2016年8月18日 星期四

★ Blynk 的控制元件 (Controllers)

開源方案 Blynk 是開發團隊於 2015 年 1 月 17 日在募資網站 Kickstart 上發起的一個提案, 成功募集到近五萬美元資金後於 2015 年 5 月 5 日正式上線, 使用者可在 iOS 與 Android 商店免費下載 Blynk App, 它提供多種元件 (Widget) 讓使用者自行設計 App 介面, 透過 Blynk Cloud 雲端與各式硬體設備例如 Arduino, Raspberry Pi 等連結, 讓使用者可以用手機很方便地控制遠端設備, 同時也可以擷取遠端設備狀態即時顯示於手機上.

除了手機端的 Blynk App 外, 使用者還須下載 Blynk 函式庫, 將含有呼叫 Blynk 函數的韌體程式寫入硬體設備中, 設備就會透過認證金鑰與 Blynk Cloud 雲端服務連結, 從而與手機中擁有相同金鑰的 Blynk App 專案連結, 達成透過 Internet 進行遠端操控目的. 其架構概念圖如下 :


下載安裝 Blynk App 與函式庫的方法參考我之前寫的兩篇實驗記錄 :

# Blynk 應用 (一) : 用手機控制 Arduino
# Blynk 應用 (二) : 在手機顯示即時溫溼度與光度

Blynk 目前已提供 25 種元件, 分為下列四種 :

 種類 數量 用途
 控制器 (Controllers) 6 傳送指令到硬體設備端進行控制
 顯示器 (Displays) 10 將硬體設備端傳來的資料以圖形呈現
 通知器 (Notification) 3 傳送訊息或通知 (例如 E-mail 元件)
 其他 (Others) 6 不屬於上面三類的元件

控制器執行 Write 動作, 由手機下指令控制遠端硬體設備 :


顯示器執行 Read 動作, 從硬體設備擷取資訊後以圖形化界面呈現 :


通知器可傳送訊息到自己的推特, 任何郵件信箱或推送訊息到自己的手機 :


其他類是上面三類以外的元件 :


每一個元件底下有標使用此元件會用掉多少能量 (Energy), Blynk 的商業模式是透過販賣元件能量 (Energy) 來獲利, 目前每一個帳號有 2000 單位的免費能量可用, 每使用一個元件, 能量餘額 (Balance) 就會降低 (扣掉該元件能量), 如果專案需要使用較多元件, 就會出現能量餘額不足提示 (you need more energy) :


按 "Add Energy" 就會出現能量罐列表, 可視需要進行線上購買 (單位是美金), 也有看廣告贈送能量罐的活動 (即將推出) :


跟 Play 商店上其他物聯網 App 比較起來, Blynk 是其中製作最精美的一款, 對於簡單專案而言, 免費的 2000 單位能量罐還是夠用的啦.

每一個元件都有其各自的設定頁面, 在編輯模式 (即未按 Play 鍵或跳出 Play 模式後) 點一下該元件就會進入其設定頁面. 但有些元件不需要設定, 例如 E-mail 只是啟動傳送 E-mail 功能, 沒有參數需要設定, 故無設定頁面.

以下是我這幾天閱讀官網說明文件, 實際操作後整理的控制器元件之使用方法.

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

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




一. 按鈕元件 :

最常用的是按鈕 Button 元件, 其設定畫面如下 :


按鈕可以選擇是 Push (押按型) 或 Switch (開關型), 如果用來控制 LED 的話, 前者按著才會亮, 放開就熄滅, 後者即使放開也還亮著, 要再按一次才會熄滅. 最底下的 ON/OFF LABELS 是用來設定按鈕裡面的顯示文字. 按最底下的 Delete 按鈕則會刪除此元件. 每一個元件底下都有這個按鈕.

第一個框 (BUTTON) 是按鈕名稱, 會出現在元件左上方, 而 PIN 則是選擇此按鈕要綁定的設備腳位, 有 Analog/Digital/Virtual 三個選項, Analog/Digital 是硬體板子都有的類比/數位 I/O 腳, 會依據我們在新增專案時所指定的硬體板子而顯示不同的腳位數量, 其中數位腳還會加註是否為 PWM :


指定 Analog/Digital 腳位是直接將 App 上的按鈕綁定到實體板子上的 I/O 腳, 板子裡面的韌體程式碼不需要去做寫入動作, Blink 函式庫會自動做輸出動作. 但有時候我們需要的不只是這樣的直接控制, 而是需要進一步處理後再輸出, 或者從微控器板子送資料給 Blynk App 顯示時, 需要一個暫存器來儲存這些資料, 於是 Blynk 就設計了所謂的虛擬腳位 (Virtual Pin) 來當作暫存器用, 顧名思義它並非實體腳位, 是硬體設備與 Blynk App 之間傳遞資料用的暫存器而已. Blynk 的所有 Controllers 元件都可以透過 Virtual Pin 傳送資料給硬體設備. Blynk App 除了傳送 一個 0 (Low)/1 (High) 訊息給硬體板子的 I/O 腳外, 某些元件像搖桿 (Joystick) 或顏色顯示器 (zeRGBa) 會以陣列方式一次傳送多個資料給虛擬腳位 (也只能給虛擬腳位), 詳細說明參考 :

http://docs.blynk.cc/#blynk-main-operations-virtual-pins
http://docs.blynk.cc/#blynk-firmware-virtual-pins-control

"We designed Virtual Pins to send any data from your microcontroller to the Blynk App and back."

我們可以使用虛擬腳位從 Blynk App 傳送資料給設備, 經過 MPU 運算處理後再透過虛擬腳位傳回來給 Blynk App 顯示結果. 虛擬腳位也可以用來作為與外部函式庫如 Servo, LCD 等之介面.

硬體設備如 Arduino 如果有感測資料要傳送給 Blynk App 的某個虛擬腳位, 則必須在韌體程式中定義該虛擬腳位的 BLYNK_READ(vPin) 函數, 然後在此函數中呼叫 Blynk.virtualWrite(vPin) 函數, 數據會被硬體設備立即透過網路傳送給 Blynk App 中的虛擬腳位, 例如 :

BLYNK_READ(V0) {  //虛擬腳位 V0 的讀取函數
  Blynk.virtualWrite(V0, Temperature);  //將參數 Temperature 傳送給虛擬腳位 V0
  }

第一個參數是虛擬腳位編號, 第二參數為要傳遞之數據, 它可以是整數, 浮點數, 或字串, 例如 :

Blynk.virtualWrite(V0, "abc"); //傳遞字串
Blynk.virtualWrite(V0, 123); //傳遞整數
Blynk.virtualWrite(V0, 12.34); //傳遞浮點數

但不論傳遞哪一種類型數據, 實際上都是轉成字串在傳送. Blynk App 中的顯示元件都有一個 Request Frequency 參數, 它會讓顯示元件以固定周期呼叫 BLYNK_READ(vPin) 函數從所綁定的虛擬腳位來取得所需要的數據. 例如下面是儀表 Gauge 的設定畫面, 中間有一個 Request Frequency 就是用來設定此 Gauge 元件 (虛擬腳位 V3) 向 Arduino 要求資料的頻率, 預設 1 秒表示 Arduino 韌體程式裡的 BLYNK_READ(V3) 函數每一秒都會被呼叫一次, 向 App 提供其即時數據 :


Blynk.virtualWrite(vPin) 也可以一次傳遞最多 4 個參數, 例如 :

Blynk.virtualWrite(V0, "hello", 123, 12.34);  //一次傳遞 3 個參數

這些多重參數會以陣列方式傳送.

如果 Arduino 要從 Blynk App 的某個虛擬腳位取得數據 (例如從搖桿元件取得座標), 則必須在韌體程式中定義該虛擬腳位的 BLYNK.WRITE(vPin) 函數, 然後於此函數中從特定之全域變數 param 取得數據, 由於設備與 App 都是以字串形式經雲端傳遞參數, 所以需視設備平台使用 param 物件的 asInt(), asStr(), asDouble() 等函數轉成所需要的資料類型,  例如 Arduino 用法 :

BLYNK_WRITE(V0) {  //虛擬腳位 V0 的寫入函數
  int value=param.asInt(); //以整數型態取得參數
  //String value=param.asDouble();  //以浮點數型態取得參數
  //String value=param.asFloat();  //以浮點數型態取得參數
  //String value=param.asStr();  //以字串型態取得參數
  //有些元件如搖桿會傳遞多的變數, 則 param 為一參數陣列
  int x=param[0].asInt();  //以整數型態取得參數
  int y=param[1].asInt();  //以整數型態取得參數
  }

當 Blynk App 上的虛擬腳位數值有變化時 (例如移動滑軌元件或搖桿元件), Arduino 程式中的這個 BLYNK_WRITE(vPin) 函數就會被呼叫,  我們可以從 param 參數取得 App 所傳遞之數據, 然後做出反應 (例如讓自走車轉彎). 注意, 這裡 BLYNK_READ(vPin) 與 BLYNK_WRITE(vPin) 都是以 Blynk App 角度來看的, 亦即 BLYNK_READ(vPin) 指的是 App 從虛擬腳位 vPin 讀取來自設備的數據; 而BLYNK_WRITE(vPin) 則是指 App 將數據寫入設備中.

Blynk 函式庫中還有 BLYNK_WRITE_DEFAULT() 與 BLYNK_READ_DEFAULT() 這兩個無參數的函數, 用來處理那些沒有個別定義 BLYNK_READ(vPin) 或 BLYNK_WRITE(vPin) 函數的虛擬腳位之預設行為.

當 App 要向 Arduino 板子讀取資料時, 若此虛擬腳位在 Arduino 韌體中沒有定義 BLYNK_READ() 函數, 那麼 BLYNK_READ_DEFAULT() 就會被呼叫. 由於它不限定哪一個虛擬腳位, 所以必須用 request.pin 屬性取得腳位編號, 才能將數據傳送到此虛擬腳位 :

BLYNK_READ_DEFAULT() {
  int pin=request.pin;  //取得 App 提出要求之虛擬腳位 
  Blynk.virtualWrite(pin, newValue);  //傳送新值給 App
  }

同樣地, Arduino 板子若要從 App 獲得控制數據, 若此虛擬腳位沒有定義 BLYNK_WRITE() 函數, 那麼 BLYNK_WRITE_DEFAULT() 就會被呼叫.

BLYNK_WRITE_DEFAULT() {
  int pin=request.pin;      //取得虛擬腳位
  int value=param.asInt();  //取得參數值
  }


二. 滑桿 (Slider) :

Blynk 有兩種滑桿 : Slider S (短滑桿) 與 Slider L (長滑桿), 短滑桿寬度佔螢幕一半, 且只要塞得下, 可以跟其他元件並列一行; 而長滑桿寬度則是整個螢幕寬, 無法與其他元件並列一行, 除此之外, 兩者使用方法相同. 下圖顯示此專案面板中的三個滑桿, 上面兩個並排的是 Slider S, 底下的則是 Slider L.


滑桿元件的設定頁面如下, 其 PIN 只有 Digital 與 Virtual 兩個選項, 沒有 Analog 腳位. 其下限與上限值預設為 0~256 (可以自行修改為所需要的上下限值). 底下有一個 Send on Release 選項用來設定是否要等手離開滑桿才向設備傳遞滑桿之值, 預設為 ON, 表示在滑動過程中都不會向設備傳遞數值, 等滑動停止時才傳送. 若設為 OFF, 則滑動過程中就會不斷地向設備傳遞其值, 由於取樣的時間差, 它也不是傳送出連續的整數.


在下面的範例中, 我將 Slider 綁定虛擬腳位 V0, 在滑動時即時將滑桿值輸出到序列埠 :

#define BLYNK_PRINT Serial  //Comment this out to disable prints and save space
#include <SoftwareSerial.h>
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

SoftwareSerial esp8266(7, 8); //(RX, TX)
ESP8266 wifi(&esp8266); //create wifi object

char ssid[]="EDIMAX-tony";
char pass[]="1234567890";
char auth[]="3a5a3d8c4e0545669ffb847xxxxxx033";

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

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

BLYNK_WRITE(V0) {  //called when V0 updated by App
  Serial.print("X=");
  Serial.println(param.asInt());
  }

當設備的 V0 腳被 Blynk 伺服器更新時 (即 App 的 Slider 將數值寫入 Blynk Server, 伺服器就會更新 V0 腳的值), 特定函數 BLYNK_WRITE(V0) 就會被呼叫, 我們可以在此函數內透過 param 變數取得 V0 之值.

序列埠監控視窗擷取訊息如下, 這是 Send onrelease 為 ON 的情況, 可見數值之間跳躍頗大, 因為是滑動到定點才放開之故 :

X=17
X=17
X=51
X=51
X=204
X=204
X=255
X=255
X=185
X=185

如果 Send onrelease 為 OFF, 則數值變化就比較連續 :

X=154
X=158
X=163
X=165
X=168
X=170
X=170
X=170
X=171
X=184
X=191


三. 計時器 (Timer) : 

此元件用來在指定時間觸發一個動作, 當到達起始時間 (Start time) 時會向綁定的腳位 (Digital/Anlog/Virtual) 送出 1 (HIGH), 而到達結束時間 (Stop time) 時就送出 0 (LOW). 含有此元件的專案執行後每天都會固定觸發執行, 直到你停止此專案, 或清除 Timer 元件中的起迄時間, 或者自專案中刪除此元件. 此元件的運作是根據手機的時鐘來觸發的.

Timer 元件外觀與設定畫面如下 :



下列範例取自官網, Timer 綁定 V0 腳位, 因此到達設定時間時, Blynk App 會將 1 (HIGH) 寫入伺服器更新 V0 之值, 因此我們要在韌體程式中定義一個特定的 BLYNK_WRITE(V0) 函數來處理此一事件, 因為只要 V0 數值被更新, 此函數就會被呼叫 :

#define BLYNK_PRINT Serial  //Comment this out to disable prints and save space
#include <SoftwareSerial.h>
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

SoftwareSerial esp8266(7, 8); //(RX, TX)
ESP8266 wifi(&esp8266); //create wifi object

char ssid[]="EDIMAX-tony";
char pass[]="1234567890";
char auth[]="3a5a3d8c4e0545669ffb847xxxxxx033";

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

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

BLYNK_WRITE(V0) {
  Serial.print("Timer fired: ");
  Serial.println(param.asStr()); //get 1 or 0  
  }

當 Timer 觸發時, 伺服器會向設備傳遞 param 變數, 其值為 1 或 0, 在 BLYNK_WRITE(V0) 函數中是將其輸出到序列埠. 序列埠監控視窗擷取訊息如下 :

[0] Blynk v0.3.8 on Arduino Nano
[499] Connecting to EDIMAX-tony
[3560] 0018000902
[8708] 192.168.2.105
[8738] Connected to WiFi
[18043] Ready (ping: 1972ms).
Timer fired: 1
Timer fired: 0

實驗結果確實會依據手機時鐘觸發事件. 計時器也可以綁定 Digital 或 Analog 腳位, 其輸出均為 1 (HIGH) 或 0 (LOW). 例如若綁定 D13, 因 Arduino 此腳有內建 LED, 時間到達時 LED 亮, 結束時熄滅, 韌體程式部分, 上面程式中的 BLYNK_WRITE() 函數就不需要了. 這個 Timer 可以應用在我的菜園自動澆水控制器哩.


四. 雙軸搖桿 (Two Axis Joystick) :

此元件用來模擬搖桿以控制伺服機 (Servo) 在上下左右四個方向的移動, 元件外觀如下 :


點一下元件顯示設定畫面 :


這裡 Output 欄位有 SPLIT 與 MERGE 兩個選項, 用來設定輸出數據的方式 : SPLIT 表示搖桿的 X, Y 軸兩個數據直接分開傳送給綁定的數位或虛擬腳位 (Digital/Virtual), 如上圖所示, 這種方式在硬體設備端的韌體程式完全不需要處理, 因為它是直接操控.

而 MERGE 則是將 X,Y 軸兩個數據組成陣列 (X 為索引 0, Y 為索引 1) 一次傳送給虛擬腳位, 在設備端程式中必須剖析 param 陣列, 分別取出 X,Y 軸數據後才能使用 :

int x=param[0].asInt();
int y=param[1].asInt();

其設定畫面如下圖所示 :


注意, 使用 MERGE 方式時只能綁定到虛擬腳位, 不能綁定到數位腳位. 參考 :

http://docs.blynk.cc/#widgets-common-widget-settings-splitmerge

底下 Autoreturn 選項用來設定方開搖桿後是否會自動歸位到中央位置, 預設為 ON, 若設為 OFF, 則放開搖桿後會停留在最後的位置. 最後的 Rotate on Tilt 選項用來設定當手機傾斜時, 搖桿是否自動旋轉 (但我的手機測試無效, 難道三軸加速器有問題?).

在下面的範例中, 我使用 SPLIT 模式分別綁定 V0 為 X 軸, V1 為 Y 軸, 設定如下 :


程式如下 :

#define BLYNK_PRINT Serial  //Comment this out to disable prints and save space
#include <SoftwareSerial.h>
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

SoftwareSerial esp8266(7, 8); //(RX, TX)
ESP8266 wifi(&esp8266); //create wifi object

char ssid[]="EDIMAX-meinung";
char pass[]="1234567890";
char auth[]="3a5a3d8c4e0545669ffb847xxxxxx033";

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

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

BLYNK_WRITE(V0) {
  Serial.print("X=");
  Serial.print(param.asInt());
  Serial.print(" ");
  }

BLYNK_WRITE(V1) {
  Serial.print("Y=");
  Serial.println(param.asInt());
  }

當搖桿移動時, 其座標值會傳送到 Blynk Cloud 並寫入伺服器更新所綁定之腳位 (對 BLYNK 而言是 WRITE), 同時會傳遞給設備, 若綁定虛擬腳位, 則設備之韌體程式的 BLYNK_WRITE() 函數會被呼叫, 我們可在函數內進行回應處理. 由於 App 中的搖桿設定為 SPLIT 模式, 因此須分別準備 V0 (X 軸) 與 V1 (Y 軸) 的 BLYNK_WRITE() 函數. 座標是放在特定物件 param 上傳遞, 可利用 asInt() 轉成整數後輸出到序列埠. 序列埠監控視窗擷取訊息如下 :

[0] Blynk v0.3.8 on Arduino Nano
[499] Connecting to EDIMAX-meinung
[3560] 0018000902
[8709] 192.168.2.106
[8738] Connected to WiFi
[14747] Ready (ping: 31ms).
X=125 Y=132
X=80 Y=178
X=57 Y=197
X=41 Y=213
X=45 Y=216
X=72 Y=235
X=99 Y=249
X=129 Y=255
....

程式上傳實測發現, 透過 Blynk 控制設備反應速度相當快, 拿來控制自走車效果應該很不錯才對. 接下來測試 MERGE 模式, 此模式只需綁定一個虛擬腳位 V0, 因為 X,Y 軸座標可以合併在陣列變數 param 中, 只需要一個 vPin 就夠了, 設定畫面如下 :


這回我把 Auto Return 設為 ON. 在 MERGE 模式下 X, Y 軸座標是以陣列形式在 param 上傳遞, 這時只需要一個 BLYNK_WRITE() 即可, 程式如下 :

#define BLYNK_PRINT Serial  //Comment this out to disable prints and save space
#include <SoftwareSerial.h>
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

SoftwareSerial esp8266(7, 8); //(RX, TX)
ESP8266 wifi(&esp8266); //create wifi object

char ssid[]="EDIMAX-meinung";
char pass[]="1234567890";
char auth[]="3a5a3d8c4e0545669ffb847xxxxxx033";

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

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

BLYNK_WRITE(V0) {
  Serial.print("X=");
  Serial.print(param[0].asInt());
  Serial.print(" ");
  Serial.print("Y=");
  Serial.println(param[1].asInt());
  }

序列埠監控視窗擷取訊息如下 :

[0] Blynk v0.3.8 on Arduino Nano
[499] Connecting to EDIMAX-meinung
[3560] 0018000902
[8709] 192.168.2.106
[8738] Connected to WiFi
[14448] Ready (ping: 30ms).
X=125 Y=127
X=43 Y=122
X=2 Y=113
X=9 Y=87
X=97 Y=117
X=128 Y=128
X=138 Y=118
X=214 Y=62
X=145 Y=115
X=128 Y=128
....

由於會 Auto Return, 因此搖桿停下來時數值都會歸位到 (128,128) 位置. 

五. 色彩選擇器 (ZeRGBa) :

此元件用來控制 RGB 色彩, 它與搖桿一樣會送出多重數據, 搖桿送出 X,Y 座標; 而 ZeRGBa 則是送出 R, G, B 三原色數據, 因此它也有 SPLIT/MERGE 選項, 其外觀與設定畫面如下 :


點一下元件進入設定畫面 :


我們可以為 RGB 綁定 Digital 或 Virtual 腳位, 如上圖分別將 R,G,B 綁定到 V0, V1, V2 腳位. 底下與滑桿元件相同有一個 Send on release 選項, 預設為 ON, 即當手停止滑動離開元件時才送出 RGB 數據寫入伺服器.
在下面的範例中, 我將 RGB 數值輸出到序列埠. 同樣地, 我們在韌體程式中必須為此三個虛擬腳位定義特定的 BLYNK_WRITE() 函數來處理 V0, V1, V2 的被寫入事件, 當 Blynk 伺服器更新虛擬腳位數值時, 此函數就會被呼叫, 程式如下 :

#define BLYNK_PRINT Serial  //Comment this out to disable prints and save space
#include <SoftwareSerial.h>
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

SoftwareSerial esp8266(7, 8); //(RX, TX)
ESP8266 wifi(&esp8266); //create wifi object

char ssid[]="EDIMAX-tony";
char pass[]="6628005572056";
char auth[]="3a5a3d8c4e0545669ffb847474a97033";

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

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

BLYNK_WRITE(V0) {
  Serial.print("R=");
  Serial.print(param.asInt());
  Serial.print(" ");
  }

BLYNK_WRITE(V1) {
  Serial.print("G=");
  Serial.print(param.asInt());
  Serial.print(" ");
  }

BLYNK_WRITE(V2) {
  Serial.print("B=");
  Serial.println(param.asInt());
  }

序列埠監控視窗擷取訊息如下 :

R=0 G=91 B=162
R=77 G=0 B=27
R=0 G=61 B=255
R=0 G=136 B=92
R=255 G=0 B=0
R=0 G=13 B=213
R=30 G=0 B=255
R=176 G=0 B=193
R=24 G=0 B=64

很奇怪的是, 同一時間只有兩個顏色值會變化, 一定有一個是 0, why? 如果 Send on release 改為 OFF 的話也是一樣 :

R=154 G=0 B=194
R=159 G=0 B=194
R=182 G=0 B=194
R=194 G=0 B=188
R=194 G=0 B=172
R=193 G=0 B=148
R=187 G=0 B=132
R=178 G=0 B=120
R=169 G=0 B=114
R=155 G=0 B=105

可見在較連續的變化過程中, G 都保持為 0 不變, 官網教學文件並未提到此現象. 另外, 如果數據傳遞過多, 可能造成緩衝器溢位現象 :

R=0 G=13 B=93
R=0 [550183] Buffer overflow
[550191] Buffer overflow
[550200] Buffer overflow
[550207] Buffer overflow
[550227] Buffer overflow
[550255] Buffer overflow
[550302] Buffer overflow

特別是 Send on release 設為 OFF 情況, 持續滑動就立即傳遞新數據最容易造成溢位, 所以預設是 ON 是有原因的, 幾乎都不會發生溢位. 溢位時只要停下來一下即恢復正常. 

如果採用 MERGE 模式, 則只能綁定 Virtual 腳位, 而且只需要綁定一個虛擬腳位即可, RGB 三色數據被放在 param 陣列中一次傳送, 所以韌體程式中必須剖析陣列以取出 R (索引 0), G (索引 1), B (索引 2) :

int R=param[0].asInt();
int G=param[1].asInt();
int B=param[2].asInt();

下面範例是 MERGE 模式的設定 :


在此只需綁定 V0 即可, 韌體程式如下 :

#define BLYNK_PRINT Serial  //Comment this out to disable prints and save space
#include <SoftwareSerial.h>
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>

SoftwareSerial esp8266(7, 8); //(RX, TX)
ESP8266 wifi(&esp8266); //create wifi object

char ssid[]="EDIMAX-tony";
char pass[]="1234567890";
char auth[]="3a5a3d8c4e0545669ffb847xxxxxx033";

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

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

BLYNK_WRITE(V0) {
  Serial.print("R=");
  Serial.print(param[0].asInt());
  Serial.print(" ");
  Serial.print("G=");
  Serial.print(param[1].asInt());
  Serial.print(" ");
  Serial.print("B=");
  Serial.println(param[2].asInt());
  }

此元件可讓我們方便控制彩色 LED.


9 則留言 :

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

請問,如果想要模擬老師之前寫的程式,Switch放在LOW低電位時,就可進入設定模式,但是Blynk好像沒有提供 textbox 之類的文字輸入元件,不知是否有更好的替代方法?

謝謝指導

小狐狸事務所 提到...

是的, blynk 還沒有提供文字輸入欄位, 要在 BLYNK 實作可切換模式以便輸入 SSID 與 PWD 似乎很棘手, 要測試看看.

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

最近把老師的圖解電路焊接好了,也做了一些簡易實作,設計了一個電燈光照度可自訂功能系統,也就是說,週邊環境的光照亮度,除了用光敏電阻控制外,也可以使用 Blynk 的 slider 來調整光照度,與光敏電阻值比較,來決定週邊環境的光照亮度開燈時的四週環境亮度,因為使用了 Blynk 的 SLIDER 就可省下在 arduino 加裝可變電阻的麻煩,使用時都OK,但後來發現 Blynk 的 SLIDER 對於第一次程式進入時,無法取得 SLIDER 當初的起始值,例如我的 SLIDER 是放在60,但是當程式啟始時 param.asInt(), 抓到的值確是零,必需等使用者拉動SLIDER時,param.asInt()的值才會正常為,請問老師有何方法,可讓Blynk 的 SLIDER 在第一次程式啟始後,就能抓到正確的值,謝謝

小狐狸事務所 提到...

您太厲害了, 很快就做出應用了, 為您感到高興. 初始值問題我倒沒想過, 最近忙完別的項目再回頭來研究這問題, 結果如何我再補充.

小狐狸事務所 提到...

使用 BLYNK_CONNECTED() 應可解決, 參考下列文章的測試 2 :

http://yhhuang1966.blogspot.tw/2016/09/blynk_21.html

Unknown 提到...

我想請問一下
我想設計OTTO機器人用blink
我用button綁定到v1
然後當v1為high時開始一組動作讓機器人往前走
但我發現當我一直按著按鈕
blynl.write(v0)似乎只能執行一次動作
不像void loop可以不斷偵測高電位重複執行動作一直往前走
要反覆按才能觸發
請問有辦法像loop一樣的功能嘛?
我按著button就能一直走

小狐狸事務所 提到...

Button 是按一下事件驅動的沒錯, 必續重複按才會動, 持續按是沒用的. 或許可以用搖桿試試看. 抱歉, Blynk 太久沒玩快忘光了, 有時間我也很想回來看看. 不介意的話可以將程式碼 po 上來分享您的創意.

Kz 提到...

你好,我想要在for迴圈內讀取blynk app上Button的資訊來作為急停的動作,不過似乎無法在for迴圈內即時作BLYNK.READ(vPin) 與 BLYNK.WRITE(vPin)的寫法,請問有其它方法嗎?

小狐狸事務所 提到...

好久沒完 blynk 了, 坦白說忘得差不多了. 我先複習看看.