#include <DHT.h>
#include <TM1637.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte degree_symbol[8] =
{
0b00111,
0b00101,
0b00111,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
#define DHTPIN 5 // Chân cảm biến DHT22
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define LED_PIN 4 // Chân GPIO điều khiển quạt (hoặc LED giả quạt) - Theo nhiệt độ
#define LED_PIN_2 19 // Chân GPIO điều khiển đèn LED theo cảm biến ánh sáng LDR
#define LDR_PIN 34 // Chân ADC đọc giá trị từ cảm biến ánh sáng (LDR)
// Định nghĩa chân cho TM1637
#define CLK 12 // Chân CLK cho LED 7 đoạn
#define DIO 14 // Chân DIO cho LED 7 đoạn
TM1637 tm(CLK, DIO); // Khởi tạo LED 7 đoạn
void setup() {
Serial.begin(115200); // Bắt đầu Serial Monitor với tốc độ 115200
pinMode(LED_PIN, OUTPUT); // Đặt chân LED làm OUTPUT (Quạt theo nhiệt độ)
pinMode(LED_PIN_2, OUTPUT); // Đặt chân LED làm OUTPUT (Đèn theo ánh sáng)
dht.begin(); // Khởi động cảm biến DHT22
tm.init(); // Khởi tạo LED 7 đoạn
tm.set(2); // Đặt độ sáng tối đa cho LED 7 đoạn
lcd.init();
lcd.backlight();
lcd.clear();
lcd.createChar(1, degree_symbol);
lcd.setCursor(0, 0);
lcd.print("SetUP T");
}
void loop() {
// Đọc nhiệt độ từ cảm biến DHT22
float temperature = dht.readTemperature();
if (isnan(temperature)) {
Serial.println("Failed to read temperature");
return;
}
// Hiển thị nhiệt độ trên LCD
lcd.setCursor(0, 1); // Đặt con trỏ trên dòng 2
lcd.print(temperature); // In nhiệt độ
lcd.write(1); // In ký tự ° đã định nghĩa
lcd.print("C"); // In chữ "C" sau dấu độ
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
// Điều chỉnh tốc độ quạt (hoặc độ sáng LED giả quạt) dựa trên nhiệt độ
int pwmValue = 0; // Khởi tạo giá trị PWM mặc định là 0
// Điều chỉnh quạt theo các mức nhiệt độ
if (temperature < 20) {
pwmValue = 0; // Đèn tắt (quạt không chạy)
}
else if (temperature >= 20 && temperature <= 25) {
pwmValue = 85; // Quạt cấp 1
}
else if (temperature > 25 && temperature <= 31) {
pwmValue = 170; // Quạt cấp 2
}
else if (temperature > 31) {
pwmValue = 255; // Quạt cấp 3 (mạnh nhất)
}
// Đọc giá trị ánh sáng từ LDR
int lightLevel = analogRead(LDR_PIN); // Đọc giá trị từ LDR
int brightness = map(lightLevel, 0, 4095, 255, 0); // Chuyển đổi giá trị ánh sáng sang giá trị PWM (0-255)
// Điều chỉnh PWM cho LED ở chân D21 theo độ sáng LDR
analogWrite(LED_PIN_2, brightness); // Điều khiển độ sáng của LED theo ánh sáng
// Điều khiển PWM với giá trị pwmValue cho quạt (hoặc LED giả quạt)
analogWrite(LED_PIN, pwmValue); // Điều khiển quạt (hoặc LED giả quạt) theo nhiệt độ
// Tính cường độ ánh sáng phần trăm (0 - 99)
int lightPercent = map(brightness, 0, 254, 0, 99);
// Hiển thị nhiệt độ (2 chữ số) và cường độ ánh sáng (2 chữ số)
int tempInt = (int)temperature; // Nhiệt độ dưới dạng nguyên
// Hiển thị nhiệt độ (hàng chục và đơn vị) ở vị trí 0 và 1
tm.display(0, tempInt / 10); // Chữ số hàng chục của nhiệt độ
tm.display(1, tempInt % 10); // Chữ số hàng đơn vị của nhiệt độ
// Hiển thị độ sáng cường độ ánh sáng ở vị trí 2 và 3
tm.display(2, lightPercent / 10); // Chữ số hàng chục của cường độ ánh sáng
tm.display(3, lightPercent % 10); // Chữ số hàng đơn vị của cường độ ánh sáng
// Hiển thị giá trị PWM, độ sáng LED và nhiệt độ lên Serial Monitor
Serial.print("PWM Value (LED_PIN): ");
Serial.println(pwmValue);
Serial.print("LED Brightness (LED_PIN_2): ");
Serial.println(brightness); // Đây là độ sáng LED theo ánh sáng từ LDR
Serial.println(lightLevel);
delay(1000); // Đọc lại nhiệt độ và ánh sáng sau mỗi giây
}