From 4c5c4e50bdfa5eaec4d3499c5b3a5c33e8044ba0 Mon Sep 17 00:00:00 2001 From: Raihan Date: Wed, 16 Jul 2025 10:35:21 +0700 Subject: [PATCH] kode arduino --- kodearduinokacamata.ino | 187 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 kodearduinokacamata.ino diff --git a/kodearduinokacamata.ino b/kodearduinokacamata.ino new file mode 100644 index 0000000..30569ac --- /dev/null +++ b/kodearduinokacamata.ino @@ -0,0 +1,187 @@ +#include +#include +#include + +// WiFi credentials +#define WIFI_SSID "KOPI" +#define WIFI_PASSWORD "digoreng123" + +// Firebase credentials +#define API_KEY "AIzaSyBy731BFAPVs_rNPN5mFJfDzTHHTF7gNv8" +#define DATABASE_URL "https://kacamatapintar-default-rtdb.firebaseio.com/" +#define LEGACY_TOKEN "RSfBvDMW6VrXGqt2xnO03QMIytuyoJoG0OfK1r1p" + +// GPS baudrate +#define GPSBaud 9600 + +// Pin definisi +#define TRIG_PIN D2 // GPIO4 +#define ECHO_PIN D1 // GPIO5 +#define BUZZER_PIN D5 // GPIO14 +#define LED_STATUS_PIN D6 // GPIO12 +#define BUTTON_PIN D7 // GPIO13 + +// Objek GPS +TinyGPSPlus gps; + +// Firebase objects +FirebaseData fbdo; +FirebaseAuth auth; +FirebaseConfig config; + +// Variabel pengaturan +unsigned long interval_lokasi = 5000; // default fallback +int jarakDekat = 20; // default fallback +int jarakJauh = 100; // default fallback + +// Variabel tambahan +bool silentMode = false; +unsigned long lastSilentBuzz = 0; +unsigned long lastGPSUpdate = 0; +bool wasInBetween = false; + +void setup() { + Serial.begin(115200); // Serial monitor debug + Serial.begin(GPSBaud); // GPS tetap pakai Serial biasa + + // Inisialisasi pin + pinMode(TRIG_PIN, OUTPUT); + pinMode(ECHO_PIN, INPUT); + pinMode(BUZZER_PIN, OUTPUT); + pinMode(LED_STATUS_PIN, OUTPUT); + pinMode(BUTTON_PIN, INPUT_PULLUP); + + // Koneksi WiFi + WiFi.begin(WIFI_SSID, WIFI_PASSWORD); + Serial.print("Connecting to WiFi"); + while (WiFi.status() != WL_CONNECTED) { + delay(1000); + Serial.print("."); + } + Serial.println("\nConnected to WiFi"); + + // Setup Firebase + config.api_key = API_KEY; + config.database_url = DATABASE_URL; + config.signer.tokens.legacy_token = LEGACY_TOKEN; + + Firebase.begin(&config, &auth); + + if (Firebase.ready()) { + Serial.println("Firebase is ready!"); + + // Ambil pengaturan dari Firebase + if (Firebase.RTDB.getInt(&fbdo, "/pengaturan/interval_lokasi")) { + interval_lokasi = fbdo.intData(); + Serial.print("interval_lokasi: "); Serial.println(interval_lokasi); + } else { + Serial.print("Gagal ambil interval_lokasi: "); Serial.println(fbdo.errorReason()); + } + + if (Firebase.RTDB.getInt(&fbdo, "/pengaturan/jarak_dekat")) { + jarakDekat = fbdo.intData(); + Serial.print("jarak_dekat: "); Serial.println(jarakDekat); + } else { + Serial.print("Gagal ambil jarak_dekat: "); Serial.println(fbdo.errorReason()); + } + + if (Firebase.RTDB.getInt(&fbdo, "/pengaturan/jarak_jauh")) { + jarakJauh = fbdo.intData(); + Serial.print("jarak_jauh: "); Serial.println(jarakJauh); + } else { + Serial.print("Gagal ambil jarak_jauh: "); Serial.println(fbdo.errorReason()); + } + + } else { + Serial.println("Firebase init failed!"); + } +} + +float getDistanceCM() { + digitalWrite(TRIG_PIN, LOW); + delayMicroseconds(2); + digitalWrite(TRIG_PIN, HIGH); + delayMicroseconds(10); + digitalWrite(TRIG_PIN, LOW); + long duration = pulseIn(ECHO_PIN, HIGH); + return duration * 0.034 / 2; +} + +void loop() { + // === GPS HANDLING === + while (Serial.available() > 0) { + gps.encode(Serial.read()); + + if (gps.location.isUpdated() && millis() - lastGPSUpdate >= interval_lokasi) { + lastGPSUpdate = millis(); + float lat = gps.location.lat(); + float lng = gps.location.lng(); + + if (Firebase.RTDB.setFloat(&fbdo, "/lokasi/latitude", lat)) { + Serial.println("Latitude sent to Firebase"); + } else { + Serial.print("Failed to send latitude: "); + Serial.println(fbdo.errorReason()); + } + + if (Firebase.RTDB.setFloat(&fbdo, "/lokasi/longitude", lng)) { + Serial.println("Longitude sent to Firebase"); + } else { + Serial.print("Failed to send longitude: "); + Serial.println(fbdo.errorReason()); + } + } + } + // === END GPS === + + // === BUTTON MODE === + static bool lastButtonState = HIGH; + bool currentButtonState = digitalRead(BUTTON_PIN); + if (lastButtonState == HIGH && currentButtonState == LOW) { + silentMode = !silentMode; + Serial.println(silentMode ? "Mode: Silent" : "Mode: Aktif"); + delay(300); + } + lastButtonState = currentButtonState; + + // === SENSOR ULTRASONIC === + float distance = getDistanceCM(); + Serial.print("Jarak: "); + Serial.print(distance); + Serial.println(" cm"); + + if (silentMode) { + if (millis() - lastSilentBuzz >= 30000) { + tone(BUZZER_PIN, 1000, 100); + lastSilentBuzz = millis(); + } + } else { + if (distance < jarakDekat) { + tone(BUZZER_PIN, 1000); + delay(100); + noTone(BUZZER_PIN); + delay(100); + wasInBetween = false; + } else if (distance < jarakJauh) { + if (!wasInBetween) { + tone(BUZZER_PIN, 1000, 100); + delay(200); + tone(BUZZER_PIN, 1000, 100); + delay(300); + wasInBetween = true; + } + } else { + noTone(BUZZER_PIN); + wasInBetween = false; + } + } + + // === LED STATUS === + if (WiFi.status() == WL_CONNECTED) { + digitalWrite(LED_STATUS_PIN, HIGH); + } else { + digitalWrite(LED_STATUS_PIN, LOW); + } + + delay(100); // loop delay +}