先前的實驗,主動的將感測值送出給 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,想請問原因,謝謝
回覆刪除張貼留言