admin管理员组

文章数量:1530316

合集地址: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;
    }
}

本文标签: 小爱继电器开源简易同学