#include <WiFi.h>
#include <HTTPClient.h>
#include "DHT.h"
#include "time.h"
#include <ESP_Google_Sheet_Client.h>
// กำหนดขาและชนิด DHT
#define DHTPIN 21
#define DHTTYPE DHT22
// LDR analog input
#define LDR_PIN 35 // ใช้ GPIO36 (ADC1_CH0)
// WiFi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Google Cloud Project Settings
#define PROJECT_ID "project-dht-9976111"
#define CLIENT_EMAIL "[email protected]"
const char PRIVATE_KEY[] PROGMEM = "-----BEGIN PRIVATE KEY-----\n...YOUR KEY...\n-----END PRIVATE KEY-----\n";
// Google Sheet ID
const char spreadsheetId[] = "1f_PwuUlHtddX6wH8ckLjt7q5DxOjTCPq1KN1QFRP0r0";
// ตัวแปรส่งข้อมูลเป็นระยะ
unsigned long lastTime = 0;
unsigned long timerDelay = 10000; // ส่งทุก 10 วินาที
// DHT sensor
DHT dht(DHTPIN, DHTTYPE);
// ข้อมูลเซ็นเซอร์
float temp;
float hum;
int ldrValue;
String location = "ตึกอาคาร 42";
// NTP
const char* ntpServer = "pool.ntp.org";
unsigned long epochTime;
unsigned long getTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return 0;
}
return mktime(&timeinfo);
}
void tokenStatusCallback(TokenInfo info){
if (info.status == token_status_error){
GSheet.printf("Token info: type = %s, status = %s\n", GSheet.getTokenType(info).c_str(), GSheet.getTokenStatus(info).c_str());
GSheet.printf("Token error: %s\n", GSheet.getTokenError(info).c_str());
} else {
GSheet.printf("Token info: type = %s, status = %s\n", GSheet.getTokenType(info).c_str(), GSheet.getTokenStatus(info).c_str());
}
}
void setup(){
Serial.begin(115200);
Serial.println("Booting...");
// เริ่มเซ็นเซอร์
dht.begin();
// ตั้งค่าเวลา
configTime(0, 0, ntpServer);
// WiFi
WiFi.setAutoReconnect(true);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
// Google Sheet Client
GSheet.printf("ESP Google Sheet Client v%s\n", ESP_GOOGLE_SHEET_CLIENT_VERSION);
GSheet.setTokenCallback(tokenStatusCallback);
GSheet.setPrerefreshSeconds(10 * 60);
GSheet.begin(CLIENT_EMAIL, PROJECT_ID, PRIVATE_KEY);
}
void loop(){
if (GSheet.ready() && millis() - lastTime > timerDelay){
lastTime = millis();
FirebaseJson response;
FirebaseJson valueRange;
// อ่านเซ็นเซอร์
temp = dht.readTemperature();
hum = dht.readHumidity();
ldrValue = analogRead(LDR_PIN); // อ่าน LDR
if (isnan(temp) || isnan(hum)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
epochTime = getTime();
// แสดงค่าทาง Serial
Serial.printf("Time: %lu, Temp: %.2f °C, Hum: %.2f %%, LDR: %d, Location: %s\n",
epochTime, temp, hum, ldrValue, location.c_str());
// เตรียมข้อมูลที่จะส่ง (เพิ่ม LDR และ location)
valueRange.add("majorDimension", "COLUMNS");
valueRange.set("values/[0]/[0]", epochTime); // Column A
valueRange.set("values/[1]/[0]", temp); // Column B
valueRange.set("values/[2]/[0]", hum); // Column C
valueRange.set("values/[3]/[0]", ldrValue); // Column D
valueRange.set("values/[4]/[0]", location); // Column E
// ส่งไปยัง Google Sheets
bool success = GSheet.values.append(&response, spreadsheetId, "Sheet1!A1", &valueRange);
if (success){
response.toString(Serial, true);
valueRange.clear();
} else {
Serial.println("Error: " + GSheet.errorReason());
}
Serial.printf("Free Heap: %d bytes\n", ESP.getFreeHeap());
Serial.println("------------------------------------");
}
}