从零开始使用ESP8266 + Blinker 实现小爱同学可控可读取状态的多路插座
前言
一直对8266很感兴趣,放寒假嘛,也挺闲,刚好手头有原来买下的Nodemcu,就拿来做个多路开关
参考资料我会放到文章末尾
(渣渣新手练手的小东西,求大佬指导)
一.准备
1.硬件
nodemcu(ESP-12E)
双路光耦继电器
2.用到的开发软件
Arduino IDE
Blinker APP
3.小爱同学(我使用的是一个小爱闹钟)
4.准备环境
5.你自己 Ciallo~(∠・ω< )⌒★
二.安装相关Arduino库&申请Blinker Secret Key
1.安装相关库
esp8266 SDK -由于国内众所周知的原因,使用IDE直接安装不太可靠,你可以点击这里查看国内安装ESP8266 SDK的方法
Blinker Arduino库-你可以从Blinker官方文档-ESP8266&WIFI接入获取下载地址以及方法
2.申请Secret Key
打开Blinker APP,点击右上角的 “+”
选择独立设备
选择WiFi接入
通信服务商选择阿里云
复制Key
以下为流程图:
三.连接线路
1.继电器相关
在正式开始编程前,我们需要先了解一下继电器模块的模块参数以及说明
2.Nodemcu相关
通过查阅资料可以了解到Nodemcu在编程时可以直接使用PCB上的丝印来表示IO口
3.链接
GND-GND
IN1-D5
IN2-D6
VCC-VV (由开发板提供5V)
四.编写程序&烧写程序
1.源码
/* ******************************************************************* Download latest Blinker library here:* /blinker-iot/blinker-library/archive/master.zip* * * Blinker is a cross-hardware, cross-platform solution for the IoT. * It provides APP, device and server support, * and uses public cloud services for data transmission and storage.* It can be used in smart home, data monitoring and other fields * to help users build Internet of Things projects better and faster.* * Make sure installed 2.7.4 or later ESP8266/Arduino package,* if use ESP8266 with Blinker.* /esp8266/Arduino/releases* * Make sure installed 1.0.4 or later ESP32/Arduino package,* if use ESP32 with Blinker.* /espressif/arduino-esp32/releases* * Docs: https://diandeng.tech/doc* * * ****************************************************************** * Blinker 库下载地址:* /blinker-iot/blinker-library/archive/master.zip* * Blinker 是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、* 服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、* 数据监测等领域,可以帮助用户更好更快地搭建物联网项目。* * 如果使用 ESP8266 接入 Blinker,* 请确保安装了 2.7.4 或更新的 ESP8266/Arduino 支持包。* /esp8266/Arduino/releases* * 如果使用 ESP32 接入 Blinker,* 请确保安装了 1.0.4 或更新的 ESP32/Arduino 支持包。* /espressif/arduino-esp32/releases* * 文档: https://diandeng.tech/doc* * * ******************************************************************** -使用ESP8266控制双路光耦继电器,可接入小米小爱,通过小爱控制&查询当前状态-** by Tracker* My blog:https://baichuan2077.top* *****************************************************************/#define BLINKER_WIFI#define BLINKER_MIOT_MULTI_OUTLET#include <Blinker.h>//继电器控制口int relay1 = D5;int relay2 = D6;bool oState[5] = {false }; //检测用char auth[] = "申请到的密匙";char ssid[] = "SSID";char pswd[] = "密码";// 新建组件对象BlinkerButton Button1("btn-1");BlinkerButton Button2("btn-2");// 按下按键1即会执行该函数void button1_callback(const String & state){BLINKER_LOG("get button1 state: ", state);digitalWrite(relay1, !digitalRead(relay1));//oState[1] = !(oState[1]);}// 如果未绑定的组件1被触发,则会执行其中内容void dataRead1(const String & data){BLINKER_LOG("Blinker readString: ", data);}// 按下按键2即会执行该函数void button2_callback(const String & state){BLINKER_LOG("get button2 state: ", state);digitalWrite(relay2, !digitalRead(relay2));//oState[2] = !(oState[2]);}// 如果未绑定的组件2被触发,则会执行其中内容void dataRead2(const String & data){BLINKER_LOG("Blinker readString: ", data);}void miotPowerState(const String & state, uint8_t num) //relay继电器电源状态{BLINKER_LOG("need set power state: ", state,"num-back", num);unsigned char i = 0; //初始化if(num == 1){i = relay1;}else if(num == 2){i = relay2;}if (state == BLINKER_CMD_ON) {digitalWrite(i, HIGH);BlinkerMIOT.powerState("on");BlinkerMIOT.print();digitalWrite(i, !digitalRead(i));oState[num] = true;}else if (state == BLINKER_CMD_OFF) {digitalWrite(i, LOW);BlinkerMIOT.powerState("off");BlinkerMIOT.print();digitalWrite(i, !digitalRead(i));oState[num] = false;}}void miotQuery(int32_t queryCode, uint8_t num){BLINKER_LOG("AliGenie Query outlet: ", num,", codes: ", queryCode);switch (queryCode){case BLINKER_CMD_QUERY_ALL_NUMBER :BLINKER_LOG("MIOT Query All");BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);BlinkerMIOT.print();break;case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :BLINKER_LOG("MIOT Query Power State");BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);BlinkerMIOT.print();break;default :BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);BlinkerMIOT.print();break;}}void setup(){// 初始化串口Serial.begin(115200);BLINKER_DEBUG.stream(Serial);BLINKER_DEBUG.debugAll();// 初始化IOpinMode(relay1, OUTPUT);digitalWrite(relay1, HIGH);pinMode(relay2, OUTPUT);digitalWrite(relay2, HIGH);// 初始化blinkerBlinker.begin(auth, ssid, pswd);Blinker.attachData(dataRead1); //获取1Blinker.attachData(dataRead2); //获取2Button1.attach(button1_callback); //按钮1Button2.attach(button2_callback); //按钮2BlinkerMIOT.attachPowerState(miotPowerState); //注册电源函数1BlinkerMIOT.attachQuery(miotQuery); //注册回调函数}void loop() {Blinker.run();}
2.烧录相关
开发板选择NodeMCU V1.0(ESP-12E Module)
其余保持默认即可
五.Blinker App &小爱绑定第三方设备
1.Blinker App配置相关
我在编写时添加了APP内的按钮控制,所以你也可以通过App来手动控制继电器通路状态
2.小米小爱绑定第三方设备
以我的小爱闹钟为例:
米家-我的-其他平台设备-右上角“添加”-选择“点灯科技”-绑定账户并同步设备
总结一下
最后我们可以通过小爱同学来控制插孔 以及查询插孔状态,还可以通过Blinker App来控制开关
语音指令例:
-打开插座插孔一
-插座插孔二的状态
由于我手头只有双路继电器,并不能展示更多路的控制
欢迎来我的博客玩 Ciallo~(∠・ω< )⌒★
My blog:https://baichuan2077.top/
使用到的参考资料:
点灯科技官方开发文档
nodeMCU 1.0简要数据手册
Arduino论坛参考帖-【智能取暖器DIY】ESP32+blinker接入小爱同学语音控制
Arduino论坛参考帖-小爱同学+Blinker如何控制多个继电器?
Blinker官方例程-MIOT_MULTI_OUTLET.ino
如果觉得《从零开始使用ESP8266 + Blinker 实现小爱同学可控可读取状态的多路插座》对你有帮助,请点赞、收藏,并留下你的观点哦!