ESP8266 Blinker 小爱同学 本地控制 手机配网 四路开关 物联网 arduino编程详细注释
作为一名注册12年CSDN的电脑爱好者,没有从事喜欢的IT行业还是颇有那么一丝丝的想念。
通过一段时间的arduino编程和ESP8266学习,参考示例程序等,完善了自己的一份小爱同学四开关控制的程序。
硬件部分:ESP8266 nodeMCU、4路继电器、4个按键开关、杜邦线若干
硬件介绍:4路继电器为低电平触发、4个按键 开关为低电平触发
功能介绍:1、可远程Blinker App控制并更新状态
2、可小爱同学控制开关状态
3、可本地开关控制开关状态(自复位控制,自锁控制,自行修改程序)
4、手机微信扫码配网
目前存在问题:1、 查询设备状态,反馈内容有误或者无法连接设备……希望各路大神指点迷津。
2、本地触碰按键目前依靠延时来防止误操作,需要帮我出一个放错程序,比如2秒内不论按多少次还是一直按着,都按一次处理。希望不要占用程序时间等待。
智能家居从一块ESP8266开启。此程序可用来远程和本地控制开关类电器的开关。
2021.3.22更新代码,小爱状态查询可使用,增加app端状态刷新按钮。
/* ***************************************************************** * @author GuoFuqiang * @version 1.0.0* @date 2021.03.22* @brief 主程序* 程序功能: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[] = "746f9ac0b5b3"; //Blinker APP(连接小爱同学必须阿里云服务器)中获取到的Secret Key(密钥)
//代码配网用这段
//char ssid[] = "Your WIFI SSID"; //自己wifi名称
//char pswd[] = "********"; //自己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.print("on");} else if(state=="off"){ctrl_multi_outlet(OUTLET_ALL, HIGH);//关闭继电器--所有// 反馈继电器状态Button.color("#808080"); //设置app按键是纯黄色,16进制颜色码Button.text("关"); //设置app按键注释“开”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); //本地开关输入上拉//初始化blinkerBlinker.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();
}
ESP8266 Blinker 小爱同学 本地控制 手机配网 四路开关 物联网 arduino编程详细注释相关推荐
- ESP8266+Blinker+小爱同学舵机控制开关
ESP8266 文章目录 ESP8266 一.简介 二.硬件连接 三.代码 四.blinker软件配置 总结 一.简介 最近想着用我们的小爱同学语音控制卧室的灯,这样就可以在睡觉的时候不用下床了,之前 ...
- esp8266接入Blinker小爱同学控制WS2812的RGB以及亮度调节
esp8266接入Blinker小爱同学控制WS2812的RGB以及亮度调节 所需准备的库: Adafruit_NeoPixel Blinker 开发板选择 1.源代码部分: 源代码: //WS281 ...
- ESP8266 快速对接小爱同学 语音控制
ESP8266 快速对接小爱同学 一.环境资料 二.安装配置 三.下载Blinker手机APP,并更改符合小米小爱协议的代码 四.米家绑定Blinker点灯 一.环境资料 1. 硬件:ESP8266 ...
- 基于Blinker的小爱同学语音控制【脱坑指南】
基于Blinker的小爱同学语音控制ESP8266 前些天在使用esp8266时遇到很多小爱不能控制设备问题,现在来叙述我控制过程中所遇到的问题,以及到完整的小爱能成功控制Esp8266的过程. 1. ...
- Blinker+小爱同学+四路继电器+(RFID+舵机模拟开门)代码
#define BLINKER_WIFI //支持wifi //#define BLINKER_ESP_SMARTCONFIG //Smartconfig或者手机微信扫码自动配网,代码配网请注释此条 ...
- ESP8266接入小爱同学—智能LED台灯或风扇(利用继电器)
ESP8266接入小爱同学-智能LED台灯或风扇 上周用esp8266做了一个语音智能台灯,也参考了很多网上的教程,也不难,挺简单的,在这里分享一下. 首先我用的是arduino IDE对esp826 ...
- 小米网关控制空调伴侣_小爱同学怎么控制灯?
说说我们神奇小爱同学吧,小爱同学是小米旗下的一款智能AI音箱,会根据您的指令来操作电器设备,比如说开关灯,那么小爱同学怎么控制灯?如果家里的是传统的灯泡,不是智能灯连接还能控制吗?今天蜜罐蚁装修网小编 ...
- 使用小爱同学语音控制电脑关机 - Winform C#
使用小爱同学语音控制电脑变关机 前言 实现原理 准备 注册巴法云账号 接入巴法云 接入米家 编写程序 连接TCP 接收信息并运行关机指令 发送指令订阅主题 添加心跳机制 后台运行 阻止默认关闭窗口事件 ...
- STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台
STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台 Wi-Fi 配网,指由外部向 Wi-Fi 设备提供 SSID 和密码(PSW),让 Wi-Fi 设备可以连接指 ...
最新文章
- android 开发小工具,Android 开发者必备的八款小工具
- javascript设计模式系列 - LukeLin - 博客园
- ccxprocess可以禁用么_提效 | 5G时代网站还需要加速么?
- C++ 11 深度学习(十)多线程
- 工作流实战_18_flowable 流程任务的转办
- 会话技术(Cookie Session)
- Oracle案例08——xx.xx.xx.xx,表空间 SYSAUX 使用率95%%
- flutter安装教程(win7)
- Atitit 编程范式总结 目录 1.1.1. IP(Imperative Programming)指令式编程	1 1.1.2. SP(Structured Programming)结构化编程	2 1
- ubuntu操作系统之新手操作必看篇
- 仓库货位卡标识牌_怎样正确使用仓库货位卡?来看看这三点
- java字符串不足长度自动补0
- springboot获取apk包名、app名称、版本名称、版本号
- 驱动启动时遇到:打开服务失败(错误码=6):句柄无效 解决方案
- vue 自动播放视频
- Sublime Text 3在行前插入递增数字序号的方法
- c语言pow为什么溢出,c – GMP pow中的溢出处理
- EximiousSoft Logo Designer (Crack)版,轻松设计logo的软件
- Hybrid App开发 四大主流平台
- mysql数据库拒绝访问的解决过程_记一次MySQL数据库拒绝访问的解决过程