2016年8月16日 星期二

★ Blynk 應用 (二) : 在手機顯示即時溫溼度與光度

上週完成用手機透過 Blynk App 控制 Arduino Nano 板上 D13 LED 的實驗, 參考 :

# Blynk 應用 : 用手機控制 Arduino (一)

這實驗是 Write 操作, 也就是由 Blynk (手機) 向遠端 Arduino 做寫入動作. 實際上除了寫入以外, Blynk 也有好幾個元件是用來讀取 Arduino 所送出的資料 (Read 操作), 然後以圖形呈現在手機上. 今天就來測試看看如何將 DHT11 與光敏電阻所組成的小型氣象站呈現於手機上的 Blynk App, 這樣就不需要開瀏覽器進去 Xively 或 ThingSpeak 網站看測量結果了. 作法參考 :

# Weather and Security Station with Blynk

雖然這篇使用 CC32000 Wifi 擴充板, 不是 ESP8266, 但可以參考它如何使用 Virtual Pin 來連接手機 App 與 Arduino 所取得的量測值.

以下測試程式是在我自己用洞洞板焊接的 Arduino Nano+ESP8266 IOT 模組上進行實驗, 電路圖參考 :

# 製作 Arduino Nano + ESP8266 物聯網模組 (四) : 完結篇



首先開啟手機上的 Blynk App 來新增專案.


輸入專案名稱 "WeatherStation", 選擇我使用的板子 "Arduino Nano", 按 "E-mail" 鈕將認證金鑰寄到信箱以便複製到程式中, 按 "Create" 產生專案 :


這樣就產生了一個空的專案面板 :


按右上方的 + 或面板中任何一處就會出現元件箱 (Widget Box), 選取其中的 Graph :


面板上會出現一個圖表 :


點一下此圖表會進入設定畫面, 輸入元件名稱 "oC" (表示攝氏溫度) :


再按 "PIN" 鈕選擇 Virtual V0, 表示此圖表將從虛擬腳位 V0 讀取資料 :


設定適當溫度範圍, 一般 0~40 即可, 讀取週期 (10 秒), 以及圖表樣式為折線圖 (LINE) :


接下來如法炮製新增濕度 RH% 與光度 LM% 的圖形顯示元件, 其值都是 0~100% :




OK, 這樣 App 設定部分就完成了. 接下來是 Arduino 程式部分, 溫溼度與照度量測參考 :

# 以 Arduino+ESP8266 物聯網模組重作 DHT11 溫溼度實驗
# Arduino 光敏電阻測試

我使用 Arduino 的 D2 連接到 DHT11 的 data 腳, 使用 A0 腳位連接光敏電阻與 10K 電阻的分壓點以取得照度值, 然後將量測到的溫溼度與照度綁定到 Blynk 的 V0~V2 虛擬腳位. 關於虛擬腳位用法, 參考 :

How to use Virtual Pins in Blynk (有範例)

而適用 Arduino + ESP8266 架構, 即把 ESP8266 當成 Arduino 的 Wifi 擴充板, 所需要的函式庫與 Arduino 應用程式, 參考前篇關於 Blynk 控制 LED 的程式 :

Blynk 應用 : 用手機控制 Arduino (一)

完整程式如下 :

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#include "DHT.h"
#define DHTPIN 6
#define DHTTYPE DHT11

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "c4965ac3d8b8464a8e6a0ffxxxxxxaae";

// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "EDIMAX-tony";
char pass[] = "1234567890";

// Hardware Serial on Mega, Leonardo, Micro...
//#define EspSerial Serial1

// or Software Serial on Uno, Nano...
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(7, 8); // RX, TX

// Your ESP8266 baud rate:
#define ESP8266_BAUD 9600

ESP8266 wifi(&EspSerial);
DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor

void setup() {
  // Set console baud rate
  Serial.begin(9600);
  delay(10);
  // Set ESP8266 baud rate
  EspSerial.begin(ESP8266_BAUD);
  delay(10);
  Blynk.begin(auth, wifi, ssid, pass);
  }

void loop() {
  Blynk.run();
  }

BLYNK_READ(0) {
  float Temperature=dht.readTemperature(); //get temperature (C) from DHT11
  Blynk.virtualWrite(0, Temperature);
  BLYNK_LOG("Temperature %5.1f", Temperature);
  }

BLYNK_READ(1) {
  float Humidity=dht.readHumidity(); //get humidity from DHT11
  Blynk.virtualWrite(1, Humidity);
  BLYNK_LOG("Humidity %5.1f", Humidity);
  }

 BLYNK_READ(2) {
  int cds=analogRead(A0); //get cds voltage (0~5V to 0~1023 dark)
  int Luminance=100-map(cds,0,1023,0,100); //map 0~1023(dark) to 0(dark)~100%
  Blynk.virtualWrite(2, Luminance);
  BLYNK_LOG("Luminance %3d", Luminance);
  }

這裡我們定義了三個 BLYNK_READ() 函數, 其參數為虛擬腳位編號 (僅數字, 不含 V), 分別對應 V0~V2 三個虛擬腳位所綁定的元件. 每當手機 Blynk App 裡的元件 (Widget) 向 Arduino 提出資料要求時, 這些對應的函數就會被呼叫. 上面在設定三個元件時, 我們指定 Request 頻率為每 10 秒提出要求一次, 亦即此三個函數每 10 秒就會被呼叫一次. 當此三函數被呼叫時, 我們就去讀取測量值, 然後呼叫 Blynk.virtualWrite() 函數把測量值寫進相應之虛擬腳位, 這樣手機 App 便能收到所傳送的測量值了.

另外這裡的 BLYNK_LOG() 函數其實就是我們常用的 Serial.println(), 即向指定序列埠輸出訊息, 但 Blynk 定義的這個 BLYNK_LOG() 較有彈性, 只要在程式開始時用定義 BLYNK_PRINT 常數為哪一個序列埠 (須在第一行), 之後只要直接使用 BLYNK_LOG() 即可. 參考 Blynk 說明文件關於 Debugging 部分 :

http://docs.blynk.cc

To enable debug prints on the default Serial, add on the top of your sketch (should be the first line):

#define BLYNK_PRINT Serial // Defines the object that is used for printing
#define BLYNK_DEBUG        // Optional, this enables more detailed prints

And enable Serial Output in setup():

Serial.begin(9600);

其實用 Serial,println() 就可以了.

此程式編譯後記憶體耗用 :

草稿碼使用了 23,524 bytes (76%) 的程式存儲空間。最大值為 30,720 bytes。
全域變數使用了 861 bytes (42%) 的動態記憶體,剩餘 1,187 bytes 供局部變數。最大值為 2,048 bytes 。

程式上傳 Arduino 後, 手機連上網路, 打開 Blynk, 執行 WeatherStation 專案, 可看到溫濕度與照度的摺線圖, 時間軸會不斷往左移動更新數據. 若覺得 10 秒更新頻率太低, 可以改為 1 秒 :


圖中照度突然變小是因為我關掉檯燈, 測試光敏電阻是否真的有在動.

也可以使用儀表 Gauge 來呈現, 可以在專案中新增一個 Gauge 元件, 並賦予 V3 虛擬腳位來量測溫度 :




然後在上面程式中添加 BLYNK_READ(3) 函數將溫度寫入 V3 腳位 :

BLYNK_READ(3) {
  float Temperature=dht.readTemperature(); //get temperature (C) from DHT11
  Blynk.virtualWrite(3, Temperature);
  }

重新上傳程式就可以看到溫度表了 :


不過, 儀表只能呈現目前的測量值, 沒辦法看到隨時間變動的情形. 我覺得使用 Blynk 比開啟瀏覽器連線到 ThingSpeak 要簡單得多, 可以透過 Internet 隨時監看遠端設備的運作情況, 實在非常方便. 這如果用 ThingSpeak 來做, 得自己寫個 App 從 ThingSpeak 伺服器讀取數據才行, 總之, Blynk 已經幫我們寫好 App 啦! 而且非常有彈性, 可以隨時修改設定.

在專案標題按兩個圈圈圖形, 再按 "Generate Link" 鈕即可分享此專案 :


手機只要安裝 Blynk, 以照相機讀取上面 QR Code 即可取得此專案.


13 則留言 :

五餅二魚水族倉庫 提到...
作者已經移除這則留言。
五餅二魚水族倉庫 提到...

請問,做好的BlyNK APP經由LINE 分享給別人,
程式中的基地台密碼及帳號,需要重新設定嗎?

五餅二魚水族倉庫 提到...

請問,做好的BlyNK APP經由LINE 分享給別人,
程式中的基地台密碼及帳號,需要重新設定嗎?

小狐狸事務所 提到...

分享出去的是專案的設計而已, 例如用了哪些元件, 參數如何設定等, 並非分享專案本身. 在 Line 或臉書下載你分享的專案的人無法存取你的設備, 無線基地台 ssid 與 pwd 更不可能, 因為那是寫在 Arduino 裡面的韌體中, 專案裡沒有這些資訊. 參考 :

http://yhhuang1966.blogspot.tw/2016/08/blynk.html

五餅二魚水族倉庫 提到...

再請教,如果人是在辦公室, DHT11 與光敏電阻所組成的小型氣象站的設備是放在家中,Blynk做好的程式,手機又如何能顯示結果?, 因為手機上的Blynk並非是藉著browser輸入家中
基地台的IP,連上家中的小型氣象站,設計過程中,也不需告知家中基地台的IP,請問這只能用在內網嗎?

小狐狸事務所 提到...

網路連線部分 BLYNK 函式庫已經幫我們搞定囉! 所以 Arduino 程式裡要給定基地台 ssid 與 pwd, 以及手機中blynk 專案的金鑰. 人在外手機用 wifi 或行動網路上網後, blynk app 會自動找尋伺服器, 而設備端也透過 wifi 上網後, 也會自動與伺服器連線, 這樣就把手機跟設備搭上線了.

小狐狸事務所 提到...

這是透過 internet 控制的, 不是用在區網. 即使手機跟設備都是連到家裡基地台, 實際上都是要連到外面 blynk 公司的伺服器, 兩個才會搭上線. 如果家裡的基地台不連 internet, 那麼整個就無法運作了, 除非自己下載 blynk 原始碼, 找區網一台主機或樹莓派安裝自己的 blynk 伺服器, 才可以在區網內玩 blynk.

五餅二魚水族倉庫 提到...

因為家中沒有internet基地台,只有手機,我可使用兩台手機,讓 Ardunio+ESP8266 利用WIFI連上A手機,B手機則安裝Blynk程式, 這種方法可以嗎?,還是說 ardunio 必需真正連上家中能夠上網的基地台才可以.

另一個問題是,arduino如何連上攝影機,讓手機顯示看到的影像,不知老師是否有這方面的專論
,謝謝指導,祝鴻圖大展......

小狐狸事務所 提到...

可以的, 一台手機打開行動網路並分享無線基地台, 讓 arduino+esp8266 可以連外道 internet, 另一台手機 (上網的同一台手機也可以) 安裝 blynk, 這樣就可以了. 只要能連上 internet 就行, 並非一定要有 adsl 或光纖這種固接式上網裝置. 我只用一台手機而已. arduino 處理影像是可以的, 只是聽說效能不佳, 要看圖片應該 ok, 要看連續影像可能會卡卡, 我還沒做此實驗, 但在網路上有看過人家做.

Unknown 提到...

您好,目前是使用ESP32-DevKit ESP-WROOM-32 及彎曲感應器所得到的數據傳到blynk.

arduino 視窗打開出現 以下一串數字 是代表沒連接到嗎?

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun 8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0x00
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0008,len:8
load:0x3fff0010,len:2232
load:0x40078000,len:11744
load:0x40080000,len:252
entry 0x40080034


這是我arduino的程式碼。

#define BLYNK_PRINT Serial
#define BLYNK_DEBUG
#include
#include
#include

char auth[] = "";

const char ssid[] = "";
const char pass[] = "";


void setup() {

Serial.begin(9600);
Blynk.begin(auth, ssid, pass);

}

void loop() {
Blynk.run();
}

BLYNK_READ(0)
{
float angle = analogRead(A4);
Blynk.virtualWrite(0, angle);
BLYNK_LOG("angle ", angle);
}


如果知道問題點在哪 ,能否告訴我 謝謝

小狐狸事務所 提到...

您 SSID 與 PASS 沒給是嗎? 這看起來是韌體開機訊息, 您是使用 ARDUINO+ESP8266 嗎? 還是只用 ESP8266 當主控, 如為後者應使用 ESP8266_standalone 模式.

Unknown 提到...

請問如何將arduino偵測到的數據 分別同時傳至blynk 中不同的project

小狐狸事務所 提到...

抱歉, 太久沒用 blynk, 有點忘了, 我得找時間研究一下.