2. 语音控制智能灯
任务目标
本案例实现一个离线语音控制智能灯的最小可复现系统:使用SU-03T离线语音识别模块识别“小智小智”唤醒词及“开灯”“关灯”“调亮”“调暗”命令词,通过串口将识别结果发送给主控(以ESP32-C3为例),主控解析指令后控制LED灯开关与PWM亮度调节。系统不依赖云端,上电即可本地运行。
硬件与依赖
- SU-03T语音识别模块(固件已训练好唤醒词与命令词,通过UART输出识别结果)
- ESP32-C3开发板(或其他支持Arduino的ESP32系列)
- LED灯珠(串联220Ω限流电阻,接GPIO2)
- Arduino IDE(安装esp32开发板支持包,版本2.x)
SU-03T固件配置要点
在智能公元/AI语音平台创建产品并完成以下配置后编译烧录至SU-03T模块:
- 唤醒词:小智小智
- 命令词:开灯、关灯、调亮、调暗
- 串口设置:波特率9600,引脚TX接ESP32-C3的GPIO4(RX)
- 指令返回格式:识别到唤醒词后输出
W,识别到命令词后输出对应编号(开灯=1,关灯=2,调亮=3,调暗=4)
主控端完整代码
#include <Arduino.h>
#define LED_PIN 2
#define UART_RX_PIN 4
#define PWM_CHANNEL 0
#define PWM_FREQ 5000
#define PWM_RESOLUTION 8
const int BRIGHTNESS_STEP = 50;
int currentBrightness = 128; // 初始亮度50%
void setup() {
Serial.begin(115200);
Serial1.begin(9600, SERIAL_8N1, UART_RX_PIN, -1); // 接收SU-03T数据
ledcSetup(PWM_CHANNEL, PWM_FREQ, PWM_RESOLUTION);
ledcAttachPin(LED_PIN, PWM_CHANNEL);
ledcWrite(PWM_CHANNEL, currentBrightness);
}
void loop() {
if (Serial1.available() > 0) {
char cmd = Serial1.read();
handleCommand(cmd);
}
}
void handleCommand(char cmd) {
switch (cmd) {
case 'W': // 唤醒词,仅提示,不改变灯状态
Serial.println("[INFO] 唤醒成功");
break;
case '1': // 开灯
currentBrightness = 128;
ledcWrite(PWM_CHANNEL, currentBrightness);
Serial.println("[CMD] 开灯");
break;
case '2': // 关灯
currentBrightness = 0;
ledcWrite(PWM_CHANNEL, 0);
Serial.println("[CMD] 关灯");
break;
case '3': // 调亮
currentBrightness = min(255, currentBrightness + BRIGHTNESS_STEP);
ledcWrite(PWM_CHANNEL, currentBrightness);
Serial.println("[CMD] 调亮");
break;
case '4': // 调暗
currentBrightness = max(0, currentBrightness - BRIGHTNESS_STEP);
ledcWrite(PWM_CHANNEL, currentBrightness);
Serial.println("[CMD] 调暗");
break;
default:
Serial.println("[WARN] 未知指令");
break;
}
Serial.print("[亮度] ");
Serial.println(currentBrightness);
}
运行与验证
- 将代码烧录至ESP32-C3,打开串口监视器(波特率115200)。
- 连接SU-03模块:模块GND接ESP32-C3 GND,模块TX接GPIO4,模块VCC接5V(若模块为3.3V则接3V3)。
- 上电后,对SU-03模块说“小智小智”,串口应打印
[INFO] 唤醒成功。 - 依次说“开灯”“调亮”“调暗”“关灯”,观察LED灯状态变化,串口打印对应
[CMD]信息及当前亮度值。
通过条件:每说一个命令词,LED灯在2秒内做出正确响应,且串口输出的指令名称与所说命令一致。调亮/调暗每次亮度变化50/255,连续执行4次后达到最亮或最暗。
常见问题
- 无串口输出:检查SU-03模块TX是否接对GPIO4,确认模块已烧录固件且波特率为9600。
- 唤醒后命令不识别:SU-03需先唤醒再识别命令词,两次说话间隔不超过3秒。
- LED亮度无变化:确认LED正极接GPIO2,且PWM通道与引脚绑定正确。