add 2 new oled
This commit is contained in:
parent
742fedab21
commit
3f3fe2dc40
230
src/face.cpp
230
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user