当前位置:   article > 正文

Arduino物联网快速开发:基于ESP8266与点灯Blinker制作小白都会的DIY《智能家居》系统_blinker点灯

blinker点灯

 前言

我们要制作一款能够远程控制家里灯、风扇的开关,并采集温湿度、光照传输到手机APP上。正好看到了点灯Blinker的开源方案,blinker是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、服务器端支持,使用公有云服务进行数据传输。可用于智能家居、数据监测等领域,可以帮助用户更好更快地搭建物联网项目。APP通过拖动控件就可以进行DIY界面了,非常方便。话不多说,那么接下来我们就一起来试试吧。

整篇文章内容较长,但全是精髓,末尾有源码参考。(注意:硬件引脚不一定与我相同,请谨慎使用。)


目录


前言

一、准备工作

所用到的硬件:

软件准备:

1、电脑安装-Arduino IDE

2、手机安装-blinker APP

3、下载并安装blinker Arduino库

4、在手机app端中添加设备,获取Secret Key

二、开始编程

1.控制部分

2.温湿度采集部分

3.光照采集部分

4.项目完整源码


一、准备工作

所用到的硬件:

esp8266 MINI开发板

G5516光敏传感器模块

DHT11温湿度传感器模块

一路5V继电器

小风扇(5V驱动)

LED发光二极管(直插) 2个

轻触开关(用来做开关电路) 2个

1K电阻 2个

20K电阻 2个

电源准备:充电宝或18650锂电池

因为芯片的IO口肯定是带不动小风扇的,所以得上一路5V继电器供电给风扇外接。

 

整个板子的原理图.以及板子的实物

软件准备:

1、电脑安装-Arduino IDE

①.先安装好ArduinoIDE(如果已安装,直接跳到第二步,详细安装ArduinoIDE的方法本篇不再赘述)
下载Arduino IDE

②.打开Arduino IDE菜单 > 文件 >首选项,在 附加开发板管理器网址 输入框中,填入以下网址:
Arduino中文社区

③.下载社区打包的esp32安装包,直接运行并解压即可。
下载地址:Arduino中文社区

双击运行即可解压,解压完成后,再打开Arduino IDE,即可在 菜单栏>工具>开发板 中找到你使用的esp8266开发板

PS:如果要添加多个开发板地址,请点后面的按钮,然后一行一个

2、手机安装-blinker APP

下载并安装blinker APP

Android下载:
点击下载 或 在android应用商店搜索“blinker”下载安装
IOS下载:
点击下载 或 在app store中搜索“blinker”下载

3、下载并安装blinker Arduino库

    ①.下载地址:点灯科技-点灯物联网解决方案

    ②.通过Arduino IDE 菜单>项目>加载库>添加.ZIP库 导入到库,如图:

4、在手机app端中添加设备,获取Secret Key

  1. 进入App,点击右上角的“+”号,然后选择 添加设备
  2. 点击选择Arduino > WiFi接入
  3. 复制申请到的Secret Key(一会写代码会用到)

二、开始编程

1.控制部分

我们打开Arduino IDE,通过 文件>示例>Blinker>Blinker_Hello/Hello_WiFi 打开例程

打开例程 我们开始进行修改

首先要改的是这部分

Secret Key是在我们手机端blinker APP 上面获取的

 

  

 获取好了之后,我们就获得了自己的Secret Key码我们把复制好的key加进我们的代码里面

  1. char auth[] = "b62b9765dccf"; //APP上的key
  2. char ssid[] = "WIFI名称"; //WIFI的名称
  3. char pswd[] = "WIFI密码"; //WIFI的密码

注意:这里的WIFI可以是家里的路由器等等都可以,我这里先用手机热点进行演示,WIFI名称和密码尽量不要使用中文,不然可能会出现奇怪的错误(WIFI频段目前只支持2.4Ghz)。

之后我们继续打开我们的APP来添加两个控件实现控制我们板子上面的风扇还有LED灯

按照箭头指示就可以创建出两个控件,然后我们来对控件进行更改,我们这里选的是开关按键,控件的图标还有文本以及控件组名大家可以自行更改,按键类型也可以是普通按键,给两个控件都修改好就是这样,然后直接点右上角的小锁图标就能保存了,接下来保存好之后,我们需要用到我们的控件组名,那么我们要在代码上添加以下

  1. // 新建组件对象
  2. BlinkerButton Button1("btn-kd"); //控件定义
  3. BlinkerButton Button2("btn-kfs"); //控件定义

这里BlinkerButton是库里面的组件类型,blinker库定义了多种组件类型,如 BlinkerSlider BlinkerRGB BlinkerNumber BlinkerText

这步完成之后要给组件写要实现的功能,那么我们这两个组件一个是控制板子上的两个LED灯,一个是控制小风扇,首先我们要给LED灯还有小风扇定义管脚

管脚我们根据自己板子的接线来定义

  1. const int LED1 =D0; //LED灯管脚定义
  2. const int LED2 =D3; //LED灯管脚定义
  3. const int FS = D2; //风扇管脚定义

 管脚定义完成之后注册我们组件的回调函数,也就是当我们组件按下去之后会实现什么功能

  1. // 按下按键即会执行该函数
  2. void button1_callback(const String & state) {
  3. BLINKER_LOG("get button state: ", state);
  4. if(state == BLINKER_CMD_ON){ //当APP上的按键按下传送过来的是ON LED灯高电平
  5. digitalWrite(LED1,1); //高电平
  6. digitalWrite(LED2,1); //高电平
  7. Button1.print("on");
  8. }
  9. else if(state == BLINKER_CMD_OFF){ //当APP上的按键按下传送过来的是Off LED灯低电平
  10. digitalWrite(LED1,0); //低电平
  11. digitalWrite(LED2,0); //低电平
  12. Button1.print("off");
  13. }
  14. }
  15. //----------------------------------
  16. // 按下按键即会执行该函数
  17. void button2_callback(const String & state) {
  18. BLINKER_LOG("get button state: ", state);
  19. if(state == BLINKER_CMD_ON){ //当APP上的按键按下传送过来的是ON 风扇至高电平启动
  20. digitalWrite(FS,1);
  21. Button2.print("on");
  22. }
  23. else if(state == BLINKER_CMD_OFF){//当APP上的按键按下传送过来的是Off 风扇至低电平启动
  24. digitalWrite(FS,0);
  25. Button2.print("off");
  26. }
  27. }

 那么回调函数大概就是这个样子,接下来我们要在 void setup()初始函数里面给我们的LED还有风扇的IO口初始化 还有调用我们的回调函数

  1. void setup()
  2. {
  3. // 初始化串口
  4. Serial.begin(115200);
  5. BLINKER_DEBUG.stream(Serial);
  6. BLINKER_DEBUG.debugAll();
  7. //----------------------------------
  8. // 初始化有LED灯的IO,以及风扇的IO口
  9. pinMode(LED1, OUTPUT);
  10. digitalWrite(LED1, 0);
  11. pinMode(LED2, OUTPUT);
  12. digitalWrite(LED2, 0);
  13. pinMode(FS, OUTPUT);
  14. digitalWrite(FS, 0);
  15. //----------------------------------
  16. // 初始化blinker
  17. Blinker.begin(auth, ssid, pswd);
  18. //----------------------------------
  19. Button1.attach(button1_callback);
  20. Button2.attach(button2_callback);//当APP组件按下触发 则 触发button2_callback函数
  21. //当app中组件触发并发送到设备端时将触发该组件注册的回调函数
  22. }
  23. void loop() {
  24. Blinker.run();
  25. }

 到这一步之后我们就可以来检验一下功能有没有实现,连接好我们的板子,Arduino IDE 上传我们的代码到板子里面

上传成功之后打开手机blinker APP 去到我们刚才创建的设备里面

可以看见我们的设备是在线的情况,就说明我们的板子已经连接上了wifi热点,然后我们进去看看

当我们的组件开关点击之后是呈现一个开启状态,那么再看我们的板子发现两个led灯已经亮了,风扇也转动起来了,那么就成功了。


2.温湿度采集部分

到这里我们的功能已经实现一半了,接下来到我们的DHT11温湿度传感器,

我们要开始实现检测温度和湿度,开始之前我们首先要添加一个库,打开Arduino IDE点击工具>管理库

把上面这个库给安装进来,安装好之后我们继续开始,首先添加头文件宏定义还有传感器的管脚定义

  1. #define BLINKER_WIFI
  2. #define DHTTYPE DHT11 // DHT 11
  3. #include <DHT.h>
  4. #include <Blinker.h>
  5. const int pinDHT11 = D1; //DHT11 管脚定义
  6. DHT dht(pinDHT11, DHTTYPE);
  7. const int LED1 =D0; //LED灯管脚定义
  8. const int LED2 =D3; //LED灯管脚定义
  9. const int FS = D2; //风扇管脚定义

 这边传感器是接在D1,所以定义D1根据接线来定义

  1. // 新建组件对象
  2. BlinkerButton Button1("btn-kd"); //控件定义
  3. BlinkerButton Button2("btn-kfs"); //控件定义
  4. BlinkerNumber HUMI("num-sd"); //检测湿度组件
  5. BlinkerNumber TEMP("num-wd"); //监测温度组件

新加入温湿度两个控件定义

在手机APP端添加一个数据组件,将其作为温度数据显示接口,点击该数据组件,编辑数据的信息

将键名修改为程序里定义的“num-wd”(这里的num-wd和程序中的名称相对应),文本显示“温度”,数据单位为“℃”,最大值“100”

再添加一个数据组件,将其作为湿度数据显示接口,点击该数据组件,编辑数据的信息。

将键名修改为程序里定义的“num-sd”(这里的num-sd和程序中的名称相对应),文本显示“湿度”,数据单位为“%”,最大值“100”

然后定义温湿度存储变量

  1. const int pinDHT11 = D1; //DHT11 管脚定义
  2. DHT dht(pinDHT11, DHTTYPE);
  3. const int LED1 =D0; //LED灯管脚定义
  4. const int LED2 =D3; //LED灯管脚定义
  5. const int FS = D2; //风扇管脚定义
  6. float humi_read = 0, temp_read = 0; //湿度 温度 定义

新增加温湿度变量的定义

 再添加回调函数

  1. //把温度湿度传送给组件
  2. void heartbeat()
  3. {
  4. HUMI.print(humi_read);
  5. TEMP.print(temp_read);
  6. }

 在void setup()添加加载函数,就可以回传温湿度数据了

  1. Blinker.attachHeartbeat(heartbeat); //加载函数heartbeat,回传数据
  2. dht.begin(); //启动DHT11

 还有启动DHT11,最后在void loop()函数里添加以下代码

  1. void loop() {
  2. Blinker.run();
  3. //Blinker.run()语句负责处理Blinker收到的数据,每次运行都会将设备收到的数据进行一次解析。在使用WiFi接入时,该语句也负责保持网络连接
  4. float h = dht.readHumidity(); //读湿度
  5. float t = dht.readTemperature();//读温度,默认为摄氏度
  6. if (isnan(h) || isnan(t)) //判断温湿度有没有读取失败
  7. {
  8. BLINKER_LOG("Failed to read from DHT sensor!");
  9. }
  10. else
  11. {
  12. BLINKER_LOG("Humidity: ", h, " %");//湿度
  13. BLINKER_LOG("Temperature: ", t, " *C");//温度
  14. humi_read = h; //读湿度
  15. temp_read = t; //读温度,默认为摄氏度
  16. }
  17. Blinker.delay(2000);
  18. }

 最后烧录程序到板子中试试,显示上传成功之后打开串口监视器还有我们的手机blinker APP(串口波特率115200)

 

可以看到都能检测到温湿度,那么已经是成功了的,到这里那么就剩我们最后一个光敏传感器。


3.光照采集部分

我们在手机APP中新添加一个数据控件,用来收集光线强度的数据。

在blinker中添加一个数据控件,修改对应的键名和显示文本,设置最大值是1023

数据控件的数据单位可以要可以不要,传感器的信号引脚连接在A0端口中

下面是代码部分

volatile int light;//光照数据定义

变量定义

BlinkerNumber GUANG("num-gm");//光照组件

组件定义

  1. //光照数据回传
  2. void dataStorage(){
  3. Blinker.dataStorage("num-gm", light);
  4. }

回调函数编写

  1. light = 0;//赋初始值
  2. Blinker.attachDataStorage(dataStorage);//访问dataStorage函数

 void setup()初始函数中添加

  1. void loop() {
  2. light = analogRead(A0);//读取A0端口的数据
  3. delay(100);
  4. GUANG.print(light);//显示数值
  5. //----------------------------------

 void loop()主函数中添加

最后上传,上传成功,打开手机APP

 

 

等待重新上电之后,可以看到光照数据已经上来了,如果实在没有的可以打开串口工具看看是否有接收到。

那么我们本次的简易《智能家居》可以说是大功告成了,对于物联网开发来说,上手难度真的不是很高,有库函数的支持下,简单方便易懂,给小白来都能看懂开发。


4.项目完整源码

 下面是整个项目的完整代码参考:

  1. #define BLINKER_WIFI
  2. #define DHTTYPE DHT11 // DHT 11
  3. #include <DHT.h>
  4. #include <Blinker.h>
  5. const int pinDHT11 = D1; //DHT11 管脚定义
  6. DHT dht(pinDHT11, DHTTYPE);
  7. const int LED1 =D0; //LED灯管脚定义
  8. const int LED2 =D3; //LED灯管脚定义
  9. const int FS = D2; //风扇管脚定义
  10. float humi_read = 0, temp_read = 0; //湿度 温度 定义
  11. volatile int light;//光照数据定义
  12. char auth[] = "b62b9765dccf"; //APP上的key
  13. char ssid[] = "wifi_name"; //wifi热点的名称
  14. char pswd[] = "12345678"; //热点密码
  15. // 新建组件对象
  16. BlinkerButton Button1("btn-kd"); //控件定义
  17. BlinkerButton Button2("btn-kfs"); //控件定义
  18. BlinkerNumber HUMI("num-sd"); //检测湿度组件
  19. BlinkerNumber TEMP("num-wd"); //监测温度组件
  20. BlinkerNumber GUANG("num-gm");//光照组件
  21. // 按下按键即会执行该函数
  22. void button1_callback(const String & state) {
  23. BLINKER_LOG("get button state: ", state);
  24. if(state == BLINKER_CMD_ON){ //当APP上的按键按下传送过来的是ON LED灯高电平
  25. digitalWrite(LED1,1); //高电平
  26. digitalWrite(LED2,1); //高电平
  27. Button1.print("on");
  28. }
  29. else if(state == BLINKER_CMD_OFF){ //当APP上的按键按下传送过来的是Off LED灯低电平
  30. digitalWrite(LED1,0); //低电平
  31. digitalWrite(LED2,0); //低电平
  32. Button1.print("off");
  33. }
  34. }
  35. //----------------------------------
  36. // 按下按键即会执行该函数
  37. void button2_callback(const String & state) {
  38. BLINKER_LOG("get button state: ", state);
  39. if(state == BLINKER_CMD_ON){ //当APP上的按键按下传送过来的是ON 风扇至高电平启动
  40. digitalWrite(FS,1);
  41. Button2.print("on");
  42. }
  43. else if(state == BLINKER_CMD_OFF){//当APP上的按键按下传送过来的是Off 风扇至低电平启动
  44. digitalWrite(FS,0);
  45. Button2.print("off");
  46. }
  47. }
  48. //----------------------------------
  49. //把温度湿度传送给组件
  50. void heartbeat()
  51. {
  52. HUMI.print(humi_read);
  53. TEMP.print(temp_read);
  54. }
  55. //----------------------------------
  56. //光照数据回传
  57. void dataStorage(){
  58. Blinker.dataStorage("num-gm", light);
  59. }
  60. //----------------------------------
  61. void setup()
  62. {
  63. // 初始化串口
  64. Serial.begin(115200);
  65. BLINKER_DEBUG.stream(Serial);
  66. BLINKER_DEBUG.debugAll();
  67. //----------------------------------
  68. // 初始化有LED灯的IO,以及风扇的IO口
  69. pinMode(LED1, OUTPUT);
  70. digitalWrite(LED1, 0);
  71. pinMode(LED2, OUTPUT);
  72. digitalWrite(LED2, 0);
  73. pinMode(FS, OUTPUT);
  74. digitalWrite(FS, 0);
  75. //----------------------------------
  76. // 初始化blinker
  77. Blinker.begin(auth, ssid, pswd);
  78. Blinker.attachHeartbeat(heartbeat); //加载函数heartbeat,回传数据
  79. dht.begin(); //启动DHT11
  80. light = 0;//赋初始值
  81. Blinker.attachDataStorage(dataStorage);//访问dataStorage函数
  82. //----------------------------------
  83. Button1.attach(button1_callback);
  84. Button2.attach(button2_callback);//当APP组件按下触发 则 触发button2_callback函数
  85. //当app中组件触发并发送到设备端时将触发该组件注册的回调函数
  86. }
  87. void loop() {
  88. light = analogRead(A0);//读取A0端口的数据
  89. delay(100);
  90. GUANG.print(light);//显示数值
  91. //----------------------------------
  92. Blinker.run();
  93. //Blinker.run()语句负责处理Blinker收到的数据,每次运行都会将设备收到的数据进行一次解析。在使用WiFi接入时,该语句也负责保持网络连接
  94. float h = dht.readHumidity(); //读湿度
  95. float t = dht.readTemperature();//读温度,默认为摄氏度
  96. if (isnan(h) || isnan(t)) //判断温湿度有没有读取失败
  97. {
  98. BLINKER_LOG("Failed to read from DHT sensor!");
  99. }
  100. else
  101. {
  102. BLINKER_LOG("Humidity: ", h, " %");//湿度
  103. BLINKER_LOG("Temperature: ", t, " *C");//温度
  104. humi_read = h; //读湿度
  105. temp_read = t; //读温度,默认为摄氏度
  106. }
  107. Blinker.delay(2000);
  108. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/142647
推荐阅读
相关标签
  

闽ICP备14008679号