/*
功能:讀取環境溫溼度,並將資料傳送至ThingSpeak
*/
#include <WiFi.h>
#include <HTTPClient.h> // 使用 HTTPClient 函式庫
#include <DHTesp.h> // 使用 DHT sensor library for ESPx 函式庫
//請修改以下參數--------------------------------------------
/*
// WiFi 帳號密碼
char SSID[] = "YourSSID"; // WiFi 帳號
char PASSWORD[] = "YourPassword"; // WiFi 密碼
// 請修改為你自己的ThingSpeak API Key,並將https改為http
String url = "http://api.thingspeak.com/update?api_key=換成你的APIKey";
int pinDHT11 = 32; // DHT22腳位 // 32、33、34、35為佳
*/
// WiFi 帳號密碼
char SSID[] = "YourSSID"; // WiFi 帳號
char PASSWORD[] = "YourPassword"; // WiFi 密碼
String url = "http://api.thingspeak.com/update?api_key=8QUYFFHOI24S17EZ";
const int DHT_PIN = 32;
//---------------------------------------------------------
DHTesp dhtSensor; // DHT22物件
void setup() {
Serial.begin(115200);
// DHT22 初始化
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
//連線到指定的WiFi SSID
Serial.print("Connecting Wifi: ");
Serial.println(SSID);
//WiFi.begin(SSID, PASSWORD); // 以STA(網路終端)模式連接到WiFi基地台
WiFi.begin("Wokwi-GUEST", "", 6); // wokwi提供的虛擬 WiFi 接入點
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
//連線成功,顯示取得的IP
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
}
void loop() {
// 讀取溫度和濕度資料
TempAndHumidity data = dhtSensor.getTempAndHumidity();
byte temperature = data.temperature;
byte humidity = data.humidity;
// 判斷是否有正確讀取
if(dhtSensor.getStatus() != 0){
Serial.println("DHT sensor error status: " + String(dhtSensor.getStatusString())); // 回傳是 timeout 或是 checksum 錯誤
}else if (isnan(data.humidity) || isnan(data.temperature)){
Serial.println("Data is NaN!");
}else{
Serial.println("------------------");
Serial.println("Temperature : " + String(data.temperature, 2) + " °C"); // 參考語法 String(val, decimalPlaces)
Serial.println("Humidity : " + String(data.humidity, 2) + " %");
///////////////////////////////////////////////////////////////////////////////////////
// 傳送溫度和濕度資料到thingspeak
Serial.println("啟動網頁連線");
HTTPClient http; // 宣告 http 物件
// 將溫度及濕度以http get參數方式補入網址後方
String url2 = url + "&field1=" + (int)temperature + "&field2=" + (int)humidity;
http.begin(url2); // 啟動網頁連線至網址url
///////////////////////////////////////////////////////////////////////////////////////
int httpCode = http.GET(); // 取得資料
Serial.print("httpCode=");
Serial.println(httpCode);
// 檢查網頁連線是否正常
// 如果取得資料成功
if (httpCode == HTTP_CODE_OK) {
// 取得網頁內容
String payload = http.getString();
// 將資料顯示在螢幕上
Serial.print("網頁內容 = ");
Serial.println(payload);
// 如果取得資料失敗
}else{
Serial.println("Error on HTTP request");
}
// 關閉網頁連線
http.end();
}
delay(15000); // 免費帳號每次間隔須超過15秒
}