#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Đặt địa chỉ I2C của LCD là 0x27 cho màn hình 16x2
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Định nghĩa chân cho cảm biến khí MQ2
#define MQ2_PIN 34
// Định nghĩa chân cho còi
#define BUZZER_PIN 12
// Định nghĩa chân và loại cảm biến DHT
#define DHTPIN 15
#define DHTTYPE DHT22
const float VCC = 5.0; // Điện áp tham chiếu cho cảm biến (5V)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
// Khởi tạo màn hình LCD
lcd.init();
lcd.backlight();
// Khởi tạo giao tiếp Serial cho việc debug
Serial.begin(115200);
// Khởi tạo chân của còi là OUTPUT
pinMode(BUZZER_PIN, OUTPUT);
// Khởi tạo cảm biến DHT
dht.begin();
// Hiển thị thông điệp ban đầu trên LCD
lcd.setCursor(0, 0);
lcd.print("Giam sat moi truong");
}
void loop() {
// Đọc giá trị từ cảm biến khí MQ2 (0 đến 4095)
int gasValue = analogRead(MQ2_PIN);
// Tính điện áp từ giá trị đọc được
float voltage = (gasValue / 4095.0) * VCC;
// Đọc giá trị nhiệt độ và độ ẩm từ cảm biến DHT22
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Kiểm tra nếu đọc giá trị từ cảm biến DHT thất bại
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// In giá trị và điện áp ra Serial Monitor
Serial.print("Gas Sensor Value: ");
Serial.print(gasValue);
Serial.print(" | Voltage: ");
Serial.print(voltage);
Serial.print(" V | Temperature: ");
Serial.print(temperature);
Serial.print(" C | Humidity: ");
Serial.println(humidity);
// Hiển thị giá trị cảm biến khí trên LCD
lcd.setCursor(0, 1);
lcd.print("Gas: ");
lcd.print(gasValue);
// Hiển thị giá trị nhiệt độ và độ ẩm trên LCD
lcd.setCursor(0, 2);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print(" C ");
lcd.setCursor(0, 3);
lcd.print("Hum: ");
lcd.print(humidity);
lcd.print(" % ");
// Kiểm tra giá trị cảm biến và kích hoạt còi nếu vượt ngưỡng
if (gasValue > 800) {
digitalWrite(BUZZER_PIN, HIGH); // Kích hoạt còi
} else {
digitalWrite(BUZZER_PIN, LOW); // Tắt còi
}
// Chờ 1000 ms trước khi đọc lại
delay(1000);
}