从零开始使用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:
* https://github.com/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.
* https://github.com/esp8266/Arduino/releases
*
* Make sure installed 1.0.4 or later ESP32/Arduino package,
* if use ESP32 with Blinker.
* https://github.com/espressif/arduino-esp32/releases
*
* Docs: https://diandeng.tech/doc
*
*
* *****************************************************************
*
* Blinker 库下载地址:
* https://github.com/blinker-iot/blinker-library/archive/master.zip
*
* Blinker 是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、
* 服务器端支持,使用公有云服务进行数据传输存储。可用于智能家居、
* 数据监测等领域,可以帮助用户更好更快地搭建物联网项目。
*
* 如果使用 ESP8266 接入 Blinker,
* 请确保安装了 2.7.4 或更新的 ESP8266/Arduino 支持包。
* https://github.com/esp8266/Arduino/releases
*
* 如果使用 ESP32 接入 Blinker,
* 请确保安装了 1.0.4 或更新的 ESP32/Arduino 支持包。
* https://github.com/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[] = "Key密匙";
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();
// 初始化IO
pinMode(relay1, OUTPUT);
digitalWrite(relay1, HIGH);
pinMode(relay2, OUTPUT);
digitalWrite(relay2, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead1); //获取1
Blinker.attachData(dataRead2); //获取2
Button1.attach(button1_callback); //按钮1
Button2.attach(button2_callback); //按钮2
BlinkerMIOT.attachPowerState(miotPowerState); //注册电源函数1
BlinkerMIOT.attachQuery(miotQuery); //注册回调函数
}
void loop() {
Blinker.run();
}
2.烧录相关
开发板选择NodeMCU V1.0(ESP-12E Module)
其余保持默认即可
五.Blinker App &小爱绑定第三方设备
1.Blinker App配置相关
我在编写时添加了APP内的按钮控制,所以你也可以通过App来手动控制继电器通路状态
2.小米小爱绑定第三方设备
以我的小爱闹钟为例:
米家-我的-其他平台设备-右上角“添加”-选择“点灯科技”-绑定账户并同步设备
总结一下
最后我们可以通过小爱同学来控制插孔 以及查询插孔状态,还可以通过Blinker App来控制开关
语音指令例:
-打开插座插孔一
-插座插孔二的状态
由于我手头只有双路继电器,并不能展示更多路的控制
使用到的参考资料:
Arduino论坛参考帖-【智能取暖器DIY】ESP32+blinker接入小爱同学语音控制