From 3f3fe2dc402428f82cae71a65ad8183af0b70970 Mon Sep 17 00:00:00 2001 From: cheykrym Date: Mon, 26 Jan 2026 00:11:53 +0300 Subject: [PATCH] add 2 new oled --- src/face.cpp | 230 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 187 insertions(+), 43 deletions(-) diff --git a/src/face.cpp b/src/face.cpp index 41b589e..e348800 100644 --- a/src/face.cpp +++ b/src/face.cpp @@ -8,63 +8,187 @@ #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 #define OLED_RESET -1 -#define OLED_ADDR 0x3C -#define SDA_PIN 21 -#define SCL_PIN 22 +// Main I2C bus (existing) +#define SDA_PIN_MAIN 21 +#define SCL_PIN_MAIN 22 -static Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); +// Auxiliary I2C bus (new) +#define SDA_PIN_AUX 4 +#define SCL_PIN_AUX 15 + +// OLED I2C addresses (adjust if needed) +#define OLED_ADDR_MOUTH 0x3C +#define OLED_ADDR_BROW 0x3D +#define OLED_ADDR_NOSE 0x3C + +static TwoWire WireAux = TwoWire(1); +static Adafruit_SSD1306 displayMouth(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); +static Adafruit_SSD1306 displayBrow(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); +static Adafruit_SSD1306 displayNose(SCREEN_WIDTH, SCREEN_HEIGHT, &WireAux, OLED_RESET); + +static bool mouthOk = false; +static bool browOk = false; +static bool noseOk = false; + +static void scanI2C(TwoWire &bus, const char *name) { + Serial.print("I2C scan "); + Serial.print(name); + Serial.print(": "); + bool found = false; + for (uint8_t addr = 0x03; addr <= 0x77; ++addr) { + bus.beginTransmission(addr); + if (bus.endTransmission() == 0) { + Serial.print("0x"); + if (addr < 16) Serial.print("0"); + Serial.print(addr, HEX); + Serial.print(" "); + found = true; + } + } + if (!found) Serial.print("none"); + Serial.println(); +} static FaceExpression currentFace = FACE_NEUTRAL; // ===== Drawing helpers ===== -static void clearFace() { - display.clearDisplay(); +static void clearFace(Adafruit_SSD1306 &d) { + d.clearDisplay(); } -// 🙂 Нейтральный -static void drawNeutral() { - clearFace(); - display.drawLine(40, 18, 88, 18, SSD1306_WHITE); - display.display(); +// ===== Mouth ===== +static void drawMouthNeutral() { + if (!mouthOk) return; + clearFace(displayMouth); + displayMouth.drawLine(40, 18, 88, 18, SSD1306_WHITE); + displayMouth.display(); } -// 😀 Улыбка -static void drawHappy() { - clearFace(); - display.drawLine(42, 16, 48, 20, SSD1306_WHITE); - display.drawLine(48, 20, 80, 20, SSD1306_WHITE); - display.drawLine(80, 20, 86, 16, SSD1306_WHITE); - display.display(); +static void drawMouthHappy() { + if (!mouthOk) return; + clearFace(displayMouth); + displayMouth.drawLine(42, 16, 48, 20, SSD1306_WHITE); + displayMouth.drawLine(48, 20, 80, 20, SSD1306_WHITE); + displayMouth.drawLine(80, 20, 86, 16, SSD1306_WHITE); + displayMouth.display(); } -// 😮 Удивление -static void drawSurprised() { - clearFace(); - display.drawCircle(64, 18, 6, SSD1306_WHITE); - display.display(); +static void drawMouthSurprised() { + if (!mouthOk) return; + clearFace(displayMouth); + displayMouth.drawCircle(64, 18, 6, SSD1306_WHITE); + displayMouth.display(); } -// 😐 Скука -static void drawBored() { - clearFace(); - display.drawLine(40, 17, 88, 17, SSD1306_WHITE); - display.drawLine(40, 19, 88, 19, SSD1306_WHITE); - display.display(); +static void drawMouthBored() { + if (!mouthOk) return; + clearFace(displayMouth); + displayMouth.drawLine(40, 17, 88, 17, SSD1306_WHITE); + displayMouth.drawLine(40, 19, 88, 19, SSD1306_WHITE); + displayMouth.display(); } -// 😠 Злой -static void drawAngry() { - clearFace(); - display.drawLine(40, 22, 88, 14, SSD1306_WHITE); - display.display(); +static void drawMouthAngry() { + if (!mouthOk) return; + clearFace(displayMouth); + displayMouth.drawLine(40, 22, 88, 14, SSD1306_WHITE); + displayMouth.display(); +} + +// ===== Brows ===== +static void drawBrowsNeutral() { + if (!browOk) return; + clearFace(displayBrow); + displayBrow.drawLine(20, 10, 52, 10, SSD1306_WHITE); + displayBrow.drawLine(76, 10, 108, 10, SSD1306_WHITE); + displayBrow.display(); +} + +static void drawBrowsHappy() { + if (!browOk) return; + clearFace(displayBrow); + displayBrow.drawLine(20, 9, 52, 12, SSD1306_WHITE); + displayBrow.drawLine(76, 12, 108, 9, SSD1306_WHITE); + displayBrow.display(); +} + +static void drawBrowsSurprised() { + if (!browOk) return; + clearFace(displayBrow); + displayBrow.drawLine(20, 6, 52, 6, SSD1306_WHITE); + displayBrow.drawLine(76, 6, 108, 6, SSD1306_WHITE); + displayBrow.display(); +} + +static void drawBrowsBored() { + if (!browOk) return; + clearFace(displayBrow); + displayBrow.drawLine(20, 12, 52, 12, SSD1306_WHITE); + displayBrow.drawLine(76, 12, 108, 12, SSD1306_WHITE); + displayBrow.display(); +} + +static void drawBrowsAngry() { + if (!browOk) return; + clearFace(displayBrow); + displayBrow.drawLine(20, 14, 52, 8, SSD1306_WHITE); + displayBrow.drawLine(76, 8, 108, 14, SSD1306_WHITE); + displayBrow.display(); +} + +// ===== Nose ===== +static void drawNoseNeutral() { + if (!noseOk) return; + clearFace(displayNose); + displayNose.drawLine(64, 10, 58, 22, SSD1306_WHITE); + displayNose.drawLine(64, 10, 70, 22, SSD1306_WHITE); + displayNose.drawLine(58, 22, 70, 22, SSD1306_WHITE); + displayNose.display(); +} + +static void drawNoseHappy() { + if (!noseOk) return; + clearFace(displayNose); + displayNose.drawTriangle(64, 9, 56, 24, 72, 24, SSD1306_WHITE); + displayNose.display(); +} + +static void drawNoseSurprised() { + if (!noseOk) return; + clearFace(displayNose); + displayNose.drawCircle(64, 18, 5, SSD1306_WHITE); + displayNose.display(); +} + +static void drawNoseBored() { + if (!noseOk) return; + clearFace(displayNose); + displayNose.drawLine(58, 20, 70, 20, SSD1306_WHITE); + displayNose.display(); +} + +static void drawNoseAngry() { + if (!noseOk) return; + clearFace(displayNose); + displayNose.drawLine(56, 12, 64, 24, SSD1306_WHITE); + displayNose.drawLine(64, 24, 72, 12, SSD1306_WHITE); + displayNose.display(); } void faceInit() { - Wire.begin(SDA_PIN, SCL_PIN); + Wire.begin(SDA_PIN_MAIN, SCL_PIN_MAIN); + WireAux.begin(SDA_PIN_AUX, SCL_PIN_AUX); - if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { - while (true); // OLED не найден - } + scanI2C(Wire, "main"); + scanI2C(WireAux, "aux"); + + mouthOk = displayMouth.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR_MOUTH); + browOk = displayBrow.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR_BROW); + noseOk = displayNose.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR_NOSE); + + if (!mouthOk) Serial.println("OLED mouth not found"); + if (!browOk) Serial.println("OLED brows not found"); + if (!noseOk) Serial.println("OLED nose not found"); faceSet(FACE_NEUTRAL); } @@ -73,11 +197,31 @@ void faceSet(FaceExpression f) { currentFace = f; switch (f) { - case FACE_NEUTRAL: drawNeutral(); break; - case FACE_HAPPY: drawHappy(); break; - case FACE_SURPRISED: drawSurprised(); break; - case FACE_BORED: drawBored(); break; - case FACE_ANGRY: drawAngry(); break; + case FACE_NEUTRAL: + drawMouthNeutral(); + drawBrowsNeutral(); + drawNoseNeutral(); + break; + case FACE_HAPPY: + drawMouthHappy(); + drawBrowsHappy(); + drawNoseHappy(); + break; + case FACE_SURPRISED: + drawMouthSurprised(); + drawBrowsSurprised(); + drawNoseSurprised(); + break; + case FACE_BORED: + drawMouthBored(); + drawBrowsBored(); + drawNoseBored(); + break; + case FACE_ANGRY: + drawMouthAngry(); + drawBrowsAngry(); + drawNoseAngry(); + break; } }