使用ESP8266通过Blinker平台接入天猫精灵控制电视/空调

Nadia ·
更新时间:2024-11-13
· 722 次阅读

目录`演示视频`1.准备工作1.1 `原理`1.2 `使用的硬件以及硬件连接图`1.3 `开发环境准备`2.解码空调红外键值2.1 `把ESP8266红外接收的实例,上传到NodeMCU中`2.2 `读取红外键值`3. 配置Blinker App的UI界面4.Arduino程序的编写`4.1 控制逻辑``4.2 新建一个Arduino程序,编写控制逻辑`4.3 `上传程序到ESP8266`5.App控制6.天猫精灵控制`总结`

前言:在前面做了一个简易的远程空调控制器(点我查看),刚好现在家里有一个闲置的天猫精灵,于是乎就想让电视机也接入语音控制。在Blinker官网详细介绍了天猫精灵是如何接入的,有了前面简易远程空调控制器的制作基础,这个例程就很好做了。只需要就上几行简单的代码
备注:

Blinker官网:点我跳转 天猫精灵接入流程:点我跳转 演示视频

ESP8266接入天猫精灵控制电视机

1.准备工作 1.1 原理

----本实验的原理比较简单,使用Arduino开发软件的第三方库(IRremoteESP8266)的示例,读取空调/电视,红外遥控的原始数据,把需要控制的按键红外键值的原始数据保存到数组中(红外协议不同,原始数据的长度有差异)。

---- 把ESP8266接入Blinker(点灯科技),使用Blinker的app去配置UI界面,然后在Arduino开发软件编写简单的控制逻辑,通过app的按钮发送指定的红外指令或接受天猫精灵的指令,间接达到控制的目的。

1.2 使用的硬件以及硬件连接图 天猫精灵(方糖) ESP8266 NodeMCU 红外发射模块、红外接收模块(HX1838) 接收红外控制的电视机 电视机顶盒
备注:在这里说明一下,因为家里的电视是连接天猫魔盒的,因此如果想开启或关闭电视,必须同时打开/关闭电视和天猫魔盒(所以需要发送两个红外指令,在这里使用了两个红外发射管(非必须)。一个对准电视红外接收管,一个对准天猫精灵红外接收管)。
在这里使用的硬件很简单(红外接收头未给出)。如下所示:
在这里插入图片描述 1.3 开发环境准备 Arduino开发环境
安装地址:Arduino IDE

备注:安装1.8.7或更新版本,这个软件是免费使用的,直接在官网下载安装最新版本即可。

安装ESP8266的扩展
方法一:如果你的电脑能够科学上网的话,使用这个方法很简便,在首选项中输入一个网址,然后添加库即可。否则参考方法二。 启动Arduino并打开“首选项”窗口。 输入https://arduino.esp8266.com/stable/package_esp8266com_index.json
在这里插入图片描述 从工具>主板菜单打开Boards Manager并安装esp8266平台(安装后不要忘记从工具>主板菜单中选择ESP8266主板)。
在这里插入图片描述
方法二:下载打包的esp8266安装包,直接运行并解压即可。

链接:https://pan.baidu.com/s/1Eu0qhlP5xu6GgQMdwflfAw 提取码:3x1f

备注:如果安装过其他版本的esp8266sdk,请先删除,再使用本安装包,解压完成后,再打开Arduino IDE,即可在 菜单栏>工具>开发板 中找到你使用的esp8266开发板

安装 IRremoteESP8266 库
这个库中有关于ESP8266 接收红外解码,以及发送红外数据的函数。是这个例程的一个核心函数
安装方法:如果直接在Anduino IDE中安装,也是需要科学上网的,否则速度会很慢。
方法一:直接在IDE中安装
在这里插入图片描述
方法二:离线安装
下载IRremoteESP8266安装包

链接:https://pan.baidu.com/s/1RlHPts_dNj6MVR9pARxLuA 提取码:0n6t

下载完成之后,把它解压缩在项目文件夹的library文件夹中
项目文件夹在这里插入图片描述

安装blinker Arduino库
安装方法,同IRmoteESP8266库安装的方法二相同。

链接:https://pan.baidu.com/s/1k5tED9HxgiRaqNtKrTJcRg 提取码:87lw

安装后如下图所示:
在这里插入图片描述
安装成功之后重启Arduino软件,可以在示例的第三方库库中找到。
在这里插入图片描述

安装blinker APP Android下载:点我进入
或 在android应用商店搜索“blinker”下载安装 IOS下载:在app store中搜索“blinker”下载

小结:完成了准备工作之后,就可以进入下一步。可以使用 IRremoteESP8266的示例,对电视机的开关红外红外进行解码。

2.解码空调红外键值 2.1 把ESP8266红外接收的实例,上传到NodeMCU中 打开红外接收的示例
在这里插入图片描述 选择所使用的开发版和连接的COM口(根据实际情况选择)
在这里插入图片描述 把红外接收模块的数据段连接到GPIO14(Node MCU 对应D5引脚)

在这里插入图片描述

上传程序到 Node MCU 上
在这里插入图片描述 2.2 读取红外键值 打开Arduino 调试 串口监视器
在这里插入图片描述 电视遥控器对准红外接收管(这里以TCL电视和天猫精灵为准)
在这里插入图片描述 捕获红外键值
读取两个开关键(通过串口打印发现,无论是打开或者是关闭电视机/天猫魔盒,其发送的红外指令都是同样的)。
在串口中打印获取的rowData数据如下: /*电视电源*/ uint16_t tv_power[207] = {3976, 4024, 500, 2008, 498, 2006, 476, 2032, 476, 2030, 474, 1030, 476, 1030, 500, 2010, 476, 1030, 474, 2032, 478, 1030, 474, 2034, 498, 1006, 474, 1032, 474, 1032, 474, 1032, 474, 1030, 476, 2030, 476, 2032, 474, 1030, 500, 2010, 474, 1032, 474, 2032, 474, 1032, 476, 2028, 476, 8494, 3976, 4026, 500, 2006, 476, 2032, 476, 2030, 476, 2030, 476, 1032, 474, 1032, 476, 2032, 498, 1030, 450, 2034, 474, 1028, 476, 2034, 498, 1008, 498, 1008, 476, 1032, 472, 1032, 474, 1032, 474, 2032, 502, 2008, 474, 1030, 476, 2032, 500, 1030, 452, 2032, 474, 1030, 476, 2026, 498, 8476, 3972, 4024, 476, 2032, 476, 2032, 474, 2034, 472, 2056, 452, 1032, 474, 1056, 450, 2034, 500, 1030, 452, 2056, 450, 1032, 474, 2034, 472, 1056, 450, 1032, 474, 1056, 450, 1034, 472, 1034, 472, 2034, 500, 2006, 474, 1032, 496, 2012, 474, 1056, 448, 2058, 476, 1006, 474, 2028, 476, 8494, 3998, 4000, 474, 2036, 472, 2032, 474, 2056, 474, 2008, 474, 1056, 450, 1056, 448, 2036, 474, 1034, 472, 2036, 472, 1056, 450, 2036, 470, 1034, 472, 1058, 450, 1032, 474, 1032, 498, 1030, 450, 2032, 474, 2034, 498, 1032, 448, 2036, 472, 1058, 450, 2034, 478, 1054, 472, 2008, 472}; // NIKAI D5F2A /*天猫精灵电源*/ uint16_t timo_power[67] = {9010, 4476, 580, 552, 580, 554, 578, 550, 578, 552, 582, 552, 578, 554, 572, 558, 578, 552, 582, 1656, 582, 1656, 582, 1654, 580, 1658, 580, 1658, 580, 554, 578, 552, 578, 1660, 580, 1658, 580, 1656, 580, 1658, 584, 552, 578, 1658, 582, 552, 578, 1656, 582, 554, 576, 554, 580, 552, 578, 554, 580, 1658, 580, 552, 554, 1682, 582, 552, 580, 1658, 560}; // NEC F9EA15

备注:保存下来,待会程序中需要用到。

3. 配置Blinker App的UI界面 注册账号
使用手机号码即可注册账号。 添加设备->wifi接入–>得到产品密钥(Secret Key)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 修改设备名字和图标
在这里插入图片描述 编辑UI界面
在这里添加两个按钮即可,一个打开/关闭电视、一个打开/关闭空调。
在这里插入图片描述
设置按键属性
在这里插入图片描述
效果如下:
在这里插入图片描述
这样一来,简单的控制界面就设置好了。 4.Arduino程序的编写

具体如何编写Arduino程序,可以在Blinker官网中有介绍:点我查看

4.1 控制逻辑

控制的逻辑很简单,当Node MCU 连接上WiFi并显示在线状态时,通过按手机app上的按键。程序发送指令的红外指定达到控制电视的目的。还有就是天猫精灵的控制,当天猫精灵接受到指令,并在程序中解析之后,发送指定的红外指令达到控制电视的目的,后面详细介绍如何操作。
备注:在进行操作之前,先连接好红外发射模块所连接的IO口,在这里使用的是GPIO4(即Node MCU的 D2引脚)

4.2 新建一个Arduino程序,编写控制逻辑

新建一个文件->另存为mIRremote_control(程序名随意)
在这里插入图片描述
根据Blinker官网给出的接入天猫精灵的教程
在这里插入图片描述
直接贴上程序,程序比较简单且有注解:

//串口打印相关 #define BLINKER_PRINT Serial //Blinker使用wifi接入 #define BLINKER_WIFI //天猫精灵控制的为插座(单个) #define BLINKER_ALIGENIE_OUTLET //红外接收解析头文件 #include //红外发送头文件 #include //Blinker相关程序头文件 #include //这里输入自己的密钥,wifi账号密码(注意大小写)。 char auth[] = "*****"; char ssid[] = "*****"; char pswd[] = "*****"; //定义红外发射的管脚 const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2). //定义GPIO4的管脚为红外发射管脚 IRsend irsend(kIrLed); // Set the GPIO to be used to sending the message. /*电视电源红外原始数据*/ uint16_t tv_power[207] = {3976, 4024, 500, 2008, 498, 2006, 476, 2032, 476, 2030, 474, 1030, 476, 1030, 500, 2010, 476, 1030, 474, 2032, 478, 1030, 474, 2034, 498, 1006, 474, 1032, 474, 1032, 474, 1032, 474, 1030, 476, 2030, 476, 2032, 474, 1030, 500, 2010, 474, 1032, 474, 2032, 474, 1032, 476, 2028, 476, 8494, 3976, 4026, 500, 2006, 476, 2032, 476, 2030, 476, 2030, 476, 1032, 474, 1032, 476, 2032, 498, 1030, 450, 2034, 474, 1028, 476, 2034, 498, 1008, 498, 1008, 476, 1032, 472, 1032, 474, 1032, 474, 2032, 502, 2008, 474, 1030, 476, 2032, 500, 1030, 452, 2032, 474, 1030, 476, 2026, 498, 8476, 3972, 4024, 476, 2032, 476, 2032, 474, 2034, 472, 2056, 452, 1032, 474, 1056, 450, 2034, 500, 1030, 452, 2056, 450, 1032, 474, 2034, 472, 1056, 450, 1032, 474, 1056, 450, 1034, 472, 1034, 472, 2034, 500, 2006, 474, 1032, 496, 2012, 474, 1056, 448, 2058, 476, 1006, 474, 2028, 476, 8494, 3998, 4000, 474, 2036, 472, 2032, 474, 2056, 474, 2008, 474, 1056, 450, 1056, 448, 2036, 474, 1034, 472, 2036, 472, 1056, 450, 2036, 470, 1034, 472, 1058, 450, 1032, 474, 1032, 498, 1030, 450, 2032, 474, 2034, 498, 1032, 448, 2036, 472, 1058, 450, 2034, 478, 1054, 472, 2008, 472}; // NIKAI D5F2A /*天猫精灵电源原始数据*/ uint16_t timo_power[67] = {9010, 4476, 580, 552, 580, 554, 578, 550, 578, 552, 582, 552, 578, 554, 572, 558, 578, 552, 582, 1656, 582, 1656, 582, 1654, 580, 1658, 580, 1658, 580, 554, 578, 552, 578, 1660, 580, 1658, 580, 1656, 580, 1658, 584, 552, 578, 1658, 582, 552, 578, 1656, 582, 554, 576, 554, 580, 552, 578, 554, 580, 1658, 580, 552, 554, 1682, 582, 552, 580, 1658, 560}; // NEC F9EA15 // 新建Blinker组件对象(app上的按键) BlinkerButton Button3("btn-pwr2"); BlinkerButton Button4("btn-pwr3"); //天猫精灵插座的状态 bool oState = false; //天猫精灵电源的状态 void aligeniePowerState(const String & state) { BLINKER_LOG("need set power state: ", state); if (state == BLINKER_CMD_ON) { digitalWrite(LED_BUILTIN, HIGH); BlinkerAliGenie.powerState("off"); BlinkerAliGenie.print(); //打开电视和天猫魔盒 irsend.sendRaw(tv_power, 207, 38); // Send a raw data capture at 38kHz. Button3.print("电视机打开"); irsend.sendRaw(timo_power, 67, 38); // Send a raw data capture at 38kHz. Button4.print("天猫魔盒打开"); oState = true; } else if (state == BLINKER_CMD_OFF) { digitalWrite(LED_BUILTIN, LOW); BlinkerAliGenie.powerState("on"); BlinkerAliGenie.print(); //关闭电视和天猫魔盒 irsend.sendRaw(tv_power, 207, 38); // Send a raw data capture at 38kHz. Button3.print("电视机关闭"); irsend.sendRaw(timo_power, 67, 38); // Send a raw data capture at 38kHz. Button4.print("天猫魔盒关闭"); oState = false; } } //天猫精灵状态查询 void aligenieQuery(int32_t queryCode) { BLINKER_LOG("AliGenie Query codes: ", queryCode); switch (queryCode) { case BLINKER_CMD_QUERY_ALL_NUMBER : BLINKER_LOG("AliGenie Query All"); BlinkerAliGenie.powerState(oState ? "on" : "off"); BlinkerAliGenie.print(); break; case BLINKER_CMD_QUERY_POWERSTATE_NUMBER : BLINKER_LOG("AliGenie Query Power State"); BlinkerAliGenie.powerState(oState ? "on" : "off"); BlinkerAliGenie.print(); break; default : BlinkerAliGenie.powerState(oState ? "on" : "off"); BlinkerAliGenie.print(); break; } } void dataRead(const String & data) { BLINKER_LOG("Blinker readString: ", data); Blinker.vibrate(); uint32_t BlinkerTime = millis(); Blinker.print(BlinkerTime); Blinker.print("millis", BlinkerTime); } void setup() { Serial.begin(115200); #if defined(BLINKER_PRINT) BLINKER_DEBUG.stream(BLINKER_PRINT); #endif pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); Blinker.begin(auth, ssid, pswd); Blinker.attachData(dataRead); //注册回调函数/ Button3.attach(Button3_callback); Button4.attach(Button4_callback); //红外初始化 irsend.begin(); BlinkerAliGenie.attachPowerState(aligeniePowerState); BlinkerAliGenie.attachQuery(aligenieQuery); //注册心跳包 Blinker.attachHeartbeat(heartbeat); } void loop() { Blinker.run(); } //心跳包回调函数 void heartbeat() { if (oState){ Button3.print("on"); } else { BUILTIN_SWITCH.print("off"); } } //回调函数 void Button3_callback(const String &state) { BLINKER_LOG("get button state: ", state); //检测到btn-pwroff按钮按下 if (state == BLINKER_CMD_BUTTON_TAP) { Button2.print("电视机电源按下"); //串口打印 BLINKER_LOG("电视机电源", "按下"); //打开 irsend.sendRaw(tv_power, 207, 38); // Send a raw data capture at 38kHz. } } //回调函数 void Button4_callback(const String &state) { BLINKER_LOG("get button state: ", state); //检测到btn-pwroff按钮按下 if (state == BLINKER_CMD_BUTTON_TAP) { Button2.print("天猫魔盒按下"); //串口打印 BLINKER_LOG("天猫魔盒电源", "按下"); //打开 irsend.sendRaw(timo_power, 67, 38); // Send a raw data capture at 38kHz. } }

注意事项

1.设备密钥和wifi账号密码换成自己的
在这里插入图片描述
2.把读取的红外键值的rowDate数组换成自己需要控制的红外键值数组(数组名称可以随意,注意发送时的数据长度,这里是199)。
3.使用函数 irsend.sendRaw(power_off, 199, 38); 进行红外命令的发送,表示以38kHz的频率,发送power_off数组。数组长度为199.

4.3 上传程序到ESP8266

在这里插入图片描述
程序上传成功之后,复位Node MCU之后就可以开始使用Blinker App进行操作啦。(注意连接好红外发射的模块,引脚为GPIO4(D2))。

5.App控制

这个例程主要还是验证天猫精灵的控制方式,这里也简单说一个app的控制方式

打开 Blinker App
如果程序中设备密钥,以及Wifi账户密码无误的话,此时可以在app中看到设备的状态是在线的。
在这里插入图片描述
在这里插入图片描述 操作设备
点击电视开关按钮:如果有回调信息,说明红外命令成功发出,可以看到电视开启/关闭。
在这里插入图片描述
通过这个app即可实现电视的控制,当时这个不是最终的目的,还需要把它接入天猫精灵呢。 6.天猫精灵控制

在这里插入图片描述
步骤详情
在这里插入图片描述
返回设备界面之后,就可以看到已经绑定的Blinker设备啦。
在这里插入图片描述
此时,如果你的天猫精灵正常联网,对着天猫精灵说:

我: 天猫精灵,打开客厅的插座。 天猫精灵: 插座已打开,注意操作哦
我:天猫精灵,关闭客厅的插座。天猫精灵:已为您关闭客厅的插座。

咦,但是我们控制的电视机啊,叫插座好像有点low吧。好吧,在天猫精灵app中可以对设备进行别名操作,当我们呼叫天猫精灵的别名时也可以对设备进行操作。
我把这个设备重命名为 电视机(我也想命名为“电视”,但是提示这个别名已经存在,应该是官方的限制吧或者是一个bug)

别名修改
在这里插入图片描述
修改别名了之后,就可以对天猫精灵说:天猫精灵,打开电视机,此时,天猫精灵就会帮你打开电视机啦。 总结

到这里这个例程就结束了,其实这个只是做一个抛砖引玉的作用,通过小小的例子,就可以扩展出很多东西,比如空调的控制,或任何需要红外控制的地方。因为IRremoteESP8266红外解码的示例可以支持解析很多种红外协议,有了这个实例,我们并不需要去关心不同红外信号的协议,只需要读取红外键值的原生数据,然后把相同的红外数据发出即可。


作者:冷暖自知_源



电视 天猫精灵 esp8266 天猫 esp

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章