#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <DHT.h>
#define I2C_ADDR 0x27
#define BACKLIGHT POSITIVE
#define MQ2_PIN A0
#define TOUCH_PIN 3
#define ULTRASONIC_TRIG_PIN 4
#define ULTRASONIC_ECHO_PIN 5
#define PIR_PIN 6
#define Suara A1 // Deklarasi sensor suara ke pin A0
#define LEDh A2 // Deklarasi LED sensor suara ke pin A2
#define LED_PIN_BLUE 7 //suhu normal
#define LED_PIN_RED 8 //suhu panas
#define BUZZER_PIN_1 9 //output sensor ultrasonik
#define BUZZER_PIN_2 10 //output touch sensor
#define BUZZER_PIN_3 11 //output mq2 sensor
#define DHT11_PIN 12
#define DHTTYPE DHT11
DHT dht(DHT11_PIN, DHTTYPE);
LiquidCrystal_I2C lcd(I2C_ADDR, 20, 4);
Servo myservo;
int clap = 0; // jumlah tepukan saat kondisi awal
long detection_range_start = 0;
long detection_range = 0;
boolean status_lights = false;
unsigned long lcdUpdateTime = 0; // Penanda waktu terakhir LCD diperbarui
const unsigned long lcdUpdateInterval = 1000; // Interval waktu untuk memperbarui LCD (dalam milidetik)
void setup() {
Serial.begin(9600); // Inisialisasi komunikasi serial dengan kecepatan 9600 baud
lcd.init();
lcd.backlight();
pinMode(Suara, INPUT); // Deklarasi variabel Sensor sebagai input
pinMode(LEDh, OUTPUT); // Deklarasi variabel LED merah sebagai output
pinMode(MQ2_PIN, INPUT);
pinMode(TOUCH_PIN, INPUT);
pinMode(ULTRASONIC_TRIG_PIN, OUTPUT);
pinMode(ULTRASONIC_ECHO_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN_BLUE, OUTPUT); //dht suhu normal
pinMode(LED_PIN_RED, OUTPUT); //dht suhu panas
pinMode(BUZZER_PIN_1, OUTPUT); //sensor ultrasonik
pinMode(BUZZER_PIN_2, OUTPUT); //touch sensor
pinMode(BUZZER_PIN_3, OUTPUT); //mq2 sensor
dht.begin(); // Inisialisasi sensor DHT11
myservo.attach(13);
}
void loop() {
// Baca sensor MQ2
int gasValue = analogRead(MQ2_PIN);
// Baca sensor touch
int touchState = digitalRead(TOUCH_PIN);
// Baca sensor ultrasonik
long duration, jarak;
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
duration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH);
jarak = (duration / 2) / 29.1;
// Baca sensor PIR
int pirState = digitalRead(PIR_PIN);
// Baca suhu dari sensor DHT11
float temperature = dht.readTemperature();
// Tampilkan hasil pada LCD
if (millis() - lcdUpdateTime >= lcdUpdateInterval) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Gas: ");
lcd.print(gasValue);
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperature);
lcd.print("C");
lcd.setCursor(0, 3);
lcd.print("Jarak: ");
lcd.print(jarak);
lcd.print("cm");
lcdUpdateTime = millis(); // Perbarui waktu terakhir LCD diperbarui
}
// Tampilkan juga pada Serial Monitor
Serial.println("Gas: " + String(gasValue));
Serial.println("Temperature: " + String(temperature) + " C");
Serial.println("Jarak: " + String(jarak) + " cm");
// Output deteksi gerakan oleh sensor PIR pada Serial Monitor
if (pirState == HIGH) {
Serial.println("Gerakan terdeteksi !");
lcd.setCursor(0, 2);
lcd.print("Gerakan terdeteksi!");
myservo.write(90); // Gerakkan motor servo ke posisi 90 derajat
delay(5000); // Tahan posisi motor servo selama 5000 milidetik
myservo.write(0); // Kembalikan motor servo ke posisi 0 derajat
} else {
Serial.println("Tidak ada gerakan !");
lcd.setCursor(0, 2);
lcd.print("Tidak ada gerakan!");
}
Serial.println();
// Kontrol Buzzer 1 saat jarak < 10
if (jarak < 10) {
digitalWrite(BUZZER_PIN_1, HIGH);
} else {
digitalWrite(BUZZER_PIN_1, LOW);
}
// Kontrol Buzzer 2 saat sensor disentuh
if (touchState == HIGH) {
digitalWrite(BUZZER_PIN_2, HIGH);
} else {
digitalWrite(BUZZER_PIN_2, LOW);
}
// Kontrol Buzzer 3 saat gas melebihi batas
if (gasValue > 400) {
digitalWrite(BUZZER_PIN_3, HIGH);
} else {
digitalWrite(BUZZER_PIN_3, LOW);
}
// Kontrol LED berdasarkan suhu
if (temperature < 33.30) { //33.30 set
digitalWrite(LED_PIN_BLUE, HIGH); // Hidupkan LED biru jika suhu normal
digitalWrite(LED_PIN_RED, LOW); // Matikan LED merah jika suhu normal
} else if (temperature > 33.40) { //33.40 set
digitalWrite(LED_PIN_BLUE, LOW); // Matikan LED biru jika suhu panas
digitalWrite(LED_PIN_RED, HIGH); // Hidupkan LED merah jika suhu panas
}
int status_sensor = digitalRead(Suara); // Instruksi untuk membaca nilai digital sensor suara
delay(1);
if (status_sensor == 0) {
if (clap == 0) {
detection_range_start = detection_range = millis();
clap++;
} else if (clap > 0 && millis() - detection_range >= 50) { // Perbaikan operator && disini
detection_range = millis();
clap++;
}
}
if (millis() - detection_range_start >= 400) {
if (clap == 1) { // Instruksi untuk mengaktifkan LED saat sensor mendeteksi suara
if (!status_lights) {
status_lights = true;
digitalWrite(LEDh, HIGH);
} else if (status_lights) {
status_lights = false; // Instruksi untuk mematikan LED saat suara kembali terdeteksi
digitalWrite(LEDh, LOW);
}
}
clap = 0;
}
}