/*
功能:讀取環境溫溼度,並將資料傳送至Google Sheet
*/
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h> // 使用 HTTPClient 函式庫
#include "DHTesp.h" // 使用 DHT sensor library for ESPx 函式庫
//請修改以下參數--------------------------------------------
/*
char SSID[] = "YourSSID"; // WiFi 帳號
char PASSWORD[] = "YourPassword"; // WiFi 密碼
// 1. 複製連結前半段 https://docs.google.com/forms/d/e/?????????????????????????????????/viewform
// 2. 將viewform 改為 formResponse
String url = "https://docs.google.com/forms/d/e/?????????????????????????????????/formResponse";
int pinDHT11 = 32; // DHT22腳位 // 32、33、34、35為佳
*/
char SSID[] = "YourSSID"; // WiFi 帳號
char PASSWORD[] = "YourPassword"; // WiFi 密碼
String url = "https://docs.google.com/forms/d/e/1FAIpQLSc3LrCALZTN3EoCG037YQI9GBdIUyWEHyxoH819qSS9XpDxow/formResponse";
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();
// 判斷是否有正確讀取
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) + " %");
///////////////////////////////////////////////////////////////////////////////////////
// 傳送溫度和濕度資料到Google Sheet
byte temperature = data.temperature;
byte humidity = data.humidity;
// 將溫度及濕度以https get參數方式補入網址後方
String url2 = url + "?usp=pp_url&entry.628396157=" + (int)temperature + "&entry.1113591143=" + (int)humidity;
Serial.println("啟動網頁連線");
WiFiClientSecure *client = new WiFiClientSecure;
if(client){
// 設定無憑證的安全客戶端
client->setInsecure();
// 建立 HTTPClient 物件
HTTPClient https;
// 使用安全客戶端初始化 HTTPS 通訊
Serial.print("[HTTPS] begin...\n");
if(https.begin(*client, url2)){ // HTTPS
Serial.print("[HTTPS] GET...\n");
// start connection and send HTTP header
int httpCode = https.GET();
// httpCode will be negative on error
if (httpCode > 0){
// HTTP header has been send and Server response header has been handled
Serial.printf("[HTTPS] GET... code: %d\n", httpCode);
// file found at server
if(httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
// print server response payload
String payload = https.getString();
Serial.println(payload);
}
}else{
Serial.printf("[HTTPS] GET... failed, error: %s\n", https.errorToString(httpCode).c_str());
}
https.end();
}
}else{
Serial.printf("[HTTPS] Unable to connect\n");
}
delay(12000);
}
delay(2000);
}