#include "EmonLib.h"
#include <WiFi.h>
#include <ThingSpeak.h>
#include <FirebaseESP32.h>
#include "addons/TokenHelper.h"
#include "addons/RTDBHelper.h"
EnergyMonitor emon;
#define vCalibration 83.3
#define currCalibration 0.50
const char *ssid = "Wokwi-GUEST"; // Your WiFi SSID
const char *password = ""; // Your WiFi password
const char *thingSpeakApiKey = "I2F5784JDV9OJHX9"; // Your ThingSpeak API key
const unsigned long channelNumber = 2410378; // Your ThingSpeak channel number
#define FIREBASE_HOST "https://testing-132ed-default-rtdb.asia-southeast1.firebasedatabase.app/"
#define FIREBASE_API_KEY "AIzaSyDiVj0PjbliyyfxajJHGj5R3am7Jckt_Ec"
#define PIR_PIN 34 // Define the PIR sensor pin
#define RELAY_PIN_1 12 // Define the first relay control pin
#define RELAY_PIN_2 27 // Define the second relay control pin
float kWh = 0;
unsigned long lastmillis = millis();
bool signupOK = false;
WiFiClient client;
FirebaseData firebaseData;
FirebaseConfig firebaseConfig;
FirebaseAuth firebaseAuth;
void setup()
{
Serial.begin(115200);
emon.voltage(35, vCalibration, 1.7); // Voltage: input pin, calibration, phase_shift
emon.current(34, currCalibration); // Current: input pin, calibration.
pinMode(PIR_PIN, INPUT); // Set PIR pin as input
pinMode(RELAY_PIN_1, OUTPUT); // Set first relay pin as output
pinMode(RELAY_PIN_2, OUTPUT); // Set second relay pin as output
// 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");
//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()
{
// Read energy parameters
emon.calcVI(20, 2000);
kWh = kWh + emon.apparentPower * (millis() - lastmillis) / 3600000000.0;
lastmillis = millis();
// Debugging: Print PIR sensor status
Serial.print("PIR Sensor Status: ");
Serial.println(digitalRead(PIR_PIN));
if (digitalRead(PIR_PIN) == HIGH) { // If motion is detected
Serial.println("Motion detected!");
digitalWrite(RELAY_PIN_1, HIGH); // Turn on the first relay
digitalWrite(RELAY_PIN_2, HIGH); // Turn on the second relay
delay(10000); // Relay on time
digitalWrite(RELAY_PIN_1, LOW); // Turn off the first relay
digitalWrite(RELAY_PIN_2, LOW); // Turn off the second relay
Serial.println("Relays turned off");
delay(10000); // Delay to avoid rapid triggering
}
if (WiFi.status() == WL_CONNECTED) {
// Send data to ThingSpeak
ThingSpeak.writeField(channelNumber, 3, static_cast<float>(emon.Vrms), thingSpeakApiKey);
ThingSpeak.writeField(channelNumber, 4, static_cast<float>((emon.Irms)*1000), thingSpeakApiKey);
ThingSpeak.writeField(channelNumber, 5, static_cast<float>(emon.apparentPower), thingSpeakApiKey);
ThingSpeak.writeField(channelNumber, 6, static_cast<float>(kWh), thingSpeakApiKey);
Serial.println("Data sent to ThingSpeak");
} else {
Serial.println("Not connected to WiFi");
}
// Send data to Firebase
if (Firebase.ready()) {
Firebase.setInt(firebaseData, "/sensorData/Voltage", static_cast<int>(emon.Vrms));
Firebase.setInt(firebaseData, "/sensorData/Current", static_cast<int>(emon.Irms * 1000));
Firebase.setInt(firebaseData, "/sensorData/ApparentPower", static_cast<int>(emon.apparentPower));
Firebase.setFloat(firebaseData, "/sensorData/kWh", kWh);
if (Firebase.pushInt(firebaseData, "/sensorData", 1)) { // Example push with integer value (1)
Serial.println("Data sent to Firebase");
} else {
Serial.println("Failed to send data to Firebase");
}
}
delay(5000); // Wait for 5 seconds before sending the next data
}