ESP8266 +Blinker 遥控空调-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 17021|回复: 36

[分享] ESP8266 +Blinker 遥控空调

[复制链接]
发表于 2020-9-6 16:06 | 显示全部楼层 |阅读模式
本帖最后由 王尼玛1 于 2020-9-7 21:10 编辑
一.软件准备
     IRremoteESP8266库文件githup链接:https://github.com/crankyoldgit/IRremoteESP8266
       Blinker库文件   链接: https://github.com/blinker-iot/blinker-library
       下载好解压后复制文件到Arduino安装目录下的library文件夹里
二.硬件方面:
  • 一块ESP8266开发版,nodeMUC 和 esp01 都行,推荐用nodemcu
  • 5mm红外发射二极管(最好多准备几个)
  • 100欧母电阻诺干
  • 杜邦线诺干
  • 一个NPN三极管(官方推荐的是2N3904,我用的是9013)
三.电路链接
  1.如果用的是nodemuc:
C${O]Z1GX1B77~HQDV)J@Y5.png
图中 红色LED表示红外二极管,这个限流电阻的大小理论10-100欧都行
     2.如果的是ESP-01 需要把三极管的基极接到RX引脚也就是GPIO3,其他的连接不变。这里要注意在写代码的时候得加上 pinMode(3,OUTPUT);  (不接GPIO0和GPIO2是因为这两个             脚 不稳定)
四.代码编写
这里以我家里的空调为例,其他品牌的写法大致相同,我的是美的,在这之前先看看这个库文件都支持操作哪些牌子的空调  https://github.com/crankyoldgit/IRremoteESP8266/blob/master/SupportedProtocols.md
  接下来打开Arduino IDE,一次点击 文件 --> 示例 --> IRremoteESP8266 --> TurnOnGreeAC  如图
C~Q]LOLX}S09UVO((TWTR2C.png
这个是格力空调的示例;打开后的程序一般只要修改头文件和类名就可测试程序,比如我的是美的空调,把  #include <ir_Gree.h> 改为 include <ir_Midea.h> ,再把  IRGreeAC ac(kIrLed);  改为 IRMideaAC ac(kIrLed); 就可以了,这个头文件的具体名字可以在Arduino的安装目录下libraries --> IRremoteESP826 --> src   这里有所有支持的源代码文件
这里还有一种情况可能不能成功,还是以我的空调为例,我的是美的,修改头文件和类名上传程序后,对着空调测试并没有反应,刚开始以为是发射管功率太小,距离太远空调没接收到,然后我把接在发射管的限流电阻拿掉,但还是没反应,发射管还烧了三个。。。。最后怀疑发射管的发出的命令可能不对。解决的办法是用一个红外接收模块来测试,如图:
1599373698(1).png
将信号端接到NODEMCU的D5脚,然后打开ArduinoIDE --> 文件 --> 示例 --> IRremoteESP8266 --> IRrecvDumpV2 上传后打开串口监视器,波特率改为115200;然后拿空调的遥控器对着外接收模块,按下遥控器的任意按键,看串口监视器的输出信息,我的是这样.
1599375587(1).png
百度 COOLIX ,原来这是美的在德国的牌子,再去Arduino的安装目录下libraries --> IRremoteESP826 --> src 这里找,果然有相关的头文件;如图
1599375854(1).png
然后在回到的那个格力空调的示例程序 ,把  #include <ir_Gree.h> 改为 include <ir_Coolix.h> ,再把  IRGreeAC ac(kIrLed);  改为 IRCoolixAC ac(kIrLed); 上传,这时空调就有反应了
可以打开相关的头文件和cpp文件看具体提有哪些方法,通常使用的就这些:
  • void begin();           //初始化空调对象 ac.begin(); 放在setup()里就好
  • void on();                 // 打开空调 ac.on()
  • void off();                 //关闭空调 ac.off();
  • bool getPower();     //查询调是否开启,返回布尔值,返回为值为true表示空调开启
  • void setMode(const uint8_t mode);  //设置空调模式,具体参数得看cpp文件,
  • void setTemp(const uint8_t temp);   //设置温度,参数范围是16 - 30
  • void setFan(const uint8_t speed, const bool modecheck = true); //设置分速,参数一般是(1-5)
其他还有很多方法,这里就先不讲了;有关Blinker的部分我这里就不在详细说明,我还加了DHT11来测房间的温度,这里看下的我界面,
331a523bf1c59109ad3bf97e69a173c.jpg
最后,我的所有代码,可以参考一下  https://gitee.com/yym001/blinker ... ob/master/Midea.ino

程序还有很多地方可以完善
发表于 2020-9-30 08:54 | 显示全部楼层
王尼玛1 发表于 2020-9-29 16:49
这个我上面有说的,用美的  的 空调没有反应,后来查出来是COOLIX 这个,这其实也是美的 的一个品牌 ...

你上面说的是你美的的空调,用的格力的头文件改成美的的,但是库里直接就有美的的头文件啊!你没有说库里的美的的头文件能不能用啊!
 楼主| 发表于 2020-9-7 22:26 | 显示全部楼层
本来想再写Blinker的内容的,但太多了。。。
发表于 2020-9-16 10:37 | 显示全部楼层
先支持再慢慢学习
 楼主| 发表于 2020-9-17 13:19 | 显示全部楼层
shouji6406 发表于 2020-9-16 10:37
先支持再慢慢学习

进收藏夹吃灰(手动狗头)
发表于 2020-9-29 16:11 | 显示全部楼层
有个疑问:既然你是美的的空调,那为什么不用美的的头文件和类名呢?
 楼主| 发表于 2020-9-29 16:49 | 显示全部楼层
han_sir 发表于 2020-9-29 16:11
有个疑问:既然你是美的的空调,那为什么不用美的的头文件和类名呢?

这个我上面有说的,用美的  的 空调没有反应,后来查出来是COOLIX 这个,这其实也是美的 的一个品牌
发表于 2020-9-30 11:41 | 显示全部楼层

代码给你们搬过来




  1. #define BLINKER_WIFI
  2. #define BLINKER_ESP_SMARTCONFIG
  3. #define IRPIN   3    //红外二极管引脚
  4. #define DHTPIN  2   //DHT11引脚
  5. #define DHTTYPE   DHT11 //DHT类型,我用的是DHT11

  6. #define Slider_1 "ran-6i6" //温度滑动条
  7. #define Slider_2 "ran-z8p" //风速滑动条

  8. #define BUTTON_1 "btn-8bg" //电源按键
  9. #define BUTTON_2 "btn-doa" //自动按键
  10. #define BUTTON_3 "btn-gvv" //制冷按键
  11. #define BUTTON_4 "btn-kop" //制热按键

  12. #include <Blinker.h>
  13. #include <ESP8266WiFi.h>
  14. #include <IRremoteESP8266.h>
  15. #include <IRsend.h>  
  16. #include <DHT.h>

  17. //根据你的空调牌子更改头文件,头文件在你的Arduino安装目录下的 libraries ->  IRremoteESP8266 -> src
  18. //例如你的是美的 的 就放 美的 的头文件
  19. #include <ir_Coolix.h>     //这是美的在德国的一个牌子

  20. IRCoolixAC Midea(IRPIN);  //实例化一个空调对象

  21. BlinkerButton Button1(BUTTON_1);
  22. BlinkerButton Button2(BUTTON_2);
  23. BlinkerButton Button3(BUTTON_3);
  24. BlinkerButton Button4(BUTTON_4);
  25. BlinkerSlider Slider1(Slider_1);
  26. BlinkerSlider Slider2(Slider_2);
  27. BlinkerNumber HUMI("num-2yc");
  28. BlinkerNumber TEMP("num-2cz");

  29. DHT dht(DHTPIN, DHTTYPE);

  30. char auth[] = "**************"; //你的设备密钥
  31. float humi_read, temp_read;
  32. uint32_t read_time = 0;
  33. int32_t tem_value;
  34. int32_t fan_value;
  35. /* 电源按键按下时的回调函数 */
  36. void button1_callback(const String & state)
  37. {
  38.    
  39.     BLINKER_LOG("get button state: ", state);

  40.       if (state == BLINKER_CMD_ON) {
  41.         BLINKER_LOG("Toggle on!");
  42.         Midea.on();
  43.         Midea.send();
  44.         Button1.color("#FF0000");
  45.         Button1.print("on");
  46.     }
  47.    if (state == BLINKER_CMD_OFF) {
  48.         BLINKER_LOG("Toggle off!");
  49.         Midea.off();
  50.         Midea.send();
  51.         Button1.color("#000000");
  52.         Button1.print("off");
  53.     }
  54. }

  55. /* 自动按键按下时的回调函数 */
  56. void button2_callback(const String & state)
  57. {
  58.   Midea.setMode(2);
  59.   Midea.send();
  60.   Button2.color("#FF0000");
  61.   Button2.print();
  62.   Button3.color("#000000");
  63.   Button3.print();
  64.   Button4.color("#000000");
  65.   Button4.print();
  66. }
  67. /* 制冷按键按下时的回调函数 */
  68. void button3_callback(const String & state)
  69. {
  70.   Midea.setMode(0);
  71.   Midea.send();
  72.   Button3.color("#0000FF");
  73.   Button3.print();
  74.   Button2.color("#000000");
  75.   Button2.print();
  76.   Button4.color("#000000");
  77.   Button4.print();
  78. }
  79. /* 制热按键按下时的回调函数 */
  80. void button4_callback(const String & state)
  81. {
  82.   Midea.setMode(3);
  83.   Midea.send();
  84.   Button4.color("#FF0000");
  85.   Button4.print();
  86.   Button2.color("#000000");
  87.   Button2.print();
  88.   Button3.color("#000000");
  89.   Button3.print();

  90. }


  91. /* 滑动温度滑动条时 执行的函数 */
  92. void slider1_callback(int32_t value)
  93. {
  94.     BLINKER_LOG("get slider value: ", value);
  95.     tem_value = value;
  96.     Midea.setTemp(value);
  97.     Midea.send();
  98. }
  99. /* 滑动风速滑动条时 执行的函数 */
  100. void slider2_callback(int32_t value)
  101. {
  102.     BLINKER_LOG("get slider value: ", value);
  103.     fan_value = value;
  104.     Midea.setFan(value-1);
  105.     Midea.send();
  106. }

  107. void dataRead(const String & data)
  108. {
  109.     BLINKER_LOG("Blinker readString: ", data);

  110.     Blinker.vibrate();
  111.    
  112.     uint32_t BlinkerTime = millis();
  113.    
  114.     Blinker.print("millis", BlinkerTime);
  115. }

  116. /*心跳包函数*/
  117. void heartbeat()
  118. {
  119.   bool flag = Midea.getPower();
  120.      if(flag) {  Button1.color("#FF0000"); Button1.print("on"); }
  121.      else {Button1.color("#000000"); Button1.print("on");}
  122.     HUMI.print(humi_read);
  123.     TEMP.print(temp_read);
  124.     Slider1.color("#FFD700");
  125.     Slider1.print(tem_value);
  126.     Slider2.color("#FFD700");
  127.     Slider2.print(fan_value);
  128. }

  129. void setup() {
  130.   Midea.begin();
  131.   Serial.begin(115200);
  132.   BLINKER_DEBUG.stream(Serial);
  133.   pinMode(IRPIN,OUTPUT);
  134.   pinMode(DHTPIN,INPUT);
  135.   digitalWrite(IRPIN,LOW);
  136.    
  137.   Blinker.begin(auth);
  138.   Blinker.attachData(dataRead);
  139.   Blinker.attachHeartbeat(heartbeat);
  140.   Button1.attach(button1_callback);
  141.   Button2.attach(button2_callback);
  142.   Button3.attach(button3_callback);
  143.   Button4.attach(button4_callback);
  144.   
  145.   
  146.   Slider1.attach(slider1_callback);
  147.   Slider2.attach(slider2_callback);
  148. }


  149. void loop() {
  150.   
  151.   Blinker.run();
  152.       if (read_time == 0 || (millis() - read_time) >= 2000)
  153.     {
  154.         read_time = millis();

  155.         float h = dht.readHumidity();
  156.         float t = dht.readTemperature();        

  157.         if (isnan(h) || isnan(t)) {
  158.             BLINKER_LOG("Failed to read from DHT sensor!");
  159.             return;
  160.         }

  161.         float hic = dht.computeHeatIndex(t, h, false);

  162.         humi_read = h;
  163.         temp_read = t;
  164.     }
  165.   
  166. }
复制代码
发表于 2020-10-11 19:10 | 显示全部楼层
请问IRremoteESP8266库文件 有功能说明吗?
 楼主| 发表于 2020-10-12 14:08 | 显示全部楼层
13149848844 发表于 2020-10-11 19:10
请问IRremoteESP8266库文件 有功能说明吗?

https://crankyoldgit.github.io/IRremoteESP8266/doxygen/html/

就是都是英文的.....
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 01:45 , Processed in 0.294502 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表