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

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

  • 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 :

树莓派语音+红外模块实现智能家居实践_第1张图片

(2)语音模块

树莓派语音+红外模块实现智能家居实践_第2张图片

(3)红外模块(某宝购的,需要的可去某宝买)

树莓派语音+红外模块实现智能家居实践_第3张图片

(4)WeMose板

树莓派语音+红外模块实现智能家居实践_第4张图片

(5)本次以空调作为例子:

树莓派语音+红外模块实现智能家居实践_第5张图片

2、需要用到的软件平台:

(1)arduino开发环境

树莓派语音+红外模块实现智能家居实践_第6张图片

(2)树莓派系统

树莓派语音+红外模块实现智能家居实践_第7张图片

(3)串口助手调式

树莓派语音+红外模块实现智能家居实践_第8张图片

3、红外解码过程:

(1)连接红外设备(连接TTL串口):

树莓派语音+红外模块实现智能家居实践_第9张图片

将TTL串口USB插入电脑,打开串口调试助手,设置好波特率和端口号,安装更新好USB驱动!!!

(2)通过串口助手获取红外码(这里以格力空调为例)

树莓派语音+红外模块实现智能家居实践_第10张图片

将获取的红外码,复制重新发送,检查是否为相对应的开关码,看是否功能正常:

树莓派语音+红外模块实现智能家居实践_第11张图片

大家根据自己买来的红外设备(搭配有送设备手册),根据手册来基础功能设置,根据自己买的红外设备手册为准

4、以树莓派与WeMose板通信实现:

(1)以TCP通讯方式,在WeMose上实现服务端:

#include
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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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;
}

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

你可能感兴趣的:(树莓派,linux,物联网)