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

21物联网1班-韦忠航 2023-05-28 17:37:35

前言

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

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

硬件设计、文档整理:21物联网应用技术1班 韦忠航

代码编写、软件调试:21物联网应用技术1班 曾先海


目录


前言

一、准备工作

所用到的硬件:

软件准备:

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菜单 > 文件 >首选项,在 附加开发板管理器网址 输入框中,填入以下网址:
https://www.arduino.me/package_esp8266com_index.json

③.下载社区打包的esp32安装包,直接运行并解压即可。
下载地址:https://arduino.me/a/esp8266

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

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

2、手机安装-blinker APP

下载并安装blinker APP

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

 

3、下载并安装blinker Arduino库

    ①.下载地址:https://diandeng.tech/dev

    ②.通过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加进我们的代码里面

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

 

 

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

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


4.项目完整源码

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

#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);
    
}

 


 

...全文
1297 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,366

社区成员

发帖
与我相关
我的任务
社区描述
柳职院电子信息工程学院同学们的学习园地
社区管理员
  • c_university_1974
  • qq_39231145
  • zhuisir
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

各位加入社区的同学,请完善社区信息,把社区昵称改为【班级-姓名】,社区签名改为【班级-学号-姓名】的格式

如【社区昵称】20计应1班  张某某(班级用简称)

     【社区签名】2020级计算机应用技术1班 20201234567 张某某 (班级用全称)

试试用AI创作助手写篇文章吧