合集地址:Arduino中文社区
CSDN为备份,最新看↑arduino.me
打开方式
本系列教程建议在电脑端打开更快
手机端切换文章请点击左下角专题目录
文章内切换章节请点击左下角文章大纲
资料下载、教程持续更新:
点灯开源项目分享群2:QQ 913319679
目录
时间戳
前言
资料下载
硬件购买
说明书:
一、程序由来
二、环境安装
三、操作步骤
四、代码原文(带注释供参考)
时间戳
上一期更新:2024年2月1日
本文更新时间:2024年3月14日
代码资源更新时间:2024年1月26日
前言
开发环境必须按照此教程第二章《软件开发环境搭建》进行配置
不按该方法配置,库版本不对必出问题
纯新手先做一遍【新手入门】[Blinker]2024-最新开发环境+温湿度节点+继电器 详细开源教程比较好
地址:Arduino中文社区
上述新手教程找新手测试过,步骤截图全
本人全部合集https://arduino.me/s/35?aid=2757
免费调试QQ1836035711,任何问题都可以问
资料下载
1.下载方式
暂时仅能从QQ 群的群文件下载
点灯开源项目分享群2:QQ 913319679
此群只提供各类开源分享,可向群主投稿,为避免打扰,不聊天
教程等任何问题都可找群主,免费调试,有空就回
群文件:
2.资料内容
小爱联动4路继电器.rar
包含
MIOT_Blinker_MULTI_OUTLET.ino
未搭建环境还需下载
Blinker-DHT11-继电器-纯小白入门超详细版全套教程资料.rar
详见第二章环境搭建
3.资料注意
调试出现任何问题先看【新手必看】[Blinker]2024最新-常见问题大全
仍存在则咨询群主。
如有咨询需要,也可前往点灯官网>开发文档>加点灯2000人官方群。
硬件购买(仅推荐)
NodeMCU
(Node MCU基于ESP12F模组(金属屏蔽罩这块),而ESP12模组基于ESP8266芯片和flash芯片)
高电平触发继电器
高/低电平触发继电器
无论用哪款继电器模组,记得:
高电平触发的模组平常是低电平0V,单片机输出3.3V高电平才吸合,使用推挽输出:
pinMode(RELAYPIN_1, OUTPUT);
低电平触发的模组平常是高电平5V,单片机输出0V高电平才吸合,避免5V灌入单片机3.3V回路,使用开漏输出:
pinMode(RELAYPIN_1, OUTPUT_OPEN_DRAIN);
参考资料:【NodeMcu-ESP8266】引脚使用参考指南http://t.csdnimg/OtETF
使用说明书
一、程序组成(建议打开看一下原版)
1.联动插座例程MIOT_MULTI_OUTLET
2.按键标准处理函数(本案例将button1_state替换为oState[1],以便与小爱共同控制)
bool button1_state=false; // 按钮1状态全局变量
//下面这句是类库实例化语句,类名BlinkerButton(按钮组件类),实例名Button1,数据键名“b1”,当blinker.run检测到APP发来数据包含键名“b1”就调用回调button1_callback。
BlinkerButton Button1("b1",button1_callback);//用此句不需要在setup里attach回调了
void button1_callback(const String & state)//按钮1回调函数,按下后设备开启继电器1
{
if(state=="tap"){button1_state=!button1_state;}//普通按键:tap反转状态
else if(state=="on"){button1_state=true;} //开关按键:on 短按开启
else if(state=="off"){button1_state=false;} //开关按键:off短按关闭
else if(state=="press"){button1_state=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){button1_state=false;}//普通按键或开关按键:pressup松开关闭
Button1.print(button1_state?"on":"off");//反馈状态到APP
digitalWrite(RELAYPIN_1,!button1_state);//输出到继电器
}
3.心跳包例程
void heartbeat () //用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
{
}
setup()
{
Blinker.attachHeartbeat(heartbeat); //注册用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
}
以上三个合并为本教程代码MIOT_Blinker_MULTI_OUTLET.ino,第四章可预览注释版代码
二、软件开发环境搭建
详见此文:
【新手必看】[Blinker]2023-最新开发环境+温湿度节点+继电器 详细开源教程
第二章
不按该方法配置,库版本不对会出问题:
Blinker库必须官网最新,不能从开发板管理器更新
ESP8266库必须3.0.1
ESP32库必须2.0.7
此项目内容少,推荐用8266做(ESP32也兼容)
(把第二章复制过来了)
群里下载Blinker-DHT11-继电器-纯小白入门超详细版全套教程资料.rar
解压,然后打开
可见
其中exe尽量管理员身份运行
1.安装Arduino
右键管理员身份运行
装过的忽略,Arduino2.0亦可,但是后面几步尽量一样
2.安装硬件库(又名开发板库、package)
Arduino开发板库添加有两种方式,推荐点灯官网资源下载栏的离线安装包(本教程压缩包中已经附带):
1.离线安装:右键管理员身份运行本教程附带的离线安装包
2.在线安装(很慢不推荐除非有VPN):Arduino>工具>开发板>开发板管理器,搜索ESP8266后点击安装
注:ESP8285直接用8266即可兼容,他俩区别仅在于硬件上8285自带flash,可用IO更多,不像8266多一个flash芯片,占用SPI了
注:ESP32不做人脸识别,做点灯运行2.0.7; 不做点灯,做人脸识别运行1.0.6
安装完硬件库后:
检查开发板库的位置
手动点开文件夹 C:\Users\用户名\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266
注:用户名换成你自己的用户名!
注:不管Arduino装在哪,这个硬件库都装到了C盘的用户文件夹!
注:AppData是隐藏文件夹,要点击查看
开启隐藏的项目
才能查看
也可自动前往:在地址栏粘贴%LOCALAPPDATA%/Arduino15/packages
结果如图:
警告:安装过的请检查:版本不要低于2.7.4,不要高于3.0.2(3.1开始会与点灯库冲突)
如果安装过其他版本的 package,请先删除或剪切走,再使用本安装包,
删除方法:文件管理器地址栏输入 %LOCALAPPDATA%/Arduino15/packages,回车进入,然后删除掉其中的esp32文件夹
3.安装软件库(又名Blinker库、Blinker Arduino SDK)
1.手动复制(推荐):
把
复制或剪切到C:\Users\用户名\Documents\Arduino\libraries
注:不管Arduino装在哪,这个软件库都在C盘的用户文件夹!
2.自动添加(不推荐):Arduino>项目>加载库>添加.ZIP库
Blinker等第三方软件库文件位置C:\Users\用户名\Documents\Arduino\libraries
4.设置Arduino——管理网址、行号、折叠、编译信息
打开Arduino>文件>首选项>附加开发板管理器网址>
,粘贴:
https://arduino.esp8266/stable/package_esp8266com_index.json
http://x.iaoye.xin/package_esp8266com_index.json
http://wechat.doit.am/package_esp8266com_index.json
https://github/esp8266/Arduino/releases/download/2.5.0/package_esp8266com_index.json
https://raw.githubusercontent/DFRobot/FireBeetle-ESP8266/master/package_firebeetle8266_index.json
https://dl.espressif/dl/package_esp32_index.json
https://arduino.me/packages/esp32.json
https://raw.githubusercontent/espressif/arduino-esp32/gh-pages/package_esp32_index.json
5. BlinkerAPP
安卓最新版本在官网下点灯科技-点灯物联网解决方案
iOS直接在APPStore搜Blinker(默认最新)
另外iOS最新版本号与安卓不同步
6. APP界面配置
先申请设备(设备数量已达上限,免费获取,见第五章第3节)
在Blinker APP右上角点击⊕>添加设备>独立设备>网络接入>复制授权码>QQ发电脑>贴至程序
界面配置在程序的注释
(冒号后的文本完整复制粘贴至QQ发送到手机,贴到APP界面配置(清空原配置),并点击更新)
退回主页面后再进去就出现界面
{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨Ê¨t0¨¨继电器1¨¨t1¨¨文本2¨¨bg¨Ê¨cols¨Ë¨rows¨Ë¨key¨¨b1¨´x´É´y´Ï¨clr¨¨#00A90C¨¨lstyle¨Ê}{ßCßDßEßFßGÊßH¨继电器2¨ßJßKßLÊßMËßNËßO¨b2¨´x´Ë´y´ÏßQßRßSÊ}{ßCßDßEßFßGÊßH¨继电器3¨ßJßKßLÊßMËßNËßO¨b3¨´x´Í´y´ÏßQßRßSÊ}{ßCßDßEßFßGÊßH¨继电器4¨ßJßKßLÊßMËßNËßO¨b4¨´x´Ï´y´ÏßSÊßQßR}{ßC¨deb¨ßGÉßLÉßMÑßNÌßO¨debug¨´x´É´y´Ò}{ßCßDßEßFßGÊßH¨总开¨ßJßKßLÊßMËßNËßO¨b0¨´x´É´y´ÍßQßRßSÉ}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ßf¨source_zh¨¨开关状态¨¨state¨|ßhßj÷¨state_zh¨|¨打开¨¨关闭¨÷}÷¨rt¨|÷}
设备设置里面点击界面配置,全选粘贴进去,前面不要有回车啥的,然后更新配置,退回主界面,再进入设备界面就好了
手动配置看这个:
7.打开程序
1.从文件管理器:打开项目文件夹 >打开设备端程序
2.从已经开启的Arduino(比从文件管理器更快,且省运行内存):
三、操作步骤
1.确保您已经配置好上述开发环境
2.打开MIOT_Blinker_MULTI_OUTLET.ino(见前文资料下载)
选择Node MCU开发板
连接USB线,选择好端口
4.自己的WiFi名、密码、继电器引脚(程序附带了Node MCU引脚表和ESP01S引脚说明)
5.上传
上传详细步骤见入门教程第八章《烧录》
【新手入门】[Blinker]2024-最新开发环境+温湿度节点+继电器 详细开源教程
Arduino中文社区
以下为简版步骤:
nodeMCU、其它CH340烧录器的开发板
直接上传
失败则:
上传前打开Arduino串口监视器确认通信
按住烧录底板RST和IO0按钮
插USB线
打开arduino串口监视器
先松开RST按钮,再松开IO0按钮
看到语句:waiting for download 等待下载
即可点击arduino右箭头上传代码
若没有则在工具里面切换端口,直到有,没端口说明要重装串口驱动
6.调试
正常编译并上传后出现连接WiFi(如图)
若串口监视器无信息,波特率115200,并按RST重置
得如下调试记录
连不上WiFi请注意
无论路由器还是手机热点还是 电脑热点,都不可以使用5G Wi-Fi,路由器不可以开启5G优选,或者是双频合一,必须使用路由器2.4G信号,必须使用有密码的Wi-Fi,校园网那种要登陆的必须转接路由器或电脑热点。
7.模块IP地址固定(可跳过)
默认IP地址路由器自动分配,如需固定,请在setup函数外添加
//上联路由器的静态IP WiFi.config
IPAddress sip(192,168,1,200); //手动设置静态IP 连接网络ip
IPAddress sip1(192,168,1,1); //本地网关
IPAddress sip2(255,255,255,0); //本地子网掩码
并在setup函数内的WiFi.begin前添加
//上联路由器wifi
WiFi.config(sip,sip1,sip2); //设置上联路由器网络参数
如图所示:
完成后同样上传
8.先在BlinkerAPP测试
(先测试BlinkerAPP,通了才能去米家,不通查前面步骤,看串口监视器是不是WiFi没连上,或者库没更新)
9.再去米家APP添加设备
点击我的
点击其他平台设备
找到点灯科技
点击绑定账号
点击同步设备
同步成功
米家里面控制不了,要去小爱
10.小爱APP或智能音箱上使用设备
点击头像
点击我的设备
点击智能家居
查看命令后返回
对小爱说话或左下角键盘输入
11.硬件接线
图见硬件购买
无论用哪款继电器模组,记得
高电平触发的模组平常是低电平0V,单片机输出3.3V高电平就吸合,使用推挽输出:pinMode(RELAYPIN_1, OUTPUT);
低电平触发的模组平常是高电平5V,单片机输出0V高电平就吸合,避免5V灌入单片机3.3V回路,使用开漏输出:pinMode(RELAYPIN_1, OUTPUT_OPENDRAIN);
参考资料:NodeMCU ESP8266 GPIO使用详解(图文并茂)[http://t.csdnimg/jBoG1](NodeMCU ESP8266 GPIO使用详解(图文并茂))
IO接线在程序前有#define RELAYPIN_1
继电器输入端电源5V可以接开发板,若出现开发板被反向尖峰电压冲击重启,则另接5V,
记得继电器GND必须和开发板GND共地
IO接继电器信号
输出端NO、NC、COM不要接开发板以便隔离外部电路,尤其外部电路为直流感性负载或为220V时
NO:normal open 常开,平常与公共点断开
NC:normal close 常闭,平常与公共点闭合
COM:common 公共端
继电器通电COM接NO,断电COM连回NC
12.其它硬件/接法
(1)使用真·智能插座(自己做,开源链接他没公布)
烧录需要烧录架或焊接线(VCC、GND、TXD、RXD、GPIO0、RST)
(2)使用串口继电器(我的毕业设计,即将开源)
四、代码原文(带注释供参考)
/* *****************************************************************
* 日期:2024年1月26日
* 本案例教程:
* 技术支持qq:1836035711
* *****************************************************************
* 使用前检查——软硬件配置
//1.开发板搜索关键词:NodeMcu 、四路继电器 或 继电器底板智能插座WIFI模块适用于ESP8266ESP-01/01S板
//2.开发板管理网址:填写在Arduino>文件>首选项>附加开发板管理网址 https://arduino.esp8266/stable/package_esp8266com_index.json
//3.硬件(开发板)库: 自动离线安装包下载地址https://www.123pan/s/dJrKVv-QEGB选择ESP8266的2.7.4~3.0.2版本
// 运行后会创建C:\Users\用户名\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2
//(1)ESP01S 开发板选择Arduino>工具>开发板>ESP8266Boards>generic esp8266 module
//(2)NodeMCU开发板选择Arduino>工具>开发板>ESP8266Boards>NodeMCU 1.0(ESP12E Module)
//4.软件(Blinker)库下载:官网下载https://diandeng.tech/dev(选Arduino SDK)
// 或 GitHub下载master总版(推荐)https://github/blinker-iot/blinker-library/tree/master(点击Code>Download ZIP)
// 下载后:自动添加方式:Arduino>项目>加载库>添加.ZIP库
// 手动解压并放置在C:\Users\用户名\Documents\Arduino\libraries文件夹
//5.Blinker APP 下载本:官网下载https://diandeng.tech/dev
//6.APP界面配置(冒号后的文本完整复制粘贴至QQ发送到手机,黏贴到APP界面配置(清空原配置),并点击更新):{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨Ê¨t0¨¨继电器1¨¨t1¨¨文本2¨¨bg¨Ê¨cols¨Ë¨rows¨Ë¨key¨¨b1¨´x´É´y´Ï¨clr¨¨#00A90C¨¨lstyle¨Ê}{ßCßDßEßFßGÊßH¨继电器2¨ßJßKßLÊßMËßNËßO¨b2¨´x´Ë´y´ÏßQßRßSÊ}{ßCßDßEßFßGÊßH¨继电器3¨ßJßKßLÊßMËßNËßO¨b3¨´x´Í´y´ÏßQßRßSÊ}{ßCßDßEßFßGÊßH¨继电器4¨ßJßKßLÊßMËßNËßO¨b4¨´x´Ï´y´ÏßSÊßQßR}{ßC¨deb¨ßGÉßLÉßMÑßNÌßO¨debug¨´x´É´y´Ò}{ßCßDßEßFßGÊßH¨总开¨ßJßKßLÊßMËßNËßO¨b0¨´x´É´y´ÍßQßRßSÉ}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ßf¨source_zh¨¨开关状态¨¨state¨|ßhßj÷¨state_zh¨|¨打开¨¨关闭¨÷}÷¨rt¨|÷}
* NodeMCU开发板的GPIO和板上引脚对应:(GPIO是ESP8266引脚号,D几是开发板上引脚号,ESP01s用Generic8266Moudle编译,直接写GPIO号,NodeMCU用NodeMCU1.0编译两个都可以)
*
* D0-GPIO16 (属于断电计时RTC模块,用于深度睡眠唤醒,但可以配置为GPIO,另外无法触发普通中断)
* D1-GPIO5
* D2-GPIO4
* D3-GPIO0 (开机时输入高电平进入运行模式,开机时输入低电平进烧录模式,烧录模式不执行用户程序)
* D4-GPIO2 (开机必须输入高电平,UART1TXD 只有发送功能,可作打印 log)
* D5-GPIO14
* D6-GPIO12
* D7-GPIO13
* D8-GPIO15 (开机时必须输入低电平)
* D9-GPIO3 (初始化Serial后用于硬件串口0即UART0)
* D10-GPIO1 (初始化Serial后用于硬件串口0即UART0)(开机时必须输入高电平)
* A0-ADC0 (整个开发板只有一个模拟输入引脚,且模拟电压值为0-1.0V)
* 注意:
* (1)GPIO4,12,14,15支持14位高精度硬件PWM
* (2)GPIO9、10在DUAL4线制式flash通信可用,QUAD6线制时不可用,嫌IO少可以选择内置flash 的8285或ESP32系列
* (3)GPIO6-11基本不用来进行通用输入输出,一般用于连接开发板的闪存(flash程序存储器,烧录程序的地方)
* (4) EN 任何时候:高电平有效,芯片正常工作;低电平芯片关闭,电流很小
* *****************************************************************/
//先定义通讯模式、小米小爱MIOT标志
#define BLINKER_WIFI
#define BLINKER_MIOT_MULTI_OUTLET
//再包含Blinker库
#include <Blinker.h>
//定义通讯参数 供Blinker.begin()初始化函数调用*************************************************************************以下三行必须修改!!!!!!!!!!!!!!!!!!!!!!!!!!
char auth[] = "******************修改为自己的点灯授权码*************";//授权码
char ssid[] = "******************修改为自己的Wifi名****************";//WiFi名 必须是2.4G不能5G,路由器不能开双频合一或5G优选,必须有密码的WiFi,可以用电脑或手机热点,设置方法百度搜
char pswd[] = "******************修改为自己的WiFi密码**************";//WiFi密码
//定义四个继电器所在引脚(参考上文nodemcu开发板引脚表,ESP01S只能0和2,另外两个可以随意写一个nodemcu开发板引脚表里的GPIO号)
#define RELAYPIN_1 16 //D0
#define RELAYPIN_2 5 //D1
#define RELAYPIN_3 4 //D2
#define RELAYPIN_4 0 //D3(开机时GPIO0输入高电平进入运行模式,输入低电平进烧录模式,烧录模式不执行用户程序,若您继电器模块为高电平触发,平时低电平,则不可连接此引脚,需要换D5(GPIO14)
//定义全局变量
bool fresh=true;//刷新标志
bool oState[5] = { false };//继电器输出状态数组:总开关(0)与四个继电器状态(1~4)一共5个布尔值:布尔变量true=1=HIGH高电平,false=0=LOW=低电平
void miotPowerState(const String & state, uint8_t num)//小爱同学修改继电器状态回调函数
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);//串口打印修改的继电器编号和写入的状态
if (state == BLINKER_CMD_ON) //若状态为开
{
oState[num] = true; //则状态赋值:向状态数组写入true(loop函数里会将其输出到继电器对应引脚)
BlinkerMIOT.powerState("on", num); //反馈该继电器开了
BlinkerMIOT.print(); //发送反馈
if (num != 0) oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
}
else if (state == BLINKER_CMD_OFF) //若状态为关
{
oState[num] = false; //则状态赋值:向状态数组写入false(loop函数里会将其输出到继电器对应引脚)
BlinkerMIOT.powerState("off", num); //反馈该继电器关了
BlinkerMIOT.print(); //发送反馈
if (num == 0)for (uint8_t o_num = 0; o_num < 5; o_num++)oState[o_num] = false;//若关闭的是总开关,则将四个继电器全部关闭(开启总开关不会使继电器全部打开,只是允许输出)
}
fresh=true;//用标志位告诉loop函数刷新继电器状态
}
void miotQuery(int32_t queryCode, uint8_t num)//小爱同学通过点灯服务器查询继电器状态
{
BLINKER_LOG("MIOT 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 dataRead(const String & data) //dataread函数,若Blinker APP数据包含未注册的组件键名,或无键名的多余数据则会进入此函数处理,例如输入框或调试组件输入的文本
{
BLINKER_LOG("Blinker readString: ", data); //串口打印多余数据
Blinker.vibrate(); //Blinker APP震动
uint32_t BlinkerTime = millis(); //取时间戳
Blinker.print("millis", BlinkerTime); //向Blinker APP反馈时间戳
}
//点灯APP修改继电器0状态
BlinkerButton Button0("b0",button0_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button0,组件键名“b0”用句不需要在setup里attach了
void button0_callback(const String & state) //按钮0回调函数,按下后设备开启继电器0
{
if(state=="tap"){oState[0]=!oState[0];} //普通按键:tap反转状态
else if(state=="on"){oState[0]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[0]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[0]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[0]=false;}//普通按键或开关按键:pressup松开关闭
Button0.print(oState[0]?"on":"off"); //反馈状态到APP
//digitalWrite(RELAYPIN_0,!oState[0]); //不输出到继电器
if (state=="off")for (uint8_t o_num = 0; o_num < 5; o_num++)oState[o_num] = false;//若关闭的是总开关,则将四个继电器全部关闭(开启总开关不会使继电器全部打开,只是允许输出)
fresh=true;
}
//点灯APP修改继电器1状态
BlinkerButton Button1("b1",button1_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button1,组件键名“b1”用句不需要在setup里attach了
void button1_callback(const String & state) //按钮1回调函数,按下后设备开启继电器1
{
if(state=="tap"){oState[1]=!oState[1];} //普通按键:tap反转状态
else if(state=="on"){oState[1]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[1]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[1]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[1]=false;}//普通按键或开关按键:pressup松开关闭
Button1.print(oState[1]?"on":"off"); //反馈状态到APP
digitalWrite(RELAYPIN_1,!oState[1]); //输出到继电器
if (state=="on")oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
fresh=true;
}
//点灯APP修改继电器2状态
BlinkerButton Button2("b2",button2_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button2,组件键名“b2”用句不需要在setup里attach了
void button2_callback(const String & state) //按钮2回调函数,按下后设备开启继电器2
{
if(state=="tap"){oState[2]=!oState[2];} //普通按键:tap反转状态
else if(state=="on"){oState[2]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[2]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[2]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[2]=false;}//普通按键或开关按键:pressup松开关闭
Button2.print(oState[2]?"on":"off"); //反馈状态到APP
digitalWrite(RELAYPIN_2,!oState[2]); //输出到继电器
if (state=="on")oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
fresh=true;
}
//点灯APP修改继电器3状态
BlinkerButton Button3("b3",button3_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button3,组件键名“b3”用句不需要在setup里attach了
void button3_callback(const String & state) //按钮3回调函数,按下后设备开启继电器3
{
if(state=="tap"){oState[3]=!oState[3];} //普通按键:tap反转状态
else if(state=="on"){oState[3]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[3]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[3]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[3]=false;}//普通按键或开关按键:pressup松开关闭
Button3.print(oState[3]?"on":"off"); //反馈状态到APP
digitalWrite(RELAYPIN_3,!oState[3]); //输出到继电器
if (state=="on")oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
fresh=true;
}
//点灯APP修改继电器4状态
BlinkerButton Button4("b4",button4_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button4,组件键名“b4”用句不需要在setup里attach了
void button4_callback(const String & state) //按钮4回调函数,按下后设备开启继电器4
{
if(state=="tap"){oState[4]=!oState[4];} //普通按键:tap反转状态
else if(state=="on"){oState[4]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[4]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[4]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[4]=false;}//普通按键或开关按键:pressup松开关闭
Button4.print(oState[4]?"on":"off"); //反馈状态到APP
digitalWrite(RELAYPIN_4,!oState[4]); //输出到继电器
if (state=="on")oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
fresh=true;
}
void heartbeat() //用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
{
Button1.print(oState[1]?"on":"off"); //反馈状态到APP
Button2.print(oState[2]?"on":"off"); //反馈状态到APP
Button3.print(oState[3]?"on":"off"); //反馈状态到APP
Button4.print(oState[4]?"on":"off"); //反馈状态到APP
}
void setup()
{
Serial.begin(115200); //初始化硬件串口UART0波特率115200 bps(调试时需要相应的调整Aruino>工具>串口监视器>波特率为115200)
BLINKER_DEBUG.stream(Serial); //将Blinker库代码调试信息流打印到硬件串口
BLINKER_DEBUG.debugAll(); //开启所有调试信息
pinMode(RELAYPIN_1, OUTPUT); digitalWrite(RELAYPIN_1, LOW);//初始化继电器1所在GPIO,并输出低电平
pinMode(RELAYPIN_2, OUTPUT); digitalWrite(RELAYPIN_2, LOW);//初始化继电器2所在GPIO,并输出低电平
pinMode(RELAYPIN_3, OUTPUT); digitalWrite(RELAYPIN_3, LOW);//初始化继电器3所在GPIO,并输出低电平
pinMode(RELAYPIN_4, OUTPUT); digitalWrite(RELAYPIN_4, LOW);//初始化继电器4所在GPIO,并输出低电平
Blinker.begin(auth, ssid, pswd); //调用Blinker库的开始成员函数,初始化Wifi连接(参数:授权码、WiFi名、密码)
Blinker.attachData(dataRead); //注册dataread函数,若APP数据包含未注册的组件键名则会进入此函数处理
Blinker.attachHeartbeat(heartbeat); //注册用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱同学修改继电器状态回调函数,Blinker.run()检测到小爱同学修改请求就会执行
BlinkerMIOT.attachQuery(miotQuery); //注册小爱同学查询继电器状态回调函数,Blinker.run()检测到小爱同学查询请求就会执行
oState[0]=true;//总开默认打开
}
void loop()
{
Blinker.run();
if(fresh){
BLINKER_LOG("输出使能:",oState[0]?"开":"关");
digitalWrite(RELAYPIN_1, oState[1]);BLINKER_LOG("继电器1: ",oState[1]?"开":"关");
digitalWrite(RELAYPIN_2, oState[2]);BLINKER_LOG("继电器1: ",oState[2]?"开":"关");
digitalWrite(RELAYPIN_3, oState[3]);BLINKER_LOG("继电器1: ",oState[3]?"开":"关");
digitalWrite(RELAYPIN_4, oState[4]);BLINKER_LOG("继电器1: ",oState[4]?"开":"关");
fresh=false;
}
}
合集地址:Arduino中文社区
CSDN为备份,最新看↑arduino.me
打开方式
本系列教程建议在电脑端打开更快
手机端切换文章请点击左下角专题目录
文章内切换章节请点击左下角文章大纲
资料下载、教程持续更新:
点灯开源项目分享群2:QQ 913319679
目录
时间戳
前言
资料下载
硬件购买
说明书:
一、程序由来
二、环境安装
三、操作步骤
四、代码原文(带注释供参考)
时间戳
上一期更新:2024年2月1日
本文更新时间:2024年3月14日
代码资源更新时间:2024年1月26日
前言
开发环境必须按照此教程第二章《软件开发环境搭建》进行配置
不按该方法配置,库版本不对必出问题
纯新手先做一遍【新手入门】[Blinker]2024-最新开发环境+温湿度节点+继电器 详细开源教程比较好
地址:Arduino中文社区
上述新手教程找新手测试过,步骤截图全
本人全部合集https://arduino.me/s/35?aid=2757
免费调试QQ1836035711,任何问题都可以问
资料下载
1.下载方式
暂时仅能从QQ 群的群文件下载
点灯开源项目分享群2:QQ 913319679
此群只提供各类开源分享,可向群主投稿,为避免打扰,不聊天
教程等任何问题都可找群主,免费调试,有空就回
群文件:
2.资料内容
小爱联动4路继电器.rar
包含
MIOT_Blinker_MULTI_OUTLET.ino
未搭建环境还需下载
Blinker-DHT11-继电器-纯小白入门超详细版全套教程资料.rar
详见第二章环境搭建
3.资料注意
调试出现任何问题先看【新手必看】[Blinker]2024最新-常见问题大全
仍存在则咨询群主。
如有咨询需要,也可前往点灯官网>开发文档>加点灯2000人官方群。
硬件购买(仅推荐)
NodeMCU
(Node MCU基于ESP12F模组(金属屏蔽罩这块),而ESP12模组基于ESP8266芯片和flash芯片)
高电平触发继电器
高/低电平触发继电器
无论用哪款继电器模组,记得:
高电平触发的模组平常是低电平0V,单片机输出3.3V高电平才吸合,使用推挽输出:
pinMode(RELAYPIN_1, OUTPUT);
低电平触发的模组平常是高电平5V,单片机输出0V高电平才吸合,避免5V灌入单片机3.3V回路,使用开漏输出:
pinMode(RELAYPIN_1, OUTPUT_OPEN_DRAIN);
参考资料:【NodeMcu-ESP8266】引脚使用参考指南http://t.csdnimg/OtETF
使用说明书
一、程序组成(建议打开看一下原版)
1.联动插座例程MIOT_MULTI_OUTLET
2.按键标准处理函数(本案例将button1_state替换为oState[1],以便与小爱共同控制)
bool button1_state=false; // 按钮1状态全局变量
//下面这句是类库实例化语句,类名BlinkerButton(按钮组件类),实例名Button1,数据键名“b1”,当blinker.run检测到APP发来数据包含键名“b1”就调用回调button1_callback。
BlinkerButton Button1("b1",button1_callback);//用此句不需要在setup里attach回调了
void button1_callback(const String & state)//按钮1回调函数,按下后设备开启继电器1
{
if(state=="tap"){button1_state=!button1_state;}//普通按键:tap反转状态
else if(state=="on"){button1_state=true;} //开关按键:on 短按开启
else if(state=="off"){button1_state=false;} //开关按键:off短按关闭
else if(state=="press"){button1_state=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){button1_state=false;}//普通按键或开关按键:pressup松开关闭
Button1.print(button1_state?"on":"off");//反馈状态到APP
digitalWrite(RELAYPIN_1,!button1_state);//输出到继电器
}
3.心跳包例程
void heartbeat () //用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
{
}
setup()
{
Blinker.attachHeartbeat(heartbeat); //注册用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
}
以上三个合并为本教程代码MIOT_Blinker_MULTI_OUTLET.ino,第四章可预览注释版代码
二、软件开发环境搭建
详见此文:
【新手必看】[Blinker]2023-最新开发环境+温湿度节点+继电器 详细开源教程
第二章
不按该方法配置,库版本不对会出问题:
Blinker库必须官网最新,不能从开发板管理器更新
ESP8266库必须3.0.1
ESP32库必须2.0.7
此项目内容少,推荐用8266做(ESP32也兼容)
(把第二章复制过来了)
群里下载Blinker-DHT11-继电器-纯小白入门超详细版全套教程资料.rar
解压,然后打开
可见
其中exe尽量管理员身份运行
1.安装Arduino
右键管理员身份运行
装过的忽略,Arduino2.0亦可,但是后面几步尽量一样
2.安装硬件库(又名开发板库、package)
Arduino开发板库添加有两种方式,推荐点灯官网资源下载栏的离线安装包(本教程压缩包中已经附带):
1.离线安装:右键管理员身份运行本教程附带的离线安装包
2.在线安装(很慢不推荐除非有VPN):Arduino>工具>开发板>开发板管理器,搜索ESP8266后点击安装
注:ESP8285直接用8266即可兼容,他俩区别仅在于硬件上8285自带flash,可用IO更多,不像8266多一个flash芯片,占用SPI了
注:ESP32不做人脸识别,做点灯运行2.0.7; 不做点灯,做人脸识别运行1.0.6
安装完硬件库后:
检查开发板库的位置
手动点开文件夹 C:\Users\用户名\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266
注:用户名换成你自己的用户名!
注:不管Arduino装在哪,这个硬件库都装到了C盘的用户文件夹!
注:AppData是隐藏文件夹,要点击查看
开启隐藏的项目
才能查看
也可自动前往:在地址栏粘贴%LOCALAPPDATA%/Arduino15/packages
结果如图:
警告:安装过的请检查:版本不要低于2.7.4,不要高于3.0.2(3.1开始会与点灯库冲突)
如果安装过其他版本的 package,请先删除或剪切走,再使用本安装包,
删除方法:文件管理器地址栏输入 %LOCALAPPDATA%/Arduino15/packages,回车进入,然后删除掉其中的esp32文件夹
3.安装软件库(又名Blinker库、Blinker Arduino SDK)
1.手动复制(推荐):
把
复制或剪切到C:\Users\用户名\Documents\Arduino\libraries
注:不管Arduino装在哪,这个软件库都在C盘的用户文件夹!
2.自动添加(不推荐):Arduino>项目>加载库>添加.ZIP库
Blinker等第三方软件库文件位置C:\Users\用户名\Documents\Arduino\libraries
4.设置Arduino——管理网址、行号、折叠、编译信息
打开Arduino>文件>首选项>附加开发板管理器网址>
,粘贴:
https://arduino.esp8266/stable/package_esp8266com_index.json
http://x.iaoye.xin/package_esp8266com_index.json
http://wechat.doit.am/package_esp8266com_index.json
https://github/esp8266/Arduino/releases/download/2.5.0/package_esp8266com_index.json
https://raw.githubusercontent/DFRobot/FireBeetle-ESP8266/master/package_firebeetle8266_index.json
https://dl.espressif/dl/package_esp32_index.json
https://arduino.me/packages/esp32.json
https://raw.githubusercontent/espressif/arduino-esp32/gh-pages/package_esp32_index.json
5. BlinkerAPP
安卓最新版本在官网下点灯科技-点灯物联网解决方案
iOS直接在APPStore搜Blinker(默认最新)
另外iOS最新版本号与安卓不同步
6. APP界面配置
先申请设备(设备数量已达上限,免费获取,见第五章第3节)
在Blinker APP右上角点击⊕>添加设备>独立设备>网络接入>复制授权码>QQ发电脑>贴至程序
界面配置在程序的注释
(冒号后的文本完整复制粘贴至QQ发送到手机,贴到APP界面配置(清空原配置),并点击更新)
退回主页面后再进去就出现界面
{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨Ê¨t0¨¨继电器1¨¨t1¨¨文本2¨¨bg¨Ê¨cols¨Ë¨rows¨Ë¨key¨¨b1¨´x´É´y´Ï¨clr¨¨#00A90C¨¨lstyle¨Ê}{ßCßDßEßFßGÊßH¨继电器2¨ßJßKßLÊßMËßNËßO¨b2¨´x´Ë´y´ÏßQßRßSÊ}{ßCßDßEßFßGÊßH¨继电器3¨ßJßKßLÊßMËßNËßO¨b3¨´x´Í´y´ÏßQßRßSÊ}{ßCßDßEßFßGÊßH¨继电器4¨ßJßKßLÊßMËßNËßO¨b4¨´x´Ï´y´ÏßSÊßQßR}{ßC¨deb¨ßGÉßLÉßMÑßNÌßO¨debug¨´x´É´y´Ò}{ßCßDßEßFßGÊßH¨总开¨ßJßKßLÊßMËßNËßO¨b0¨´x´É´y´ÍßQßRßSÉ}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ßf¨source_zh¨¨开关状态¨¨state¨|ßhßj÷¨state_zh¨|¨打开¨¨关闭¨÷}÷¨rt¨|÷}
设备设置里面点击界面配置,全选粘贴进去,前面不要有回车啥的,然后更新配置,退回主界面,再进入设备界面就好了
手动配置看这个:
7.打开程序
1.从文件管理器:打开项目文件夹 >打开设备端程序
2.从已经开启的Arduino(比从文件管理器更快,且省运行内存):
三、操作步骤
1.确保您已经配置好上述开发环境
2.打开MIOT_Blinker_MULTI_OUTLET.ino(见前文资料下载)
选择Node MCU开发板
连接USB线,选择好端口
4.自己的WiFi名、密码、继电器引脚(程序附带了Node MCU引脚表和ESP01S引脚说明)
5.上传
上传详细步骤见入门教程第八章《烧录》
【新手入门】[Blinker]2024-最新开发环境+温湿度节点+继电器 详细开源教程
Arduino中文社区
以下为简版步骤:
nodeMCU、其它CH340烧录器的开发板
直接上传
失败则:
上传前打开Arduino串口监视器确认通信
按住烧录底板RST和IO0按钮
插USB线
打开arduino串口监视器
先松开RST按钮,再松开IO0按钮
看到语句:waiting for download 等待下载
即可点击arduino右箭头上传代码
若没有则在工具里面切换端口,直到有,没端口说明要重装串口驱动
6.调试
正常编译并上传后出现连接WiFi(如图)
若串口监视器无信息,波特率115200,并按RST重置
得如下调试记录
连不上WiFi请注意
无论路由器还是手机热点还是 电脑热点,都不可以使用5G Wi-Fi,路由器不可以开启5G优选,或者是双频合一,必须使用路由器2.4G信号,必须使用有密码的Wi-Fi,校园网那种要登陆的必须转接路由器或电脑热点。
7.模块IP地址固定(可跳过)
默认IP地址路由器自动分配,如需固定,请在setup函数外添加
//上联路由器的静态IP WiFi.config
IPAddress sip(192,168,1,200); //手动设置静态IP 连接网络ip
IPAddress sip1(192,168,1,1); //本地网关
IPAddress sip2(255,255,255,0); //本地子网掩码
并在setup函数内的WiFi.begin前添加
//上联路由器wifi
WiFi.config(sip,sip1,sip2); //设置上联路由器网络参数
如图所示:
完成后同样上传
8.先在BlinkerAPP测试
(先测试BlinkerAPP,通了才能去米家,不通查前面步骤,看串口监视器是不是WiFi没连上,或者库没更新)
9.再去米家APP添加设备
点击我的
点击其他平台设备
找到点灯科技
点击绑定账号
点击同步设备
同步成功
米家里面控制不了,要去小爱
10.小爱APP或智能音箱上使用设备
点击头像
点击我的设备
点击智能家居
查看命令后返回
对小爱说话或左下角键盘输入
11.硬件接线
图见硬件购买
无论用哪款继电器模组,记得
高电平触发的模组平常是低电平0V,单片机输出3.3V高电平就吸合,使用推挽输出:pinMode(RELAYPIN_1, OUTPUT);
低电平触发的模组平常是高电平5V,单片机输出0V高电平就吸合,避免5V灌入单片机3.3V回路,使用开漏输出:pinMode(RELAYPIN_1, OUTPUT_OPENDRAIN);
参考资料:NodeMCU ESP8266 GPIO使用详解(图文并茂)[http://t.csdnimg/jBoG1](NodeMCU ESP8266 GPIO使用详解(图文并茂))
IO接线在程序前有#define RELAYPIN_1
继电器输入端电源5V可以接开发板,若出现开发板被反向尖峰电压冲击重启,则另接5V,
记得继电器GND必须和开发板GND共地
IO接继电器信号
输出端NO、NC、COM不要接开发板以便隔离外部电路,尤其外部电路为直流感性负载或为220V时
NO:normal open 常开,平常与公共点断开
NC:normal close 常闭,平常与公共点闭合
COM:common 公共端
继电器通电COM接NO,断电COM连回NC
12.其它硬件/接法
(1)使用真·智能插座(自己做,开源链接他没公布)
烧录需要烧录架或焊接线(VCC、GND、TXD、RXD、GPIO0、RST)
(2)使用串口继电器(我的毕业设计,即将开源)
四、代码原文(带注释供参考)
/* *****************************************************************
* 日期:2024年1月26日
* 本案例教程:
* 技术支持qq:1836035711
* *****************************************************************
* 使用前检查——软硬件配置
//1.开发板搜索关键词:NodeMcu 、四路继电器 或 继电器底板智能插座WIFI模块适用于ESP8266ESP-01/01S板
//2.开发板管理网址:填写在Arduino>文件>首选项>附加开发板管理网址 https://arduino.esp8266/stable/package_esp8266com_index.json
//3.硬件(开发板)库: 自动离线安装包下载地址https://www.123pan/s/dJrKVv-QEGB选择ESP8266的2.7.4~3.0.2版本
// 运行后会创建C:\Users\用户名\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2
//(1)ESP01S 开发板选择Arduino>工具>开发板>ESP8266Boards>generic esp8266 module
//(2)NodeMCU开发板选择Arduino>工具>开发板>ESP8266Boards>NodeMCU 1.0(ESP12E Module)
//4.软件(Blinker)库下载:官网下载https://diandeng.tech/dev(选Arduino SDK)
// 或 GitHub下载master总版(推荐)https://github/blinker-iot/blinker-library/tree/master(点击Code>Download ZIP)
// 下载后:自动添加方式:Arduino>项目>加载库>添加.ZIP库
// 手动解压并放置在C:\Users\用户名\Documents\Arduino\libraries文件夹
//5.Blinker APP 下载本:官网下载https://diandeng.tech/dev
//6.APP界面配置(冒号后的文本完整复制粘贴至QQ发送到手机,黏贴到APP界面配置(清空原配置),并点击更新):{¨version¨¨2.0.0¨¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨dark¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨Ê¨t0¨¨继电器1¨¨t1¨¨文本2¨¨bg¨Ê¨cols¨Ë¨rows¨Ë¨key¨¨b1¨´x´É´y´Ï¨clr¨¨#00A90C¨¨lstyle¨Ê}{ßCßDßEßFßGÊßH¨继电器2¨ßJßKßLÊßMËßNËßO¨b2¨´x´Ë´y´ÏßQßRßSÊ}{ßCßDßEßFßGÊßH¨继电器3¨ßJßKßLÊßMËßNËßO¨b3¨´x´Í´y´ÏßQßRßSÊ}{ßCßDßEßFßGÊßH¨继电器4¨ßJßKßLÊßMËßNËßO¨b4¨´x´Ï´y´ÏßSÊßQßR}{ßC¨deb¨ßGÉßLÉßMÑßNÌßO¨debug¨´x´É´y´Ò}{ßCßDßEßFßGÊßH¨总开¨ßJßKßLÊßMËßNËßO¨b0¨´x´É´y´ÍßQßRßSÉ}÷¨actions¨|¦¨cmd¨¦¨switch¨‡¨text¨‡¨on¨¨打开?name¨¨off¨¨关闭?name¨—÷¨triggers¨|{¨source¨ßf¨source_zh¨¨开关状态¨¨state¨|ßhßj÷¨state_zh¨|¨打开¨¨关闭¨÷}÷¨rt¨|÷}
* NodeMCU开发板的GPIO和板上引脚对应:(GPIO是ESP8266引脚号,D几是开发板上引脚号,ESP01s用Generic8266Moudle编译,直接写GPIO号,NodeMCU用NodeMCU1.0编译两个都可以)
*
* D0-GPIO16 (属于断电计时RTC模块,用于深度睡眠唤醒,但可以配置为GPIO,另外无法触发普通中断)
* D1-GPIO5
* D2-GPIO4
* D3-GPIO0 (开机时输入高电平进入运行模式,开机时输入低电平进烧录模式,烧录模式不执行用户程序)
* D4-GPIO2 (开机必须输入高电平,UART1TXD 只有发送功能,可作打印 log)
* D5-GPIO14
* D6-GPIO12
* D7-GPIO13
* D8-GPIO15 (开机时必须输入低电平)
* D9-GPIO3 (初始化Serial后用于硬件串口0即UART0)
* D10-GPIO1 (初始化Serial后用于硬件串口0即UART0)(开机时必须输入高电平)
* A0-ADC0 (整个开发板只有一个模拟输入引脚,且模拟电压值为0-1.0V)
* 注意:
* (1)GPIO4,12,14,15支持14位高精度硬件PWM
* (2)GPIO9、10在DUAL4线制式flash通信可用,QUAD6线制时不可用,嫌IO少可以选择内置flash 的8285或ESP32系列
* (3)GPIO6-11基本不用来进行通用输入输出,一般用于连接开发板的闪存(flash程序存储器,烧录程序的地方)
* (4) EN 任何时候:高电平有效,芯片正常工作;低电平芯片关闭,电流很小
* *****************************************************************/
//先定义通讯模式、小米小爱MIOT标志
#define BLINKER_WIFI
#define BLINKER_MIOT_MULTI_OUTLET
//再包含Blinker库
#include <Blinker.h>
//定义通讯参数 供Blinker.begin()初始化函数调用*************************************************************************以下三行必须修改!!!!!!!!!!!!!!!!!!!!!!!!!!
char auth[] = "******************修改为自己的点灯授权码*************";//授权码
char ssid[] = "******************修改为自己的Wifi名****************";//WiFi名 必须是2.4G不能5G,路由器不能开双频合一或5G优选,必须有密码的WiFi,可以用电脑或手机热点,设置方法百度搜
char pswd[] = "******************修改为自己的WiFi密码**************";//WiFi密码
//定义四个继电器所在引脚(参考上文nodemcu开发板引脚表,ESP01S只能0和2,另外两个可以随意写一个nodemcu开发板引脚表里的GPIO号)
#define RELAYPIN_1 16 //D0
#define RELAYPIN_2 5 //D1
#define RELAYPIN_3 4 //D2
#define RELAYPIN_4 0 //D3(开机时GPIO0输入高电平进入运行模式,输入低电平进烧录模式,烧录模式不执行用户程序,若您继电器模块为高电平触发,平时低电平,则不可连接此引脚,需要换D5(GPIO14)
//定义全局变量
bool fresh=true;//刷新标志
bool oState[5] = { false };//继电器输出状态数组:总开关(0)与四个继电器状态(1~4)一共5个布尔值:布尔变量true=1=HIGH高电平,false=0=LOW=低电平
void miotPowerState(const String & state, uint8_t num)//小爱同学修改继电器状态回调函数
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);//串口打印修改的继电器编号和写入的状态
if (state == BLINKER_CMD_ON) //若状态为开
{
oState[num] = true; //则状态赋值:向状态数组写入true(loop函数里会将其输出到继电器对应引脚)
BlinkerMIOT.powerState("on", num); //反馈该继电器开了
BlinkerMIOT.print(); //发送反馈
if (num != 0) oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
}
else if (state == BLINKER_CMD_OFF) //若状态为关
{
oState[num] = false; //则状态赋值:向状态数组写入false(loop函数里会将其输出到继电器对应引脚)
BlinkerMIOT.powerState("off", num); //反馈该继电器关了
BlinkerMIOT.print(); //发送反馈
if (num == 0)for (uint8_t o_num = 0; o_num < 5; o_num++)oState[o_num] = false;//若关闭的是总开关,则将四个继电器全部关闭(开启总开关不会使继电器全部打开,只是允许输出)
}
fresh=true;//用标志位告诉loop函数刷新继电器状态
}
void miotQuery(int32_t queryCode, uint8_t num)//小爱同学通过点灯服务器查询继电器状态
{
BLINKER_LOG("MIOT 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 dataRead(const String & data) //dataread函数,若Blinker APP数据包含未注册的组件键名,或无键名的多余数据则会进入此函数处理,例如输入框或调试组件输入的文本
{
BLINKER_LOG("Blinker readString: ", data); //串口打印多余数据
Blinker.vibrate(); //Blinker APP震动
uint32_t BlinkerTime = millis(); //取时间戳
Blinker.print("millis", BlinkerTime); //向Blinker APP反馈时间戳
}
//点灯APP修改继电器0状态
BlinkerButton Button0("b0",button0_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button0,组件键名“b0”用句不需要在setup里attach了
void button0_callback(const String & state) //按钮0回调函数,按下后设备开启继电器0
{
if(state=="tap"){oState[0]=!oState[0];} //普通按键:tap反转状态
else if(state=="on"){oState[0]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[0]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[0]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[0]=false;}//普通按键或开关按键:pressup松开关闭
Button0.print(oState[0]?"on":"off"); //反馈状态到APP
//digitalWrite(RELAYPIN_0,!oState[0]); //不输出到继电器
if (state=="off")for (uint8_t o_num = 0; o_num < 5; o_num++)oState[o_num] = false;//若关闭的是总开关,则将四个继电器全部关闭(开启总开关不会使继电器全部打开,只是允许输出)
fresh=true;
}
//点灯APP修改继电器1状态
BlinkerButton Button1("b1",button1_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button1,组件键名“b1”用句不需要在setup里attach了
void button1_callback(const String & state) //按钮1回调函数,按下后设备开启继电器1
{
if(state=="tap"){oState[1]=!oState[1];} //普通按键:tap反转状态
else if(state=="on"){oState[1]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[1]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[1]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[1]=false;}//普通按键或开关按键:pressup松开关闭
Button1.print(oState[1]?"on":"off"); //反馈状态到APP
digitalWrite(RELAYPIN_1,!oState[1]); //输出到继电器
if (state=="on")oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
fresh=true;
}
//点灯APP修改继电器2状态
BlinkerButton Button2("b2",button2_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button2,组件键名“b2”用句不需要在setup里attach了
void button2_callback(const String & state) //按钮2回调函数,按下后设备开启继电器2
{
if(state=="tap"){oState[2]=!oState[2];} //普通按键:tap反转状态
else if(state=="on"){oState[2]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[2]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[2]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[2]=false;}//普通按键或开关按键:pressup松开关闭
Button2.print(oState[2]?"on":"off"); //反馈状态到APP
digitalWrite(RELAYPIN_2,!oState[2]); //输出到继电器
if (state=="on")oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
fresh=true;
}
//点灯APP修改继电器3状态
BlinkerButton Button3("b3",button3_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button3,组件键名“b3”用句不需要在setup里attach了
void button3_callback(const String & state) //按钮3回调函数,按下后设备开启继电器3
{
if(state=="tap"){oState[3]=!oState[3];} //普通按键:tap反转状态
else if(state=="on"){oState[3]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[3]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[3]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[3]=false;}//普通按键或开关按键:pressup松开关闭
Button3.print(oState[3]?"on":"off"); //反馈状态到APP
digitalWrite(RELAYPIN_3,!oState[3]); //输出到继电器
if (state=="on")oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
fresh=true;
}
//点灯APP修改继电器4状态
BlinkerButton Button4("b4",button4_callback); //类库实例化语句,类名BlinkerButton按钮组件,实例名Button4,组件键名“b4”用句不需要在setup里attach了
void button4_callback(const String & state) //按钮4回调函数,按下后设备开启继电器4
{
if(state=="tap"){oState[4]=!oState[4];} //普通按键:tap反转状态
else if(state=="on"){oState[4]=true;} //开关按键:on 短按开启
else if(state=="off"){oState[4]=false;} //开关按键:off短按关闭
else if(state=="press"){oState[4]=true;} //普通按键或开关按键:press长按开启
else if(state=="pressup"){oState[4]=false;}//普通按键或开关按键:pressup松开关闭
Button4.print(oState[4]?"on":"off"); //反馈状态到APP
digitalWrite(RELAYPIN_4,!oState[4]); //输出到继电器
if (state=="on")oState[0] = true; //若打开的不是总开关,则打开总开关,允许分开关输出
fresh=true;
}
void heartbeat() //用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
{
Button1.print(oState[1]?"on":"off"); //反馈状态到APP
Button2.print(oState[2]?"on":"off"); //反馈状态到APP
Button3.print(oState[3]?"on":"off"); //反馈状态到APP
Button4.print(oState[4]?"on":"off"); //反馈状态到APP
}
void setup()
{
Serial.begin(115200); //初始化硬件串口UART0波特率115200 bps(调试时需要相应的调整Aruino>工具>串口监视器>波特率为115200)
BLINKER_DEBUG.stream(Serial); //将Blinker库代码调试信息流打印到硬件串口
BLINKER_DEBUG.debugAll(); //开启所有调试信息
pinMode(RELAYPIN_1, OUTPUT); digitalWrite(RELAYPIN_1, LOW);//初始化继电器1所在GPIO,并输出低电平
pinMode(RELAYPIN_2, OUTPUT); digitalWrite(RELAYPIN_2, LOW);//初始化继电器2所在GPIO,并输出低电平
pinMode(RELAYPIN_3, OUTPUT); digitalWrite(RELAYPIN_3, LOW);//初始化继电器3所在GPIO,并输出低电平
pinMode(RELAYPIN_4, OUTPUT); digitalWrite(RELAYPIN_4, LOW);//初始化继电器4所在GPIO,并输出低电平
Blinker.begin(auth, ssid, pswd); //调用Blinker库的开始成员函数,初始化Wifi连接(参数:授权码、WiFi名、密码)
Blinker.attachData(dataRead); //注册dataread函数,若APP数据包含未注册的组件键名则会进入此函数处理
Blinker.attachHeartbeat(heartbeat); //注册用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱同学修改继电器状态回调函数,Blinker.run()检测到小爱同学修改请求就会执行
BlinkerMIOT.attachQuery(miotQuery); //注册小爱同学查询继电器状态回调函数,Blinker.run()检测到小爱同学查询请求就会执行
oState[0]=true;//总开默认打开
}
void loop()
{
Blinker.run();
if(fresh){
BLINKER_LOG("输出使能:",oState[0]?"开":"关");
digitalWrite(RELAYPIN_1, oState[1]);BLINKER_LOG("继电器1: ",oState[1]?"开":"关");
digitalWrite(RELAYPIN_2, oState[2]);BLINKER_LOG("继电器1: ",oState[2]?"开":"关");
digitalWrite(RELAYPIN_3, oState[3]);BLINKER_LOG("继电器1: ",oState[3]?"开":"关");
digitalWrite(RELAYPIN_4, oState[4]);BLINKER_LOG("继电器1: ",oState[4]?"开":"关");
fresh=false;
}
}