#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include <Wire.h>
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"
// WiFi_SSID = "Wokwi-GUEST" #isikan dengan ssid hotspot
// WiFi_PASS = "" #isikan dengan password hotspot
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define API_KEY "AIzaSyClmCd-tP6BA9AidNaUJIDT2-BWUI6Vg78"
#define DATABASE_URL "smarcos-25427-default-rtdb.asia-southeast1.firebasedatabase.app"
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
unsigned long sendDataPrevMillis = 0;
bool signupOK = false;
// Function to get current time as a string (formatted)
String getTimeStamp() {
time_t now;
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("Failed to obtain time");
return "N/A";
}
char timeStr[20];
strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", &timeinfo); // Format: YYYY-MM-DD HH:MM:SS
return String(timeStr);
}
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
if (Firebase.signUp(&config, &auth, "", "")) {
Serial.println("signUp OK");
signupOK = true;
} else {
Serial.printf("%s\n", config.signer.signupError.message.c_str());
}
config.token_status_callback = tokenStatusCallback;
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
// Set time from NTP server
configTime(0, 0, "pool.ntp.org", "time.nist.gov");
Serial.println();
}
void loop() {
// Interval of 5 minutes (300,000 ms)
if (Firebase.ready() && signupOK && (millis() - sendDataPrevMillis > 300000 || sendDataPrevMillis == 0)) {
sendDataPrevMillis = millis();
// --------------- STORE sensor data to RTDB
// =====Rendom Angka (replace with actual sensor readings)===== //
float temp = random(20, 35); // Temperature reading
float d_Turb = random(0, 100); // Turbidity reading
float pH = random(4, 11); // pH reading
float DO_R = random(0, 10); // Dissolved Oxygen reading
// Get current timestamp
String timeStamp = getTimeStamp();
// Create a base path for storing data using the timestamp
String basePath = "Readings/" + timeStamp;
// Store Temperature
if (Firebase.RTDB.setFloat(&fbdo, basePath + "/Temperature", temp)) {
Serial.print("Data Temp: ");
Serial.print(temp); Serial.println(" *C");
} else {
Serial.print("Error mengirim data temp ke Firebase: ");
Serial.println("FAILED: " + fbdo.errorReason());
}
// Store Turbidity
if (Firebase.RTDB.setFloat(&fbdo, basePath + "/Turbidity", d_Turb)) {
Serial.print("Data Turbidity: ");
Serial.print(d_Turb); Serial.println(" NTU");
} else {
Serial.print("Error mengirim data turbidity ke Firebase: ");
Serial.println("FAILED: " + fbdo.errorReason());
}
// Store pH
if (Firebase.RTDB.setFloat(&fbdo, basePath + "/pH", pH)) {
Serial.print("Data pH: ");
Serial.print(pH); Serial.println(" pH");
} else {
Serial.print("Error mengirim data pH ke Firebase: ");
Serial.println("FAILED: " + fbdo.errorReason());
}
// Store Dissolved Oxygen (DO)
if (Firebase.RTDB.setFloat(&fbdo, basePath + "/Dissolved_Oxygen", DO_R)) {
Serial.print("Data DO: ");
Serial.print(DO_R); Serial.println(" mg/l");
} else {
Serial.print("Error mengirim data DO ke Firebase: ");
Serial.println("FAILED: " + fbdo.errorReason());
}
Serial.println("Data sent to Firebase at " + timeStamp);
Serial.println();
}
}