树莓派(TCP客户端 )和Wemos(TCP服务端&连接红外模块)通讯实现对红外设备的控制
Posted 行稳方能走远
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派(TCP客户端 )和Wemos(TCP服务端&连接红外模块)通讯实现对红外设备的控制相关的知识,希望对你有一定的参考价值。
摘自:U如何用树莓派连接语音模块,红外模块来控制红外设备详解
作者:一只青木呀
发布时间:2020-08-12 17:14:10
网址:https://blog.csdn.net/weixin_45309916/article/details/107960066
硬件
1.USB转TTL串口
2.WomosD1开发板
3.树莓派开发板
4.红外模块
5.红外设备(如:红外灯)
软件
1 . arduino开发环境
2 .树莓派系统
3 .串口调试小助手
红外解码
思路:利用红外码控制红外家电
1.连接红外设备(与TTL串口相连)
把TTL插入到电脑USB接口,打开串口调试小助手,波特率等信息都要设置好,USB驱动装好。
2.获取开关红外电器的码
用遥控器对着红外工具按键,会返回相对应的码,一般商家都会有详细的资料可以翻阅。
有些红外设备还需要特定的格式,这里参考自己买的红外设备的资料为准。
然后按照特定的格式发回去,一定要按照16进制发送,红外设备对准红外电器,看是否有反应。
树莓派和Wemos通信
这里我们通信使用TCP通讯方式,在Wemos开启TCP的服务端,树莓派写一个TCP的客户端。
Wemos TCP服务端
#include <ESP8266WiFi.h> //WIFI头文件
char ssid[] = "muqiao"; //自己家的WIFI账号
char passwd[] = "987654321"; //WIFI密码
const byte data_off[] =
{
0xA1,0xF1,0x80,0x7F,0x01 //灯的开关码 一般开和关的码一致
};
const byte data_on[] =
{
0xA1,0xF1,0x80,0x7F,0x01
};
void initWifiSta()
{
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);
}
int port = 8888; //端口号
WiFiServer server(port); // 设置服务器端口号
void setup()
{
Serial.begin(9600); //设置波特率(和红外设相连接的波特率)
initWifiSta();
/* while(!Serial) //串口未成功则循环等待
{
delay(1000); // 延迟1秒
}
Serial.println("串口启动成功"); //通知串口
*/
}
void loop() {
/*
if(Serial.available()) //是否有数据传入 (数据只会一个一个读取)
{
Serial.write(Serial.read()); //串口接收后再串口发送/输出数据
// ESP.restart(); // 重启设备
}
*/
WiFiClient client = server.available(); //设置为服务端
server.begin();//服务初始化
Serial.println(WiFi.localIP()); //打印IP
while (client.connected()) //等待客户端的连接
{
while (client.available() > 0) {
char cmd = client.read(); //从客户端读取数据
Serial.println(cmd); //打印读取的数据
if(cmd=='1')
{
// Serial.println("recv 1");
Serial.write(data_on,(sizeof(data_on) / sizeof(data_on[0]))); //给红外设备发送开灯码
}
else if(cmd=='2')
{
// Serial.println("close light\\r\\n");
Serial.write(data_off,(sizeof(data_off) / sizeof(data_off[0])));//给红外设备发送关灯码 其实是一样的 嘻嘻嘻
}
}
}
}
树莓派TCP客户端
#include<netinet/in.h>
#include <arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char **argv){
char readbuf[2];
char ch[128];
if (argc!=3)
{
printf("input not good\\n");
exit(-1);
}
int fd_a;
int s_fd=socket(AF_INET, SOCK_STREAM,0);//配置通信模式
if (s_fd==-1)
{
perror("socket");
exit(-1);
}
struct sockaddr_in addr;
struct sockaddr_in addr1;
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)//连接wemos版
{
perror("connect");
exit(-1);
}else
{
printf("connect success\\n");
}
while(1){
printf("请输入发送的指令\\n"); //发送的数据和wemos判断相结合哦
gets(readbuf);
puts(readbuf);
write(s_fd,readbuf,strlen(readbuf));//向wemos版发送信息
}
return 0;
}
走到这里已经差不多了,通信就解决了。语音模块的话根据自己的语音模块代码进行修改。
以上是关于树莓派(TCP客户端 )和Wemos(TCP服务端&连接红外模块)通讯实现对红外设备的控制的主要内容,如果未能解决你的问题,请参考以下文章