This commit is contained in:
unknown 2026-01-23 01:04:20 +03:00
parent 7a4e9df6ce
commit 5e7c6a1f9c
4 changed files with 113 additions and 0 deletions

86
src/face.cpp Normal file
View File

@ -0,0 +1,86 @@
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#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;
}

13
src/face.h Normal file
View File

@ -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();

View File

@ -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();

View File

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