add 2 new oled

This commit is contained in:
cheykrym 2026-01-26 00:11:53 +03:00
parent 742fedab21
commit 3f3fe2dc40

View File

@ -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;
}
}