#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Địa chỉ I2C 0x27, 16 cột và 2 hàng
float flamelevel = 0; // Giá trị ánh xạ và đảo ngược % phạm vi cảm biến
#define greenLED 7 // Đèn xanh báo lửa tốt hoặc đang đốt
#define redLED 2 // Đèn đỏ báo cảnh báo hoặc đèn đỏ nhấp nháy
// Tương quan thực nghiệm giữa % lửa và tình trạng lửa thực tế (TBD)
const int minSurvive = 15; // Mức tối thiểu cho trạng thái chờ đợi, dưới đó là tắt lửa
const int idleLow = 20; // Đọc thấp nhất cho trạng thái chờ đợi lành mạnh
const int idleTarget = 30; // Giá trị mục tiêu cho trạng thái chờ đợi nghỉ ngơi
const int firingLow = 70; // Đọc thấp nhất cho trạng thái đốt cháy hoạt động
const int firingHigh = 90; // Đọc cho trạng thái đốt cháy đầy đủ
void setup() {
lcd.init();
lcd.clear();
lcd.backlight();
Serial.begin(9600);
pinMode(greenLED, OUTPUT); // Đặt chân đèn xanh là đầu ra
digitalWrite(greenLED, LOW); // Tắt đèn xanh
pinMode(redLED, OUTPUT); // Đặt chân đèn đỏ là đầu ra
digitalWrite(redLED, LOW); // Tắt đèn đỏ
}
void loop() {
float analogValue = analogRead(A0);
Serial.print("Cảm biến RAW: ");
Serial.println(analogValue, 0);
flamelevel = map(analogValue, 0, 1024, 100, 0);
Serial.print(flamelevel, 0);
Serial.println("%");
// Vô hiệu hóa các lệnh điều khiển màn hình để in ra Serial Monitor
lcd.setCursor(0, 0);
lcd.print(F("Flame: "));
if (flamelevel >= firingHigh) { // Đang đốt cháy đầy đủ
lcd.print("Full Fire");
digitalWrite(greenLED, HIGH); // Bật đèn xanh
digitalWrite(redLED, LOW); // Tắt đèn đỏ
delay(300);
digitalWrite(greenLED, LOW); // Tắt đèn xanh để nhấp nháy
}
if ((flamelevel >= firingLow) && (flamelevel < firingHigh)) { // Đang đốt cháy
lcd.print("Firing ");
digitalWrite(greenLED, HIGH); // Bật đèn xanh
digitalWrite(redLED, LOW); // Tắt đèn đỏ
}
if ((flamelevel < firingLow) && (flamelevel > idleLow)) { // Đốt cháy ở trạng thái chờ đợi
lcd.print("Idle fire ");
digitalWrite(greenLED, HIGH); // Bật đèn xanh
digitalWrite(redLED, HIGH); // Tắt đèn đỏ
}
if ((flamelevel <= idleLow) && (flamelevel >= minSurvive)) { // Lửa yếu
lcd.print("Low fire ");
digitalWrite(greenLED, LOW); // Bật đèn xanh
digitalWrite(redLED, HIGH); // Tắt đèn đỏ
// Kích hoạt bộ đếm thời gian chạy đốt (ví dụ: 2 phút?)
}
if (flamelevel < minSurvive) { // Lửa tắt
lcd.print("FIRE OUT! ");
digitalWrite(greenLED, LOW); // Bật đèn xanh
digitalWrite(redLED, HIGH); // Tắt đèn đỏ
delay(300);
digitalWrite(redLED, LOW); // Tắt đèn đỏ để nhấp nháy
// Gửi cảnh báo
}
lcd.setCursor(0, 1);
lcd.print(" Level: ");
lcd.print(flamelevel, 0);
lcd.print("% ");
delay(200);
}