#include <LiquidCrystal_I2C.h>
#include "DHTesp.h"

#define DHT_PIN 15        // Chân kết nối cảm biến DHT   
#define PIR_PIN 12        // Chân kết nối cảm biến PIR motion
#define LED_PIN 32       // Chân kết nối LED

#define LCD_ADDRESS 0x27 // Địa chỉ I2C của màn hình LCD
#define LCD_COLS 16      // Số cột của màn hình LCD
#define LCD_ROWS 2       // Số hàng của màn hình LCD

DHTesp dht;
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLS, LCD_ROWS);

void setup() {
  //Cài đặt kênh serial
  Serial.begin(115200);
  Serial.println("ESP32 collecting sensors data");
  
  dht.setup(DHT_PIN, DHTesp::DHT22);
  pinMode(PIR_PIN, INPUT);  //Cấu hình đầu vào PIR_PIN
  pinMode(LED_PIN, OUTPUT); //Cấu hình đầu ra LED_PIN
  
  lcd.init(); //Khởi tạo lcd
  lcd.print("ESP32 collecting data ..."); //In ra màn hình khởi động
  delay(1000);
  lcd.begin(LCD_COLS, LCD_ROWS);  //In ra thông tin thu được sensor
  lcd.backlight();
  lcd.print("Temp:");
  lcd.setCursor(0, 1);
  lcd.print("Humidity:");
}

void loop() {
  // Đọc dữ liệu từ cảm biến DHT
  TempAndHumidity  data = dht.getTempAndHumidity();

  // Hiển thị dữ liệu lên màn hình LCD
  lcd.setCursor(6, 0);
  lcd.print(String(data.temperature, 2));
  lcd.print("C");
  lcd.setCursor(10, 1);
  lcd.print(String(data.humidity, 1));
  lcd.print("%");

  // Đọc trạng thái từ cảm biến PIR motion
  int motion = digitalRead(PIR_PIN);

  // Bật/tắt LED dựa trên phát hiện chuyển động
  if (motion == HIGH) {
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }

  // Gửi log dữ liệu và thông báo tương ứng qua Serial
  Serial.print("Temperature: ");
  Serial.print(String(data.temperature, 2));
  Serial.print(" °C, Humidity: ");
  Serial.print(String(data.humidity, 1));
  Serial.print(" %, Motion: ");
  Serial.println(motion ? "Detected" : "Not detected");

  delay(2000);  // Đợi 2 giây trước khi đọc dữ liệu tiếp theo
}