#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <ThingSpeak.h>
#define ledHot 2
#define ledCold 4
#define ledPower 14
#define buzzerPin 13
#define switchPin 15
#define DHTPIN 12
#define DHTTYPE DHT22
#define apiKey "II8NDNCPSJU5FO89"
#define channelNumber 2403873
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht(DHTPIN, DHTTYPE);
int alarmCounter = 0;
int switchStatus;
bool alarmFirstTime = false;
unsigned long previousMillis = 0;
long interval = 0;
WiFiClient client;
void setup() {
Serial.begin(9600);
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
pinMode(buzzerPin, OUTPUT);
pinMode(ledHot, OUTPUT);
pinMode(ledCold, OUTPUT);
pinMode(ledPower, OUTPUT);
pinMode(switchPin, INPUT_PULLUP);
digitalWrite(ledHot, 1);
digitalWrite(ledCold, 1);
digitalWrite(ledPower, 1);
lcd.init();
dht.begin();
lcd.begin(16, 2);
delay(2000);
lcd.clear();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.setCursor(0, 1);
lcd.print("Humi: ");
ThingSpeak.begin(client);
}
void loop() {
switchStatus = digitalRead(switchPin);
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 (switchStatus == LOW) {
digitalWrite(ledPower, HIGH);
// Cek kondisi alarm setiap interval waktu
if (millis() - previousMillis >= interval || checkTemperatureChange(temp)) {
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, h);
ThingSpeak.writeFields(channelNumber, apiKey);
checkAlarmCondition(temp);
previousMillis = millis(); // Update timestamp
interval = 1200000; // alarm akan menyala kembali setelah 2 menit
}
}else{
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, h);
ThingSpeak.writeFields(channelNumber, apiKey);
}
if (switchStatus == LOW) {
Serial.println("Slide switch aktif (posisi ON)");
} else {
Serial.println("Slide switch tidak aktif (posisi OFF)");
}
delay(2000);
}
void soundAlarm(int frequency, int duration) {
for (int i = 0; i < 5; i++) {
tone(buzzerPin, frequency);
delay(duration);
noTone(buzzerPin);
delay(duration);
}
}
void checkAlarmCondition(float temp) {
if (temp < 20) {
digitalWrite(ledHot, LOW);
digitalWrite(ledCold, HIGH);
soundAlarm(1000, 500);
} if (temp > 27) {
digitalWrite(ledHot, HIGH);
digitalWrite(ledCold, LOW);
soundAlarm(500, 500);
}else{
digitalWrite(ledHot, LOW);
digitalWrite(ledCold, LOW);
}
alarmCounter++;
if (alarmCounter >= 5) {
delay(interval);
}
}
bool checkTemperatureChange(float temp) {
static float previousTemp = temp; // Variabel untuk menyimpan suhu sebelumnya
// Jika suhu berubah lebih dari 1 derajat Celsius, kembalikan true
if (abs(temp - previousTemp) > 1.0) {
previousTemp = temp;
return true;
}
return false;
}