#include <Arduino.h>
#include <WiFi.h>
#include "time.h"
#include <ESP_Google_Sheet_Client.h>
#include "DHT.h"
#define DHTTYPE DHT22
#define DHTPIN 19
// For SD/SD_MMC mounting helper
#include <GS_SDHelper.h>
char WIFI_SSID[] = "Wokwi-GUEST";
char WIFI_PASSWORD[] = "";
// Google Project ID
#define PROJECT_ID "chs-project-412017"
// Service Account's client email
#define CLIENT_EMAIL "[email protected]"
// Service Account's private key
const char PRIVATE_KEY[] PROGMEM = "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC+8560WbYRzg0d\nonOcu+4KtJ3rhifoiYkI4TrcFpUMMJhs8vkVsH/0ZMkq0MlvA+urTBgehAy3/hPL\nCS/tZGkm1Ni3JAwV77EroKXurx8Tv1Cd4d0H83RzVkbh3gUVeG0Y4LvFza2FqRmp\n/GpjWFtyIRfjXozHeezD82T6pXSMjLQVA5rrXqYQ4r6bkGmJOoLdu2ivmUcHnuiu\nh0mlpvnpPP0E9wVWYG5HHPLBmq4QGx+VP1OVa52Rh/9kSk4YMLeQXDxAHypOKKZD\n+TxE+MLLzlwHlRACCru4ZQNexi/NDZGJxBY2O5j+2C4e/T1PVWZ8Ua4XPkAynioH\nfNR2/2XDAgMBAAECggEALUwIYVsIrEeXZ+jCCTOxf7uh3J2p+OkrZz5aopv+xnH+\nrpWizejdKaIA8JWvuxSQgsWd0RtdEwaENn1a77MKmKoUMLmt3kRKYIGO60SCmEIh\ngxpxvvGbNcMJNIpg5Vt4cdbZ5E3qtFLNYjwdFqz+oF/GVWr39VfwePlTgnveXnqX\nPXYrMp0ZKcr7kNBeXyVB3sJ0ViR3MStoWpSTVQhjcvEoCfNYI/KzB5oQJGKEPwwh\nfF+ebd2lpLJZ13Qzn462OtyfTIElbMuv7TkXJMFQR+EN07jiyl0HYUBqwadhr26f\nlqAQGCCHSTRjEMq70ZqnEjyqs4ueHHKAj1N8G4l0eQKBgQDmtw1CobSs4QiFUMWW\nKnSI5+Sj1HjeJcuvTRps92V6+OACqDmOPoH5fxAA+biupsLP2OacQbLtQnUIH8rz\n48mBlN88Ez32Y+iZC283GQwCjNQtGY0AzYDJH8cGs9gk3VfMocqT4bC0qG/IlZgF\nquDF+MYWVZPjN8XNFkH21vI4mwKBgQDT4PcAPEnA9HAlv98vCDKIdo3T+If89xcZ\ngE0wkZNNiIWzVM4YWNuIoIucWi3Ing6W4VIkEtVCIfBaKWaX5rld69SzKIiMDd2q\n4g471/pmus0zeFcbk2xR6t0SJbpsE6CLEAs/lmQW62M/DyqJTbexb2tFBi+/1jim\n8lUdYk71+QKBgAZlgtebFiBI6OyRTbkZGjwFeeBU7rjyAVCt6ZKl1Ulwhv1r3pSk\nBQR+0lnEkqs88l/C2rnwVF6hng8Imp7ibN7L2tiWi/w9zuAXYhD7/8o+T0+kyrT/\n/ZcV63WzHMYA4QNKZQxukHChzt+XziwyDaNPf2Z1HvGIxVInUNLgKL0LAoGBAIo2\nYwnNShNLoOiPHEiy4Tvxkh0nL5ZNnMzuy+uV2vAl0YmlFXf+Zt7eU5Qfo2QN7thv\njUSo4GJufzphbWJDiMICt9JS65fo56O0KLLS9a4Txw3/P1tmtK9PNPzEjbI4r25n\nfd7x/MKStEALZaUBhIWDeAcjvPw4Auash+dOHNIJAoGAQgr/+6MN3hn68Nnjv5ir\nrsSbWaDpRzOKOTdFm4P4scwjFWJN84QfqqUVj2+tGh98dZZHs8PBC0PYAtB6XMtG\nvisMMR/ePGVm7ROvNiHGh7DJdBuKQD+0Fi6jZcR5KrJ510Vs+1fIJMogCrwsMnUd\nUn0WLnBe17VPPZC92TL/Mlw=\n-----END PRIVATE KEY-----\n";
// The ID of the spreadsheet where you'll publish the data
const char spreadsheetId[] = "1E1810hD-4Gu2QGYCQhvfexgWC0va0bIQ9wh7MxCPM7E";
// Timer variables
unsigned long lastTime = 0;
unsigned long timerDelay = 30000;
// Token Callback function
void tokenStatusCallback(TokenInfo info);
DHT dht(DHTPIN, DHTTYPE);
// Variables to hold sensor readings
float temp;
float hum;
float pres;
// NTP server to request epoch time
const char* ntpServer = "pool.ntp.org";
// Variable to save current epoch time
unsigned long epochTime;
// Function that gets current epoch time
unsigned long getTime() {
time_t now;
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
//Serial.println("Failed to obtain time");
return(0);
}
time(&now);
return now;
}
void setup(){
Serial.begin(115200);
Serial.println();
Serial.println();
//Configure time
configTime(0, 0, ntpServer);
dht.begin();
GSheet.printf("ESP Google Sheet Client v%s\n\n", ESP_GOOGLE_SHEET_CLIENT_VERSION);
// Connect to Wi-Fi
WiFi.setAutoReconnect(true);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
// Set the callback for Google API access token generation status (for debug only)
GSheet.setTokenCallback(tokenStatusCallback);
// Set the seconds to refresh the auth token before expire (60 to 3540, default is 300 seconds)
GSheet.setPrerefreshSeconds(10 * 60);
// Begin the access token generation for Google API authentication
GSheet.begin(CLIENT_EMAIL, PROJECT_ID, PRIVATE_KEY);
}
void loop(){
// Call ready() repeatedly in loop for authentication checking and processing
bool ready = GSheet.ready();
if (ready && millis() - lastTime > timerDelay){
lastTime = millis();
FirebaseJson response;
Serial.println("\nAppend spreadsheet values...");
Serial.println("----------------------------");
FirebaseJson valueRange;
// // New BME280 sensor readings
// temp = bme.readTemperature();
// //temp = 1.8*bme.readTemperature() + 32;
// hum = bme.readHumidity();
float hum = dht.readHumidity();
// // Read temperature as Celsius (the default)
float temp = dht.readTemperature();
float moisture = analogRead(32) % 100;
int pH = analogRead(33) % 14;
// Get timestamp
epochTime = getTime();
valueRange.add("majorDimension", "COLUMNS");
valueRange.set("values/[0]/[0]", epochTime);
valueRange.set("values/[1]/[0]", temp);
valueRange.set("values/[2]/[0]", hum);
valueRange.set("values/[3]/[0]", moisture);
valueRange.set("values/[4]/[0]", moisture);
// For Google Sheet API ref doc, go to https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append
// Append values to the spreadsheet
bool success = GSheet.values.append(&response /* returned response */, spreadsheetId /* spreadsheet Id to append */, "Sheet1!A1" /* range to append */, &valueRange /* data range to append */);
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());
}
}
// #include "DHT.h"
// #define DHTTYPE DHT22
// #define DHTPIN 19
// DHT dht(DHTPIN, DHTTYPE);
// void setup() {
// // put your setup code here, to run once:
// Serial.begin(115200);
// Serial.println("Hello, ESP32!");
// dht.begin();
// }
// void loop() {
// int N = analogRead(32);
// int P = analogRead(33);
// int K = analogRead(25);
// float h = dht.readHumidity();
// // Read temperature as Celsius (the default)
// float t = dht.readTemperature();
// // Read temperature as Fahrenheit (isFahrenheit = true)
// // float f = dht.readTemperature(true);
// Serial.println("N : ");
// Serial.println(N);
// Serial.println("P : ");
// Serial.println(P);
// Serial.println("K : ");
// Serial.println(K);
// Serial.println("Temp : ");
// Serial.println(t);
// Serial.println("Hum : ");
// Serial.println(h);
// delay(2000);
// }