//connect WiFi
#include <WiFi.h> // Library untuk koneksi WiFi ESP32
// Menyimpan SSID dan password WiFi yang digunakan untuk koneksi
const char *ssid = "Wokwi-GUEST"; // Nama WiFi (SSID), SESUAIKAN
const char *password = ""; // Password WiFi, SESUAIKAN
//Firebase
#include <FirebaseESP32.h> // Library untuk koneksi Firebase Realtime Database
// Konfigurasi Firebase
#define FIREBASE_HOST "https://project-engine-start-default-rtdb.firebaseio.com/"
// URL database realtime Firebase, SESUAIKAN
#define FIREBASE_AUTH "AAIzaSyBfdsZrGyzDaa69H2cWr1hLdb3Y5aEM6UA"
// Token (database secrets / legacy token), SESUAIKAN
// Membuat objek yang digunakan library Firebase
FirebaseData firebaseData; // Objek untuk komunikasi data
FirebaseAuth firebaseAuth; // Objek autentikasi
FirebaseConfig firebaseConfig; // Objek konfigurasi koneksi
// Variabel untuk menampung data dari Firebase
String lampudekatdatafb, lampujauhdatafb; // Menyimpan data lampu dari widget aplikasi
int lampudekatvaluefb, lampujauhvaluefb; // Menyimpan nilai hasil konversi string ke integer
String lampudekatdatafbSpeech, lampujauhdatafbSpeech, mesinnyaladatafbSpeech, mesinmatidatafbSpeech, doorlockdatafbSpeech, doorunlockdatafbSpeech; // Menyimpan data dari perintah suara (Speech)
int lampudekatvaluefbSpeech, lampujauhvaluefbSpeech, mesinnyalavaluefbSpeech, mesinmativaluefbSpeech, doorlockvaluefbSpeech, doorunlockvaluefbSpeech; // Nilai integer dari perintah suara
//------------------------------------------------------------
NetworkServer server(80); // Membuat server dengan port 80 (untuk akses HTTP)
// Definisi pin
const int tomboldekat = 32; // Pin Input push button lampu dekat
const int tomboljauh = 33; // Pin Input push button lampu jauh
const int lampudekat = 23; // Pin Output lampu dekat
const int lampujauh = 22; // Pin Output lampu jauh
const int relayACC = 17;
const int relayON = 16;
const int relayST = 15;
int nilaitomboldekat = 0;
int nilaitomboljauh = 0;
int statusmesin = 0;
void setup() {
// Program yang dijalankan sekali saat ESP32 menyala
Serial.begin(115200); // Memulai komunikasi serial dengan baudrate 115200
Serial.println("Project Lampu Dekat dan Jauh");
/*---------------------------------------------*/
// Koneksi ke WiFi
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid); // Tampilkan SSID yang sedang dihubungkan
WiFi.begin(ssid, password); // Memulai koneksi WiFi
// Looping sampai WiFi tersambung
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print("."); // Cetak titik sebagai indikator proses koneksi
}
Serial.println("");
Serial.println("WiFi connected."); // Notifikasi koneksi berhasil
Serial.println("IP address: ");
Serial.println(WiFi.localIP()); // Menampilkan IP ESP32 di jaringan
server.begin(); // Memulai server HTTP
/*---------------------------------------------*/
// Konfigurasi Firebase
firebaseConfig.host = FIREBASE_HOST; // Set alamat database
firebaseConfig.signer.tokens.legacy_token = FIREBASE_AUTH; // Set token autentikasi
Firebase.begin(&firebaseConfig, &firebaseAuth); // Mulai koneksi Firebase
// Inisialisasi pin
pinMode(tomboldekat, INPUT); // Tombol dengan internal pull-up
pinMode(tomboljauh, INPUT );
pinMode(lampudekat, OUTPUT); // Relay sebagai output
pinMode(lampujauh, OUTPUT);
pinMode(relayACC, OUTPUT);
pinMode(relayON, OUTPUT);
pinMode(relayST, OUTPUT);
}
void loop() {
// Program yang dijalankan berulang-ulang
// Membaca status tombol fisik
nilaitomboldekat = digitalRead(tomboldekat);
nilaitomboljauh = digitalRead(tomboljauh);
//---------------------------------------------------------------------
// Membaca data dari Firebase untuk lampu jauh
if (Firebase.getString(firebaseData, "/project_engine/StateLampuJauh")) {
if (firebaseData.dataType() == "string") { // Pastikan tipe data string
lampujauhdatafb = firebaseData.stringData(); // Simpan data string
lampujauhvaluefb = lampujauhdatafb.toInt(); // Ubah string ke integer (0/1)
}
}
// Membaca data dari Firebase untuk lampu dekat
if (Firebase.getString(firebaseData, "/project_engine/StateLampuDekat")) {
if (firebaseData.dataType() == "string") {
lampudekatdatafb = firebaseData.stringData();
lampudekatvaluefb = lampudekatdatafb.toInt();
}
}
// Membaca data perintah suara (Speech) untuk lampu jauh
if (Firebase.getString(firebaseData, "/project_engine/SpeechLampuJauh")) {
if (firebaseData.dataType() == "string") {
lampujauhdatafbSpeech = firebaseData.stringData();
lampujauhvaluefbSpeech = lampujauhdatafbSpeech.toInt();
}
}
// Membaca data perintah suara (Speech) untuk lampu dekat
if (Firebase.getString(firebaseData, "/project_engine/SpeechLampuDekat")) {
if (firebaseData.dataType() == "string") {
lampudekatdatafbSpeech = firebaseData.stringData();
lampudekatvaluefbSpeech = lampudekatdatafbSpeech.toInt();
}
}
if (Firebase.getString(firebaseData, "/project_engineSpeechEngineStart"))
{
if (firebaseData.dataType() == "string")
{
enginestartdatafbSpeech = firebaseData.stringData();
enginestartvaluefbSpeech = enginestartdatafbSpeech.toInt();
}
}
if (Firebase.getString(firebaseData, "/project_engine/SpeechEngineStop"))
{
if (firebaseData.dataType() == "string")
{
enginestopdatafbSpeech = firebaseData.stringData();
enginestopvaluefbSpeech = enginestopdatafbSpeech.toInt();
}
}
// Logika pengendalian lampu
// Lampu dekat ON jika tombol ditekan ATAU data Firebase (widget/speech) = 1
if (nilaitomboldekat == 1 || lampudekatvaluefb == 1 || lampudekatvaluefbSpeech == 1) {
digitalWrite(lampudekat, LOW); // Nyalakan lampu dekat
} else {
digitalWrite(lampudekat, HIGH); // Matikan lampu dekat
}
// Lampu jauh ON jika tombol ditekan ATAU data Firebase (widget/speech) = 1
if (nilaitomboljauh == 1 || lampujauhvaluefb == 1 || lampujauhvaluefbSpeech == 1) {
digitalWrite(lampujauh, LOW); // Nyalakan lampu jauh
} else {
digitalWrite(lampujauh, HIGH); // Matikan lampu jauh
}
if (enginestartvaluefbSpeech == 1 && statusengine == 0)
{
digitalWrite (relayACC, LOW);
delay(1000);
digitalWrite (relayON, LOW);
delay(1000);
digitalWrite (relayST, LOW);
digitalWrite (relayACC, HIGH);
delay(1000);
digitalWrite (relayACC, LOW);
digitalWrite(relayON, LOW);
digitalWrite (relayST, HIGH);
statusengine = 1;
}
if (enginestopvaluefbSpeech == 1)
{
digitalWrite (relayACC, HIGH);
digitalWrite (relayON, HIGH);
digitalWrite (relayST, HIGH);
statusengine = 0;
}
}