桌面情绪伙伴电子表情盒

划重点

需求洞察

目标用户

真实痛点

为什么值得做

方案设计

感知层

控制层

执行层

日志/联网层

物料清单

物料名称 数量 用途说明 估算单价(元) 合计(元)
ESP32 开发板 1 主控芯片 25 25
0.96 寸 OLED 屏(SPI) 2 双屏表情显示 18 36
SG90 舵机 2 带动耳朵动作 8 16
INMP441 麦克风模块 1 语音采集输入 15 15
面包板及跳线若干 1 电路连接 8 8
3D 打印外壳/纸盒 1 结构支撑与外观 10 10
TYPE-C 数据线等配件 1 供电与烧录 5 5
合计 - - - 115

接线与结构

OLED 双屏接线

舵机接线

结构设计

核心代码

以下为 Arduino 框架下的核心骨架代码,实现双屏驱动、舵机控制与简单语音识别逻辑:


#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ESP32Servo.h>

#define OLED_DC    2
#define OLED_CS1   15
#define OLED_CS2   27
#define OLED_MOSI  23
#define OLED_SCK   18
#define SERVO_L    13
#define SERVO_R    14

Servo servoLeft, servoRight;

// 情绪状态枚举
enum Emotion {
  HAPPY,
  SAD,
  ANGRY,
  SLEEPY
};

Emotion currentEmotion = HAPPY;

void setup() {
  Serial.begin(115200);

  // 初始化双屏
  display1.clearDisplay();
  display2.clearDisplay();

  // 初始化舵机
  servoLeft.attach(SERVO_L);
  servoRight.attach(SERVO_R);

  // 初始表情
  setEmotion(HAPPY);
}

void loop() {
  // 模拟语音识别结果(实际接入麦克风识别后替换)
  if (Serial.available()) {
    String cmd = Serial.readStringUntil('\n');
    cmd.trim();
    if (cmd == "happy") setEmotion(HAPPY);
    else if (cmd == "sad") setEmotion(SAD);
    else if (cmd == "angry") setEmotion(ANGRY);
    else if (cmd == "sleep") setEmotion(SLEEPY);
  }
  delay(50);
}

void setEmotion(Emotion emo) {
  currentEmotion = emo;
  display1.clearDisplay();
  display1.setTextSize(2);
  display1.setCursor(20, 20);

  switch (emo) {
    case HAPPY:
      display1.println(":)");
      servoLeft.write(180);
      servoRight.write(180);
      break;
    case SAD:
      display1.println(":(");
      servoLeft.write(0);
      servoRight.write(0);
      break;
    case ANGRY:
      display1.println(">.<");
      servoLeft.write(90);
      servoRight.write(180);
      break;
    case SLEEPY:
      display1.println("-.-");
      servoLeft.write(0);
      servoRight.write(90);
      break;
  }
  display1.display();

  // 辅屏显示当前情绪名称
  display2.clearDisplay();
  display2.setTextSize(2);
  display2.setCursor(10, 20);
  display2.println("State:");
  display2.setCursor(10, 40);
  display2.display();
}

const char* emoName(Emotion emo) {
  switch (emo) {
    case HAPPY: return "Happy";
    case SAD: return "Sad";
    case ANGRY: return "Angry";
    case SLEEPY: return "Sleepy";
  }
}

调试步骤

  1. 基础电路检查:使用万用表确认电源与地导通正常,无短路。
  2. OLED 屏测试:分别烧录单屏显示测试代码,确认两屏独立工作正常,再启用 CS 片选切换逻辑。
  3. 舵机调零与行程测试:烧录舵机扫动程序,确认两个舵机角度范围,并在外壳上调试安装位置,避免卡滞。
  4. 语音识别调试:初版可用串口发送命令模拟语音识别结果,验证表情与舵机状态切换逻辑;随后接入麦克风模块,调整唤醒词与识别阈值。
  5. 整机联调:装入外壳,进行 30 分钟连续运行测试,观察有无过热、卡死或显示异常。
  6. 功耗与稳定性测试:测量运行电流,确认 Type-C 供电能力充足;检查 Wi-Fi 连接稳定性。

设计图

桌面情绪伙伴电子表情盒结构flow
1
感知输入
2
控制处理
3
执行反馈
4
数据上报