查看: 18530|回復: 48
打印 上一主題 下一主題

[使用文檔] [Arduino物聯網開發實戰2]數據反饋

[復制鏈接]
  • TA的每日心情
    郁悶
    2018-12-6 22:21
  • 簽到天數: 48 天

    [LV.5]常住居民I

    跳轉到指定樓層
    樓主
    發表于 2018-12-15 23:30 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

    上一篇:blinker開發實戰1-控制開關燈

    除了控制設備外,blinker還可以接收設備的反饋數據,并顯示出來

    添加DIY組件

    在編輯模式下,點擊按鍵進入編輯組件頁面,可以看到 按鍵類型 有三個選項:普通按鍵、開關按鍵、自定義

    三種類型區別如下:
    普通按鍵
    每次按下發送的指令為  

    {"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,兩個組件分別對應溫濕度數據。 如圖:

    可以添加一個調試組件,用以觀察APP收到的數據,方便調試程序。

    本示例中使用的DHT11/22溫濕度傳感器庫,可在以下地址下載:
    http://www.xwjziy.live/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);替代,否則會導致設備斷開連接。

    實際效果如下圖:

    下一篇:blinker開發實戰3-語音/定時/設備共享  












  • 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

    5#
     樓主| 發表于 2019-1-22 23:02 | 只看該作者
    chensr 發表于 2019-1-22 21:22
    上傳溫濕度有保存嗎?可以查詢歷史數據嗎?

    暫為向免費用戶開放
  • TA的每日心情
    郁悶
    2019-1-25 10:53
  • 簽到天數: 2 天

    [LV.1]初來乍到

    6#
    發表于 2019-1-24 12:45 | 只看該作者
    我的按照DHT庫,實例導入會報錯!如圖:求解!實例可以通過編譯。但是這個文中的導入就不行了!

    dhtbaocuo.jpg (33.35 KB, 下載次數: 19)

    dhtbaocuo.jpg

    點評

    請帖完整的報錯信息  詳情 回復 發表于 2019-1-24 13:24
  • TA的每日心情
    郁悶
    2018-12-6 22:21
  • 簽到天數: 48 天

    [LV.5]常住居民I

    7#
     樓主| 發表于 2019-1-24 13:24 | 只看該作者
    宇之楓海云 發表于 2019-1-24 12:45
    我的按照DHT庫,實例導入會報錯!如圖:求解!實例可以通過編譯。但是這個文中的導入就不行了! ...

    請帖完整的報錯信息
  • TA的每日心情
    郁悶
    2019-1-25 10:53
  • 簽到天數: 2 天

    [LV.1]初來乍到

    8#
    發表于 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]初來乍到

    9#
    發表于 2019-1-24 15:28 | 只看該作者
    我測試下來,只要加入了#include <DHT.h>
    這一句,編譯就過不了了!注釋后就好了!

    點評

    使用本帖鏈接里的庫就行了  詳情 回復 發表于 2019-1-24 15:33
  • TA的每日心情
    郁悶
    2018-12-6 22:21
  • 簽到天數: 48 天

    [LV.5]常住居民I

    10#
     樓主| 發表于 2019-1-24 15:33 | 只看該作者
    宇之楓海云 發表于 2019-1-24 15:28
    我測試下來,只要加入了#include
    這一句,編譯就過不了了!注釋后就好了! ...

    使用本帖鏈接里的庫就行了
    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規則

    熱門推薦

    [限時福利]5分鐘帶你快速了解新一代開發板:M5STACK
    [限時福利]5分鐘帶你快速
    一、什么是M5Stack M5Stack是一種模塊化、可堆疊擴展的開發板,每個模塊
    Blynk與m5stack basic以及uiflow的交互玩法
    Blynk與m5stack basic以及
    Blynk與m5stack basic以及uiflow的交互玩法 [準備工作我們假設玩家已經熟悉下面的準備
    Arduino mega2560+MPU6050利用加速度值控制舵機
    Arduino mega2560+MPU6050
    學習了幾天時間,慢慢了解MPU6050這個6軸的姿態模塊,現在整理一下這個模塊與Arduino
    【Arduino】168種傳感器模塊系列實驗(138)---5A交流電流模塊
    【Arduino】168種傳感器模
    37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是
    Arduino物聯網開發實例教程
    Arduino物聯網開發實例教
    [md] **blinker用戶交流群 301438087 (僅限github已Star的用戶加群)** ## bli
    Copyright   ©2015-2016  Arduino中文社區  Powered by©Discuz!   
    快速回復 返回頂部 返回列表
    3d每天组六27个号必中