//#include <ThingSpeak.h>
#include <FirebaseESP32.h>
#include "addons/TokenHelper.h" // Assuming these are provided in your project
#include "addons/RTDBHelper.h" // Check the correct paths
const char *ssid = "Wokwi-GUEST"; // Your WiFi SSID
const char *password = ""; // Your WiFi password
//const char *thingSpeakApiKey = "PSER8CDEV21FTPTH"; // Your ThingSpeak API key
//const unsigned long channelNumber = 2466820; // Your ThingSpeak channel number
#define FIREBASE_HOST "testing-132ed-default-rtdb.asia-southeast1.firebasedatabase.app/"
#define FIREBASE_API_KEY "AIzaSyDiVj0PjbliyyfxajJHGj5R3am7Jckt_Ec"
bool signupOK = false;
const int trigPin = 13; // Connect the trigger pin of the ultrasonic sensor to GPIO 13
const int echoPin = 14; // Connect the echo pin of the ultrasonic sensor to GPIO 12
const int flowSensorPin = 5; // Connect the pulse output of the flow sensor to GPIO 5
volatile unsigned int pulseCount = 0;
unsigned int flowRate = 0;
unsigned long flowMilliLiters = 0;
unsigned long totalMilliLiters = 0;
unsigned long lastTime = 0;
WiFiClient client;
FirebaseData firebaseData;
FirebaseConfig firebaseConfig;
FirebaseAuth firebaseAuth;
void handleFlow() {
pulseCount++;
}
void setup() {
Serial.begin(115200);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Set up the ultrasonic sensor pins
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Set up the flow sensor pin
pinMode(flowSensorPin, INPUT);
attachInterrupt(digitalPinToInterrupt(flowSensorPin), handleFlow, FALLING);
// Initialize ThingSpeak
//ThingSpeak.begin(client);
firebaseConfig.database_url = FIREBASE_HOST;
firebaseConfig.api_key = FIREBASE_API_KEY;
/* Sign up */
if (Firebase.signUp(&firebaseConfig, &firebaseAuth, "", "")){
Serial.println("ok");
signupOK = true;
}
else{
Serial.printf("%s\n", firebaseConfig.signer.signupError.message.c_str());
}
/* Assign the callback function for the long running token generation task */
firebaseConfig.token_status_callback = tokenStatusCallback; //see addons/TokenHelper.h
// Connect to Firebase
Firebase.begin(&firebaseConfig, &firebaseAuth);
Firebase.reconnectWiFi(true);
}
void loop() {
// Measure distance using ultrasonic sensor
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2; // Calculate distance in centimeters
// Print distance to serial monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// Calculate flow rate and total flow
unsigned long currentTime = millis();
if (currentTime - lastTime > 1000) { // Calculate every second
flowRate = pulseCount / 7.5; // Flow sensor calibration factor (adjust as needed)
flowMilliLiters = (flowRate * 1000) / 60; // Convert to milliliters per second
totalMilliLiters += flowMilliLiters;
pulseCount = 0;
lastTime = currentTime;
// Print flow rate and total flow to serial monitor
Serial.print("Flow Rate: ");
Serial.print(flowRate);
Serial.print(" L/min\tTotal Flow: ");
Serial.print(totalMilliLiters);
Serial.println(" mL");
}
/*
// Send data to ThingSpeak
if (WiFi.status() == WL_CONNECTED) {
ThingSpeak.writeField(channelNumber, 1, distance, thingSpeakApiKey); // Field 1 for ultrasonic sensor distance data
ThingSpeak.writeField(channelNumber, 2, static_cast<float>(totalMilliLiters), thingSpeakApiKey);
// Field 2 for total flow data
Serial.println("Data sent to ThingSpeak");
} else {
Serial.println("Not connected to WiFi");
}
*/
// Send data to Firebase if the water level is below 20 or above 90
if (Firebase.ready()) {
// Set distance value as a float in Firebase
Firebase.setFloat(firebaseData, "/watersensorData/Distance", static_cast<float>(distance));
// Push the data to Firebase
if (Firebase.pushFloat(firebaseData, "/watersensorData/Distance", static_cast<float>(distance))) {
Serial.println("Distance data sent to Firebase");
} else {
Serial.println("Failed to send distance data to Firebase");
}
}
delay(5000); // Wait for 5 seconds before sending the next data
}