#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
// DHT Sensor
#define pinDHT 8
#define typeDHT DHT22
DHT dht(pinDHT, typeDHT);
// LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Default address 0x27 for 16x2 LCD
// Pin definitions
int sensor_gas = A0;
int redLED = 4;
int greenLED = 3;
int buzzer = 5;
int buttonOFF = 9;
int buttonON = 10;
int relayPin = 7;
// Thresholds
int sensorThreshold = 400;
float tempThreshold = 40.0;
bool alarmMuted = false; // Status untuk alarm
bool systemOn = false; // Status untuk sistem
unsigned long previousMillis = 0; // Store last time tone was played
const long interval = 300; // Interval between tones in milliseconds
void setup() {
// Setup pinMode
pinMode(sensor_gas, INPUT);
pinMode(redLED, OUTPUT);
pinMode(greenLED, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(buttonOFF, INPUT_PULLUP);
pinMode(buttonON, INPUT_PULLUP);
pinMode(relayPin, OUTPUT);
digitalWrite(relayPin, HIGH); // Pastikan relay dimatikan saat mulai
// Setup LCD
lcd.begin(16, 2);
lcd.clear();
lcd.backlight();
// Setup DHT
dht.begin();
// Initialize Serial Monitor
Serial.begin(9600);
}
void loop() {
// Check button states
if (digitalRead(buttonON) == LOW) {
systemOn = true;
delay(50); // Debounce delay
}
if (digitalRead(buttonOFF) == LOW) {
systemOn = false;
delay(50); // Debounce delay
}
if (systemOn) {
int analogSensor = analogRead(sensor_gas);
float h = dht.readHumidity();
float t = dht.readTemperature();
unsigned long currentMillis = millis();
// Display temperature and humidity on Serial Monitor
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C, Humidity: ");
Serial.print(h);
Serial.println(" %");
// High temperature notification
if (t > tempThreshold) {
if(analogSensor > sensorThreshold) {
lcd.setCursor(0, 0);
lcd.print("SUHU ");
lcd.print(t);
lcd.print(" *C ");
lcd.setCursor(0, 1);
lcd.print("GAS BOCOR! ");
digitalWrite(greenLED, LOW);
digitalWrite(redLED, HIGH);
digitalWrite(relayPin, LOW); // Mematikan relay (memutus listrik)
// If alarm is not muted, alternate between two tones
if (!alarmMuted && currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
tone(buzzer, (currentMillis / interval) % 2 == 0 ? 2000 : 2500); // Alternate between 2000Hz and 2500Hz
} else {
noTone(buzzer);
}
} else {
lcd.setCursor(0, 0);
lcd.print("SUHU TINGGI! ");
lcd.setCursor(0, 1);
lcd.print(t);
lcd.print(" *C ");
noTone(buzzer);
digitalWrite(relayPin, HIGH); // Menghidupkan kembali relay (menyambung listrik)
}
} else {
// Check for gas leakage
if (analogSensor > sensorThreshold) {
lcd.setCursor(0, 0);
lcd.print("Kondisi Ruangan:");
lcd.setCursor(0, 1);
lcd.print("GAS BOCOR! ");
digitalWrite(redLED, LOW);
digitalWrite(greenLED, LOW);
digitalWrite(relayPin, HIGH); // Menghidupkan kembali relay (menyambung listrik)
delay(500);
digitalWrite(redLED, HIGH);
// If alarm is not muted, alternate between two tones
if (!alarmMuted && currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
tone(buzzer, (currentMillis / interval) % 2 == 0 ? 1000 : 1500); // Alternate between 1000Hz and 1500Hz
} else {
noTone(buzzer);
}
} else {
lcd.setCursor(0, 0);
lcd.print("Kondisi Ruangan:");
lcd.setCursor(0, 1);
lcd.print("Gas aman. ");
digitalWrite(redLED, LOW);
digitalWrite(greenLED, HIGH);
noTone(buzzer);
alarmMuted = false;
digitalWrite(relayPin, HIGH); // Menghidupkan kembali relay (menyambung listrik)
}
}
} else {
// System is off, turn off everything
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sistem Mati");
digitalWrite(redLED, LOW);
digitalWrite(greenLED, LOW);
noTone(buzzer);
digitalWrite(relayPin, HIGH); // Memastikan relay tetap mati
}
delay(1000); // 1 second delay for the next reading
}