Arduino筆記(33):ESP8266 無線網路讀取DHT-11的溫濕度

花了好多時間,想要知道如何將程式寫到 ESP8266-01S的 Flash,可是一直無法成功,接好線路後,不管怎樣上傳程式都無法成功。後來找了很多關於 ESP8266燒錄的資料,才發現我沒將 GPIO0 接地,花了好多時間去找到問題。現在知道如何接線了,將正確的接線方式紀錄起來,免得又花很多時間除錯。

利用一個在拍賣網站購買的溫濕度模組,學習如何將 Arduino 的程式上傳到 ESP8266,並且直接供給電源後,不需連接  Arduino就可以回報溫濕度,而且是透過 Web Server的方式回應當時測得的溫度,以下紀錄一下我實作的過程。

在實作的過程中,很麻煩的是,每次要上傳程式,就要先將 ESP-01S接六條線到 USB to TTL及麵包板,上傳完成後,拔下電線,再將 ESP-01S插到 DHT-11模組,非常麻煩。我預計買一個可以直接插 ESP-01S的 USB to TTL模組,可快速在兩邊測試轉換。

另外,我有看到相關文件,可直接透過無線更新程式,下次研究一下如何操作,這樣會更快速更新程式到 ESP-01S。


[材料]

•  USB 轉 UART 模組 (CP2102 晶片)
•  ESP8266 ESP01 無線網路模組
• 連接線 x 5條
• 麵包板 x 1個
• 麵包板電源 x 1個
• DHT-11 無線網路 ESP-01S模組 x 1個

[線路圖]

上傳程式的連接方式:要將 ESp8266 的 GPIO0接地,如下圖黃色線路。

將上圖的接線,插上電腦後,開啟 Arduino IDE,需將開發板設定成:「Generic ESP8266 Module",如下圖:

選好開發板後,按下上傳程式的按鍵   就可以將程式上傳到 ESP8266,上傳完成,會出現以下畫面:

這時若要執行已燒錄好的程式,需將 GPIO0接地的線拿掉。如下圖:

[程式]

/* 修改自 5/3/2014  Version 1.0   Mike Barela for Adafruit Industries
   將瀏覽器連線的子目錄呈現方式,改成一連線該 IP 就出現溫濕度,且從華氏換算成攝氏
*/
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
#define DHTTYPE DHT11
#define DHTPIN  2

// 設定無線基地台SSID跟密碼
const char* ssid     = "MyHome";     //改成您的SSID  
const char* password = "12345678";   //改成您的密碼

ESP8266WebServer server(80);

DHT dht(DHTPIN, DHTTYPE, 11);    // 11 works fine for ESP8266
 
float humidity, temp_f;   // 從 DHT-11 讀取的值
String webString="";      // 顯示的字串

unsigned long previousMillis = 0;        // will store last temp was read
const long interval = 2000;              // interval at which to read sensor
 
 
void setup(void)
{
  Serial.begin(115200);  // 設定速率 感測器
  dht.begin();           // 初始化

  // 連接無線基地台
  WiFi.begin(ssid, password);
  Serial.print("\n\r \n\rWorking to connect");

  // 等待連線,並從 Console顯示 IP
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("DHT Weather Reading Server");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
   
//  server.on("/", handle_root);
  
  server.on("/", [](){     
    gettemperature();       // 讀取感測器資料
    webString="Temperature: "+String((int)(temp_f-32)*5/9)+" C,   "+" Humidity: "+String((int)humidity)+"%";    // Arduino has a hard time with float to string
    server.send(200, "text/plain", webString);            // 回應瀏覽器詢問的
  });

  server.begin();
  Serial.println("HTTP server started");
}
 
void loop(void)
{
  server.handleClient();
} 

void gettemperature() {
  // 量測間等待至少 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;
    }
  }
}

[執行結果]

程式燒錄完成後,可拔掉ESP-01S上 GPIO0那條線,重新插入 USB,打開 Console,可以知道目前 ESP-01S這個無線裝置的 IP。

使用瀏覽器,連線至 ESP-01S的 Web 伺服器,可以看到溫濕度呈現在網頁上。

[參考資料]


Post a Comment

較新的 較舊