树莓派语音+红外模块实现智能家居实践

柔情只为你懂 2022-11-29 03:05 363阅读 0赞

树莓派+红外+语音模块练习:

  • 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上实现服务端:

  1. #include<ESP8266WiFi.h>
  2. char ssid[] = "Liuzheng"; //这是wifi名字
  3. char passwd[] = "68269300"; //这是密码
  4. int port = 8888; //设置端口号
  5. WiFiServer server(port); //设置服务器端口
  6. // 空调开的红外码
  7. const byte open_data[] =
  8. {
  9. 0xFE , 0xFD , 0x03 , 0x81 , 0x01 , 0xC9 , 0x36 , 0x43 , 0x34 , 0x43 , 0x31 , 0x45 , 0x34 , 0xAC,
  10. 0x38 , 0x43 , 0x34 , 0x40 , 0x36 , 0xAC , 0x39 , 0x40 , 0x37 , 0xB1 , 0x33 , 0x43 , 0x33 , 0x41,
  11. 0x38 , 0xAD , 0x36 , 0x40 , 0x39 , 0x3E , 0x33 , 0x43 , 0x36 , 0x41 , 0x36 , 0x40 , 0x34 , 0x40,
  12. 0x39 , 0x40 , 0x36 , 0x41 , 0x36 , 0x40 , 0x39 , 0xAE , 0x34 , 0x3E , 0x38 , 0x41 , 0x35 , 0x3F,
  13. 0x38 , 0x41 , 0x35 , 0x41 , 0x36 , 0x41 , 0x35 , 0xAF , 0x36 , 0x41 , 0x36 , 0xAE , 0x37 , 0x40,
  14. 0x36 , 0x40 , 0x36 , 0xAF , 0x36 , 0x3E , 0x39 , 0x07 , 0xDC , 0x36 , 0xB1 , 0x33 , 0x43 , 0x34,
  15. 0x40 , 0x36 , 0x40 , 0x34 , 0xB1 , 0x39 , 0x43 , 0x31 , 0x3E , 0x38 , 0x43 , 0x33 , 0x41 , 0x36,
  16. 0x40 , 0x36 , 0x41 , 0x36 , 0x40 , 0x36 , 0x3E , 0x39 , 0xB1 , 0x34 , 0x40 , 0x36 , 0x41 , 0x36,
  17. 0x40 , 0x33 , 0x43 , 0x36 , 0x3E , 0x36 , 0x43 , 0x36 , 0x41 , 0x36 , 0x40 , 0x36 , 0x41 , 0x33,
  18. 0x43 , 0x36 , 0x40 , 0x34 , 0x45 , 0x31 , 0x40 , 0x39 , 0x3E , 0x39 , 0x45 , 0x31 , 0xB2 , 0x30,
  19. 0xB7 , 0x31 , 0xAE , 0x36 , 0x0F , 0xB1 , 0x03 , 0x7F , 0x01 , 0xCC , 0x33 , 0x43 , 0x31 , 0x43,
  20. 0x36 , 0x40 , 0x36 , 0xAF , 0x36 , 0x41 , 0x33 , 0x46 , 0x33 , 0xAF , 0x36 , 0x40 , 0x36 , 0xAF,
  21. 0x33 , 0x46 , 0x34 , 0x40 , 0x36 , 0xB1 , 0x34 , 0x40 , 0x36 , 0x43 , 0x31 , 0x43 , 0x36 , 0x40,
  22. 0x37 , 0x40 , 0x36 , 0x40 , 0x37 , 0x40 , 0x36 , 0x40 , 0x34 , 0x43 , 0x35, 0xB0 , 0x36 , 0x40,
  23. 0x36, 0x40 , 0x36 , 0x41 , 0x36 , 0x40 , 0x34 , 0x45 , 0x34 , 0x45 , 0x32 , 0xB1 , 0x33 , 0xAF,
  24. 0x35, 0xB0 , 0x33 , 0x43 , 0x36 , 0x40 , 0x34 , 0xB4 , 0x33 , 0x41 , 0x36 , 0x07 , 0xD9 , 0x39,
  25. 0x42, 0x36 , 0x3C , 0x38 , 0x44 , 0x30 , 0x43 , 0x39 , 0x3C , 0x35 , 0x41, 0x38 , 0x44 , 0x33,
  26. 0x3E, 0x38 , 0x41 , 0x36 , 0x40 , 0x36 , 0x41 , 0x35 , 0x41 , 0x39 , 0x3B , 0x36 , 0x40 , 0x39,
  27. 0x40, 0x39 , 0x3B , 0x39 , 0x3E , 0x38 , 0x3E , 0x39 , 0x40 , 0x36 , 0x3E , 0x39 , 0x40 , 0x36,
  28. 0x40, 0x36 , 0x41 , 0x36 , 0x43 , 0x33 , 0x43 , 0x34 , 0x40 , 0x36 , 0x46 , 0x31 , 0x3E , 0x38,
  29. 0xAF, 0x36 , 0xAF , 0x36 , 0x40 , 0x36 , 0xAF , 0x33, 0xFF
  30. };
  31. //空调关的红外码
  32. const byte close_data[] =
  33. {
  34. 0xFE , 0xFD , 0x03 , 0x87 , 0x01 , 0xC1 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F,
  35. 0xA6 , 0x3F , 0x37 , 0x3F , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38,
  36. 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F,
  37. 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3F , 0x37 , 0x3F , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3E , 0x38,
  38. 0x3F , 0x07 , 0xD2 , 0x3F , 0xA6 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38,
  39. 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E,
  40. 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F , 0x38,
  41. 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0xA7 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0x0F , 0xA9 , 0x03 , 0x88 , 0x01 , 0xC0 , 0x3F , 0x38,
  42. 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0xA7 , 0x3E , 0x38 , 0x3F,
  43. 0x38 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38,
  44. 0x3F , 0x38 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3F,
  45. 0xA6 , 0x3E , 0xA7 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0xA6 , 0x3F , 0x38 , 0x3E , 0x07 , 0xD4 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E,
  46. 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38,
  47. 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F,
  48. 0x38 , 0x3E , 0x38 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0x37 , 0x3F , 0x38 , 0x3E , 0x38 , 0x3F , 0xA6 , 0x3F , 0xA6 , 0x3E , 0x38,
  49. 0x3F, 0x38 , 0x3E , 0xFF
  50. };
  51. void initWiFi()
  52. {
  53. WiFi.mode(WIFI_STA);// 设置STA模式
  54. WiFi.begin(ssid, passwd); //开始连接网络
  55. while (WiFi.status() != WL_CONNECTED)
  56. {
  57. Serial.print(".");
  58. delay(500);
  59. }
  60. Serial.println(WiFi.localIP() ); //打印ip地址
  61. delay(500);
  62. }
  63. void setup()
  64. {
  65. Serial.begin(115200); //设置波特率(和红外设相连接的波特率)
  66. initWiFi(); //初始化网络
  67. }
  68. void loop() {
  69. char cmd;
  70. // WiFiClient client = server.available();
  71. WiFiClient client = server.available(); //设置为服务端
  72. server.begin(); //服务初始化
  73. Serial.println(WiFi.localIP()); //打印IP
  74. while (client.connected()) //用来等待客户端连接
  75. {
  76. while (client.available() > 0)
  77. {
  78. cmd = client.read(); //从客户端读取数据
  79. // Serial.println(cmd);// 打印读取的数据
  80. if (cmd == '1')
  81. {
  82. Serial.write(open_data, (sizeof(open_data) / sizeof(open_data[0]))); //给红外设备发送打开码
  83. }
  84. else if (cmd == '2')
  85. {
  86. Serial.write(close_data, (sizeof(close_data) / sizeof(close_data[0]))); //给红外设备发送关码
  87. }
  88. }
  89. }
  90. }

(2)树莓派语音模块上,做一个TCP的客户端:

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<sys/types.h>
  4. #include<sys/socket.h>
  5. #include<netinet/in.h>
  6. #include<arpa/inet.h>
  7. #include<stdlib.h>
  8. #include<unistd.h>
  9. #include<wiringSerial.h>
  10. #include<unistd.h>
  11. #include<string.h>
  12. #include<wiringPi.h>
  13. int main(int argc, char **argv)
  14. {
  15. int s_fd;
  16. char buf[2] = {
  17. '\0'};
  18. char a='1'; // 与服务端指令一样
  19. char b='2';
  20. int fd;
  21. char cmd[128] = {
  22. '\0'};
  23. wiringPiSetup(); //硬件初始化
  24. fd = serialOpen("/dev/ttyAMA0",9600); //语音模块串口
  25. if(argc != 3)
  26. {
  27. printf("输入参数有错误\n");
  28. exit(0);
  29. }
  30. s_fd = socket(AF_INET,SOCK_STREAM,0);
  31. if(s_fd == -1)
  32. {
  33. printf("创建套接字对象失败\n");
  34. exit(-1);
  35. }
  36. struct sockaddr_in addr;
  37. memset(&addr,0,sizeof(struct sockaddr_in));
  38. addr.sin_family = AF_INET;
  39. addr.sin_port = htons(atoi(argv[2]));
  40. inet_aton(argv[1],&addr.sin_addr);
  41. if( connect(s_fd,(struct sockaddr *)&addr,sizeof(struct sockaddr)) == -1)
  42. {
  43. printf("连接wemose失败\n");
  44. exit(-1);
  45. }
  46. else
  47. {
  48. printf("连接成功\n");
  49. }
  50. while(1)
  51. {
  52. read(fd,cmd,sizeof(cmd)); //读取数据
  53. if(strstr(cmd,"open") != NULL)
  54. {
  55. printf("open sucess!\n");
  56. write(s_fd,&a,sizeof(char)); //发送开的红外码
  57. }
  58. if(strstr(cmd,"close") != NULL)
  59. {
  60. printf("close sucess!\n");
  61. write(s_fd,&b,sizeof(char)); //发送关的红外码
  62. }
  63. memset(cmd,'\0',sizeof(cmd)/sizeof(char));
  64. }
  65. return 0;
  66. }

到这里功能代码已经实现,硬件接好就可以实现功能,其他灯、电视原理基本相同,冲冲冲!!!

发表评论

表情:
评论列表 (有 0 条评论,363人围观)

还没有评论,来说两句吧...

相关阅读