语音识别红外控制系统
零基础做一个语音红外控制系统
蜂鸣器响起来
红外编解码模块
1.红外遥控码学习(破解)
1.1串口发送数据给红外编解码模块,控制RGB手写板
1.2编程实现WemosD1接受不同指令发不同红外码
1.3修改接线,实现电脑发送简单指令控制RGB灯
WemosD1接红外编解码模块和语音模块,控制RGB手写板 1.代码完整 2.制作最后的控制固件
我不关心你的年纪,专业,和基础,只要对编程感兴趣,不要有编程基础,也不要有硬件基础,只要花一下午或者一天的时间,有一台电脑就可以学习和编程开发体验,当然有点基础的话就会更快乐一些。
语音控制RGB手写板的电源,颜色切换功能。写完后可以自行拓展完成电视,风扇,空调灯基于红外 NEC编码控制的电器
2.硬件模块
每一块单片机都可以理解成人脑,我们可以驱使人类干活,比如开灯,拉上窗帘,打开电视等,但是人脑听懂后不一定听话照做,而单片机可以,但是单片机仅仅是脑子,而一个人信息接收需要眼睛-图像处理,需要耳朵-声音识别等,执行需要用到四肢操作一些类似遥控器的东西。所以把单片机加外设模块就 可以理解成一个听话的人,你编程就是给这个听话的人下指令,这个人能听懂的话叫做编程语言,比如 单片机
需要用到的硬件模块:
WemosD1 --大脑,Arduino平台,带WiFi,IIC, SPI接口
语音模块 --耳朵
红外编解码模块 --遥控器
编程语言
C语言(确切来说是C++),是我们人类和机器沟通的一种语言!
编程
开发环境,就是编写代码的地方,相当于把沟通语言写在纸条上,写代码就像把要吩咐机器做的事 情提前写在纸条上!
编译
开发环境除了能让你写代码,还能帮你把写的代码翻译成000101010这种机器真正能“看懂”的指 令,这个过程叫做编译
烧写
就是把最后翻译的代码写入单片机,这样单片机上电后就可以执行你写的代码
链接:https://pan.baidu.com/s/1ZsO_IV3QyMHzlZEI72DOsA
3.2安装
本开发软件自动集成WemosD1环境,如果你电脑有Arduino环境,也请先别用,按照教程来 解压后即可使用,强调:解压的路径不要带有中文!不要解压到带有中文名文件夹中!很重 要!!!!!否则会编译失败
配置开发板型号为Wemos!!!!!重要配置
单片机通过数据线接到电脑后,需要安装驱动
选择端口号,驱动安装后,会建立电脑和wemosD1的数据传输“通道”,这个“通道”就是端口!!! 重要配置
蜂鸣器如下图,我们传统电路一般是串联型,也就是正极接正极,负极接负极,灯泡就亮,蜂鸣器就响,但是这种设计是不能编程控制的于是我们看到下方蜂鸣器除了正极VCC,负极GND之外还有I/O接口,这个就是可以通过杜邦线接到 WemosD1
又看到上面写着“低电平触发”
在单片机或者计算机中,所谓的低电平就是引脚信号为0,只要WemosD1的某个引脚和蜂鸣器I/O连接,然后WemosD1把这个引脚设置为0(低电平)
那么因为它们在同一根线上,蜂鸣器就收到低电平信号,所以就响起来。
如果把WemosD1看作是人,那么这个就相当于婴儿,完成简单的控制,就像刚学会叫爸爸一样!
是不是觉得没看到数电模电的东西就能编程实现蜂鸣器控制?没什么好纠结的,我们教婴儿叫爸爸是目 的,至于婴儿脑子里面的神经元是怎么反射的,不是我们关心的,或者不是现在该关心的。
/*
蜂鸣器响起来的代码
modified 31 June 2022
by:BUG_LONG
*/
// the setup function runs once when you press reset or power the board
// setup函数当单片机重新上电的时候,运行一次,通常我们在这里做一些初始化动作
void setup() {
// initialize digital pin 13 as an output.
//初始化D2引脚为输出引脚,输出电信号,比如后面输出低电平给蜂鸣器
pinMode(D2, OUTPUT);
}
// the loop function runs over and over again forever
// loop函数运行一次又一次,重复运行这个函数
void loop() {
digitalWrite(D2, 1); // D2输出高电平,不响
delay(100); //延迟100毫秒
digitalWrite(D2, 0); // D2输出低电平,响了
delay(100); //延迟100毫秒
}
5.1串口控制蜂鸣器
让它响,就给我响,让它不响就给我不响!
5.2串口是什么
一种单片机的数据传输方式,双向传输的,专业名词叫做:全双工 半双工
5.3串口控制蜂鸣器原理
5.4编程实现
void setup() {
// initialize serial communication:
//初始化串口,设定波特率是9600
Serial.begin(9600);
//初始化D2引脚为输出引脚,输出电信号,比如后面输出低电平给蜂鸣器
pinMode(D2, OUTPUT);
digitalWrite(D2, 1);
}
// loop函数运行一次又一次,重复运行这个函数
void loop() {
int inByte;
// read the sensor:
//读取串口数据
if (Serial.available() > 0) {//串口有数据了
inByte = Serial.read();//读取数据
}
//如果收到数据是0x64,响
if (inByte == 0x64) //表示判断用==
{
digitalWrite(D2, 0);
}
//如果收到数据是0x65,不响
if (inByte == 0x65)
{
digitalWrite(D2, 1);
}
}
6.1语音模块基本介绍
配置网址:http://www.smartpi.cn/#/
对蜂鸣器的控制是通过串口,需要用户在电脑用串口调试助手,很不方便,所以我们可以 用语音模块语音模块用的是su-03T的方案,是这个价位中无敌的存在,很多产品设计中都集成进去!
教大家用这个模块
需要硬件:USB转TTL, 语音模块
6.2语音模块固件配置和烧写
模块连接
语音模块的Tx是B7引脚,Rx是B6引脚,记得电源也要接,图中没有体现电源 打开蜂鸣器 串口输出0x64 关闭蜂鸣器 串口输出0x65
唤醒:小米小米
开机:欢迎使用我的语音智能系统
6.3语音控制蜂鸣器
RGB手写板
7.1红外遥控码学习(破解)
需要软件工具: 串口调试助手
需要硬件工具: 红外编解码模块 USB转TTL
接线
注意注意注意
USB转ttl接电脑USB口,驱动不用再安装,同WemosD1的ch340驱动
USB转ttl和红外编解码模块是“交叉接线”,RX接TX, TX接RX
电源VCC接VCC, GND接GND
电脑通过串口调试助手就可以获得红外编解码模块破解出来的遥控码,这是店家官方给的使用方法 破解:
00 EF 03 开
00 EF 02关
00 EF 04红
00 EF 05绿
00 EF 06蓝
00 EF 07白
00 EF 0B切换
7.2 串口发送数据给红外编解码模块,控制手写板
7.3编程实现WemosD1接受不同指令发不同红外码
7.4 修改接线,实现电脑发送简单指令控制RGB灯
7.5 WemosD1接红外编解码模块和语音,控制RGB手写板
7.6代码完整
这代码写的不好(我后面优化一哈)
char CODE_OPEN[] = {0xA1, 0xF1, 0x00, 0xEF, 0x03};
char CODE_OFF[] = {0xA1, 0xF1, 0x00, 0xEF, 0x02};
char CODE_RED[] = {0xA1, 0xF1, 0x00, 0xEF, 0x04}; char CODE_GREEN[] = {0xA1, 0xF1, 0x00, 0xEF, 0x05};
char CODE_BLUE[] = {0xA1, 0xF1, 0x00, 0xEF, 0x06};
char CODE_WHITE[] = {0xA1, 0xF1, 0x00, 0xEF, 0x07};
char CODE_FLASH[] = {0xA1, 0xF1, 0x00, 0xEF, 0x0B};
void setup() {
// initialize serial communication:
//初始化串口,设定波特率是9600
Serial.begin(9600);
}
// loop函数运行一次又一次,重复运行这个函数
void loop() {
int i;
int inByte;
// read the sensor:
//读取串口数据
if (Serial.available() > 0) {//串口有数据了
inByte = Serial.read();//读取数据
}
//如果收到数据是0x64
if (inByte == 0x64) //表示判断用==
{
for(i=0;i<5;i++){
Serial.print(CODE_OPEN[i]);
}
}
//如果收到数据是0x65
if (inByte == 0x65)
{
for(i=0;i<5;i++){
Serial.print(CODE_OFF[i]);
}
}
if (inByte == 0x66)
{
for(i=0;i<5;i++){
Serial.print(CODE_RED[i]);
}
}
if (inByte == 0x67)
{
for(i=0;i<5;i++){
Serial.print(CODE_GREEN[i]);
}
}
if (inByte == 0x68)
{
for(i=0;i<5;i++){
Serial.print(CODE_BLUE[i]);
}
}
if (inByte == 0x69)
{
for(i=0;i<5;i++){
Serial.print(CODE_WHITE[i]);
}
}
if (inByte == 0x6A)
{
for(i=0;i<5;i++){
Serial.print(CODE_FLASH[i]);
}
}
}
char CODE_OPEN[] = {0xA1, 0xF1, 0x00, 0xEF, 0x03};
char CODE_OFF[] = {0xA1, 0xF1, 0x00, 0xEF, 0x02};
char CODE_RED[] = {0xA1, 0xF1, 0x00, 0xEF, 0x04}; char CODE_GREEN[] = {0xA1, 0xF1, 0x00, 0xEF, 0x05};
char CODE_BLUE[] = {0xA1, 0xF1, 0x00, 0xEF, 0x06};
char CODE_WHITE[] = {0xA1, 0xF1, 0x00, 0xEF, 0x07};
char CODE_FLASH[] = {0xA1, 0xF1, 0x00, 0xEF, 0x0B};
void setup() {
// initialize serial communication:
//初始化串口,设定波特率是9600 Serial.begin(9600);
}
//发送NEC编码
void sendNEC(char code[])
{
int i;
for (i = 0; i < 5; i++) {
Serial.print(code[i]);
}
}
// loop函数运行一次又一次,重复运行这个函数
void loop() {
int inByte;
// read the sensor:
//读取串口数据
if (Serial.available() > 0) {//串口有数据了
inByte = Serial.read();//读取数据
}
switch (inByte) {
case 0x64:
sendNEC(CODE_OPEN);
break;
case 0x65:
sendNEC(CODE_OFF);
break;
case 0x66:
sendNEC(CODE_RED);
break;
case 0x67:
sendNEC(CODE_GREEN);
break;
case 0x68:
sendNEC(CODE_BLUE);
break;
case 0x69:
sendNEC(CODE_WHITE);
break;
case 0x6A:
sendNEC(CODE_FLASH);
break;
}
}
根据代码设计如下词条和控制数据
识别控制词条 对应串口输出数据
开灯 0x64
关灯 0x65
切换红色 0x66
切换绿色 0x67
切换蓝色 0x68
切换白色 0x69
开始闪烁 0x6A
小米小米注:唤醒
注:上机语音播报内容