#include "WiFi.h"
#include <FirebaseJson.h>
#include <FirebaseESP32.h>
#include <LiquidCrystal_I2C.h>
#include "lcdSymbols.h"
#include <DS1307RTC.h>
#include <TimeLib.h>
#define FIREBASE_HOST "https://load-project-4601f-default-rtdb.firebaseio.com/"
#define FIREBASE_AUTH "VyCFwwManCmj6GtQZnT4L4Nc3ZFYUTP7Lw2EthCg"
#define WIFI_SSID "ISITcom_wifi_etud"
#define WIFI_PASSWORD "@isitcom@2022"
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2);
const char* ssid = "ISITcom_wifi_etud";
const char* password = "@isitcom@2022";
FirebaseData firebaseData;
class MainLight {
public:
MainLight(int _pin) : PIN(_pin) {
pinMode(PIN, OUTPUT);
}
MainLight(int _pin, bool turn) : PIN(_pin), TurnToMotion(turn) {
pinMode(PIN, OUTPUT);
}
MainLight(int _pin, int enable, int disable) {
PIN = _pin;
EnableOnMotion = enable;
DisableOnMotion = disable;
pinMode(PIN, OUTPUT);
}
int GetCurrentState() { return CurrentState; }
void Switch(int sig) {
CurrentState = sig;
digitalWrite(PIN, CurrentState);
}
private:
int PIN;
int CurrentState = LOW;
bool TurnToMotion = true;
int EnableOnMotion = 7;
int DisableOnMotion = 23;
};
MainLight m(32);
class AmbientLight {};
class AlarmClock {
public:
AlarmClock(int _pin) : PIN(_pin) {
pinMode(PIN, OUTPUT);
};
AlarmClock(int _pin, int _hour, int _minute, int r) {
PIN = _pin;
Hour = _hour;
Minute = _minute;
ResponseTime = r;
pinMode(PIN, OUTPUT);
};
void SetEnabled(bool b) { Enabled = b; }
void SetTime(int h, int m) {
Hour = h;
Minute = m;
}
void SetResposeTime(int i) { ResponseTime = i; }
bool isEnabled() { return Enabled; }
int GetHour() { return Hour; }
int GetMinute() { return Minute; }
int GetResposeTime() { return ResponseTime; }
void StartAlarm() {
digitalWrite(PIN, HIGH);
}
void StopAlarm() {
digitalWrite(PIN, LOW);
}
private:
int PIN;
bool Enabled = true;
int Hour = 0;
int Minute = 0;
int ResponseTime = 300;
};
time_t GetUnixTime() {
time_t unixTime = 0;
if (Firebase.getTimestamp(firebaseData)) {
unixTime = firebaseData.timestamp / 1000; // Convert milliseconds to seconds
}
return unixTime;
}
void PrintMenu() {
lcd.setCursor(9, 1);
lcd.write(byte(0));
lcd.setCursor(11, 1);
lcd.write(byte(1));
lcd.setCursor(13, 1);
lcd.write(byte(2));
lcd.setCursor(15, 1);
lcd.write(byte(3));
}
void PrintIDLE() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(hour());
lcdPrintDigits(minute());
lcdPrintDigits(second());
lcd.setCursor(0, 1);
lcd.print(day());
lcd.print(".");
lcd.print(month());
lcd.print(".");
lcd.print(year());
lcd.setCursor(13, 1);
lcd.write(byte(6));
lcd.setCursor(15, 1);
if (digitalRead(32) == HIGH) {
lcd.write(byte(4));
} else {
lcd.write(byte(5));
}
}
void lcdPrintDigits(int digits) {
// utility function for digital clock display: prints preceding colon and leading 0
lcd.print(":");
if (digits < 10)
lcd.print('0');
lcd.print(digits);
}
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH, WIFI_SSID, WIFI_PASSWORD);
pinMode(34, INPUT); // Mortion sensor
m.Switch(HIGH);
lcd.init();
lcd.backlight();
lcd.createChar(0, up);
lcd.createChar(1, down);
lcd.createChar(2, yes);
lcd.createChar(3, no);
lcd.createChar(4, lightBulbOn);
lcd.createChar(5, lightBulbOff);
lcd.createChar(6, menu);
WiFi.begin(ssid, password);
int i = 0;
while (WiFi.status() != WL_CONNECTED) {
if (i == 10)
break;
i++;
delay(1000);
Serial.println("Connecting to Wi-Fi...");
}
Serial.println("Wi-Fi connection is established!");
time_t Time = GetUnixTime();
if (Time >= 0) {
RTC.set(Time);
setSyncProvider(RTC.get); // the function to get the time from the RTC
} else {
setSyncProvider(0);
}
}
void UpdateFirebaseData() {
// Update your data on Firebase here
// For example, update the state of the main light
Firebase.setInt("mainLightState", m.GetCurrentState());
}
void loop() {
static unsigned long tmr = 0;
if (millis() - tmr > 1000) {
tmr = millis();
PrintIDLE();
UpdateFirebaseData(); // Add a function to update data on Firebase
}
}