[Arduino物联网开发实战2]数据反馈-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 134932|回复: 157

[使用文档] [Arduino物联网开发实战2]数据反馈

  [复制链接]
发表于 2018-12-15 23:30 | 显示全部楼层 |阅读模式
[md]上一篇:[blinker开发实战1-控制开关灯](https://www.arduino.cn/thread-83177-1-1.html)

除了控制设备外,blinker还可以接收设备的反馈数据,并显示出来

### 添加DIY组件  

在编辑模式下,点击按键进入编辑组件页面,可以看到 **按键类型** 有三个选项:普通按键、开关按键、自定义
   app4.jpg

三种类型区别如下:
**普通按键**  
每次按下发送的指令为  
```
{"btn-abc":"tap"}
```

**开关按键**  
按键本身会保存开关状态,默认为off,按下时会发送  
```
{"btn-abc":"on"}
```

保存的状态为on时,按下会发送  
```
{"btn-abc":"off"}
```

设备端可以发送指令改变当前按键的开关状态  

**自定义**  
可以自定义按下按键发送的指令内容,如

```
{"btn-abc":"自定义的内容"}
```

当用户按下按键时,这些指令会发到该设备上,设备上运行的blinker支持库可以解析这些指令,并执行开发者自定义的动作。


以下示例,是使用开关按键控制开关灯,每次开关后,都会返回当前组件的开关状态:
```
#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);
    if (state=="on") {
        digitalWrite(LED_BUILTIN, LOW);
        // 反馈开关状态
        Button1.print("on");
    } else if(state=="off"){
        digitalWrite(LED_BUILTIN, HIGH);
        // 反馈开关状态
        Button1.print("off");
    }
}

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

void loop() {
    Blinker.run();
}
```

### 心跳包与初始化UI

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

```json
{"get":"state"}
```

默认状态下,WiFi接入设备会返回:
```
{"state":"online"}
```
BLE接入设备会返回:
```
{"state":"connected"}
```

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


> blinker设备设计原则之一:设备端不主动发送数据,一切反馈都是由客户端(APP)发起。这样设计可以节约服务器资源,避免浪费。



示例程序:

```
#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.icon("fas fa-lightbulb");
    Button1.color("#fddb00");
    Button1.text("关灯","打开啦");

```
都是对Button1组件进行相关设置,当用户调用**Button1.print("on");**这些设置才会一并发送,APP收到这些数据,即会改变组件上显示的内容。
#### 图标库使用方法
在图标库 (https://fontawesome.com/v5/search) 中找到要使用的图标,点击进入该图标页面,可以看到其html调用形式,如
```
<i class="far fa-lightbulb"></i>
```
其中class内容即是我们设备端程序需要的参数。
arduino程序中调用方法如下:
```
Button1.icon("far fa-lightbulb");
```
### 数据同步

本示例可以将设备端采集的温湿度数据,通过心跳包同步数据的方式,显示到APP上。
通过界面编辑功能,添加两个数据组件,将**数据键值**分别设为humi和temp,两个组件分别对应温湿度数据。 如图:
blinker5.jpg

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

本示例中使用的DHT11/22温湿度传感器库,可在以下地址下载:  
https://www.arduino.cn/thread-81585-1-1.html

```
#define BLINKER_WIFI

#include <Blinker.h>
#include <DHT.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";

BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");

#define DHTPIN D7

//#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);
    TEMP.print(temp_read);
}

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

```
> **需要注意的是:blinker下的所有延时操作,都需要使用Blinker.delay(val);替代,否则会导致设备断开连接。**

实际效果如下图:
blinker6.jpg





下一篇:[blinker开发实战3-语音/定时/设备共享](https://www.arduino.cn/thread-83175-1-1.html)  
[/md]










发表于 2019-3-16 16:38 | 显示全部楼层
返回不了“on”,“off”是为什么呀
发表于 2019-1-16 00:53 | 显示全部楼层
请教下怎么做一键刷新状态

点评

按键对应的回调函数中反馈数据即可  详情 回复 发表于 2019-1-16 11:41
 楼主| 发表于 2019-1-16 11:41 | 显示全部楼层
邓杰罗斯 发表于 2019-1-16 00:53
请教下怎么做一键刷新状态

按键对应的回调函数中反馈数据即可
发表于 2019-1-22 21:22 | 显示全部楼层
上传温湿度有保存吗?可以查询历史数据吗?

点评

暂为向免费用户开放  详情 回复 发表于 2019-1-22 23:02
 楼主| 发表于 2019-1-22 23:02 | 显示全部楼层
chensr 发表于 2019-1-22 21:22
上传温湿度有保存吗?可以查询历史数据吗?

暂为向免费用户开放
发表于 2019-1-24 12:45 | 显示全部楼层
我的按照DHT库,实例导入会报错!如图:求解!实例可以通过编译。但是这个文中的导入就不行了!
dhtbaocuo.jpg

点评

请帖完整的报错信息  详情 回复 发表于 2019-1-24 13:24
 楼主| 发表于 2019-1-24 13:24 | 显示全部楼层
宇之枫海云 发表于 2019-1-24 12:45
我的按照DHT库,实例导入会报错!如图:求解!实例可以通过编译。但是这个文中的导入就不行了! ...

请帖完整的报错信息
发表于 2019-1-24 15:20 | 显示全部楼层
Arduino:1.8.5 (Windows 7), 开发板:"WeMos D1 R1, 80 MHz, Flash, Enabled, 4M (no SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 921600"

找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
找到无效库在 C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C: C:\Users\rain\Documents\Arduino\libraries\LiquidCrystal_I2C
In file included from C:\Users\rain\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:22:0:

C:\Users\rain\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory

#include <Adafruit_Sensor.h>

                             ^

compilation terminated.

"Blinker.h" 对应多个库
已使用: C:\Users\rain\Documents\Arduino\libraries\Blinker
未使用:C:\Users\rain\Documents\Arduino\libraries\blinker-library-master
未使用:E:\arduino\ESPduino\arduino-1.8.5\arduino-1.8.5\libraries\blinker_library_master
未使用:E:\arduino\ESPduino\arduino-1.8.5\arduino-1.8.5\libraries\blinker-library-master
"Ticker.h" 对应多个库
已使用: C:\Users\rain\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\Ticker
未使用:E:\arduino\ESPduino\arduino-1.8.5\arduino-1.8.5\libraries\Ticker
"EEPROM.h" 对应多个库
已使用: C:\Users\rain\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\EEPROM
未使用:E:\arduino\ESPduino\arduino-1.8.5\arduino-1.8.5\libraries\EEPROM
"DHT.h" 对应多个库
已使用: C:\Users\rain\Documents\Arduino\libraries\DHT-sensor-library-master
未使用:C:\Users\rain\Documents\Arduino\libraries\DHT-sensor-library
未使用:E:\arduino\ESPduino\arduino-1.8.5\arduino-1.8.5\libraries\DHT-sensor-library-master
"Hash.h" 对应多个库
已使用: C:\Users\rain\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0-beta2\libraries\Hash
未使用:E:\arduino\ESPduino\arduino-1.8.5\arduino-1.8.5\libraries\Hash
exit status 1
为开发板 WeMos D1 R1 编译时出错。

在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。
发表于 2019-1-24 15:28 | 显示全部楼层
我测试下来,只要加入了#include <DHT.h>
这一句,编译就过不了了!注释后就好了!

点评

使用本帖链接里的库就行了  详情 回复 发表于 2019-1-24 15:33
 楼主| 发表于 2019-1-24 15:33 | 显示全部楼层
宇之枫海云 发表于 2019-1-24 15:28
我测试下来,只要加入了#include
这一句,编译就过不了了!注释后就好了! ...

使用本帖链接里的库就行了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-30 23:54 , Processed in 0.089430 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表