Arduino筆記(41):ESP8266傳送DHT-11溫濕度到 Thingspeak

先前的實驗,主動的將感測值送出給 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欄位的類型即可。

[程式]

#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);
}

[執行結果]



[參考資料]

Randomnerdtutorials:ESP8266 Daily Task – Publish Temperature Readings to ThingSpeak

4 留言

  1. 如果再開發版管理員中都找不到thinkspeak的程式怎麼辦

    回覆刪除
    回覆
    1. thinkspeak是外部網站,不會安裝在開發板管理員中。ESP8266 的初次設定可參考:https://atceiling.blogspot.com/2019/05/arduino29nodemcu.html

      刪除
  2. 想請問一下,有時DHT11可以取得資料,但有時會顯示Failed to read from DHT sensor,想請問原因,謝謝

    回覆刪除

張貼留言

較新的 較舊