先前的實驗,主動的將感測值送出給 Line通知或是寄到 GMail 信箱,可是單次的紀錄當時的感測值。在這個 IoT 時代,如果能夠持續紀錄感測值,那就可以進行大數據分析,過去我用樹莓派上傳過溫度的資料到 Thingspeak ,請參考 Raspberry Pi 筆記(35):DS18B20 溫度紀錄- 使用 Cayenee 及 Thingspeak 。今天要實作使用 ESP8266-01上傳溫濕度模組的感測值到 Thingspeak。相關ESP8266-01溫濕度模組線路的連接方式,請參考:Arduino筆記(33):透過 ESP8266 無線網路讀取DHT-11的溫濕度。
(1) 按右上方的 Sign In,輸入登入的郵件及密碼登入 Thingspeak 網站
(2) 登入後,看到屬於自己的 Channels
(3) 按下 [New Channel]後,如下圖。輸入 Channel 名稱及描述,並輸入本次實作的兩個欄位 [Field1] 及 [Field2] 的名稱。輸入完成後,按下下方綠色的 [Save Channel]。
(4) 選擇 [API Keys] 的頁簽,將 Write API Key的一串文字紀錄下來,稍後程式會用到。
(5) 如要改變呈現的儀表板類型,可以按下圖表上方一支筆的圖案,修改Type欄位的類型即可。
(1) 按右上方的 Sign In,輸入登入的郵件及密碼登入 Thingspeak 網站
(2) 登入後,看到屬於自己的 Channels
(3) 按下 [New Channel]後,如下圖。輸入 Channel 名稱及描述,並輸入本次實作的兩個欄位 [Field1] 及 [Field2] 的名稱。輸入完成後,按下下方綠色的 [Save Channel]。
(4) 選擇 [API Keys] 的頁簽,將 Write API Key的一串文字紀錄下來,稍後程式會用到。
(5) 如要改變呈現的儀表板類型,可以按下圖表上方一支筆的圖案,修改Type欄位的類型即可。
[程式]
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <DHT.h> #define DHTTYPE DHT11 #define DHTPIN 2 // 設定網路基地台SSID跟密碼 const char* ssid = "MyHome"; const char* password = "12345678"; // 請更換成 Thing Speak WRITE API KEY const char* apiKey = "AB4CDEFG4HI5J3KL"; const char* resource = "/update?api_key="; // Thing Speak API server const char* server = "api.thingspeak.com"; // 初始化 DHT sensor. DHT dht(DHTPIN, DHTTYPE); float humidity, temp_f; // 從 DHT-11 讀取的值 static char ftemp[7]; unsigned long previousMillis = 0; // will store last temp was read const long interval = 2000; // interval at which to read sensor void setup() { // Initializing serial port for debugging purposes Serial.begin(9600); delay(10); Serial.println(""); Serial.println(""); Serial.print("Connecting To: "); Serial.println(ssid); WiFi.begin(ssid, password); // 等待連線,並從 Console顯示 IP while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi Connected."); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } void loop() { // sleeping so wont get here // 量測間等待至少 2 秒 unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= interval) { // 將最後讀取感測值的時間紀錄下來 previousMillis = currentMillis; // 讀取溫度大約 250 微秒! humidity = dht.readHumidity(); // 讀取濕度(百分比) temp_f = dht.readTemperature(true); // 讀取溫度(華氏) // 檢查兩個值是否為空值 if (isnan(humidity) || isnan(temp_f)) { Serial.println("Failed to read from DHT sensor!"); return; } } Serial.println(temp_f); Serial.println(humidity); float tempe = (temp_f-32)*5/9; dtostrf(tempe, 6, 2, ftemp); dtostrf(humidity, 6, 2, ftemp); // 除錯用 Serial.println(tempe); Serial.println(humidity); Serial.print("Connecting to "); Serial.print(server); WiFiClient client; // 使用 80 Port 連線 if (client.connect(server, 80)) { Serial.println(F("connected")); } else { Serial.println(F("connection failed")); return; } Serial.print("Request resource: "); Serial.println(resource); client.print(String("GET ") + resource + apiKey + "&field1=" + tempe + "&field2=" + humidity + " HTTP/1.1\r\n" + "Host: " + server + "\r\n" + "Connection: close\r\n\r\n"); int timeout = 5 * 10; // 5 seconds while(!!!client.available() && (timeout-- > 0)){ delay(100); } if(!client.available()) { Serial.println("No response, going back to sleep"); } while(client.available()){ Serial.write(client.read()); } Serial.println("\nclosing connection"); client.stop(); // 每三分鐘會上傳一筆資料 delay(180000); }
如果再開發版管理員中都找不到thinkspeak的程式怎麼辦
回覆刪除thinkspeak是外部網站,不會安裝在開發板管理員中。ESP8266 的初次設定可參考:https://atceiling.blogspot.com/2019/05/arduino29nodemcu.html
刪除不需要“dht.begin();”嗎
回覆刪除想請問一下,有時DHT11可以取得資料,但有時會顯示Failed to read from DHT sensor,想請問原因,謝謝
回覆刪除張貼留言