ESP8266利用Bliker、小爱同学和本地按钮控制4路开关


Blinker函数说明:

  • Button.color("#FFFF00"); //设置app按键是纯黄色,16进制颜色码
  • Button.text("开"); //设置app按键注释“开”
  • Button.icon("fal fa-power-on");//按键图标。

获取更多图标:https://fontawesome.com/v5.15/icons?d=gallery&p=2&c=arrows,design&m=free

  • Button.print("on");//调试器窗口打印信息
  • Blinker.vibrate(); //开启继电器时反馈,让手机震动

配网使用注意事项

  • 如果是使用Smartconfig配网:

请启用宏定义: #define BLINKER_ESP_SMARTCONFIG和Setup函数里面的,Blinker.begin(auth); //手机配网用这段
注释掉:Setup函数里面的,Blinker.begin(auth, ssid, pswd);//代码配网用这段

  • 如果是使用直接写入的配网方式:

注释掉宏定义: #define BLINKER_ESP_SMARTCONFIG和Setup函数里面的,Blinker.begin(auth); //手机配网用这段
启用:Setup函数里面的,Blinker.begin(auth, ssid, pswd);//代码配网用这段

实例代码

本文采用代码直接写入wifi的方式配网。

/* *****************************************************************  * 程序功能:blinker+小爱同学+本地按键(点触自复位)控制插座4路插孔/开关* 1.使用开发板:nodemcu-ESP8266(模块ESP-12F)* 2.程序功能1:使用Blinker 手机APP添加设备并绑定,通过Blinker APP或者小爱同学,*   远程控制开发板相连的继电器开关* 3.程序功能2:使用本地开关控制继电器开关,并反馈继电器状态到Blinker控制按钮* 4.例程文档:小爱类:https://www.diandeng.tech/doc/xiaoai*            SmartConfig自动配网:https://blog.csdn.net/u014091490/article/details/105178037*            Blinker心跳包:https://github.com/blinker-iot/blinker-doc/wiki/Blinker-Arduino-%E5%BA%93%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C* 5.程序参考:blinker库例程--blinker-library-master\examples\Blinker_MIOT\MIOT_MULTI_OUTLET* *****************************************************************/#define BLINKER_WIFI               //支持wifi
//#define BLINKER_ESP_SMARTCONFIG    //Smartconfig或者手机微信扫码自动配网,代码配网请注释此条
#define BLINKER_MIOT_MULTI_OUTLET  //支持多路插座,最多4个插孔
#define BLINKER_PRINT Serial       //串口协议库
#define BLINKER_WITHOUT_SSL        //blinker默认使用加密方式进行远程通信,但通信加密会消耗大量的RAM,如果您对通信安全性无要求//可以添加宏BLINKER_WITHOUT_SSL用以获得更多可用RAM,BLINKER_WITHOUT_SSL目前仅可用于ESP8266,其他设备的RAM足以进行加密通信#include <Blinker.h>               //使用第三方Blinker库char auth[] = "7963c4b7e283";      //Blinker APP(连接小爱同学必须阿里云服务器)中获取到的Secret Key(密钥)
//代码配网用这段
char ssid[] = "MERCURY_D268G";                     //wifi名称
char pswd[] = "pba5ayzk";              //wifi密码//定义继电器信号
#define Relay_1 5         //定义继电器1信号接入GPIO5,D1
#define Relay_2 4         //定义继电器2信号接入GPIO4,D2
#define Relay_3 0         //定义继电器3信号接入GPIO0,D3
#define Relay_4 2         //定义继电器4信号接入GPIO2,D4//定义本地开关信号
#define KG_1 14         //定义开关1信号接入GPIO14,D5
#define KG_2 12         //定义开关2信号接入GPIO12,D6
#define KG_3 13         //定义开关3信号接入GPIO13,D7
#define KG_4 3          //定义开关4信号接入GPIO3,RX(GPIO15/D8持续低电平,后更改为GPIO3/RX接口)// 新建Blinker软件组件对象
BlinkerButton Button("MainSwitch");     //组件对象,要和APP组件中的“数据键名”一致,总开关
BlinkerButton Button1("Switch1");       //组件对象,要和APP组件中的“数据键名”一致,开关1
BlinkerButton Button2("Switch2");       //组件对象,要和APP组件中的“数据键名”一致,开关2
BlinkerButton Button3("Switch3");       //组件对象,要和APP组件中的“数据键名”一致,开关3
BlinkerButton Button4("Switch4");       //组件对象,要和APP组件中的“数据键名”一致,开关4
BlinkerButton Button5("Refresh");       //APP端按钮状态刷新//定义插座状态,用于小爱同学状态反馈
bool oState[5] = { false };
#define OUTLET_ALL   0  //所有插孔
#define OUTLET_NO_1  1  //插座插孔一
#define OUTLET_NO_2  2  //插座插孔二
#define OUTLET_NO_3  3  //插座插孔三
#define OUTLET_NO_4  4  //插座插孔四//反馈继电器状态函数
void RelayState(int num)
{switch(num){case 1:   //插座插孔一状态if(digitalRead(Relay_1)==LOW){Button1.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码Button1.text("插座1开");          //设置app按键注释“开”Button1.print("on");oState[1] = true;}else if(digitalRead(Relay_1==HIGH)){Button1.color("#808080");   //设置app按键是灰色,16进制颜色码Button1.text("插座1关");          //设置app按键注释“关”Button1.print("off");oState[1] = false;}break;case  2:if(digitalRead(Relay_2)==LOW){Button2.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码Button2.text("插座2开");          //设置app按键注释“开”Button2.print("on");oState[2] = true;}else if(digitalRead(Relay_2==HIGH)){Button2.color("#808080");   //设置app按键是灰色,16进制颜色码Button2.text("插座2关");          //设置app按键注释“关”Button2.print("off");oState[2] = false;}break;case  3:if(digitalRead(Relay_3)==LOW){Button3.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码Button3.text("插座3开");          //设置app按键注释“开”Button3.print("on");oState[3] = true;}else if(digitalRead(Relay_3==HIGH)){Button3.color("#808080");   //设置app按键是灰色,16进制颜色码Button3.text("插座3关");          //设置app按键注释“关”Button3.print("off");oState[3] = false;}break;case  4:if(digitalRead(Relay_4)==LOW){Button4.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码Button4.text("插座4开");          //设置app按键注释“开”Button4.print("on");oState[4] = true;}else if(digitalRead(Relay_4==HIGH)){Button4.color("#808080");   //设置app按键是灰色,16进制颜色码Button4.text("插座4关");          //设置app按键注释“关”Button4.print("off");oState[4] = false;}break;default:break;}
}//小爱同学控制插座多个插孔
void ctrl_multi_outlet(uint8_t num, uint8_t io_level)
{switch (num){case 0:  //所有插孔digitalWrite(Relay_1, io_level);//控制继电器1digitalWrite(Relay_2, io_level);//控制继电器2digitalWrite(Relay_3, io_level);//控制继电器3digitalWrite(Relay_4, io_level);//控制继电器4break;case 1:  //插座插孔一digitalWrite(Relay_1, io_level);//控制继电器1break;case 2:  //插座插孔二digitalWrite(Relay_2, io_level);//控制继电器2break;case 3:  //插座插孔三digitalWrite(Relay_3, io_level);//控制继电器3break;case 4:  //插座插孔四digitalWrite(Relay_4, io_level);//控制继电器4break;default:break;}
}//小爱电源类回调,例如:“打开插座”、“打开插座插孔一”、“打开插座插孔二”
void miotPowerState(const String & state, uint8_t num)
{BLINKER_LOG("need set outlet: ", num, ", power state: ", state);if (state == BLINKER_CMD_ON) {ctrl_multi_outlet(num, LOW);//打开继电器,num表示是多少路(继电器低电平出发)BlinkerMIOT.powerState("on", num);BlinkerMIOT.print();RelayState(num);oState[num] = true;}else if (state == BLINKER_CMD_OFF) {ctrl_multi_outlet(num, HIGH);//关闭继电器,num表示是多少路BlinkerMIOT.powerState("off", num);BlinkerMIOT.print();RelayState(num);oState[num] = false;}
}//小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
void miotQuery(int32_t queryCode,uint8_t num)
{BLINKER_LOG("插孔",num,"状态",",codes:", queryCode);switch (num){case 0 :BLINKER_LOG("状态:");BlinkerMIOT.powerState(oState[1] ? "on" : "off");BlinkerMIOT.powerState(oState[2] ? "on" : "off");BlinkerMIOT.powerState(oState[3] ? "on" : "off");BlinkerMIOT.powerState(oState[4] ? "on" : "off"); BlinkerMIOT.print();break;case 1 :BLINKER_LOG("插孔1状态:");BlinkerMIOT.powerState(oState[1] ? "on" : "off");BlinkerMIOT.print();break;case 2 :BLINKER_LOG("插孔2状态:");BlinkerMIOT.powerState(oState[2] ? "on" : "off");BlinkerMIOT.print();break;case 3 :BLINKER_LOG("插孔3状态:");BlinkerMIOT.powerState(oState[3] ? "on" : "off");BlinkerMIOT.print();break;case 4 :BLINKER_LOG("插孔4状态:");BlinkerMIOT.powerState(oState[4] ? "on" : "off");BlinkerMIOT.print();break;default :BlinkerMIOT.powerState(oState[1] ? "on" : "off");BlinkerMIOT.powerState(oState[2] ? "on" : "off");BlinkerMIOT.powerState(oState[3] ? "on" : "off");BlinkerMIOT.powerState(oState[4] ? "on" : "off"); BlinkerMIOT.print();break;}}// 在APP控制,按下MainSwitch按键即会执行该函数
void button_callback(const String & state)
{BLINKER_LOG("操作了MainSwitch: ", state);//APP中的Monitor控件打印的信息if (state=="on") {ctrl_multi_outlet(OUTLET_ALL, LOW);//打开继电器--所有// 反馈继电器状态Button.color("#FFFF00");   //设置app按键是纯黄色,16进制颜色码Button.text("开");          //设置app按键注释“开”Button.icon("fal fa-power-on");Button.print("on");Blinker.vibrate();  //开启继电器时反馈,让手机震动} else if(state=="off"){ctrl_multi_outlet(OUTLET_ALL, HIGH);//关闭继电器--所有// 反馈继电器状态Button.color("#808080");   //设置app按键是纯黄色,16进制颜色码Button.text("关");          //设置app按键注释“开”Button.icon("fal fa-power-off");Button.print("off");}
}// 在APP控制,按下Switch1按键即会执行该函数--第1路开关
void button1_callback(const String & state)
{BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息if (state=="on") {ctrl_multi_outlet(OUTLET_NO_1, LOW);//打开继电器--第1路// 反馈继电器1状态RelayState(1);    //调用继电器反馈程序} else if(state=="off"){ctrl_multi_outlet(OUTLET_NO_1, HIGH);//关闭继电器--第1路// 反馈继电器状态RelayState(1);    //调用继电器反馈程序}
}// 在APP控制,按下Switch2按键即会执行该函数--第2路开关
void button2_callback(const String & state)
{BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息if (state=="on") {ctrl_multi_outlet(OUTLET_NO_2, LOW);//打开继电器--第2路// 反馈继电器状态RelayState(2);    //调用继电器反馈程序} else if(state=="off"){ctrl_multi_outlet(OUTLET_NO_2, HIGH);//关闭继电器--第2路// 反馈继电器状态RelayState(2);    //调用继电器反馈程序}
}// 在APP控制,按下Switch3按键即会执行该函数--第3路开关void button3_callback(const String & state)
{BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息if (state=="on") {ctrl_multi_outlet(OUTLET_NO_3, LOW);//打开继电器--第3路// 反馈继电器状态RelayState(3);    //调用继电器反馈程序} else if(state=="off"){ctrl_multi_outlet(OUTLET_NO_3, HIGH);//关闭继电器--第3路// 反馈继电器状态RelayState(3);    //调用继电器反馈程序}
}// 在APP控制,按下Switch4按键即会执行该函数--第4路开关 void button4_callback(const String & state)
{BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息if (state=="on") {ctrl_multi_outlet(OUTLET_NO_4, LOW);//打开继电器--第4路// 反馈继电器状态RelayState(4);    //调用继电器反馈程序} else if(state=="off"){ctrl_multi_outlet(OUTLET_NO_4, HIGH);//关闭继电器--第4路// 反馈继电器状态RelayState(4);    //调用继电器反馈程序}
}//APP端状态手动刷新按钮
void button5_callback(const String & state)
{for(int i=0;i<5;i++){RelayState(i);}
}//心跳包刷新状态void heartbeat(){for(int i=0;i<5;i++){RelayState(i);}}//本地开关控制继电器程序void bdms(){if(digitalRead(KG_1)==LOW){digitalWrite(Relay_1, !digitalRead(Relay_1));//反馈继电器1状态RelayState(1);    //调用继电器反馈程序Blinker.delay(1000);    //必须加延时,否则灯一直切换状态}if(digitalRead(KG_2)==LOW){digitalWrite(Relay_2, !digitalRead(Relay_2));RelayState(2);    //调用继电器反馈程序Blinker.delay(1000); }if(digitalRead(KG_3)==LOW){digitalWrite(Relay_3, !digitalRead(Relay_3));RelayState(3);    //调用继电器反馈程序Blinker.delay(1000);}if(digitalRead(KG_4)==LOW){digitalWrite(Relay_4, !digitalRead(Relay_4));RelayState(4);    //调用继电器反馈程序Blinker.delay(1000);}}void setup()
{// 初始化串口,用于调试,后期可删除Serial.begin(115200);BLINKER_DEBUG.stream(Serial);BLINKER_DEBUG.debugAll();// 初始化有继电器的IOpinMode(Relay_1, OUTPUT);pinMode(Relay_2, OUTPUT);pinMode(Relay_3, OUTPUT);pinMode(Relay_4, OUTPUT);//初始化继电器初始状态digitalWrite(Relay_1, HIGH);       //继电器为低电平触发,初始化为HIGHdigitalWrite(Relay_2, HIGH);digitalWrite(Relay_3, HIGH);digitalWrite(Relay_4, HIGH);//初始化本地按键状态pinMode(KG_1, INPUT_PULLUP);   //本地开关输入上拉pinMode(KG_2, INPUT_PULLUP);   //本地开关输入上拉pinMode(KG_3, INPUT_PULLUP);   //本地开关输入上拉pinMode(KG_4, INPUT_PULLUP);   //本地开关输入上拉//初始化blinker// Blinker.begin(auth);              //手机配网用这段Blinker.begin(auth, ssid, pswd);//代码配网用这段Button.attach(button_callback);   //绑定按键回调Button1.attach(button1_callback); //绑定按键回调Button2.attach(button2_callback); //绑定按键回调Button3.attach(button3_callback); //绑定按键回调Button4.attach(button4_callback); //绑定按键回调Button5.attach(button5_callback);//小爱同学注册回调BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱电源回调BlinkerMIOT.attachQuery(miotQuery);           //小爱设备查询的回调函数//心跳包,初始化Blinker.attachHeartbeat(heartbeat);           //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态
}void loop()
{bdms();           //本地开关模式Blinker.run();
}

设备接入联网后,手机APP操作界面

  • 串口调试输出信息

ESP8266利用Bliker、小爱同学和本地按钮控制4路开关相关推荐

  1. 从零开始使用ESP8266 + Blinker 实现小爱同学可控可读取状态的多路插座

    从零开始使用ESP8266 + Blinker 实现小爱同学可控可读取状态的多路插座 前言 一直对8266很感兴趣,放寒假嘛,也挺闲,刚好手头有原来买下的Nodemcu,就拿来做个多路开关 参考资料我 ...

  2. 基于ESP8266+点灯科技+小爱同学控制开门解决方案!

    前言 每次下班回到家就已经很累了,到门口还要到处翻找钥匙,然后开门,是不是觉得很烦,那我们有没有不用通过钥匙开门且成本低的方案了?下面我会教大家基于ESP8266+点灯科技+小爱同学来控制开门的方法 ...

  3. ESP8266 快速对接小爱同学 语音控制

    ESP8266 快速对接小爱同学 一.环境资料 二.安装配置 三.下载Blinker手机APP,并更改符合小米小爱协议的代码 四.米家绑定Blinker点灯 一.环境资料 1. 硬件:ESP8266 ...

  4. esp8266接入Blinker小爱同学控制WS2812的RGB以及亮度调节

    esp8266接入Blinker小爱同学控制WS2812的RGB以及亮度调节 所需准备的库: Adafruit_NeoPixel Blinker 开发板选择 1.源代码部分: 源代码: //WS281 ...

  5. ESP32接入小爱同学,实现语音控制

    准备工作 安装手机app 米家app 小米音箱或小爱同学app 点灯科技app,app下载链接:https://diandeng.tech/dev 开发环境搭建 Arduino IDE需安装好esp3 ...

  6. 一个按钮控制灯的开关

    一个按钮控制灯的开关 可以通过Simulator进行模拟展示

  7. 【点灯科技+esp8266+小爱同学】实现语音控制的米思齐代码和arduino代码

    以下转换后的arduino代码. #define BLINKER_WIFI #include <Blinker.h> char auth[] = "点灯分配的密钥"; ...

  8. 安信可ESP8266模块实现对接天猫精灵IOT平台控制单路插座的教程

    文章目录 一.材料准备 二.软件配置 一.材料准备 天猫精灵一个,ESP8266模块一个(为了方便接线我们直接使用了Nodemcu开发板),插座一个(方便查看现象),杜邦线若干,接线方式如下 Node ...

  9. (含代码)ESP8266+舵机 制作wifi灯控开关(arduino,点灯科技,小爱同学/天猫精灵实现)

    目录 项目涉及的主代码 前言 一.环境搭建 二.开发步骤 1.注册点灯科技平台 2.在点灯科技平台注册设备,获取Secret Key 3.在Arduino IDE中编写代码,写入ESP8266 4.编 ...

最新文章

  1. php中的抽象类(abstract class)和接口(interface)
  2. ubuntu修改新增用户的目录_Ubuntu 18.04下创建新用户/目录、修改用户权限及删除用户的方法...
  3. C语言中内联函数的作用 inline
  4. Hadoop教程(五):Flume、Sqoop、Pig、Hive、OOZIE
  5. 21%转化率,海淘用户都在买什么?
  6. Ranorex中利用code module对于测试数据的管理
  7. Ajax的简单实现(JQuary)
  8. uml 继承_UML 完全解析和总结
  9. provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接错误的解决方法...
  10. VS2012手动关联xaml与CS文件
  11. zoj2432 hdoj1423 最长公共上升子序列(LCIS)
  12. mysql的索引类型_带您了解mysql索引类型
  13. [导入]如何点击按钮弹出新窗口,输入数据后返回并刷新页面?(老孟)
  14. 开启协程_一篇文章搞懂Python协程
  15. C语言判断四个嫌疑犯问题,C语言谁是窃贼问题代码及解析
  16. 教育学相关期刊杂志介绍
  17. 移动通信原理、技术与系统——概述
  18. css椭圆轨迹运动动画
  19. KEGG COMPOUND 数据库
  20. JS Base64加密解密

热门文章

  1. 微信支付V3-下载交易账单
  2. 联想拯救者R720在重装Win10系统时无法识别固态硬盘的解决方法
  3. 你真的了解switch吗?
  4. 通过cocos裁切图片,将大图分为小图
  5. 利用OBS和手机摄像头录课(录屏/录像)时的方法与参数设置
  6. MacOS git配置本地ssh
  7. c语言小游戏----改版斗兽棋
  8. hbase 使用lzo_hbase 使用LZO笔记
  9. 正则表达式 匹配中文,英文字母和数字及_长度详解
  10. echarts饼图 外圈转动动画 pie