#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define LCD_ADDRESS 0x27 // Alamat I2C LCD
#define LCD_COLUMNS 16 // Jumlah kolom LCD
#define LCD_ROWS 2 // Jumlah baris LCD
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
#define TRIGGER_PIN 7
#define ECHO_PIN 6
#define SERVO_PIN 9
#define PIR_PIN 2
#define BUTTON_PIN 3
#define BUZZER_PIN 8
Servo myservo;
int ledPins[] = {10, 11, 12, 13, A0}; // LED pins
int ledCount = 5;
bool pirStatus = false;
bool buttonState = false;
void setup() {
Serial.begin(9600);
// LCD I2C Setup
lcd.init();
lcd.backlight();
// Servo Setup
myservo.attach(SERVO_PIN);
// Ultrasonic Sensor Setup
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// PIR Sensor Setup
pinMode(PIR_PIN, INPUT);
// LED Setup
for (int i = 0; i < ledCount; i++) {
pinMode(ledPins[i], OUTPUT);
}
// Buzzer Setup
pinMode(BUZZER_PIN, OUTPUT);
// Button Setup
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void displayButtonState() {
lcd.setCursor(0, 1); // Set posisi kursor untuk menulis teks tombol push
lcd.print(buttonState ? "Pressed" : "Released"); // Menampilkan status tombol push
}
void loop() {
// LCD Display
lcd.clear();
lcd.setCursor(0, 0);
if (pirStatus) {
lcd.print("Motion detected");
} else {
long duration, distance; // Declare distance here
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = (duration / 2) / 29.1; // Calculate distance in cm
Serial.print("Distance: ");
Serial.println(distance);
// Deteksi jarak 30 cm
if (distance <= 30) {
lcd.print("Sensor detected");
// Running LED
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], HIGH); // Turn on LED
delay(100); // Delay between LED
digitalWrite(ledPins[i], LOW); // Turn off LED
}
// Blink Buzzer
for (int i = 0; i < 3; i++) {
tone(BUZZER_PIN, 1000); // Play a tone
delay(500);
noTone(BUZZER_PIN); // Turn off the tone
delay(500);
}
} else {
lcd.print("No motion detected");
}
}
displayButtonState(); // Panggil fungsi untuk menampilkan status tombol push
// PIR Sensor
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
pirStatus = true;
// Gerakkan servo 90 derajat
myservo.write(90);
// Aktifkan buzzer
tone(BUZZER_PIN, 1000);
// Blink LED
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], HIGH);
}
delay(500);
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], LOW);
}
delay(500);
} else {
pirStatus = false;
// Matikan servo
myservo.write(0);
// Matikan buzzer
noTone(BUZZER_PIN);
}
// Button
if (digitalRead(BUTTON_PIN) == LOW) {
buttonState = true;
// Hidupkan semua LED selama 3 detik
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], HIGH);
}
delay(3000);
// Matikan semua LED
for (int i = 0; i < ledCount; i++) {
digitalWrite(ledPins[i], LOW);
}
} else {
buttonState = false;
}
delay(100); // Delay before repeating loop
}