树莓派+红外+语音模块练习:
- 1、硬件工具有如下:
- (1)树莓派 3B :
- (2)语音模块
- (3)红外模块(某宝购的,需要的可去某宝买)
- (4)WeMose板
- (5)本次以空调作为例子:
- 2、需要用到的软件平台:
- (1)arduino开发环境
- (2)树莓派系统
- (3)串口助手调式
- 3、红外解码过程:
- (1)连接红外设备(连接TTL串口):
- 将TTL串口USB插入电脑,打开串口调试助手,设置好波特率和端口号,安装更新好USB驱动!!!
- (2)通过串口助手获取红外码(这里以格力空调为例)
- 将获取的红外码,复制重新发送,检查是否为相对应的开关码,看是否功能正常:
- 大家根据自己买来的红外设备(搭配有送设备手册),根据手册来基础功能设置,根据自己买的红外设备手册为准
- 4、以树莓派与WeMose板通信实现:
- (1)以TCP通讯方式,在WeMose上实现服务端:
- (2)树莓派语音模块上,做一个TCP的客户端:
- 到这里功能代码已经实现,硬件接好就可以实现功能,其他灯、电视原理基本相同,冲冲冲!!!
1、硬件工具有如下:
(1)树莓派 3B :
(2)语音模块
(3)红外模块(某宝购的,需要的可去某宝买)
(4)WeMose板
(5)本次以空调作为例子:
2、需要用到的软件平台:
(1)arduino开发环境
(2)树莓派系统
(3)串口助手调式
3、红外解码过程:
(1)连接红外设备(连接TTL串口):
将TTL串口USB插入电脑,打开串口调试助手,设置好波特率和端口号,安装更新好USB驱动!!!
(2)通过串口助手获取红外码(这里以格力空调为例)
将获取的红外码,复制重新发送,检查是否为相对应的开关码,看是否功能正常:
大家根据自己买来的红外设备(搭配有送设备手册),根据手册来基础功能设置,根据自己买的红外设备手册为准
4、以树莓派与WeMose板通信实现:
(1)以TCP通讯方式,在WeMose上实现服务端:
char ssid[] = "Liuzheng"; //这是wifi名字
char passwd[] = "68269300"; //这是密码
int port = 8888; //设置端口号
WiFiServer server(port); //设置服务器端口
// 空调开的红外码
const byte open_data[] =
{
0xFE , 0xFD , 0x03 , 0x81 , 0x01 , 0xC9 , 0x36 , 0x43 , 0x34 , 0x43 , 0x31 , 0x45 , 0x34 , 0xAC,
0x38 , 0x43 , 0x34 , 0x40 , 0x36 , 0xAC , 0x39 , 0x40 , 0x37 , 0xB1 , 0x33 , 0x43 , 0x33 , 0x41,
0x38 , 0xAD , 0x36 , 0x40 , 0x39 , 0x3E , 0x33 , 0x43 , 0x36 , 0x41 , 0x36 , 0x40 , 0x34 , 0x40,
0x39 , 0x40 , 0x36 , 0x41 , 0x36 , 0x40 , 0x39 , 0xAE , 0x34 , 0x3E , 0x38 , 0x41 , 0x35 , 0x3F,
0x38 , 0x41 , 0x35 , 0x41 , 0x36 , 0x41 , 0x35 , 0xAF , 0x36 , 0x41 , 0x36 , 0xAE , 0x37 , 0x40,
0x36 , 0x40 , 0x36 , 0xAF , 0x36 , 0x3E , 0x39 , 0x07 , 0xDC , 0x36 , 0xB1 , 0x33 , 0x43 , 0x34,
0x40 , 0x36 , 0x40 , 0x34 , 0xB1 , 0x39 , 0x43 , 0x31 , 0x3E , 0x38 , 0x43 , 0x33 , 0x41 , 0x36,
0x40 , 0x36 , 0x41 , 0x36 , 0x40 , 0x36 , 0x3E , 0x39 , 0xB1 , 0x34 , 0x40 , 0x36 , 0x41 , 0x36,
0x40 , 0x33 , 0x43 , 0x36 , 0x3E , 0x36 , 0x43 , 0x36 , 0x41 , 0x36 , 0x40 , 0x36 , 0x41 , 0x33,
0x43 , 0x36 , 0x40 , 0x34 , 0x45 , 0x31 , 0x40 , 0x39 , 0x3E , 0x39 , 0x45 , 0x31 , 0xB2 , 0x30,
0xB7 , 0x31 , 0xAE , 0x36 , 0x0F , 0xB1 , 0x03 , 0x7F , 0x01 , 0xCC , 0x33 , 0x43 , 0x31 , 0x43,
0x36 , 0x40 , 0x36 , 0xAF , 0x36 , 0x41 , 0x33 , 0x46 , 0x33 , 0xAF , 0x36 , 0x40 , 0x36 , 0xAF,
0x33 , 0x46 , 0x34 , 0x40 , 0x36 , 0xB1 , 0x34 , 0x40 , 0x36 , 0x43 , 0x31 , 0x43 , 0x36 , 0x40,
0x37 , 0x40 , 0x36 , 0x40 , 0x37 , 0x40 , 0x36 , 0x40 , 0x34 , 0x43 , 0x35, 0xB0 , 0x36 , 0x40,
0x36, 0x40 , 0x36 , 0x41 , 0x36 , 0x40 , 0x34 , 0x45 , 0x34 , 0x45 , 0x32 , 0xB1 , 0x33 , 0xAF,
0x35, 0xB0 , 0x33 , 0x43 , 0x36 , 0x40 , 0x34 , 0xB4 , 0x33 , 0x41 , 0x36 , 0x07 , 0xD9 , 0x39,
0x42, 0x36 , 0x3C , 0x38 , 0x44 , 0x30 , 0x43 , 0x39 , 0x3C , 0x35 , 0x41, 0x38 , 0x44 , 0x33,
0x3E, 0x38 , 0x41 , 0x36 , 0x40 , 0x36 , 0x41 , 0x35 , 0x41 , 0x39 , 0x3B , 0x36 , 0x40 , 0x39,
0x40, 0x39 , 0x3B , 0x39 , 0x3E , 0x38 , 0x3E , 0x39 , 0x40 , 0x36 , 0x3E , 0x39 , 0x40 , 0x36,
0x40, 0x36 , 0x41 , 0x36 , 0x43 , 0x33 , 0x43 , 0x34 , 0x40 , 0x36 , 0x46 , 0x31 , 0x3E , 0x38,
0xAF, 0x36 , 0xAF , 0x36 , 0x40 , 0x36 , 0xAF , 0x33, 0xFF
};
//空调关的红外码
const byte close_data[] =
{
0xFE , 0xFD , 0x03 , 0x87 , 0x01 , 0xC1 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F,
0xA6 , 0x3F , 0x37 , 0x3F , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38,
0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F,
0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3F , 0x37 , 0x3F , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3E , 0x38,
0x3F , 0x07 , 0xD2 , 0x3F , 0xA6 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38,
0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E,
0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F , 0x38,
0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0xA7 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0x0F , 0xA9 , 0x03 , 0x88 , 0x01 , 0xC0 , 0x3F , 0x38,
0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0xA7 , 0x3E , 0x38 , 0x3F,
0x38 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38,
0x3F , 0x38 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3F,
0xA6 , 0x3E , 0xA7 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0x07 , 0xD4 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E,
0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38,
0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F,
0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3F , 0xA6 , 0x3E , 0x38,
0x3F, 0x38 , 0x3E , 0xFF
};
void initWiFi()
{
WiFi.mode(WIFI_STA);// 设置STA模式
WiFi.begin(ssid, passwd); //开始连接网络
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println(WiFi.localIP() ); //打印ip地址
delay(500);
}
void setup()
{
Serial.begin(115200); //设置波特率(和红外设相连接的波特率)
initWiFi(); //初始化网络
}
void loop() {
char cmd;
// WiFiClient client = server.available();
WiFiClient client = server.available(); //设置为服务端
server.begin(); //服务初始化
Serial.println(WiFi.localIP()); //打印IP
while (client.connected()) //用来等待客户端连接
{
while (client.available() > 0)
{
cmd = client.read(); //从客户端读取数据
// Serial.println(cmd);// 打印读取的数据
if (cmd == '1')
{
Serial.write(open_data, (sizeof(open_data) / sizeof(open_data[0]))); //给红外设备发送打开码
}
else if (cmd == '2')
{
Serial.write(close_data, (sizeof(close_data) / sizeof(close_data[0]))); //给红外设备发送关码
}
}
}
}
(2)树莓派语音模块上,做一个TCP的客户端:
int main(int argc, char **argv)
{
int s_fd;
char buf[2] = {'\0'};
char a='1'; // 与服务端指令一样
char b='2';
int fd;
char cmd[128] = {'\0'};
wiringPiSetup(); //硬件初始化
fd = serialOpen("/dev/ttyAMA0",9600); //语音模块串口
if(argc != 3)
{
printf("输入参数有错误\n");
exit(0);
}
s_fd = socket(AF_INET,SOCK_STREAM,0);
if(s_fd == -1)
{
printf("创建套接字对象失败\n");
exit(-1);
}
struct sockaddr_in addr;
memset(&addr,0,sizeof(struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&addr.sin_addr);
if( connect(s_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr)) == -1)
{
printf("连接wemose失败\n");
exit(-1);
}
else
{
printf("连接成功\n");
}
while(1)
{
read(fd,cmd,sizeof(cmd)); //读取数据
if(strstr(cmd,"open") != NULL)
{
printf("open sucess!\n");
write(s_fd,&a,sizeof(char)); //发送开的红外码
}
if(strstr(cmd,"close") != NULL)
{
printf("close sucess!\n");
write(s_fd,&b,sizeof(char)); //发送关的红外码
}
memset(cmd,'\0',sizeof(cmd)/sizeof(char));
}
return 0;
}
到这里功能代码已经实现,硬件接好就可以实现功能,其他灯、电视原理基本相同,冲冲冲!!!