前言
我们要制作一款能够远程控制家里灯、风扇的开关,并采集温湿度、光照传输到手机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
- 进入App,点击右上角的“+”号,然后选择 添加设备
- 点击选择Arduino > WiFi接入
- 复制申请到的Secret Key(一会写代码会用到)
二、开始编程
1.控制部分
我们打开Arduino IDE,通过 文件>示例>Blinker>Blinker_Hello/Hello_WiFi 打开例程
打开例程 我们开始进行修改
首先要改的是这部分
Secret Key是在我们手机端blinker APP 上面获取的
获取好了之后,我们就获得了自己的Secret Key码我们把复制好的key加进我们的代码里面
char auth[] = "b62b9765dccf"; //APP上的key char ssid[] = "WIFI名称"; //WIFI的名称 char pswd[] = "WIFI密码"; //WIFI的密码
注意:这里的WIFI可以是家里的路由器等等都可以,我这里先用手机热点进行演示,WIFI名称和密码尽量不要使用中文,不然可能会出现奇怪的错误(WIFI频段目前只支持2.4Ghz)。
之后我们继续打开我们的APP来添加两个控件实现控制我们板子上面的风扇还有LED灯
按照箭头指示就可以创建出两个控件,然后我们来对控件进行更改,我们这里选的是开关按键,控件的图标还有文本以及控件组名大家可以自行更改,按键类型也可以是普通按键,给两个控件都修改好就是这样,然后直接点右上角的小锁图标就能保存了,接下来保存好之后,我们需要用到我们的控件组名,那么我们要在代码上添加以下
// 新建组件对象 BlinkerButton Button1("btn-kd"); //控件定义 BlinkerButton Button2("btn-kfs"); //控件定义
这里BlinkerButton是库里面的组件类型,blinker库定义了多种组件类型,如 BlinkerSlider BlinkerRGB BlinkerNumber BlinkerText
这步完成之后要给组件写要实现的功能,那么我们这两个组件一个是控制板子上的两个LED灯,一个是控制小风扇,首先我们要给LED灯还有小风扇定义管脚
管脚我们根据自己板子的接线来定义
const int LED1 =D0; //LED灯管脚定义 const int LED2 =D3; //LED灯管脚定义 const int FS = D2; //风扇管脚定义
管脚定义完成之后注册我们组件的回调函数,也就是当我们组件按下去之后会实现什么功能
// 按下按键即会执行该函数 void button1_callback(const String & state) { BLINKER_LOG("get button state: ", state); if(state == BLINKER_CMD_ON){ //当APP上的按键按下传送过来的是ON LED灯高电平 digitalWrite(LED1,1); //高电平 digitalWrite(LED2,1); //高电平 Button1.print("on"); } else if(state == BLINKER_CMD_OFF){ //当APP上的按键按下传送过来的是Off LED灯低电平 digitalWrite(LED1,0); //低电平 digitalWrite(LED2,0); //低电平 Button1.print("off"); } } //---------------------------------- // 按下按键即会执行该函数 void button2_callback(const String & state) { BLINKER_LOG("get button state: ", state); if(state == BLINKER_CMD_ON){ //当APP上的按键按下传送过来的是ON 风扇至高电平启动 digitalWrite(FS,1); Button2.print("on"); } else if(state == BLINKER_CMD_OFF){//当APP上的按键按下传送过来的是Off 风扇至低电平启动 digitalWrite(FS,0); Button2.print("off"); } }
那么回调函数大概就是这个样子,接下来我们要在 void setup()初始函数里面给我们的LED还有风扇的IO口初始化 还有调用我们的回调函数
void setup() { // 初始化串口 Serial.begin(115200); BLINKER_DEBUG.stream(Serial); BLINKER_DEBUG.debugAll(); //---------------------------------- // 初始化有LED灯的IO,以及风扇的IO口 pinMode(LED1, OUTPUT); digitalWrite(LED1, 0); pinMode(LED2, OUTPUT); digitalWrite(LED2, 0); pinMode(FS, OUTPUT); digitalWrite(FS, 0); //---------------------------------- // 初始化blinker Blinker.begin(auth, ssid, pswd); //---------------------------------- Button1.attach(button1_callback); Button2.attach(button2_callback);//当APP组件按下触发 则 触发button2_callback函数 //当app中组件触发并发送到设备端时将触发该组件注册的回调函数 } void loop() { Blinker.run(); }
到这一步之后我们就可以来检验一下功能有没有实现,连接好我们的板子,在Arduino IDE 上传我们的代码到板子里面
上传成功之后打开手机blinker APP 去到我们刚才创建的设备里面
可以看见我们的设备是在线的情况,就说明我们的板子已经连接上了wifi热点,然后我们进去看看
当我们的组件开关点击之后是呈现一个开启状态,那么再看我们的板子发现两个led灯已经亮了,风扇也转动起来了,那么就成功了。
2.温湿度采集部分
到这里我们的功能已经实现一半了,接下来到我们的DHT11温湿度传感器,
我们要开始实现检测温度和湿度,开始之前我们首先要添加一个库,打开Arduino IDE点击工具>管理库
把上面这个库给安装进来,安装好之后我们继续开始,首先添加头文件宏定义还有传感器的管脚定义
#define BLINKER_WIFI #define DHTTYPE DHT11 // DHT 11 #include <DHT.h> #include <Blinker.h> const int pinDHT11 = D1; //DHT11 管脚定义 DHT dht(pinDHT11, DHTTYPE); const int LED1 =D0; //LED灯管脚定义 const int LED2 =D3; //LED灯管脚定义 const int FS = D2; //风扇管脚定义
这边传感器是接在D1,所以定义D1根据接线来定义
// 新建组件对象 BlinkerButton Button1("btn-kd"); //控件定义 BlinkerButton Button2("btn-kfs"); //控件定义 BlinkerNumber HUMI("num-sd"); //检测湿度组件 BlinkerNumber TEMP("num-wd"); //监测温度组件
新加入温湿度两个控件定义
在手机APP端添加一个数据组件,将其作为温度数据显示接口,点击该数据组件,编辑数据的信息
将键名修改为程序里定义的“num-wd”(这里的num-wd和程序中的名称相对应),文本显示“温度”,数据单位为“℃”,最大值“100”
再添加一个数据组件,将其作为湿度数据显示接口,点击该数据组件,编辑数据的信息。
将键名修改为程序里定义的“num-sd”(这里的num-sd和程序中的名称相对应),文本显示“湿度”,数据单位为“%”,最大值“100”
然后定义温湿度存储变量
const int pinDHT11 = D1; //DHT11 管脚定义 DHT dht(pinDHT11, DHTTYPE); const int LED1 =D0; //LED灯管脚定义 const int LED2 =D3; //LED灯管脚定义 const int FS = D2; //风扇管脚定义 float humi_read = 0, temp_read = 0; //湿度 温度 定义
新增加温湿度变量的定义
再添加回调函数
//把温度湿度传送给组件 void heartbeat() { HUMI.print(humi_read); TEMP.print(temp_read); }
在void setup()添加加载函数,就可以回传温湿度数据了
Blinker.attachHeartbeat(heartbeat); //加载函数heartbeat,回传数据 dht.begin(); //启动DHT11
还有启动DHT11,最后在void loop()函数里添加以下代码
void loop() { Blinker.run(); //Blinker.run()语句负责处理Blinker收到的数据,每次运行都会将设备收到的数据进行一次解析。在使用WiFi接入时,该语句也负责保持网络连接 float h = dht.readHumidity(); //读湿度 float t = dht.readTemperature();//读温度,默认为摄氏度 if (isnan(h) || isnan(t)) //判断温湿度有没有读取失败 { BLINKER_LOG("Failed to read from DHT sensor!"); } else { BLINKER_LOG("Humidity: ", h, " %");//湿度 BLINKER_LOG("Temperature: ", t, " *C");//温度 humi_read = h; //读湿度 temp_read = t; //读温度,默认为摄氏度 } Blinker.delay(2000); }
最后烧录程序到板子中试试,显示上传成功之后打开串口监视器还有我们的手机blinker APP(串口波特率115200)
可以看到都能检测到温湿度,那么已经是成功了的,到这里那么就剩我们最后一个光敏传感器。
3.光照采集部分
我们在手机APP中新添加一个数据控件,用来收集光线强度的数据。
在blinker中添加一个数据控件,修改对应的键名和显示文本,设置最大值是1023
数据控件的数据单位可以要可以不要,传感器的信号引脚连接在A0端口中
下面是代码部分
volatile int light;//光照数据定义
变量定义
BlinkerNumber GUANG("num-gm");//光照组件
组件定义
//光照数据回传 void dataStorage(){ Blinker.dataStorage("num-gm", light); }
回调函数编写
light = 0;//赋初始值 Blinker.attachDataStorage(dataStorage);//访问dataStorage函数
void setup()初始函数中添加
void loop() { light = analogRead(A0);//读取A0端口的数据 delay(100); GUANG.print(light);//显示数值 //----------------------------------
void loop()主函数中添加
最后上传,上传成功,打开手机APP
等待重新上电之后,可以看到光照数据已经上来了,如果实在没有的可以打开串口工具看看是否有接收到。
那么我们本次的简易《智能家居》可以说是大功告成了,对于物联网开发来说,上手难度真的不是很高,有库函数的支持下,简单方便易懂,给小白来都能看懂开发。文章来源:https://www.toymoban.com/news/detail-738014.html
4.项目完整源码
下面是整个项目的完整代码参考:文章来源地址https://www.toymoban.com/news/detail-738014.html
#define BLINKER_WIFI #define DHTTYPE DHT11 // DHT 11 #include <DHT.h> #include <Blinker.h> const int pinDHT11 = D1; //DHT11 管脚定义 DHT dht(pinDHT11, DHTTYPE); const int LED1 =D0; //LED灯管脚定义 const int LED2 =D3; //LED灯管脚定义 const int FS = D2; //风扇管脚定义 float humi_read = 0, temp_read = 0; //湿度 温度 定义 volatile int light;//光照数据定义 char auth[] = "b62b9765dccf"; //APP上的key char ssid[] = "wifi_name"; //wifi热点的名称 char pswd[] = "12345678"; //热点密码 // 新建组件对象 BlinkerButton Button1("btn-kd"); //控件定义 BlinkerButton Button2("btn-kfs"); //控件定义 BlinkerNumber HUMI("num-sd"); //检测湿度组件 BlinkerNumber TEMP("num-wd"); //监测温度组件 BlinkerNumber GUANG("num-gm");//光照组件 // 按下按键即会执行该函数 void button1_callback(const String & state) { BLINKER_LOG("get button state: ", state); if(state == BLINKER_CMD_ON){ //当APP上的按键按下传送过来的是ON LED灯高电平 digitalWrite(LED1,1); //高电平 digitalWrite(LED2,1); //高电平 Button1.print("on"); } else if(state == BLINKER_CMD_OFF){ //当APP上的按键按下传送过来的是Off LED灯低电平 digitalWrite(LED1,0); //低电平 digitalWrite(LED2,0); //低电平 Button1.print("off"); } } //---------------------------------- // 按下按键即会执行该函数 void button2_callback(const String & state) { BLINKER_LOG("get button state: ", state); if(state == BLINKER_CMD_ON){ //当APP上的按键按下传送过来的是ON 风扇至高电平启动 digitalWrite(FS,1); Button2.print("on"); } else if(state == BLINKER_CMD_OFF){//当APP上的按键按下传送过来的是Off 风扇至低电平启动 digitalWrite(FS,0); Button2.print("off"); } } //---------------------------------- //把温度湿度传送给组件 void heartbeat() { HUMI.print(humi_read); TEMP.print(temp_read); } //---------------------------------- //光照数据回传 void dataStorage(){ Blinker.dataStorage("num-gm", light); } //---------------------------------- void setup() { // 初始化串口 Serial.begin(115200); BLINKER_DEBUG.stream(Serial); BLINKER_DEBUG.debugAll(); //---------------------------------- // 初始化有LED灯的IO,以及风扇的IO口 pinMode(LED1, OUTPUT); digitalWrite(LED1, 0); pinMode(LED2, OUTPUT); digitalWrite(LED2, 0); pinMode(FS, OUTPUT); digitalWrite(FS, 0); //---------------------------------- // 初始化blinker Blinker.begin(auth, ssid, pswd); Blinker.attachHeartbeat(heartbeat); //加载函数heartbeat,回传数据 dht.begin(); //启动DHT11 light = 0;//赋初始值 Blinker.attachDataStorage(dataStorage);//访问dataStorage函数 //---------------------------------- Button1.attach(button1_callback); Button2.attach(button2_callback);//当APP组件按下触发 则 触发button2_callback函数 //当app中组件触发并发送到设备端时将触发该组件注册的回调函数 } void loop() { light = analogRead(A0);//读取A0端口的数据 delay(100); GUANG.print(light);//显示数值 //---------------------------------- Blinker.run(); //Blinker.run()语句负责处理Blinker收到的数据,每次运行都会将设备收到的数据进行一次解析。在使用WiFi接入时,该语句也负责保持网络连接 float h = dht.readHumidity(); //读湿度 float t = dht.readTemperature();//读温度,默认为摄氏度 if (isnan(h) || isnan(t)) //判断温湿度有没有读取失败 { BLINKER_LOG("Failed to read from DHT sensor!"); } else { BLINKER_LOG("Humidity: ", h, " %");//湿度 BLINKER_LOG("Temperature: ", t, " *C");//温度 humi_read = h; //读湿度 temp_read = t; //读温度,默认为摄氏度 } Blinker.delay(2000); }
到了这里,关于Arduino物联网快速开发:基于ESP8266与点灯Blinker制作小白都会的DIY《智能家居》系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!