#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define ledHot A0
#define ledCold A1
#define DHTPIN 2
#define DHTTYPE DHT22
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
int buzzerPin = 3;
int alarmCounter = 0;
bool alarmFirstTime = false;
unsigned long previousMillis = 0;
const long interval = 120000;
void setup() {
Serial.begin(9600);
pinMode(buzzerPin, OUTPUT);
pinMode(ledHot, OUTPUT);
pinMode(ledCold, OUTPUT);
dht.begin();
digitalWrite(ledHot, HIGH);
digitalWrite(ledCold, HIGH);
lcd.begin(16, 2);
delay(2000);
lcd.clear();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
lcd.setCursor(8, 0);
lcd.print("Error ");
lcd.setCursor(10, 1);
lcd.print("Error ");
return;
}
float temp = dht.readTemperature();
lcd.setCursor(8, 0);
lcd.print(temp, 1);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(8, 1);
lcd.print(h, 0);
lcd.print("%");
if (!alarmFirstTime || checkTemperatureChange(temp)) {
checkAlarmCondition(temp);
alarmFirstTime = true; // Setelah alarm nyala untuk pertama kali, set variabel menjadi true
}
// Cek kondisi alarm setiap interval waktu
if (millis() - previousMillis >= interval ) {
// Hanya uji alarm setelah run pertama dan jika ada perubahan suhu
checkAlarmCondition(temp);
previousMillis = millis(); // Update timestamp
}
}
void soundAlarm(int frequency, int duration) {
for (int i = 0; i < 5; i++) {
tone(buzzerPin, frequency); // Frekuensi bunyi buzzer
delay(duration); // Bunyikan selama durasi yang diberikan
noTone(buzzerPin); // Matikan bunyi
delay(duration); // Tunggu selama durasi sebelum bunyi berikutnya
}
}
void checkAlarmCondition(float temp) {
if (temp <= 15) {
digitalWrite(ledHot, 0);
digitalWrite(ledCold, 1);
soundAlarm(1000, 500);
} if (temp >= 40) {
digitalWrite(ledHot, 1);
digitalWrite(ledCold, 0);
soundAlarm(500, 500);
}else{
digitalWrite(ledHot, 0);
digitalWrite(ledCold, 0);
}
alarmCounter++; // Tambahkan jumlah kali alarm telah berbunyi
// Jika alarm sudah berbunyi 5 kali, reset counter dan tunggu selama 2 menit sebelum memeriksa kembali
if (alarmCounter >= 5) {
alarmCounter = 0; // Reset counter
delay(interval); // Tunggu selama interval sebelum memeriksa kembali
alarmFirstTime = false; // Reset alarmFirstTime setelah interval waktu
}
}
bool checkTemperatureChange(float currentTemp) {
static float previousTemp = currentTemp; // Variabel untuk menyimpan suhu sebelumnya
// Jika suhu berubah lebih dari 1 derajat Celsius, kembalikan true
if (abs(currentTemp - previousTemp) > 1.0) {
previousTemp = currentTemp; // Update suhu sebelumnya
return true;
}
return false;
}