浏览量: 520 次浏览

利用红外无线控制空调

2020年2月4日 4 作者 Nie Hen

对于空调的控制 一般都是红外控制。这样我们就可以将esp模块和红外模块联合使用
这样来对空调进行远程的无线的控制

演示视频:

红外接收

TIM图片20190511141512
使用的是引脚11 使用波特率是9600
调用的IRremote库,将接收到的光信号转换为数值。


\#include <IRremote.h> int PIN_RECV = 11; IRrecv irrecv(PIN_RECV); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value); irrecv.resume(); } }

可以根据这个代码 来获取到 遥控器上相关按键的值
记录下来 用到下面进行发送

(在我的这个项目中 我是要演示效果,所以控制的是一个数码管 使用arduino pro mini 进行控制 通过红外接收 接收到的信息 处理后控制TM1637数码管进行显示)

红外发送

下列代码经过改造,是使用在要红外控制显示。思路是一样的
就是使用 sendNEC(); 函数发送值,可以发送十六进制的值或者十进制等。

代码网上很多
也可以参考我博客上

arduino控制红外接收,发送

使用esp开发

发送给esp相应的指令 进入callback函数中进行解析
解析之后 控制红外发送,发送相应的码段

使用的esp12f GPIO4引脚
使用到的库有
<IRremoteESP8266.h>
<IRsend.h> // 红外发送的库
<ESP8266WiFi.h>
<PubSubClient.h> // mqtt 的库

  1. 制定发送和接收的规则
    >char* order_infor[] ={“on”,”off”,”tema”,”tems”,”warm”,”cold”,”winda”,”winds”}; // 控制的温度
    long enc[] ={0xFF30CF,0xFF18E7,0xFF7A85,0xFF10EF,0xFF38C7,0xFF5AA5,0xFF42BD,0xFF4AB5};//发射的红外 十六进制值

接收到0(打开) 发送第一个编码 接收到1 (关闭) 发送第二个编码…..
2. callback中处理 接收到的值(防止出现错误的命令)

 int isint = 0;// 如果有字母 就为1 全数字就为0
    for (int i=0; i< strplayload.length();i++)  // 检测接收到的命令里面是否含有 非数字的字符
  {
    if (!isDigit(strplayload[i]))
    {
      isint = 1;
      break;
      }
    }
  1. 根据callback处理的结果 进行发送 (callback中代码)
 if(isint == 0){
      int older_air = strplayload.toInt() ; // 转换为 int类型
        if(older_air >=1 && older_air<=8){
          irsend.sendSony(enc[older_air - 1], 12);
          client.publish("air_cond/status", "IR remote is running");
          client.publish("air_cond/status", order_infor[older_air -1]);
        }

代码

esp8266 mqtt使用arduino 开发

esp8266 mqtt 使用arduino开发教程

esp8266-12f使用介绍

esp8266-12f介绍与使用

完整代码仅供参考
根据自己的应用场景 再进行相应的更改代码


\#include <IRremoteESP8266.h> #include <IRsend.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> // Update these with values suitable for your network. const char* ssid = "nihen_pc"; const char* password = "#"; const char* mqtt_server = "192.168.137.41"; WiFiClient espClient; PubSubClient client(espClient); long lastMsg = 0; char msg[50]; int value = 0; String tmpTopic; String strplayload; #define IR_LED 4 // ESP8266 GPIO pin to use. Recommended: 4 (D2). IRsend irsend(IR_LED); // Set the GPIO to be used to sending the message. char* order_infor[] ={"on","off","tema","tems","warm","cold","winda","winds"}; // 控制的温度 long enc[] ={0xFF30CF,0xFF18E7,0xFF7A85,0xFF10EF,0xFF38C7,0xFF5AA5,0xFF42BD,0xFF4AB5};//发射的红外 十六进制值 void setup() { //pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); irsend.begin(); // Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY); } void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { tmpTopic = String((char *)topic); payload[length] = '\0'; strplayload = String((char*)payload); client.publish("mp3player/status", "get older "); int isint = 0;// 如果有字母 就为1 全数字就为0 for (int i=0; i< strplayload.length();i++) // 检测接收到的命令里面是否含有 非数字的字符 { if (!isDigit(strplayload[i])) { isint = 1; break; } } if(isint == 0){ int older_air = strplayload.toInt() ; // 转换为 int类型 if(older_air >=1 && older_air<=8){ irsend.sendSony(enc[older_air - 1], 12); client.publish("air_cond/status", "IR remote is running"); client.publish("air_cond/status", order_infor[older_air -1]); } } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); if (client.connect(clientId.c_str())) { Serial.println("connected"); client.publish("air_cond/status", "init..."); // ... and resubscribe client.subscribe("air_cond/older"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }