From 5e7c6a1f9cabcc94d632b2c896277244ac7c4601 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 23 Jan 2026 01:04:20 +0300 Subject: [PATCH] add face --- src/face.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++++ src/face.h | 13 +++++++ src/main.cpp | 2 ++ src/ws_server.cpp | 12 +++++++ 4 files changed, 113 insertions(+) create mode 100644 src/face.cpp create mode 100644 src/face.h diff --git a/src/face.cpp b/src/face.cpp new file mode 100644 index 0000000..41b589e --- /dev/null +++ b/src/face.cpp @@ -0,0 +1,86 @@ +#include +#include +#include +#include +#include "face.h" + +// ===== OLED CONFIG ===== +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 32 +#define OLED_RESET -1 +#define OLED_ADDR 0x3C + +#define SDA_PIN 21 +#define SCL_PIN 22 + +static Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); +static FaceExpression currentFace = FACE_NEUTRAL; + +// ===== Drawing helpers ===== +static void clearFace() { + display.clearDisplay(); +} + +// 🙂 Нейтральный +static void drawNeutral() { + clearFace(); + display.drawLine(40, 18, 88, 18, SSD1306_WHITE); + display.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 drawSurprised() { + clearFace(); + display.drawCircle(64, 18, 6, SSD1306_WHITE); + display.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 drawAngry() { + clearFace(); + display.drawLine(40, 22, 88, 14, SSD1306_WHITE); + display.display(); +} + +void faceInit() { + Wire.begin(SDA_PIN, SCL_PIN); + + if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) { + while (true); // OLED не найден + } + + faceSet(FACE_NEUTRAL); +} + +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; + } +} + +FaceExpression faceGet() { + return currentFace; +} diff --git a/src/face.h b/src/face.h new file mode 100644 index 0000000..3a9afa8 --- /dev/null +++ b/src/face.h @@ -0,0 +1,13 @@ +#pragma once + +enum FaceExpression { + FACE_NEUTRAL, + FACE_HAPPY, + FACE_SURPRISED, + FACE_BORED, + FACE_ANGRY +}; + +void faceInit(); +void faceSet(FaceExpression f); +FaceExpression faceGet(); diff --git a/src/main.cpp b/src/main.cpp index 3a58dfc..3d31be4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,12 +7,14 @@ #include "ws_server.h" #include "servo.h" #include "ultrasonic.h" +#include "face.h" void setup() { Serial.begin(115200); servoInit(); ultrasonicInit(); + faceInit(); actuatorsInit(); webServerInit(); wsInit(); diff --git a/src/ws_server.cpp b/src/ws_server.cpp index 33ce978..c72f41b 100644 --- a/src/ws_server.cpp +++ b/src/ws_server.cpp @@ -4,6 +4,7 @@ #include "ws_server.h" #include "controller.h" #include "robot_state.h" +#include "face.h" static WebSocketsServer ws(81); // порт 81 @@ -53,6 +54,17 @@ void wsEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { } } + else if (msg.startsWith("FACE:")) { + String v = msg.substring(5); + v.toUpperCase(); + + if (v == "HAPPY") faceSet(FACE_HAPPY); + else if (v == "ANGRY") faceSet(FACE_ANGRY); + else if (v == "BORED") faceSet(FACE_BORED); + else if (v == "SURPRISED") faceSet(FACE_SURPRISED); + else faceSet(FACE_NEUTRAL); + } + else if (msg.startsWith("SPEED:")) { int v = msg.substring(6).toInt(); controllerSetSpeed(v, v);