///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// The data read from the Aht30 sensor is sent to Google Apps Script to run the function to send the data to be written to Google Sheet.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//https://docs.google.com/spreadsheets/d/1fD02864bB4h2RF_ZBDSY9PC6rvvo82XcJ_R0wZY08QM/edit?gid=0#gid=0
// Spreadsheet ID คือส่วนของ Url ที่ได้มาจากช่อง Url ของ Google Sheet โดยตัดช่วงมาตั้งแต่
//หลัง https://docs.google.com/spreadsheets/d/
//ถึงก่อน /edit?gid=0#gid=0
//จาก Url ด้านบนนี้ Spreadsheet ID ก็คือ 1fD02864bB4h2RF_ZBDSY9PC6rvvo82XcJ_R0wZY08QM
//นำไปใช้ในโค้ด Apps Script
//--------- ชื่อชีต Esp32 & AHT30 -----------
//--------- ชื่อสคริปต์ Esp32_Aht30 ----------
//---------- Apps Script Code ------------
/*
function doGet(e) {
Logger.log( JSON.stringify(e) );
var result = 'Ok';
if (e.parameter == 'undefined') {
result = 'No Parameters';
}
else {
var sheet_id = '1fD02864bB4h2RF_ZBDSY9PC6rvvo82XcJ_R0wZY08QM'; //*Spreadsheet ID
var sheet = SpreadsheetApp.openById(sheet_id).getActiveSheet();
var newRow = sheet.getLastRow() + 1;
var rowData = [];
var Curr_Date = new Date();
rowData[0] = Curr_Date; // Date in column A
var Curr_Time = Utilities.formatDate(Curr_Date, "Asia/Bangkok", 'HH:mm:ss');
rowData[1] = Curr_Time; // Time in column B
for (var param in e.parameter) {
Logger.log('In for loop, param=' + param);
var value = stripQuotes(e.parameter[param]);
Logger.log(param + ':' + e.parameter[param]);
switch (param) {
case 'temp':
rowData[2] = value; // Temperature in column C
result = 'temp Written on column C';
break;
case 'humi':
rowData[3] = value; // Temperature in column D
result = 'humidity Written on column D';
break;
}
}
Logger.log(JSON.stringify(rowData));
var newRange = sheet.getRange(newRow, 1, 1, rowData.length);
newRange.setValues([rowData]);
}
return ContentService.createTextOutput(result);
}
function stripQuotes( value ) {
return value.replace(/^["']|['"]$/g, "");
}
*/
//----------- Arduino Code -------------
//////////////////////////////////////////////////////////////////////////////////////////////////////////
// ESP32 + AHT30 + Google Apps Script
// ส่งข้อมูลอุณหภูมิและความชื้นทุก 5 นาที
// Deep Sleep Timer Wakeup + ประหยัดพลังงานสูงสุด
//////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <WiFi.h>
#include <WiFiMulti.h>
#include <HTTPClient.h>
#include <Wire.h>
#include <Adafruit_AHTX0.h>
Adafruit_AHTX0 aht;
WiFiMulti WiFiMulti;
// Google Apps Script URL
const char SCRIPT_URL[] PROGMEM =
"https://script.google.com/macros/s/AKfycbxeW7ifG_H7KS3rsnW9if76IgEFkIu8Eb_M8OonLMgIs0zsELuCKPaC3x9zREEmSCol/exec";
// Deep Sleep interval (5 minutes)
#define SLEEP_MINUTES 5
//////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
Serial.begin(115200);
Serial.println(F("ESP32-C3 AHT30 & Google Sheet"));
// Initialize AHT30
if (!aht.begin()) {
Serial.println(F("AHT30 not found, check wiring!"));
while (1) delay(10);
}
// Connect Wi-Fi
WiFi.mode(WIFI_STA); // ประหยัดพลังงาน
WiFiMulti.addAP("happy_2.4G", "0816599222");
Serial.print(F("Connecting to Wi-Fi"));
int wifi_retry = 0;
while (WiFiMulti.run() != WL_CONNECTED) {
Serial.print(F("."));
delay(500);
wifi_retry++;
if (wifi_retry > 20) {
Serial.println(F("\nWi-Fi connect failed, going to sleep"));
esp_sleep_enable_timer_wakeup(SLEEP_MINUTES * 60ULL * 1000000ULL);
esp_deep_sleep_start();
}
}
Serial.println();
Serial.println(F("Wi-Fi connected"));
Serial.print(F("IP: "));
Serial.println(WiFi.localIP());
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
// อ่านค่า AHT30
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
// สร้าง URL
char url[300];
snprintf(url, sizeof(url), "%s?temp=%.2f&humi=%.2f",
FPSTR(SCRIPT_URL),
temp.temperature,
humidity.relative_humidity);
Serial.println(F("Send data to Google Sheet..."));
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(url);
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
int httpCode = http.GET();
if (httpCode > 0) {
Serial.println(httpCode);
Serial.println(http.getString());
} else {
Serial.println(F("Data transmission error."));
}
http.end();
}
// Short delay before sleep
delay(50);
Serial.print(F("Going to sleep for "));
Serial.print(SLEEP_MINUTES);
Serial.println(F(" minutes..."));
// Deep Sleep Timer
esp_sleep_enable_timer_wakeup(SLEEP_MINUTES * 60ULL * 1000000ULL);
esp_deep_sleep_start();
}