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

导读:本篇文章讲解 树莓派语音+红外模块实现智能家居实践,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

#include<ESP8266WiFi.h>
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的客户端:

#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<wiringSerial.h>
#include<unistd.h>
#include<string.h>
#include<wiringPi.h>
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;
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/68462.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!