#include <WiFi.h>
#include <Firebase_ESP_Client.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
// Thông tin Wi-Fi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Thông tin Firebase
#define API_KEY "AIzaSyBSBExZN1rB6SUycieoT1CX1XjhsF1g6HI"
#define DATABASE_URL "https://tt-iotcuoiky-default-rtdb.firebaseio.com/"
// Định nghĩa cảm biến
#define DHTTYPE DHT22
DHT dht1(15, DHTTYPE); // Trang 1
DHT dht2(13, DHTTYPE); // Phòng 1
DHT dht3(12, DHTTYPE); // Phòng 2
DHT dht4(14, DHTTYPE); // Phòng 3
// MQ2
#define MQ2_1 32
#define MQ2_2 35
#define MQ2_3 34
// Nút nhấn
#define BUTTON_PIN 19
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Firebase
FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
int page = 0;
unsigned long lastDebounce = 0;
bool lastButtonState = HIGH;
bool emergency = false;
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
lcd.init();
lcd.backlight();
pinMode(BUTTON_PIN, INPUT_PULLUP);
dht1.begin(); dht2.begin(); dht3.begin(); dht4.begin();
config.api_key = API_KEY;
config.database_url = DATABASE_URL;
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
}
void loop() {
handleButton();
switch (page) {
case 0: displayTrang1(); break;
case 1: displayPhong(1, dht2, MQ2_1); break;
case 2: displayPhong(2, dht3, MQ2_2); break;
case 3: displayPhong(3, dht4, MQ2_3); break;
}
delay(2000);
}
void handleButton() {
bool buttonState = digitalRead(BUTTON_PIN);
if (buttonState == LOW && lastButtonState == HIGH && millis() - lastDebounce > 300) {
page = (page + 1) % 4;
lastDebounce = millis();
}
lastButtonState = buttonState;
}
void displayTrang1() {
float temp = dht1.readTemperature();
float hum = dht1.readHumidity();
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Trang 1");
lcd.setCursor(0, 1); lcd.print("T:"); lcd.print(temp); lcd.print(" H:"); lcd.print(hum);
// Gửi Firebase
Firebase.RTDB.setFloat(&fbdo, "Trang 1/Temperature", temp);
Firebase.RTDB.setFloat(&fbdo, "Trang 1/Humidity", hum);
// Emergency
emergency = (temp > 40 || hum > 50);
Firebase.RTDB.setBool(&fbdo, "Trang 2/Control 2/Emergency", emergency);
}
void displayPhong(int phong, DHT &dht, int mqPin) {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int co2 = analogRead(mqPin);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Phong "); lcd.print(phong);
lcd.setCursor(0, 1);
lcd.print("T:"); lcd.print(temp); lcd.print(" C");
String path = "Trang2/Phong" + String(phong) + "/";
Firebase.RTDB.setFloat(&fbdo, path + "Temperature", temp);
Firebase.RTDB.setFloat(&fbdo, path + "Humidity", hum);
Firebase.RTDB.setInt(&fbdo, path + "Co2", co2);
}