查看: 13361|回复: 44

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

[复制链接]
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

    发表于 2018-12-15 23:30 | 显示全部楼层 |阅读模式

    上一篇:blinker开发实战1-控制开关灯

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

    添加DIY组件

    在编辑模式下,点击按键进入编辑组件页面,可以看到 按键类型 有三个选项:普通按键、开关按键、自定义
    blinker3.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秒返回一次心跳包
    状态查询指令,如下:

    {"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) 中找到要使用的图标,点击进入该图标页面,可以看到其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-语音/定时/设备共享  












    如果以上内容对你有帮助,你可以通过打赏支持作者

    1人打赏

  • TA的每日心情
    奋斗
    2019-3-30 17:49
  • 签到天数: 19 天

    [LV.4]偶尔看看III

    发表于 2019-1-16 00:53 | 显示全部楼层
    请教下怎么做一键刷新状态

    点评

    按键对应的回调函数中反馈数据即可  详情 回复 发表于 2019-1-16 11:41
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2019-1-16 11:41 | 显示全部楼层
    邓杰罗斯 发表于 2019-1-16 00:53
    请教下怎么做一键刷新状态

    按键对应的回调函数中反馈数据即可
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    无聊
    2019-2-19 15:40
  • 签到天数: 18 天

    [LV.4]偶尔看看III

    发表于 2019-1-22 21:22 | 显示全部楼层
    上传温湿度有保存吗?可以查询历史数据吗?

    点评

    暂为向免费用户开放  详情 回复 发表于 2019-1-22 23:02
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2019-1-22 23:02 | 显示全部楼层
    chensr 发表于 2019-1-22 21:22
    上传温湿度有保存吗?可以查询历史数据吗?

    暂为向免费用户开放
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    郁闷
    2019-1-25 10:53
  • 签到天数: 2 天

    [LV.1]初来乍到

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

    点评

    请帖完整的报错信息  详情 回复 发表于 2019-1-24 13:24
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

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

    请帖完整的报错信息
    如果以上内容对你有帮助,你可以通过打赏支持作者
  • TA的每日心情
    郁闷
    2019-1-25 10:53
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 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 编译时出错。

    在文件 -> 首选项开启
    “编译过程中显示详细输出”选项
    这份报告会包含更多信息。
  • TA的每日心情
    郁闷
    2019-1-25 10:53
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-1-24 15:28 | 显示全部楼层
    我测试下来,只要加入了#include <DHT.h>
    这一句,编译就过不了了!注释后就好了!

    点评

    使用本帖链接里的库就行了  详情 回复 发表于 2019-1-24 15:33
  • TA的每日心情
    郁闷
    2018-12-6 22:21
  • 签到天数: 48 天

    [LV.5]常住居民I

     楼主| 发表于 2019-1-24 15:33 | 显示全部楼层
    宇之枫海云 发表于 2019-1-24 15:28
    我测试下来,只要加入了#include
    这一句,编译就过不了了!注释后就好了! ...

    使用本帖链接里的库就行了
    如果以上内容对你有帮助,你可以通过打赏支持作者
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    【Arduino】108种传感器模块系列实验(55)---DHT11温湿度传感器
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    【Arduino】108种传感器模块系列实验(40)---旋转编码器模块
    【Arduino】108种传感器模
    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
    基于机器视觉的智能分拣机械臂
    基于机器视觉的智能分拣机
    本作品是一个基于机器视觉的智能机械臂操作平台,其采用atmega32单片机作为主控制系统
    请问HMC5883L的三个数据到底代表什么,如何做成指南针?
    请问HMC5883L的三个数据到
    或者哪位朋友有资料给个连接?网上愣是没找到。都只介绍了如何读取数据。我想做成图
    关于atmega328p-pu 地的问题
    关于atmega328p-pu 地的问
    请问图中ADC的地和VCC的地在单片机内部有连接吗?本人初学者,因为需要控制模拟电路,
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表