
灵眸 (LingMou) 是一个以 ESP32-C6 和 1.47 寸 ST7789 LCD 为核心的低成本、轻量化基于多模态感知的随身智能交互挂件。它把姿态感知(MPU6050)、环境感知(AHT20)、BLE + WiFi 双通道通信,以及 Uni-app 移动端控制器融合到一个随身小挂件里——不只是"显示"信息,更能感知、决策、表达、响应。
版本状态:面包板测试版。 当前版本为面包板测试版,用于功能验证与快速迭代,尚未进行正式 PCB 设计;正式的 PCB 版图与外壳设计将在量产版本中完成。
倾斜它、摇晃它、或通过 App 与它交互:LCD 上的眼睛会实时地眨眼、凝视、受惊,并在 18 种情绪之间切换。
一句话定义: 一个基于动画眼睛显示屏、板载 IMU/环境传感器和 BLE/WiFi 双通道通信,实现完整 感知 → 决策 → 表达 → 反馈 闭环的随身智能交互挂件。
项目口号: 让机器拥有会回应世界的眼睛。
本项目源自大学小学期综合能力实训小组课题,在此以开源形式发布,供学习、二次开发和扩展。
[-1, 1] 区间的眼睛方向。倾斜机身,眼睛跟随。GET /api/status 与 GET /api/telemetry 返回 JSON 状态,可直接对接 LAN / IoT。系统采用五层架构:App → 通信 → 控制 → 感知 / 表现 → 硬件,并形成完整的数据闭环:
<p align="center"> <img src="https://cdn.wuyilin18.top/img/%E7%B3%BB%E7%BB%9F%E4%BA%94%E5%B1%82%E6%9E%B6%E6%9E%84%E5%9B%BE.png" width="800" alt="系统五层架构"> </p>环境 / 姿态变化
→ AHT20 / MPU6050
→ ESP32-C6 数据采集
→ 状态判断与行为逻辑
→ Face 表情 / 凝视引擎
→ LCD 视觉表达
→ BLE / WiFi 遥测
→ 手机 App 状态展示
→ 用户控制指令
→ 回到 ESP32-C6
<p align="center">
<img src="https://cdn.wuyilin18.top/img/%E6%A0%B8%E5%BF%83%E6%95%B0%E6%8D%AE%E9%97%AD%E7%8E%AF%E5%9B%BE.png" width="800" alt="核心数据闭环">
</p>
当前原型基于 Waveshare ESP32-C6-LCD-1.47 平台搭建。
| 模块 | 器件 | 作用 |
|---|---|---|
| 主控 | ESP32-C6 | 系统控制、BLE GATT、WiFi STA、HTTP、NTP、行为引擎 |
| 显示 | ST7789 LCD(172×320,SPI) | 拟态眼睛 + 信息界面 |
| 姿态 | MPU6050(I2C) | 倾斜 → 凝视方向;晃动 → Scared |
| 环境 | AHT20(I2C) | 温度与湿度 |
| 按键 | 轻触按键(接 GPIO 9) | 切换 Eye Mode ↔ Info Mode |
| 电源 | USB / 5V | 系统供电 |
LCD(SPI):
| 功能 | GPIO |
|---|---|
| MOSI | 6 |
| SCLK | 7 |
| CS | 14 |
| DC | 15 |
| RST | 21 |
| Backlight | 22 |
| SD CS | 4 |
I2C 总线(MPU6050 + AHT20 共用):
| 功能 | GPIO |
|---|---|
| SDA | 18 |
| SCL | 19 |
按键: GPIO 9(内部上拉,下降沿中断,约 300 ms 防抖)
| 模块 | 器件 | 数量 |
|---|---|---|
| 主控 | ESP32-C6 开发板 | 1 |
| 显示 | ST7789 1.47 寸 LCD(172×320) | 1 |
| 姿态 | MPU6050 模组 | 1 |
| 环境 | AHT20 模组 | 1 |
| 按键 | 6mm 轻触按键 | 1 |
| 电源 | USB-C / 5V 供电 | 1 |
| 外壳 | 3D 打印 / 定制 | 1 |
眼睛模式(默认) — 核心交互界面。展示拟态眼睛的自动眨眼、姿态跟随凝视、App 凝视控制、随机行为和随机凝视。
信息模式 — 约 1 Hz 低频刷新的信息面板,显示当前时间、日期、星期、温湿度和 WiFi / BLE 状态。低频刷新是为了避免不必要的高频全屏重绘。
移动端 App 同样有对应的 眼睛模式 和 信息模式 页面(截图见下文"移动端 App"章节)。
设备端用 GPIO 9 上的物理按键切换,App 端用首页"视图模式"卡片切换。
固件为单 Arduino 框架工程(LingMou.ino),按逻辑分为以下几层:
LingMou Firmware
├── Hardware Layer → LCD、MPU6050、AHT20、Button
├── Face Engine → Blink、Emotion、LookAt、RandomBehavior、RandomLook
├── Communication → BLE(NimBLE)、WiFi、HTTP API、NTP
├── Storage → Preferences / NVS(WiFi 凭据)
├── UI → Eye Mode、Info Mode
└── Main Scheduler → 非阻塞 loop()
BLE 在启动早期就被初始化,保证即使部分外设异常,设备仍可被发现与配网。
B:1)、凝视控制(X:x,y)、随机凝视、随机行为、情绪切换(E:n)、姿态驱动凝视。ax, ay 归一化到 look_x, look_y ∈ [-1, 1]。机身左/右倾 → 眼睛左/右看;前/后倾 → 眼睛上/下看。这是实体姿态与虚拟表情联动的关键桥梁。A = √(ax² + ay² + az²);当 |A − g| 超过阈值时进入 Scared 状态约 1.5 秒,然后恢复 Normal。| 序号 | 情绪 | 序号 | 情绪 | 序号 | 情绪 |
|---|---|---|---|---|---|
| 0 | Normal | 6 | Focused | 12 | Sleepy |
| 1 | Angry | 7 | Annoyed | 13 | Suspicious |
| 2 | Glee | 8 | Surprised | 14 | Squint |
| 3 | Happy | 9 | Skeptic | 15 | Furious |
| 4 | Sad | 10 | Frustrated | 16 | Scared |
| 5 | Worried | 11 | Unimpressed | 17 | Awe |
LingMou4fafc201-1fb5-459e-8fcc-c5c9c331914bbeb5483e-36e1-4688-b7f5-ea07361b26a8beb5483e-36e1-4688-b7f5-ea07361b26a9采用轻量文本协议;分片大小根据对端 MTU 自动适配,保证 JSON 状态消息和长 SSID/密码不被截断。
| 指令 | 示例 | 功能 |
|---|---|---|
| 眨眼 | B:1 | 触发一次眨眼 |
| 随机行为 | I:1 | 开启随机行为 |
| 随机凝视 | W:1 | 开启随机凝视 |
| 情绪 | E:3 | 切换到第 3 号情绪(Happy) |
| 凝视 | X:0.5,-0.3 | 设置眼睛 X/Y 方向 |
| 获取状态 | GET_STATUS | 返回设备状态 |
| 获取遥测 | GET_TELEMETRY | 返回环境数据 |
| 手机授时 | TIME=<epoch> | 同步系统时间 |
| WiFi SSID | WIFI_SSID=xxx(支持 WIFI_SSID+ 分片) | 设置 WiFi 名称 |
| WiFi 密码 | WIFI_PASS=xxx(支持 WIFI_PASS+) | 设置密码 |
| 开始联网 | WIFI_CONNECT | 保存并连接 |
| 清除网络 | WIFI_CLEAR | 清除已保存的 WiFi |
设备内置 BLE 广播看门狗:若检测到广播停止会自动重启广播,提高 App 再次连接成功率。
WiFi 连接成功后,设备在 80 端口启动本地 WebServer:
GET /api/status
GET /api/telemetry
/api/telemetry 响应示例:
{
"t": 25.6,
"h": 48.3,
"aht": 1,
"time": "14:32:18",
"wifi": 1
}
/api/status 返回 WiFi 状态、BLE 状态、SSID、IP 和最新遥测数据。
支持两种授时方式,保证时钟始终正确:
TIME=<unix>):无 WiFi 时使用。pool.ntp.org,UTC+8):WiFi 已连接时使用。配套的 灵眸控制中心 App 基于 Uni-app / Vue 开发,主要能力:
| 故障 | 行为 |
|---|---|
| MPU6050 初始化失败 | 眼睛、BLE、WiFi、AHT20 仍工作,仅姿态驱动凝视关闭。 |
| AHT20 初始化失败 | 眼睛、姿态、BLE、WiFi 仍工作,温湿度显示为"不可用"。 |
| WiFi 掉线 | HTTP 遥测不可用;BLE 控制与遥测继续工作。 |
| BLE 广播丢失 | 看门狗约 2 秒内重启广播。 |
| 眼睛动画 | 采用 Sprite 离屏渲染,避免整屏闪烁。 |
| 信息模式 | 约 1 Hz 低频刷新,避免不必要的高频重绘。 |
按上面的引脚表把模块接到 ESP32-C6(或者直接用 Waveshare ESP32-C6-LCD-1.47 平台,pin 全部一致),USB-C 供电。
固件位于 Firmware/LingMou/LingMou.ino,目标框架为 ESP32-C6 + Arduino。
Arduino IDE / Arduino CLI:
Arduino_GFX_LibraryTFT_eSPINimBLE-ArduinoAdafruit AHT20Adafruit MPU6050(外加 Adafruit Unified Sensor、Adafruit BusIO)Firmware/LingMou/LingMou.ino。ESP32C6 Dev Module(如果安装了 Waveshare 的板支持包,可选对应型号)。所有引脚定义都在
LingMou.ino文件顶部,自制板时按需修改。
App 源码位于 App/(Uni-app 工程,入口为 index.vue)。
App/。LingMou 的设备,找到后点击连接。LingMou_SmallTeamProject/
├── Firmware/ ESP32-C6 Arduino 工程
│ └── LingMou/
│ ├── LingMou.ino
│ ├── LingMouEngine.cpp
│ └── LingMouEngine.h
├── App/ Uni-app / Vue 移动端
│ ├── App.vue
│ ├── index.html
│ ├── main.js
│ ├── manifest.json
│ ├── pages.json
│ ├── pages/index/index.vue
│ └── static/logo.png
├── docs/
│ ├── images/ README / 文档配图
│ └── LingMou_Project_Design.md 完整设计文档
├── .gitignore
├── LICENSE
├── README.md 英文 README(默认)
└── README.zh-CN.md 简体中文 README
当前固件采用紧凑结构——主程序 LingMou.ino 加上独立的 LingMouEngine 模块,后续会进一步按 display/、sensors/、communication/、behavior/、storage/ 模块化重构。
项目配套 20 项功能测试与 8 项验收指标:
| 指标 | 目标 |
|---|---|
| 眼睛动画 | ≥ 25 FPS |
| BLE 控制响应 | < 300 ms |
| App → 设备情绪切换 | < 500 ms |
| BLE 重连 | 自动恢复广播 |
| 温湿度刷新 | ≤ 3 秒 |
| WiFi 配网成功率 | ≥ 95%(正常网络环境) |
| 连续运行 | ≥ 24 小时无死机 |
| WiFi 故障 | 不影响 BLE 核心控制 |
当前原型在功能上已经较完整。后续演进规划:
{emotion, look_x, look_y, action}),设备负责执行——"云端智能 + 本地实时执行"。Energy, Mood, Curiosity, Comfort, Attention, Sleepiness),由环境和用户行为驱动演化,进而决定表情和动作(长时间空闲 → Sleepy;被拿起 → Awe / Happy)。欢迎提 Issue 和 PR,特别欢迎以下方向:
提交前请跑一遍冒烟测试(上电 → BLE 连接 → 倾斜 → 晃动),确保基本闭环正常。
本项目基于 MIT 协议开源,详见 LICENSE。如需更换为其他 OSI 协议(Apache-2.0 等)也可以直接替换该文件。
灵眸 LingMou — 让机器拥有会回应世界的眼睛。 Give machines eyes that respond to the world.
Article Navigation System © 2025
欢迎来到我的留言板,留下你的足迹,与我分享你的想法和感受。
点击文本框会有惊喜哦`(。•̀ᴗ-)✧