#include <Wire.h>
#include <Arduino.h>
#include <WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <FirebaseESP32.h>
#include <addons/TokenHelper.h>
#include <addons/RTDBHelper.h>
// Definisi API dan koneksi Firebase
#define API_KEY "AIzaSyB1onwZ9uNzDVtmen3C43d4QAeMVjxQ_H8"
#define DATABASE_URL "https://smartmotorcontrol-605d9-default-rtdb.asia-southeast1.firebasedatabase.app"
#define WIFI_SSID "Wowi-GUEST"
#define WIFI_PASSWORD ""
#define USER_EMAIL "[email protected]"
#define USER_PASSWORD "321987Awal"
// Pin konstanta
const int RELAY1_PIN = 17;
const int RELAY2_PIN = 16;
const int RELAY3_PIN = 15;
const int START_BUTTON_PIN = 32;
const int STOP_BUTTON_PIN = 33;
const int BUTTON_PIN = 34;
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variabel status motor
bool motorRunning = false;
// Variabel debounce tombol
int buttonState = HIGH, lastButtonState = HIGH;
unsigned long lastDebounceTime = 0, debounceDelay = 100;
// Variabel Firebase
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
// Variabel untuk timing
unsigned long motorStartTime = 0;
const unsigned long RUN_TIME = 5000;
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
lcd.begin(16, 2);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("ANDI AWAL JANWAR");
lcd.setCursor(3, 1);
lcd.print("RISKAYANTI");
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
pinMode(START_BUTTON_PIN, INPUT_PULLUP);
pinMode(STOP_BUTTON_PIN, INPUT_PULLUP);
pinMode(BUTTON_PIN, INPUT_PULLUP);
connectToWiFi();
// Konfigurasi Firebase
config.api_key = API_KEY;
auth.user.email = USER_EMAIL;
auth.user.password = USER_PASSWORD;
config.database_url = DATABASE_URL;
config.token_status_callback = tokenStatusCallback;
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void loop() {
handleButtons();
if (Firebase.ready()) {
updateFirebaseState();
Firebasebutton();
}
updateMotor();
}
void connectToWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to WiFi");
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < 20) {
Serial.print(".");
delay(500);
attempts++;
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Failed to connect to WiFi. Please check your credentials.");
while (1) delay(1000);
}
Serial.println("Connected to WiFi");
}
void handleButtons() {
int reading = digitalRead(BUTTON_PIN);
if (fallingEdge(reading)) {
changeTextOnLCD();
}
lastButtonState = reading;
if (digitalRead(START_BUTTON_PIN) == LOW && digitalRead(STOP_BUTTON_PIN) == HIGH && !motorRunning) {
startMotor();
}
if (digitalRead(STOP_BUTTON_PIN) == LOW && motorRunning) {
stopMotor();
}
}
bool fallingEdge(int pinState) {
return (lastButtonState == HIGH && pinState == LOW);
}
void startMotor() {
if (!motorRunning) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Motor 3 Fase");
lcd.setCursor(4, 1);
lcd.print("Run Star");
digitalWrite(RELAY1_PIN, HIGH);
digitalWrite(RELAY2_PIN, HIGH);
motorRunning = true;
motorStartTime = millis();
}
}
void updateMotor() {
if (motorRunning && (millis() - motorStartTime >= RUN_TIME)) {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Motor 3 Fase");
lcd.setCursor(3, 1);
lcd.print("Run Delta");
digitalWrite(RELAY2_PIN, LOW);
digitalWrite(RELAY3_PIN, HIGH);
motorStartTime = millis(); // Reset waktu
}
}
void stopMotor() {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Motor 3 Fase");
lcd.setCursor(4, 1);
lcd.print("Stopped");
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
digitalWrite(RELAY3_PIN, LOW);
motorRunning = false;
updateFirebaseState();
}
void updateFirebaseState() {
if (Firebase.RTDB.setInt(&fbdo, "/Motor_Stop", !motorRunning)) {
Serial.println("Firebase updated: Motor_Stop = " + String(!motorRunning));
} else {
Serial.println("Firebase update failed: " + fbdo.errorReason());
}
}
void Firebasebutton() {
if (Firebase.RTDB.getInt(&fbdo, "/Button_Stop")) {
int Stop_motor = fbdo.intData();
if (Stop_motor == 1 && motorRunning) {
stopMotor();
}
}
if (Firebase.RTDB.getInt(&fbdo, "/Button_Start")) {
int Start_motor = fbdo.intData();
if (Start_motor == 1 && !motorRunning) {
startMotor();
}
}
}
void changeTextOnLCD() {
static int screenNumber = 1;
switch (screenNumber) {
case 1:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ANDI AWAL JANWAR");
lcd.setCursor(2, 1);
lcd.print("105821104320");
break;
}
screenNumber++;
if (screenNumber > 1) {
screenNumber = 1;
Serial.println("Screen Number: " + String(screenNumber));
}
}