#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <Servo.h>
#define DHTPIN 2 // Pin data DHT22 terhubung ke pin 2
#define DHTTYPE DHT22 // Tipe sensor DHT (DHT22)
#define PIR_PIN 3 // Pin output PIR sensor
#define TRIG_PIN 6 // Pin trigger sensor ultrasonik
#define ECHO_PIN 7 // Pin echo sensor ultrasonik
#define RELAY1_PIN 4 // Pin relay 1
#define RELAY2_PIN 5 // Pin relay 2
#define BUZZER_PIN 8 // Pin buzzer
#define SERVO_PIN 9 // Pin servo
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo;
void scrollText(const char* message, int delayTime) {
int len = strlen(message);
for (int i = 0; i < len + 16; i++) {
lcd.clear();
lcd.setCursor(16 - i, 0);
lcd.print(message);
delay(delayTime);
}
}
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
servo.attach(SERVO_PIN);
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
lcd.begin(16, 2);
lcd.backlight();
scrollText("Smart Home", 250);
lcd.clear();
}
void loop() {
long duration, distance;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = duration * 0.034 / 2;
if (distance >= 200 && distance <= 400) { // Jika jarak antara 200cm dan 400cm
digitalWrite(RELAY1_PIN, HIGH); // Nyalakan Relay 1 (misalnya untuk lampu atau perangkat lainnya)
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SEDANG ISTIRAHAT");
servo.write(0); // Tutup servo
} else if (distance >= 60 && distance < 200) { // Jika jarak antara 60cm dan 199cm
digitalWrite(RELAY1_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SELAMAT DATANG");
servo.write(90); // Buka servo
} else if (distance >= 2 && distance < 60) { // Jika jarak antara 2cm dan 59cm
digitalWrite(RELAY1_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SEDANG ISTIRAHAT");
servo.write(0); // Tutup servo
} else { // Jika jarak di luar rentang yang ditentukan
lcd.clear();
digitalWrite(RELAY1_PIN, LOW); // Matikan Relay 1
}
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Error membaca");
delay(2000);
return;
}
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C");
lcd.setCursor(0, 2);
lcd.print("Humidity: ");
lcd.print(h);
lcd.print(" %");
int motionDetected = 0;
for (int i = 0; i < 5; ++i) {
if (digitalRead(PIR_PIN) == HIGH) {
motionDetected++;
digitalWrite(RELAY2_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SILAHKAN TUNGGU");
tone(BUZZER_PIN, 500);
delay(500);
noTone(BUZZER_PIN);
delay(500);
} else {
digitalWrite(RELAY2_PIN, LOW);
}
delay(500);
}
if (motionDetected > 0) {
for (int i = 0; i < 5; i++) {
digitalWrite(RELAY2_PIN, HIGH);
tone(BUZZER_PIN, 500);
delay(500);
digitalWrite(RELAY2_PIN, LOW);
noTone(BUZZER_PIN);
delay(500);
}
}
delay(1000);
}