功能需求:

  • 语音控制台灯
  • 语音控制…
  • 将控制信息显示在oled屏幕上

问题

以前也做个类似的控制(小爱同学+esp8266+继电器) 但是这个缺点太大了. 不能免唤醒词 必须联网, 控制延迟也很大. 而且不能自定义回答

解决方案

淘宝上买了一个语音控制的模块(SU-03T), 离线语音, 免唤醒, 响应时间很快. 完美符合我的要求. 在线编程自己生成sdk,和固件.

思维导图

img

arduino代码

#include <Wire.h>

// 引入驱动OLED0.96所需的库
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // 设置OLED宽度,单位:像素
#define SCREEN_HEIGHT 64 // 设置OLED高度,单位:像素
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#include <SoftwareSerial.h> //软串口库
SoftwareSerial mySerial(2,3); ////定义软串口,arduino的2号引脚作为RX,arduino的3号引脚作为TX,根据需要自行修改

void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
}
void loop()
{
DataJC();
}
//------读取串口
void DataJC(){
if (mySerial.available() > 0) //检测软串口是否有数据
{
int val = 0;
val = mySerial.read();//读出串数据
Serial.println(val); //从主串口打开出来
if (val == 161) {
Serial.println("A1已开启");
A1_on();
}
if (val == 162) {
Serial.println("A1已关闭");
A1_off();
}
if (val == 17) {
Serial.println("响应");
Emoji_1();
}
}
}
//表情:响应
void Emoji_1()
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(4);
display.setCursor(45, 10);
display.print("Hi");
display.display();
delay(1000);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(4);
display.setCursor(32, 10);
display.print("o o");
display.display();
delay(1000);
}
//打开A1
void A1_on(){
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0, 20);
display.print("A1 >> on");
display.display();
//delay(2000);
}
//关闭A1
void A1_off(){
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0, 20);
display.print("A1 >> off");
display.display();
//delay(2000);
}
//向软串口输出数据
void send_cmd(int cmd){
char mylist[9]={0xAA,0x55,0x01,0x01,0x00,0x00,0x00,0x55,0xAA};//设置发送列表
//改变数值
mylist[(int)(3)] = cmd;
mySerial.write(mylist[(int)(0)]);
mySerial.write(mylist[(int)(1)]);
mySerial.write(mylist[(int)(2)]);
mySerial.write(mylist[(int)(3)]);
mySerial.write(mylist[(int)(4)]);
mySerial.write(mylist[(int)(5)]);
mySerial.write(mylist[(int)(6)]);
mySerial.write(mylist[(int)(7)]);
mySerial.write(mylist[(int)(8)]);
}