#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define I2C_ADDR 0x27
#define LED_PIN1 18
#define BUZZER_PIN 14
#define LED_PIN2 19
#define LCD_COLS 20
#define LCD_ROWS 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLS, LCD_ROWS);
#define DHTPIN 2
#define DHTTYPE DHT22 // Loại cảm biến DHT22
DHT dht(DHTPIN, DHTTYPE);
const int nutbam = 4;
const int coi = 14;
int bam = 0;
unsigned long lastBlinkTime = 0;
const int blinkInterval = 50; // Độ trễ giữa các lần nhấp nháy, tính bằng milliseconds
void setup() {
Wire.begin();
lcd.init(); // Khởi tạo màn hình LCD
lcd.backlight(); // Bật đèn nền
lcd.setCursor(0, 0);
lcd.print(" Nhiet do: ");
lcd.setCursor(0, 1);
lcd.print(" Do am: ");
dht.begin(); // Khởi tạo cảm biến DHT
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(nutbam, INPUT);
pinMode(coi, OUTPUT); // Khai báo chân cho loa còi
}
void loop() {
// Đọc dữ liệu nhiệt độ và độ ẩm từ cảm biến DHT
float nhietdo = dht.readTemperature(); // Đọc nhiệt độ
float doam = dht.readHumidity(); // Đọc độ ẩm
// Hiển thị nhiệt độ và độ ẩm lên màn hình LCD
lcd.setCursor(10, 0);
lcd.print(nhietdo);
lcd.print("C");
lcd.setCursor(7, 1);
lcd.print(doam);
lcd.print("%");
if (nhietdo > 38 && nhietdo < 60 ) {
digitalWrite(LED_PIN1, HIGH); // Bật LED nếu nhiệt độ vượt quá 38 độ C
lcd.setCursor(0, 2);
lcd.print(" Nhiet do cao! ");
} else {
digitalWrite(LED_PIN1, LOW); // Tắt LED nếu nhiệt độ không vượt quá 38 độ C
lcd.setCursor(0, 2);
lcd.print(" "); // Xóa thông báo nhiệt độ ca
}
if (nhietdo > 60 ) {
lcd.setCursor(0, 2);
lcd.print(" Nhiet do cuc cao! ");
tone(BUZZER_PIN, 1000); // Phát âm thanh từ loa còi
} else {
noTone(BUZZER_PIN); // Tắt âm thanh từ loa còi
}
bam = digitalRead(nutbam);
Serial.println(bam);
if (bam == HIGH || nhietdo > 60) {
// Khi nút được nhấn, còi sẽ kêu và giữ kêu trong 10000 milliseconds (10 giây)
digitalWrite(coi, HIGH);
tone ( coi, 10000);
delay(100);
digitalWrite(coi, LOW);
} else {
digitalWrite(coi, LOW);
}
if (bam == HIGH || nhietdo > 60) {
// Khi nút được nhấn, LED sẽ nhấp nháy trong khoảng thời gian blinkInterval
unsigned long currentMillis = millis();
if (currentMillis - lastBlinkTime >= blinkInterval) {
digitalWrite(LED_PIN2, !digitalRead(LED_PIN2)); // Đảo trạng thái của LED
lastBlinkTime = currentMillis;
delay(10000); // Cập nhật thời gian cuối cùng nhấp nháy
}
} else {
digitalWrite(LED_PIN2, LOW);
}
delay(10);
}