赞
踩
我们要制作一款能够远程控制家里灯、风扇的开关,并采集温湿度、光照传输到手机APP上。正好看到了点灯Blinker的开源方案,blinker是一套跨硬件、跨平台的物联网解决方案,提供APP端、设备端、服务器端支持,使用公有云服务进行数据传输。可用于智能家居、数据监测等领域,可以帮助用户更好更快地搭建物联网项目。APP通过拖动控件就可以进行DIY界面了,非常方便。话不多说,那么接下来我们就一起来试试吧。
整篇文章内容较长,但全是精髓,末尾有源码参考。(注意:硬件引脚不一定与我相同,请谨慎使用。)
目录
esp8266 MINI开发板
G5516光敏传感器模块
DHT11温湿度传感器模块
一路5V继电器
小风扇(5V驱动)
LED发光二极管(直插) 2个
轻触开关(用来做开关电路) 2个
1K电阻 2个
20K电阻 2个
电源准备:充电宝或18650锂电池
因为芯片的IO口肯定是带不动小风扇的,所以得上一路5V继电器供电给风扇外接。
整个板子的原理图.以及板子的实物
①.先安装好ArduinoIDE(如果已安装,直接跳到第二步,详细安装ArduinoIDE的方法本篇不再赘述)
下载Arduino IDE
②.打开Arduino IDE菜单 > 文件 >首选项,在 附加开发板管理器网址 输入框中,填入以下网址:
Arduino中文社区
③.下载社区打包的esp32安装包,直接运行并解压即可。
下载地址:Arduino中文社区
双击运行即可解压,解压完成后,再打开Arduino IDE,即可在 菜单栏>工具>开发板 中找到你使用的esp8266开发板
PS:如果要添加多个开发板地址,请点后面的按钮,然后一行一个
下载并安装blinker APP
Android下载:
点击下载 或 在android应用商店搜索“blinker”下载安装
IOS下载:
点击下载 或 在app store中搜索“blinker”下载
①.下载地址:点灯科技-点灯物联网解决方案
②.通过Arduino IDE 菜单>项目>加载库>添加.ZIP库 导入到库,如图:
我们打开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灯已经亮了,风扇也转动起来了,那么就成功了。
到这里我们的功能已经实现一半了,接下来到我们的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)
可以看到都能检测到温湿度,那么已经是成功了的,到这里那么就剩我们最后一个光敏传感器。
我们在手机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
等待重新上电之后,可以看到光照数据已经上来了,如果实在没有的可以打开串口工具看看是否有接收到。
那么我们本次的简易《智能家居》可以说是大功告成了,对于物联网开发来说,上手难度真的不是很高,有库函数的支持下,简单方便易懂,给小白来都能看懂开发。
下面是整个项目的完整代码参考:
- #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);
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。