Upload files to "Kode Program Arduino"

This commit is contained in:
Damar_rawuh_Sarjito 2024-07-15 14:21:58 +07:00
parent f1e9ff047a
commit 160f9371fd
1 changed files with 298 additions and 0 deletions

View File

@ -0,0 +1,298 @@
#include <WiFiManager.h>
#include <FirebaseESP32.h>
#include <WiFi.h>
#include <WebServer.h>
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 = "<html><body>"
"<h1>ESP32 Sensor Configuration</h1>"
"<form action=\"/setThreshold\" method=\"POST\">"
"Flame Threshold: "
"<select name=\"threshold\">"
"<option value=\"400\" " + String(flameThreshold == 400 ? "selected" : "") + ">Mode 1 (400)</option>"
"<option value=\"700\" " + String(flameThreshold == 700 ? "selected" : "") + ">Mode 2 (700)</option>"
"<option value=\"1000\" " + String(flameThreshold == 1000 ? "selected" : "") + ">Mode 3 (1000)</option>"
"</select><br>"
"<input type=\"submit\" value=\"Set Threshold\">"
"</form>"
"</body></html>";
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
}
}