#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 // ถ้าใช้ DHT22 เปลี่ยนเป็น DHT22
// WiFi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Google Project ID
#define PROJECT_ID "esp32-test-471304"
// Service Account's client email
#define CLIENT_EMAIL "[email protected]"
// Service Account's private key
const char PRIVATE_KEY[] PROGMEM = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC02VHdETGhjo4r\nr1tEr+LKsK+irDTzf0PtOVww+B//XuFyRJ+vjIOuQJl5O4z5XmwS7Pid37FIewLn\nNji8+rZ5EzoqSLuCdJNqLeQYmDBUCIerdx6538o++cCCtQ+zjFWBQCgcxfk77qs0\ndLM6EZaRXjIafiQN1DCsp0AQD74Qcc4FeKduddYJIMgc2cSi+dzU2CBD7nhTRMhp\n3sRlPiPtwC7EPd4tkzkdt5+EaEerbtbfDHOgyeGJQue21EbrNbTLT610OXMuAHJk\ns4Fn7NvjxUIFNxpP63YvXx6+dImfxV8+mTefR3ZKgK4A8kngxLPLmGuAkhjuV3zy\nccbot3CbAgMBAAECggEARoWIGsCdrfY9EmPrHznHImsL0k98xocWIeeAP8hCEf8Z\nwslny7jrkIO4VUIXkxZy5l5qBIY6R51QYIEQVwEdLtGEmQCLvi9fXMRQchbGob5B\nyWdGIA1YfH4/x7h7SvSqUyCFg9LfgbNsJ6RqT3aUVFN7DkGqJYpdALankJvS7e4K\ncSa7Qq1PsZ/Xsy87FR+R5+sosn8TOnZVTck/ga69vc7QfGylGhRIDnR+YX5igEau\n6t9QAiIRsRc+HWfP5m2lS+p35kAur6PLzzJ9WUZmdfmYdqToZHrsBrVTUd82v3HX\nNiJS3d5Ty7EnGxaWpw7+C6gir+A/aMZb/WaJMkBm4QKBgQDsQRrsW6gPxxK6ziBF\nqip0A1RP9aCbGZFd6mIwp6Fv9AYs4ErreSu2chiZXqS25mWnRGOu3LZm+h8PTaX7\n44jFiKFrBujBB4uM7QnztkXiL1zQBxQoEv5PBd/AOM/beeTQomMvVK5FZxiXeoeU\na5DHCknBNfYri+aTaA3lonGHtQKBgQDD9sLSBNBlLovGWvTQtXfJ3s6duO4AjP0G\nXVzKH/Vr2JWFkHlnZeVD5SeSAg4Nt8Lfh+y8k8/25rihB3k/tUdIW6VdtOrfG/lK\nFydIvN/BcbualIBQ/KmsA55xPgPMLEhEzbiG07O9bf7MjjaaEwSDJahvoWivtVNp\n9rYJA9KpDwKBgGCgMBbDVfU+AlcMvv4/HqXcRrt9Rnao+l9i4U3tAYX8VBo+keXE\n5S/1ckIoB04W5TSIMAzwkFmFqvZjV6Ox59qCiyJu7PslztmQiSV4QxTDMj6S5peN\nTR2c1WqU0c5+CCucftx40d3o0JIDtzfo1onRl2DCZTBiQ6e+QxDMY4qRAoGBAKxr\nbokZYT7VkHgrSWJleItu9f6CWy6y3mH+PYk+S1LjktOdBaS7W9i8RG/MTQ8200iY\nMOzPZVjJMkPE7qLmXlzE/iAP8ePymgndi1wNixaKelWNOcWIOcW2vW7H8NFxWPjo\nxOYkWO5gXKMgsdwoxXya4rOtog2PjmAaiZou+ehzAoGAbeO16n2TKRRfZfmRFyOT\niaQpaLdyI4QnoI2KuxZnRMBbo1j5sXQeIeqDy79ywvGWu1C4vX2UeQxZtYR2Zv0O\n7nZkiNp7xNK47BVRxGdCWA5OLVK7gluDrQckudKXcRElm8Dm4pXbwXbW1ju+5GR3\nWAb3NOyd1bxTdXfxDmUzt+Y=\n-----END PRIVATE KEY-----\n";
// The ID of the spreadsheet where you'll publish the data
const char spreadsheetId[] = "1ThWL4bEwcq94vU8PQHaruCt8KImqEXJVrTcdOHwVq60";
// ตัวแปรเวลาสำหรับส่งข้อมูลเป็นระยะ
unsigned long lastTime = 0;
unsigned long timerDelay = 3000; // ส่งทุก 30 วินาที
// DHT sensor object
DHT dht(DHTPIN, DHTTYPE);
// ตัวแปรเก็บค่าเซ็นเซอร์
float temp;
float hum;
// NTP Server เพื่อขอเวลา
const char* ntpServer = "pool.ntp.org";
// ตัวแปรเก็บเวลา epoch
unsigned long epochTime;
// ฟังก์ชันรับเวลา epoch ปัจจุบัน
unsigned long getTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return 0;
}
return mktime(&timeinfo);
}
// Callback เช็คสถานะ Token (สำหรับ Debug)
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();
Serial.println("Starting...");
// เริ่มเซ็นเซอร์ DHT
dht.begin();
// ตั้งค่าเวลา NTP
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());
Serial.println();
// Debug info เวอร์ชันไลบรารี
GSheet.printf("ESP Google Sheet Client v%s\n\n", ESP_GOOGLE_SHEET_CLIENT_VERSION);
// ตั้ง callback สำหรับ token status
GSheet.setTokenCallback(tokenStatusCallback);
// ตั้งเวลาที่จะรีเฟรช token ก่อนหมดอายุ (หน่วย: วินาที)
GSheet.setPrerefreshSeconds(10 * 60);
// เริ่มการรับ token เพื่อใช้งาน Google API
GSheet.begin(CLIENT_EMAIL, PROJECT_ID, PRIVATE_KEY);
}
void loop(){
// เช็คว่า Google Sheet Client พร้อมใช้งานหรือยัง
bool ready = GSheet.ready();
if (ready && millis() - lastTime > timerDelay){
lastTime = millis();
FirebaseJson response;
FirebaseJson valueRange;
// อ่านค่า DHT
temp = dht.readTemperature();
hum = dht.readHumidity();
// ถ้าอ่านไม่ได้ ให้ข้ามรอบนี้
if (isnan(temp) || isnan(hum)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// ขอเวลาปัจจุบัน (epoch)
epochTime = getTime();
Serial.printf("Time: %lu, Temp: %.2f C, Hum: %.2f %%\n", epochTime, temp, hum);
// เตรียมข้อมูลที่จะส่ง (แบบ COLUMNS)
valueRange.add("majorDimension", "COLUMNS");
valueRange.set("values/[0]/[0]", epochTime);
valueRange.set("values/[1]/[0]", temp);
valueRange.set("values/[2]/[0]", hum);
// ส่งข้อมูลไป 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.println();
Serial.printf("Free Heap: %d bytes\n", ESP.getFreeHeap());
}
}