#include <WiFi.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <time.h>
#include <ESP_Google_Sheet_Client.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define PROJECT_ID "dht-22-419715"
#define CLIENT_EMAIL "[email protected]"
const char PRIVATE_KEY[] PROGMEM = "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCgriRutx99Uw26\nkJaw4fmDp596z79tZO6/pyMHgD/aHn1e03svD7vlnKyaxx+ddSSHPGq1BA+R4nzB\npoLYEYepAkfj4ued5uinh0HRNkYfqpzTbt7PNNmoITXwhCMClF4qpNSRhcy4aJ7G\nDESQ6GuQYs1i96ISS4TO313ryOQDqdvmSffRnZ96S2MB6h3VVKF+tke1suAaUBtB\n3Ukunc1CKMC2mEWrCWRQy12w60DtvV7DFSEcdz2Ibc5sMNQiJKXc0YJn6VxkjTpr\nmw6uT8VXaBTi3gzgt0vCu1E/EMx9xpY4sWow5pqTtbNhgZ31R0zLR4pydE/JQDev\nbRCcOpKnAgMBAAECggEAPobluIvcXimWuxYO/fBB56CwJ9t2M7zGR6BjukSHFHsu\n8Fq9ofeud9C7PlPkkqKGP3YcVCqrYGrRf44rdqeDshooHZ8r4L99o8u3qhFDwojj\nFEgdvmZjmNCrq9fPw+42osOX0LVPkCduOcWGXRmE2iAIqs2QrSvkF5jGdL2tNVsj\nI8T8eUvVngt0xE6si+WfoSI9maB26EcU7TR3z5maib+SQ/NDH5nJSEwJrMwHGdwP\n0PuA89Z1uo/Wyysb4dk9fKwAh3SF+UFADBWBj5FXUXwl3ZlR0YhOshbzE7yM0tDE\nHmw29I+EYUf4r1f9CnZSU8ZAhsa2EMYWVM7KQ4qFAQKBgQDVFhVnAK1dfIvxYzAA\n3KlDni0sopp6pf7CrSlePdn63s1RoY62VGIPqVQjcV4xV23fFfwY11SecLQYLsvr\nUKNy53zrtH3P0g5V6X3BJaQ4L3SQkPrUjhkcHlic3R1IczaT1ARYkVy78aZcHvji\nKUhPAScURhKcwqh21fVhpBOrJwKBgQDBCjQuin0NV8nLgMJQ0naC3BHoIgVt2UfJ\nqp81iE4TBP0OYWvm3Iq2onQbIcqODrcTDdx5Nu/0LMJr25/sK+fvWmDfitNl99uF\nQ5ePRa/y/mEJ0XgZlna22big5uYRuXWXA7cfhzOdCVkHyR4JEz4NavXeAarbrMfs\nvzJewIiMgQKBgDiMU8Gx/FAC7WBx4htYc9Lt9y8RN820n5cqPQA1idN5rSMsrKLW\nYe+mEB4Xx9dwTEgXnX86JcqmPiTsxlD8ZWPo6s3iaEDujb9e53CKfLosXdK/ptEh\npKhBpWJ7i3nemW1BpqWabfGyf2OTFJlwOzA8LhLDRc00G2DuBuCSmmWhAoGAR2Am\ney7png1fp8csEgY/m5MTa+loaH12dbKIu5pyg8XMa4zKAMp635yhoYaVBoGaX4k4\ng/k0L+x81rSWJRT25SFdwEnscD99A4FCgM8bh5VW+/JfndZsfp9yDMxTNSqFuBi/\nlQDArMfQC3jpiiF7SCrMThH/wsnYAkmPrkkyNAECgYA/Kb3/WSg8/WXGAS4TNy1v\n6IwZANLrbG1y9lhdvte4wvHIi86PIoeXsl3/9rVRcKrQlbKdTZlEfqjBsKK/0eb+\nmOUblxSa8w6WI/0Cp8MO2Y5TJlugAU03lw5fVfNU3YQuxu67bcylabtAq2qmnSeh\nZEG1hWxa8HDyXDcbDeQBaw==\n-----END PRIVATE KEY-----\n";
const char spreadsheetId[] = "15bhDaxhbJJPb9UlrgfcRrpN_lXHdRKedF7IiBnMyfGY";
unsigned long lastTime = 0;
unsigned long timerDelay = 2000; // Update data setiap 2 detik
void tokenStatusCallback(TokenInfo info);
#define DHT_PIN 14
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
float temp;
float hum;
const char* ntpServer = "asia.pool.ntp.org";
const long gmtOffset_sec = 7 * 3600; // WIB (GMT +7)
const int daylightOffset_sec = 0;
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
dht.begin();
GSheet.printf("ESP Google Sheet Client v%s\n\n", ESP_GOOGLE_SHEET_CLIENT_VERSION);
GSheet.setTokenCallback(tokenStatusCallback);
GSheet.setPrerefreshSeconds(10 * 60);
GSheet.begin(CLIENT_EMAIL, PROJECT_ID, PRIVATE_KEY);
}
void loop() {
bool ready = GSheet.ready();
if (ready && millis() - lastTime > timerDelay) {
lastTime = millis();
FirebaseJson response;
Serial.println("\Akan tersambung");
Serial.println("tersambung");
FirebaseJson valueRange;
temp = dht.readTemperature();
hum = dht.readHumidity();
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time!");
return;
}
char dateString[12];
sprintf(dateString, "%02d/%02d/%04d", timeinfo.tm_mday, timeinfo.tm_mon + 1, timeinfo.tm_year + 1900);
char timeString[10];
sprintf(timeString, "%02d:%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
valueRange.add("majorDimension", "COLUMNS");
valueRange.set("values/[0]/[0]", dateString);
valueRange.set("values/[1]/[0]", timeString);
valueRange.set("values/[2]/[0]", temp);
valueRange.set("values/[3]/[0]", hum);
bool success = GSheet.values.append(&response, spreadsheetId, "Sheet1!A1", &valueRange);
if (success) {
response.toString(Serial, true);
valueRange.clear();
}
else {
Serial.println(GSheet.errorReason());
}
Serial.println();
Serial.println(ESP.getFreeHeap());
}
}
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());
}
}