【小爱同学】[Blinker·点灯科技]2024最新-小爱联动4路继电器 浅易开源教程 ...

打印 上一主题 下一主题

主题 913|帖子 913|积分 2739

合集地点: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高电平才吸合,利用推挽输出:
  1. pinMode(RELAYPIN_1, OUTPUT);
复制代码
低电平触发的模组寻常是高电平5V,单片机输出0V高电平才吸合,避免5V灌入单片机3.3V回路,利用开漏输出
  1. pinMode(RELAYPIN_1, OUTPUT_OPEN_DRAIN);
复制代码
参考资料:【NodeMcu-ESP8266】引脚利用参考指南http://t.csdnimg.cn/OtETF
利用阐明书

一、程序组成(发起打开看一下原版)

1.联动插座例程MIOT_MULTI_OUTLET



2.按键尺度处置惩罚函数(本案例将button1_state替换为oState[1],以便与小爱共同控制)

  1. bool button1_state=false;     // 按钮1状态全局变量
  2. //下面这句是类库实例化语句,类名BlinkerButton(按钮组件类),实例名Button1,数据键名“b1”,当blinker.run检测到APP发来数据包含键名“b1”就调用回调button1_callback。
  3. BlinkerButton Button1("b1",button1_callback);//用此句不需要在setup里attach回调了
  4. void button1_callback(const String & state)//按钮1回调函数,按下后设备开启继电器1
  5. {
  6.     if(state=="tap"){button1_state=!button1_state;}//普通按键:tap反转状态
  7.     else if(state=="on"){button1_state=true;}      //开关按键:on 短按开启
  8.     else if(state=="off"){button1_state=false;}    //开关按键:off短按关闭
  9.     else if(state=="press"){button1_state=true;}   //普通按键或开关按键:press长按开启
  10.     else if(state=="pressup"){button1_state=false;}//普通按键或开关按键:pressup松开关闭
  11.     Button1.print(button1_state?"on":"off");//反馈状态到APP
  12.     digitalWrite(RELAYPIN_1,!button1_state);//输出到继电器
  13. }
复制代码
3.心跳包例程



  1. void heartbeat ()                               //用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
  2. {
  3. }
  4. setup()
  5. {
  6. Blinker.attachHeartbeat(heartbeat);           //注册用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
  7.    
  8. }
复制代码
以上三个合并为本教程代码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.com/stable/package_esp8266com_index.json
http://x.iaoye.xin/package_esp8266com_index.json
http://wechat.doit.am/package_esp8266com_index.json
https://github.com/esp8266/Arduino/releases/download/2.5.0/package_esp8266com_index.json
https://raw.githubusercontent.com/DFRobot/FireBeetle-ESP8266/master/package_firebeetle8266_index.json
https://dl.espressif.com/dl/package_esp32_index.json
https://arduino.me/packages/esp32.json
https://raw.githubusercontent.com/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函数外添加
  1.     //上联路由器的静态IP   WiFi.config
  2.     IPAddress sip(192,168,1,200);      //手动设置静态IP 连接网络ip
  3.     IPAddress sip1(192,168,1,1);       //本地网关
  4.     IPAddress sip2(255,255,255,0);     //本地子网掩码
复制代码
并在setup函数内的WiFi.begin前添加
  1.     //上联路由器wifi
  2.     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.cn/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)利用串口继电器(我的毕业设计,即将开源)




四、代码原文(带注释供参考)

  1. /* *****************************************************************
  2. * 日期:2024年1月26日   
  3. * 本案例教程:
  4. * 技术支持qq:1836035711
  5. * *****************************************************************
  6. * 使用前检查——软硬件配置
  7. //1.开发板搜索关键词:NodeMcu 、四路继电器 或 继电器底板智能插座WIFI模块适用于ESP8266ESP-01/01S板
  8. //2.开发板管理网址:填写在Arduino>文件>首选项>附加开发板管理网址 https://arduino.esp8266.com/stable/package_esp8266com_index.json
  9. //3.硬件(开发板)库: 自动离线安装包下载地址https://www.123pan.com/s/dJrKVv-QEGB选择ESP8266的2.7.4~3.0.2版本
  10. //                运行后会创建C:\Users\用户名\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2
  11. //(1)ESP01S 开发板选择Arduino>工具>开发板>ESP8266Boards>generic esp8266 module
  12. //(2)NodeMCU开发板选择Arduino>工具>开发板>ESP8266Boards>NodeMCU 1.0(ESP12E Module)
  13. //4.软件(Blinker)库下载:官网下载https://diandeng.tech/dev(选Arduino SDK)
  14. //                    或 GitHub下载master总版(推荐)https://github.com/blinker-iot/blinker-library/tree/master(点击Code>Download ZIP)
  15. //              下载后:自动添加方式:Arduino>项目>加载库>添加.ZIP库                 
  16. //                    手动解压并放置在C:\Users\用户名\Documents\Arduino\libraries文件夹
  17. //5.Blinker APP 下载本:官网下载https://diandeng.tech/dev
  18. //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¨|÷}
  19. * NodeMCU开发板的GPIO和板上引脚对应:(GPIO是ESP8266引脚号,D几是开发板上引脚号,ESP01s用Generic8266Moudle编译,直接写GPIO号,NodeMCU用NodeMCU1.0编译两个都可以)
  20. *
  21. * D0-GPIO16  (属于断电计时RTC模块,用于深度睡眠唤醒,但可以配置为GPIO,另外无法触发普通中断)
  22. * D1-GPIO5
  23. * D2-GPIO4
  24. * D3-GPIO0   (开机时输入高电平进入运行模式,开机时输入低电平进烧录模式,烧录模式不执行用户程序)
  25. * D4-GPIO2   (开机必须输入高电平,UART1TXD 只有发送功能,可作打印 log)
  26. * D5-GPIO14
  27. * D6-GPIO12
  28. * D7-GPIO13  
  29. * D8-GPIO15  (开机时必须输入低电平)
  30. * D9-GPIO3   (初始化Serial后用于硬件串口0即UART0)
  31. * D10-GPIO1  (初始化Serial后用于硬件串口0即UART0)(开机时必须输入高电平)
  32. * A0-ADC0    (整个开发板只有一个模拟输入引脚,且模拟电压值为0-1.0V)
  33. * 注意:
  34. * (1)GPIO4,12,14,15支持14位高精度硬件PWM
  35. * (2)GPIO9、10在DUAL4线制式flash通信可用,QUAD6线制时不可用,嫌IO少可以选择内置flash 的8285或ESP32系列
  36. * (3)GPIO6-11基本不用来进行通用输入输出,一般用于连接开发板的闪存(flash程序存储器,烧录程序的地方)
  37. * (4) EN 任何时候:高电平有效,芯片正常工作;低电平芯片关闭,电流很小
  38. * *****************************************************************/
  39. //先定义通讯模式、小米小爱MIOT标志
  40. #define BLINKER_WIFI
  41. #define BLINKER_MIOT_MULTI_OUTLET
  42. //再包含Blinker库
  43. #include <Blinker.h>
  44. //定义通讯参数 供Blinker.begin()初始化函数调用*************************************************************************以下三行必须修改!!!!!!!!!!!!!!!!!!!!!!!!!!
  45. char auth[] = "******************修改为自己的点灯授权码*************";//授权码
  46. char ssid[] = "******************修改为自己的Wifi名****************";//WiFi名   必须是2.4G不能5G,路由器不能开双频合一或5G优选,必须有密码的WiFi,可以用电脑或手机热点,设置方法百度搜
  47. char pswd[] = "******************修改为自己的WiFi密码**************";//WiFi密码
  48. //定义四个继电器所在引脚(参考上文nodemcu开发板引脚表,ESP01S只能0和2,另外两个可以随意写一个nodemcu开发板引脚表里的GPIO号)
  49. #define RELAYPIN_1 16           //D0
  50. #define RELAYPIN_2 5            //D1
  51. #define RELAYPIN_3 4            //D2
  52. #define RELAYPIN_4 0            //D3(开机时GPIO0输入高电平进入运行模式,输入低电平进烧录模式,烧录模式不执行用户程序,若您继电器模块为高电平触发,平时低电平,则不可连接此引脚,需要换D5(GPIO14)
  53. //定义全局变量
  54. bool fresh=true;//刷新标志
  55. bool oState[5] = { false };//继电器输出状态数组:总开关(0)与四个继电器状态(1~4)一共5个布尔值:布尔变量true=1=HIGH高电平,false=0=LOW=低电平
  56. void miotPowerState(const String & state, uint8_t num)//小爱同学修改继电器状态回调函数
  57. {
  58.     BLINKER_LOG("need set outlet: ", num, ", power state: ", state);//串口打印修改的继电器编号和写入的状态
  59.     if (state == BLINKER_CMD_ON)                                    //若状态为开   
  60.     {   
  61.         oState[num] = true;                                         //则状态赋值:向状态数组写入true(loop函数里会将其输出到继电器对应引脚)
  62.         BlinkerMIOT.powerState("on", num);                          //反馈该继电器开了
  63.         BlinkerMIOT.print();                                        //发送反馈
  64.         if (num != 0) oState[0] = true;                             //若打开的不是总开关,则打开总开关,允许分开关输出
  65.     }
  66.     else if (state == BLINKER_CMD_OFF)                              //若状态为关
  67.     {
  68.         oState[num] = false;                                        //则状态赋值:向状态数组写入false(loop函数里会将其输出到继电器对应引脚)
  69.         BlinkerMIOT.powerState("off", num);                         //反馈该继电器关了
  70.         BlinkerMIOT.print();                                        //发送反馈
  71.         if (num == 0)for (uint8_t o_num = 0; o_num < 5; o_num++)oState[o_num] = false;//若关闭的是总开关,则将四个继电器全部关闭(开启总开关不会使继电器全部打开,只是允许输出)
  72.     }
  73.     fresh=true;//用标志位告诉loop函数刷新继电器状态
  74. }
  75. void miotQuery(int32_t queryCode, uint8_t num)//小爱同学通过点灯服务器查询继电器状态
  76. {
  77.     BLINKER_LOG("MIOT Query outlet: ", num,", codes: ", queryCode);//串口打印调试的继电器编号、查询的项目
  78.     switch (queryCode)                                              //检测编号
  79.     {
  80.         case BLINKER_CMD_QUERY_ALL_NUMBER :                         //当项目为查询全部
  81.             BLINKER_LOG("MIOT Query All");                          //串口打印全部
  82.             BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);//反馈全部状态
  83.             BlinkerMIOT.print();                                    //发送反馈
  84.             break;
  85.         case BLINKER_CMD_QUERY_POWERSTATE_NUMBER :                  //当项目为查询电源状态
  86.             BLINKER_LOG("MIOT Query Power State");                  //串口打印电源状态
  87.             BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);//反馈电源状态
  88.             BlinkerMIOT.print();                                    //发送反馈
  89.             break;
  90.         default :                                                   //当项目为查询其它
  91.             BlinkerMIOT.powerState(oState[num] ? "on" : "off", num);//反馈电源状态
  92.             BlinkerMIOT.print();                                    //发送反馈
  93.             break;
  94.     }
  95. }
  96. void dataRead(const String & data)              //dataread函数,若Blinker APP数据包含未注册的组件键名,或无键名的多余数据则会进入此函数处理,例如输入框或调试组件输入的文本
  97. {
  98.     BLINKER_LOG("Blinker readString: ", data);  //串口打印多余数据
  99.     Blinker.vibrate();                          //Blinker APP震动   
  100.     uint32_t BlinkerTime = millis();            //取时间戳
  101.     Blinker.print("millis", BlinkerTime);       //向Blinker APP反馈时间戳
  102. }
  103. //点灯APP修改继电器0状态
  104. BlinkerButton Button0("b0",button0_callback);  //类库实例化语句,类名BlinkerButton按钮组件,实例名Button0,组件键名“b0”用句不需要在setup里attach了
  105. void button0_callback(const String & state)    //按钮0回调函数,按下后设备开启继电器0
  106. {
  107.     if(state=="tap"){oState[0]=!oState[0];}    //普通按键:tap反转状态
  108.     else if(state=="on"){oState[0]=true;}      //开关按键:on 短按开启
  109.     else if(state=="off"){oState[0]=false;}    //开关按键:off短按关闭
  110.     else if(state=="press"){oState[0]=true;}   //普通按键或开关按键:press长按开启
  111.     else if(state=="pressup"){oState[0]=false;}//普通按键或开关按键:pressup松开关闭
  112.     Button0.print(oState[0]?"on":"off");       //反馈状态到APP
  113.     //digitalWrite(RELAYPIN_0,!oState[0]);       //不输出到继电器
  114.     if (state=="off")for (uint8_t o_num = 0; o_num < 5; o_num++)oState[o_num] = false;//若关闭的是总开关,则将四个继电器全部关闭(开启总开关不会使继电器全部打开,只是允许输出)
  115.     fresh=true;
  116. }
  117. //点灯APP修改继电器1状态
  118. BlinkerButton Button1("b1",button1_callback);  //类库实例化语句,类名BlinkerButton按钮组件,实例名Button1,组件键名“b1”用句不需要在setup里attach了
  119. void button1_callback(const String & state)    //按钮1回调函数,按下后设备开启继电器1
  120. {
  121.     if(state=="tap"){oState[1]=!oState[1];}    //普通按键:tap反转状态
  122.     else if(state=="on"){oState[1]=true;}      //开关按键:on 短按开启
  123.     else if(state=="off"){oState[1]=false;}    //开关按键:off短按关闭
  124.     else if(state=="press"){oState[1]=true;}   //普通按键或开关按键:press长按开启
  125.     else if(state=="pressup"){oState[1]=false;}//普通按键或开关按键:pressup松开关闭
  126.     Button1.print(oState[1]?"on":"off");       //反馈状态到APP
  127.     digitalWrite(RELAYPIN_1,!oState[1]);       //输出到继电器
  128.     if (state=="on")oState[0] = true;          //若打开的不是总开关,则打开总开关,允许分开关输出
  129.     fresh=true;
  130. }
  131. //点灯APP修改继电器2状态
  132. BlinkerButton Button2("b2",button2_callback);  //类库实例化语句,类名BlinkerButton按钮组件,实例名Button2,组件键名“b2”用句不需要在setup里attach了
  133. void button2_callback(const String & state)    //按钮2回调函数,按下后设备开启继电器2
  134. {
  135.     if(state=="tap"){oState[2]=!oState[2];}    //普通按键:tap反转状态
  136.     else if(state=="on"){oState[2]=true;}      //开关按键:on 短按开启
  137.     else if(state=="off"){oState[2]=false;}    //开关按键:off短按关闭
  138.     else if(state=="press"){oState[2]=true;}   //普通按键或开关按键:press长按开启
  139.     else if(state=="pressup"){oState[2]=false;}//普通按键或开关按键:pressup松开关闭
  140.     Button2.print(oState[2]?"on":"off");       //反馈状态到APP
  141.     digitalWrite(RELAYPIN_2,!oState[2]);       //输出到继电器
  142.     if (state=="on")oState[0] = true;          //若打开的不是总开关,则打开总开关,允许分开关输出
  143.     fresh=true;
  144. }
  145. //点灯APP修改继电器3状态
  146. BlinkerButton Button3("b3",button3_callback);  //类库实例化语句,类名BlinkerButton按钮组件,实例名Button3,组件键名“b3”用句不需要在setup里attach了
  147. void button3_callback(const String & state)    //按钮3回调函数,按下后设备开启继电器3
  148. {
  149.     if(state=="tap"){oState[3]=!oState[3];}    //普通按键:tap反转状态
  150.     else if(state=="on"){oState[3]=true;}      //开关按键:on 短按开启
  151.     else if(state=="off"){oState[3]=false;}    //开关按键:off短按关闭
  152.     else if(state=="press"){oState[3]=true;}   //普通按键或开关按键:press长按开启
  153.     else if(state=="pressup"){oState[3]=false;}//普通按键或开关按键:pressup松开关闭
  154.     Button3.print(oState[3]?"on":"off");       //反馈状态到APP
  155.     digitalWrite(RELAYPIN_3,!oState[3]);       //输出到继电器
  156.     if (state=="on")oState[0] = true;          //若打开的不是总开关,则打开总开关,允许分开关输出
  157.     fresh=true;
  158. }
  159. //点灯APP修改继电器4状态
  160. BlinkerButton Button4("b4",button4_callback);  //类库实例化语句,类名BlinkerButton按钮组件,实例名Button4,组件键名“b4”用句不需要在setup里attach了
  161. void button4_callback(const String & state)    //按钮4回调函数,按下后设备开启继电器4
  162. {
  163.     if(state=="tap"){oState[4]=!oState[4];}    //普通按键:tap反转状态
  164.     else if(state=="on"){oState[4]=true;}      //开关按键:on 短按开启
  165.     else if(state=="off"){oState[4]=false;}    //开关按键:off短按关闭
  166.     else if(state=="press"){oState[4]=true;}   //普通按键或开关按键:press长按开启
  167.     else if(state=="pressup"){oState[4]=false;}//普通按键或开关按键:pressup松开关闭
  168.     Button4.print(oState[4]?"on":"off");       //反馈状态到APP
  169.     digitalWrite(RELAYPIN_4,!oState[4]);       //输出到继电器   
  170.     if (state=="on")oState[0] = true;          //若打开的不是总开关,则打开总开关,允许分开关输出
  171.     fresh=true;
  172. }
  173. void heartbeat()                               //用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
  174. {
  175.     Button1.print(oState[1]?"on":"off");       //反馈状态到APP
  176.     Button2.print(oState[2]?"on":"off");       //反馈状态到APP
  177.     Button3.print(oState[3]?"on":"off");       //反馈状态到APP
  178.     Button4.print(oState[4]?"on":"off");       //反馈状态到APP
  179. }
  180. void setup()
  181. {
  182.     Serial.begin(115200);                         //初始化硬件串口UART0波特率115200 bps(调试时需要相应的调整Aruino>工具>串口监视器>波特率为115200)
  183.     BLINKER_DEBUG.stream(Serial);                 //将Blinker库代码调试信息流打印到硬件串口
  184.     BLINKER_DEBUG.debugAll();                     //开启所有调试信息
  185.    
  186.     pinMode(RELAYPIN_1, OUTPUT);    digitalWrite(RELAYPIN_1, LOW);//初始化继电器1所在GPIO,并输出低电平
  187.     pinMode(RELAYPIN_2, OUTPUT);    digitalWrite(RELAYPIN_2, LOW);//初始化继电器2所在GPIO,并输出低电平
  188.     pinMode(RELAYPIN_3, OUTPUT);    digitalWrite(RELAYPIN_3, LOW);//初始化继电器3所在GPIO,并输出低电平
  189.     pinMode(RELAYPIN_4, OUTPUT);    digitalWrite(RELAYPIN_4, LOW);//初始化继电器4所在GPIO,并输出低电平
  190.     Blinker.begin(auth, ssid, pswd);              //调用Blinker库的开始成员函数,初始化Wifi连接(参数:授权码、WiFi名、密码)
  191.     Blinker.attachData(dataRead);                 //注册dataread函数,若APP数据包含未注册的组件键名则会进入此函数处理
  192.     Blinker.attachHeartbeat(heartbeat);           //注册用户心跳包回调函数,Blinker.run检测到APP每30秒 get:state 请求心跳包时会顺带执行此函数
  193.     BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱同学修改继电器状态回调函数,Blinker.run()检测到小爱同学修改请求就会执行
  194.     BlinkerMIOT.attachQuery(miotQuery);           //注册小爱同学查询继电器状态回调函数,Blinker.run()检测到小爱同学查询请求就会执行
  195.     oState[0]=true;//总开默认打开
  196. }
  197. void loop()
  198. {
  199.     Blinker.run();
  200.     if(fresh){
  201.                                         BLINKER_LOG("输出使能:",oState[0]?"开":"关");
  202.     digitalWrite(RELAYPIN_1, oState[1]);BLINKER_LOG("继电器1: ",oState[1]?"开":"关");
  203.     digitalWrite(RELAYPIN_2, oState[2]);BLINKER_LOG("继电器1: ",oState[2]?"开":"关");
  204.     digitalWrite(RELAYPIN_3, oState[3]);BLINKER_LOG("继电器1: ",oState[3]?"开":"关");
  205.     digitalWrite(RELAYPIN_4, oState[4]);BLINKER_LOG("继电器1: ",oState[4]?"开":"关");
  206.     fresh=false;
  207.     }
  208. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表