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_WIDTH 128
|
||||||
#define SCREEN_HEIGHT 32
|
#define SCREEN_HEIGHT 32
|
||||||
#define OLED_RESET -1
|
#define OLED_RESET -1
|
||||||
#define OLED_ADDR 0x3C
|
|
||||||
|
|
||||||
#define SDA_PIN 21
|
// Main I2C bus (existing)
|
||||||
#define SCL_PIN 22
|
#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;
|
static FaceExpression currentFace = FACE_NEUTRAL;
|
||||||
|
|
||||||
// ===== Drawing helpers =====
|
// ===== Drawing helpers =====
|
||||||
static void clearFace() {
|
static void clearFace(Adafruit_SSD1306 &d) {
|
||||||
display.clearDisplay();
|
d.clearDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 🙂 Нейтральный
|
// ===== Mouth =====
|
||||||
static void drawNeutral() {
|
static void drawMouthNeutral() {
|
||||||
clearFace();
|
if (!mouthOk) return;
|
||||||
display.drawLine(40, 18, 88, 18, SSD1306_WHITE);
|
clearFace(displayMouth);
|
||||||
display.display();
|
displayMouth.drawLine(40, 18, 88, 18, SSD1306_WHITE);
|
||||||
|
displayMouth.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 😀 Улыбка
|
static void drawMouthHappy() {
|
||||||
static void drawHappy() {
|
if (!mouthOk) return;
|
||||||
clearFace();
|
clearFace(displayMouth);
|
||||||
display.drawLine(42, 16, 48, 20, SSD1306_WHITE);
|
displayMouth.drawLine(42, 16, 48, 20, SSD1306_WHITE);
|
||||||
display.drawLine(48, 20, 80, 20, SSD1306_WHITE);
|
displayMouth.drawLine(48, 20, 80, 20, SSD1306_WHITE);
|
||||||
display.drawLine(80, 20, 86, 16, SSD1306_WHITE);
|
displayMouth.drawLine(80, 20, 86, 16, SSD1306_WHITE);
|
||||||
display.display();
|
displayMouth.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 😮 Удивление
|
static void drawMouthSurprised() {
|
||||||
static void drawSurprised() {
|
if (!mouthOk) return;
|
||||||
clearFace();
|
clearFace(displayMouth);
|
||||||
display.drawCircle(64, 18, 6, SSD1306_WHITE);
|
displayMouth.drawCircle(64, 18, 6, SSD1306_WHITE);
|
||||||
display.display();
|
displayMouth.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 😐 Скука
|
static void drawMouthBored() {
|
||||||
static void drawBored() {
|
if (!mouthOk) return;
|
||||||
clearFace();
|
clearFace(displayMouth);
|
||||||
display.drawLine(40, 17, 88, 17, SSD1306_WHITE);
|
displayMouth.drawLine(40, 17, 88, 17, SSD1306_WHITE);
|
||||||
display.drawLine(40, 19, 88, 19, SSD1306_WHITE);
|
displayMouth.drawLine(40, 19, 88, 19, SSD1306_WHITE);
|
||||||
display.display();
|
displayMouth.display();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 😠 Злой
|
static void drawMouthAngry() {
|
||||||
static void drawAngry() {
|
if (!mouthOk) return;
|
||||||
clearFace();
|
clearFace(displayMouth);
|
||||||
display.drawLine(40, 22, 88, 14, SSD1306_WHITE);
|
displayMouth.drawLine(40, 22, 88, 14, SSD1306_WHITE);
|
||||||
display.display();
|
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() {
|
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)) {
|
scanI2C(Wire, "main");
|
||||||
while (true); // OLED не найден
|
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);
|
faceSet(FACE_NEUTRAL);
|
||||||
}
|
}
|
||||||
@ -73,11 +197,31 @@ void faceSet(FaceExpression f) {
|
|||||||
currentFace = f;
|
currentFace = f;
|
||||||
|
|
||||||
switch (f) {
|
switch (f) {
|
||||||
case FACE_NEUTRAL: drawNeutral(); break;
|
case FACE_NEUTRAL:
|
||||||
case FACE_HAPPY: drawHappy(); break;
|
drawMouthNeutral();
|
||||||
case FACE_SURPRISED: drawSurprised(); break;
|
drawBrowsNeutral();
|
||||||
case FACE_BORED: drawBored(); break;
|
drawNoseNeutral();
|
||||||
case FACE_ANGRY: drawAngry(); break;
|
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