diff --git a/Kode Program Arduino/30052024.1.ino b/Kode Program Arduino/30052024.1.ino new file mode 100644 index 0000000..f223bd7 --- /dev/null +++ b/Kode Program Arduino/30052024.1.ino @@ -0,0 +1,298 @@ +#include +#include +#include +#include + +const int flameSensorPin = 34; +const int smokeDetectionPin = 4; // Smoke detection pin (used for smoke detection) +const int buzzerPin = 27; +const int greenLEDPin = 25; +const int blueLEDPin = 26; +const int redLEDPin = 33; + +#define IGNORE_TIME 200UL //ignore 2000ms at start +#define ACTIVE_TIME 200UL //input 2000ms before + +#define FIREBASE_HOST "projecttugasakhir-6d39f-default-rtdb.firebaseio.com" +#define FIREBASE_AUTH "AIzaSyA2_Bc6_LAVn9UENlx8IRa_Ne6j9b_HCLI" + +FirebaseData firebaseData; +WebServer server(80); + +int flameThreshold = 400; +unsigned long wifiConnectedTime = 0; +volatile uint32_t lastTime = 0; +volatile uint32_t firstTime = 0; +volatile bool inputActive = false; +volatile bool prevInput = false; + +unsigned long previousBuzzerMillis = 0; +const long buzzerInterval = 500; // Interval for buzzer sound + +unsigned long previousLEDMillis = 0; +const long ledInterval = 500; // Interval for LED blink +bool ledState = false; + +String getESPSerial(); +void updateFirebase(int flameValue, String flameStatus, bool smokeDetected); +void setLEDs(int ledColor); +void handleRoot(); +void handleSetThreshold(); +void updateClientIP(); +void blinkLED(int ledColor); +void blink(int pin, int duration, int repetitions); +void soundBuzzer(int repetitions); + +String clientIP = ""; + +void ICACHE_RAM_ATTR INTERRUPT_handler() { + //debounce + if ((millis() - lastTime) < 50) { + return; + } + + if (((millis() - firstTime) > IGNORE_TIME)) { + if (digitalRead(smokeDetectionPin) == HIGH) { // Change condition to HIGH for smoke detection + lastTime = millis(); + if (!inputActive) inputActive = true; + } + } +} + +void InputRoutine() { + //reset if timeout + if (inputActive) { + if ((millis() - lastTime) > ACTIVE_TIME) { + lastTime = millis(); + inputActive = false; + } + } +} + +void SetupInput() { + pinMode(smokeDetectionPin, INPUT_PULLUP); // Smoke detection pin as input with pull-up resistor + firstTime = millis(); + attachInterrupt(digitalPinToInterrupt(smokeDetectionPin), INTERRUPT_handler, RISING); +} + +void setup() { + Serial.begin(9600); + + WiFiManager wifiManager; + + WiFi.softAPConfig(IPAddress(192, 168, 1, 1), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0)); + wifiManager.autoConnect("ESP32_alat2"); + + if (WiFi.status() == WL_CONNECTED) { + Serial.println("Connected to WiFi"); + wifiConnectedTime = millis(); + } else { + Serial.println("Failed to connect to WiFi"); + } + + Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH); + + pinMode(buzzerPin, OUTPUT); + pinMode(greenLEDPin, OUTPUT); + pinMode(blueLEDPin, OUTPUT); + pinMode(redLEDPin, OUTPUT); // Ensure the red LED pin is configured as output + pinMode(smokeDetectionPin, INPUT_PULLUP); // Set pin as input with pull-up resistor + + digitalWrite(buzzerPin, HIGH); + delay(500); + digitalWrite(buzzerPin, LOW); + + server.on("/", handleRoot); + server.on("/setThreshold", handleSetThreshold); + server.begin(); + Serial.println("Web server started"); + + setLEDs(flameThreshold); + + SetupInput(); // Call SetupInput() to configure the input pin for smoke detection + + // Update client IP in Firebase + updateClientIP(); +} + +bool buzzerActive = false; // Flag to keep track of buzzer state when smoke is detected + +void loop() { + server.handleClient(); + + unsigned long currentMillis = millis(); + + int flameValue = analogRead(flameSensorPin); + Serial.print("Flame Value: "); + Serial.println(flameValue); + String flameStatus = (flameValue < flameThreshold) ? "2" : "1"; + + // Check smoke detection pin + if (prevInput != inputActive) { + prevInput = inputActive; + if (inputActive) { + Serial.println("Ada Asap"); + buzzerActive = true; // Activate buzzer when smoke is detected + } else { + Serial.println("Tidak Ada Asap"); + buzzerActive = false; // Deactivate buzzer when smoke is no longer detected + digitalWrite(buzzerPin, LOW); // Ensure buzzer is off + } + } + + InputRoutine(); // Call InputRoutine() to handle smoke detection + + if (flameStatus == "2") { // Buzzer active only if fire is detected + if (currentMillis - previousBuzzerMillis >= buzzerInterval) { + previousBuzzerMillis = currentMillis; + soundBuzzer(5); // Sound buzzer 5 times when fire is detected + } + + if (currentMillis - previousLEDMillis >= ledInterval) { + previousLEDMillis = currentMillis; + ledState = !ledState; + if (ledState) { + setLEDs(flameThreshold); // Turn on the appropriate LED + } else { + setLEDs(0); // Turn off all LEDs + } + } + } else if (!inputActive) { // Ensure buzzer is off when no fire is detected and no smoke is detected + digitalWrite(buzzerPin, LOW); // Ensure buzzer is off + setLEDs(flameThreshold); // Kembalikan LED ke status semula + } + + // Sound buzzer continuously in loop if smoke is detected + if (buzzerActive && inputActive) { + soundBuzzer(5); // Keep sounding buzzer until smoke is no longer detected + } + + // Update client IP before updating sensor data + updateClientIP(); + + updateFirebase(flameValue, flameStatus, inputActive); // Call updateFirebase() with smoke detection status + + delay(10); // Reduced delay to allow more frequent checking +} + + +void handleRoot() { + String html = "" + "

ESP32 Sensor Configuration

" + "
" + "Flame Threshold: " + "
" + "" + "
" + ""; + server.send(200, "text/html", html); +} + +void handleSetThreshold() { + if (server.hasArg("threshold")) { + flameThreshold = server.arg("threshold").toInt(); + Serial.println("New Flame Threshold: " + String(flameThreshold)); + + setLEDs(flameThreshold); + + digitalWrite(buzzerPin, HIGH); + delay(500); + digitalWrite(buzzerPin, LOW); + } + server.sendHeader("Location", "/"); + server.send(303); +} + +void updateClientIP() { + // Get the current IP address from WiFi + clientIP = WiFi.localIP().toString(); + Serial.println("Client IP: " + clientIP); +} + +void updateFirebase(int flameValue, String flameStatus, bool smokeDetected) { + FirebaseJson json; + json.set("espSerial", getESPSerial()); + json.set("nomorRumah", "A02"); + json.set("flameValue", flameValue); + json.set("flameStatus", flameStatus); + json.set("smokeDetected", smokeDetected ? "2" : "1"); // Convert smoke detection status to string "2" or "1" + json.set("clientIP", clientIP); // Add clientIP to JSON + + // Non-blocking call to update Firebase + if (Firebase.updateNode(firebaseData, "/sensorData2", json)) { + Serial.println("Data successfully updated to Firebase!"); + } else { + Serial.println("Failed to update data to Firebase."); + Serial.println("Reason: " + firebaseData.errorReason()); + } +} + +String getESPSerial() { + uint64_t chipid = ESP.getEfuseMac(); + return String(chipid, HEX); +} + +void setLEDs(int ledColor) { + switch (ledColor) { + case 400: + digitalWrite(greenLEDPin, HIGH); + digitalWrite(blueLEDPin, LOW); + digitalWrite(redLEDPin, LOW); + break; + case 700: + digitalWrite(greenLEDPin, LOW); + digitalWrite(blueLEDPin, HIGH); + digitalWrite(redLEDPin, LOW); + break; + case 1000: + digitalWrite(greenLEDPin, LOW); + digitalWrite(blueLEDPin, LOW); + digitalWrite(redLEDPin, HIGH); + break; + default: + digitalWrite(greenLEDPin, LOW); + digitalWrite(blueLEDPin, LOW); + digitalWrite(redLEDPin, LOW); + break; + } +} + +void blinkLED(int ledColor) { + switch (ledColor) { + case 400: + blink(greenLEDPin, 1000, 5); // Kedipkan LED hijau 3 kali dengan interval 500ms + break; + case 700: + blink(blueLEDPin, 1000, 5); // Kedipkan LED biru 3 kali dengan interval 500ms + break; + case 1000: + blink(redLEDPin, 1000, 5); // Kedipkan LED merah 3 kali dengan interval 500ms + break; + default: + break; + } +} + +void blink(int pin, int duration, int repetitions) { + for (int i = 0; i < repetitions; i++) { + digitalWrite(pin, HIGH); + delay(duration); + digitalWrite(pin, LOW); + delay(duration); + } +} + +// Function to sound the buzzer for a specified number of repetitions +void soundBuzzer(int repetitions) { + for (int i = 0; i < repetitions; i++) { + digitalWrite(buzzerPin, HIGH); + delay(100); // Reduced sound duration + digitalWrite(buzzerPin, LOW); + delay(100); // Reduced silence duration + } +} +