如何將ESP8266讀值送到Google Forms儲存

作者:Ted Lee

這次的實驗目標是將ESP8266物聯網開發板讀取到的送至Google儲存,如圖1所示。

圖1:本實驗架構圖。

材料

品名 數量 單位 備註
WeMos D1 WiFi UNO 1 *其它具有Arduino相容腳位及WiFi功能的開發板亦可
USB A公對Micro USB B公傳輸線 1 建議長度最好≥100 cm

*例如:D1 mini、…

編程與開發環境建立步驟

依照以下7個步驟,依序完成。

  1. 安裝CH340 driver(驅動程式)
    依照〈WEMOS D1 WIFI 物聯網開發板驅動程式安裝與設定〉提及的網址下載並裝妥開發板上晶片的硬體驅動程式。裝完後可以在device manager(裝置管理員)中看到它已被指定到一個特定的COM代號了。
  2. 安裝Arduino IDE
    從照〈WEMOS D1 WIFI 物聯網開發板安裝ARDUINO 整合開發環境〉的做法,先從Arduino官網上下載最新版的Arduino開發工具後安裝之。然後再讓Arduino IDE掛載上WeMOS D1 R1這塊板子的相關資訊。最後要記得選定它在步驟1拿到COM埠代碼(註:筆者在測試本文時發現,V1.8.15版的Arduino IDE已不會有先前版次埠偶而會有跑掉未勾選的情況)。
  3. Arduino程式開發起手式:blink
    將ESP8266接上電腦,再依筆者先前拙著〈使用Autodesk 的123D Circuits來玩Arduino〉測試妥接下來的軟硬體開發環境是否備妥(板載的LED能正常閃爍)。註:步驟3~4(再到6)採取的是樣板程式碼的decomposition(拆解)。若讀者已確定您的軟硬體開發環境是正常的,可直接跳到步驟5。
  4. WiFi connection(連接測試)
    步驟4~7可參考〈ESP8266 上傳資料到Google表單〉的做法。將您的一段式(即裝置一開機後自動地讓程式傳送帳號及密碼後就可以連網)WiFi AP(筆者是開自己的手機hot spot(熱點)讓開發板連接上網的。讀者若要設定成非手機的WiFi AP,請查詢該WiFi AP的相關設定)帳號及密碼填入下列template code(樣板程式)aaa及bbb處後燒入到開發板中即可如圖2~3的所示順利地連上網際網路。

    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #include  //ESP8266連網用

    void setup() {
      Serial.begin(9600);

      WiFi.begin("aaa","bbb");
      while(WiFi.status() != WL_CONNECTED) { //不斷重複等候WiFi AP連接上
         delay(500);
         Serial.print(".");
      } //end of while

      Serial.println(WiFi.localIP()); //顯示出開發板被配到的IP
    } //end of setup()

    void loop() { //沒用到,留個空殼即可
    } //end of loop()

    圖2:開發板連上WiFi後會取得一個IP。

    圖3:在WiFi AP上可以看到該開發板已連接(筆者的開發環境是筆電亦連到手機熱點上網,故會顯示已有筆電和開發板共2個連線裝置)。

  5. 建立Google Forms
    建Google Forms的詳細過程已在步驟4中的YouTube影片網址中揭示。取得form的API key(金鑰)和field id(表單內的欄位名稱代碼)如圖4及圖5所示。其中,知導了建好的Google Forms的這兩項資訊後,可直接在瀏覽器上下達 https://docs.google.com/forms/d/e/xxx/formResponse?entry.yyy=zzz 的HTTP GET命令手動傳測資zzz(如圖6所示)。同時,讀者可以檢查表單對應到Google Sheet上已成功將zzz寫入了。其中,Google網站提供的web services(網路服務)項目可查閱Forms for Developers 所示。
    總結,上述的流程可以順利的產生一條完整的HTTP GET命令,執行它就能把一筆測資送到Google Forms儲存。接著,再把這個命令依照Google Forms的API呼叫格式填到程式碼裡(步驟6),就可以完整的串接讀取測資、送雲端存檔的整個自動化流程了。

    1. 設定Google Forms,以取得金錀與欄位代碼。
    2. 組成HTTP GET命令(可在瀏覽器上手動下達測試)。
    3. 用支援HTTP呼叫的程式語言程式拼成合法的API格式後反複自動執行。

      圖4:Google自動產生的表單金鑰(藍色色塊處的字串)。

      圖5:Google自動產生的欄位名稱代碼 1245404726。

      圖6:手動下HTTP GET命令成功的網頁畫面。

  6. 修改樣板程式中的參數
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include
    #include  //下達HTTP GET用

    long  test_data; //存放類比腳位讀到的測資
    WiFiClientSecure Secure_client;

    //讀取類比腳位17測資
    void read_data() {
       test_data = analogRead(17);
    }

    void upload2GoogleForms() {
        Secure_client.setInsecure(); //[2]
        if (Secure_client.connect("docs.google.com", 443)) {
            Secure_client.println("GET /forms/d/e/xxx/formResponse?entry.yyy="+ String(test_data)+"&submit=Submit HTTP/1.1");
            Secure_client.println("Host: docs.google.com");
            Secure_client.println("Connection: close");
            Secure_client.println();
            Secure_client.stop();
       } else { //Google returned 0
          Serial.println("Google said no!");
       } //end of if-else
    } //end of upload2GoogleForms()

    void setup() {
       pinMode(17, INPUT);
       Serial.begin(9600);
       test_data = 0;
       WiFi.begin("aaa","bbb");
       while(WiFi.status() != WL_CONNECTED) {
           delay(500);
           Serial.print(".");
       } //end of while()

       Serial.println(WiFi.localIP());
    } //end of setup()

    void loop() {
        read_data();
        Serial.println(test_data);
        upload2GoogleForms();
        delay(5000);
    } //end of loop()
  7. 燒入開發板
    當程式燒入完成後,在Arduino IDE的serial monitor(序列埠監看器)可看到類比讀值不斷的更新,並且透過網路將之記錄到Google Sheet上。

Advanced learning(進階學習)

後端database(資料庫)

開發板上傳測資到雲端資料庫的選擇還有Google Sheet(不透過Google Forms,但不確定現在是否可行,因為Google的開放策略總是改來改去的)、ThingSpeak、自架的資料庫、…。

HTTP、HTTPS protocol(通信協定)

在「編程與開發環境建立步驟」一節步驟6樣板程式的第13行,為什麼要設定成insecure(不安全的)?讀者可以試試,把此行comment(註解)掉後實驗是否依然會成功?

和WiFi AP建立連線

在「編程與開發環境建立步驟」一節步驟6樣板程式的第6~12行,begin()、status()、localIP()這三個method(方法)是定義在ESP8266WiFi.cpp這隻程式(在 C:\Users\User\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\libraries\ESP8266WiFi\src 這個path(路徑)下可找到它)中的,它是怎麼implement(實現)的?

從樣板到專業或應用

現今編程已變的十分簡化,跟著SOP(Standard Operation,標準化流程)123…就搞定。如果只是拿來快速應用,It’s ok. Everything is fine. 否則,我們得細想:業餘 vs. 專業?我會套快速樣板,別人也一樣會套,那差別在哪裡?還有,樣板雖美,但當後續程式maintain(維護)發生問題時(很多時候會發生在某些API改版)要怎麼debug(除錯)?另一方面,從樣板內的基礎、必要知識是哪些?要不要花時去了解?…學習是有層次的,端看我們的目的為何?

多欄位(multiple fields)

HTTP GET命令 https://docs.google.com/forms/d/e/xxx/formResponse?entry.yyy1=zzz1&entry.yyy2=zzz2&entry.yyy3=zzz3 ,那「編程與開發環境建立步驟」歩驟6的程式要怎修改呢?

觸發條件(triggering conditions)設定

能否設定當某些條件成立時自動發出手機推播(push)警訊?例如:當Google Forms收到的溫度測值超過100度,可能這個感測器已燒毀…。

443

在「編程與開發環境建立步驟」步驟5樣板程式第14行的443是何意?(Port 443 — Everything You Need to Know About HTTPS 443

[1]六種授權條款。
[2]筆者特別感謝慧手科技Lin Sam老板的大力協助,使得本實驗得以順利完成。

(作者為本刊專欄作家,本文同步表於作者部落格,原文連結;責任編輯:謝涵如)

Ted Lee

Author: Ted Lee

從工程師轉任中學教師,又為了捍衛教育理念,投身成為 STEAM 教育工作者,自稱「無可救藥的人文教育理想主義者」的李俊德(Ted Lee)。

Share This Post On

發表

跳至工具列