blinker数据反馈

一.简介

我们在做智能家居项目的时候,数据的反馈是必不可少的,比如测温度湿度等等,将得到的数据通过服务器发送到我们的app端,实时的观测数据,今天简=简绍的是blinker 的心跳包来反馈数据

二.心跳包

我们先来了解一下什么是心跳包

在blinker app上,点击设备图标进入设备控制页面时,app会向设备发送一个状态查询指令(心跳查询)
此后,WiFi设备,每59秒会返回一次心跳包;Ble(蓝牙)设备,每29秒返回一次心跳包

状态查询指令

{"get":"state"}

默认状态下,wifi接入设备会返回

{"state":"online"}

BLE(蓝牙)接入设备会返回

{"state":"connected"}

blinker提供了改写心跳包内容的方法,使用此方法可将一些数据放置在心跳包中返回,该方法可用于数据同步、状态查询。

但是注意
设备端不主动发送数据(我们在app上不刷新的话我们检测的数据是不会变得),一切反馈都是由客户端(APP)发起。这样设计可以节约服务器资源,避免浪费。

三.心跳包初始化ui

1.代码部分

#define BLINKER_WIFI
 
#include <Blinker.h>
 
char auth[] = "Your Device Secret Key";
char ssid[] = "Your WiFi network SSID or name";
char pswd[] = "Your WiFi network WPA password or WEP key";
// 新建组件对象
BlinkerButton Button1("btn-abc");
 
// 按下按键即会执行该函数
void button1_callback(const String & state) {
    BLINKER_LOG("get button state: ", state);
}
 
// 心跳包函数
void heartbeat() {
    Button1.icon("fas fa-lightbulb");
    Button1.color("#fddb00");
    Button1.text("关灯","打开啦");
    Button1.print("on");
}
 
void setup() {
    // 初始化串口
    Serial.begin(115200);
    // 初始化有LED的IO
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);
    // 初始化blinker
    Blinker.begin(auth, ssid, pswd);
    Button1.attach(button1_callback);
    //注册一个心跳包
    Blinker.attachHeartbeat(heartbeat);
}
 
void loop() {
    Blinker.run();
}

上面代码的目的就是在进入软件控制界面后初始化ui界面

下面代码是对Button1 组件的初始化,当用户调用Button1.print(“on”);这些设置才会一并发送,APP收到这些数据,即会改变组件上显示的内容

 Button1.icon("fas fa-lightbulb");
 Button1.color("#fddb00");
 Button1.text("关灯","打开啦");

2.ui库的使用

我们可以在下面 图标库中找到我们想要的图标

点击此处:图标库

我们只需要根据 图标的名字来更换 下面代码中 fa- 后面的内容就可以了

 Button1.icon("fas fa-lightbulb");

四.温湿度测试

在这里我就用DHT11模块来测量温湿度数据,然后再通过心跳包的形式发送到app上面

1.DHT 库的安装

首先我们下载DHT库,然后将这个库文件解压到我们arduino 软件安装目录下的 libraries文件夹下

下载地址:DHT11库文件

在这里插入图片描述

2.app端ui组件设置

首先我们添加两个数据组件,将数据键值分别设为humi(温度)和temp(湿度) 如图

此图借用的是Arduino中文社区的图片
在这里插入图片描述

我们可以再添加一个调试组件,用以观察APP收到的数据,方便调试程序。

3.代码部分

#define BLINKER_WIFI
 
#include <Blinker.h>
#include <DHT.h>
 
char auth[] = "774c60aac10f"; //上一步中在app中获取到的Secret Key(新建设备的秘钥)

char ssid[] = "ZFQ"; //你的WiFi热点名称

char pswd[] = "123456789"; //你的WiFi密码
 
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");

#define DHTPIN 2  //接的是GPIO2端口
 
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
 
DHT dht(DHTPIN, DHTTYPE);
 
float humi_read = 0, temp_read = 0;
 
void heartbeat()
{
    //反馈温度数据
    HUMI.print(humi_read);
    //设置ui组件图标和颜色
    HUMI.icon("fas fa-thermometer-2");
    HUMI.color("#fddb10");

    //反馈湿度数据
    TEMP.print(temp_read);
    TEMP.icon("fas fa-heart");
    HUMI.color("#fddb01");
}
 
void setup()
{
    Serial.begin(115200);
    BLINKER_DEBUG.stream(Serial);
    BLINKER_DEBUG.debugAll();
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, LOW);
 
    Blinker.begin(auth, ssid, pswd);
    Blinker.attachHeartbeat(heartbeat);
    dht.begin();
}
 
void loop()
{
    Blinker.run();
 
    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);
}

注意

  1. 配置自己的模块联网代码,不会的可以看一下 前一个教程

  2. 注意配置#define DHTPIN D7 模块的io口,我们可以根据自己的连接来定义这个宏,不同的开发板书写上可能会不同,大家注意一下

  3. 我们根据我们所所选择的模块,来在代码此处修改

    #define DHTTYPE DHT11   // DHT 11
    //#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)
    
  4. blinker下的所有延时操作,都需要使用Blinker.delay(val);替代,否则会导致设备断开连接

同时我们也可以自己可以在心跳包里添加ui组件美化的代码,来优化组件

4.测试

我们连接好开发板,将程序烧写进去,我们就可以看到对应的数据了
在这里插入图片描述
在这里插入图片描述

四.总结

这篇文章参考arduino中文社区里的教程,自己测试了一边,有的地方书写的不够详细,包括如何和DHT11连接,如何设置IO口,以及程序如何下载进开发板,这些问题都挺简单的,不会的可以先去看一下前一篇文章,blinker点灯的文章,同时也可以和我交流

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐