#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD dengan alamat 0x27 dan ukuran 16x2
const int potPin = A0; // Pin analog untuk potensiometer
const int buzzerPin = 8; // Pin digital untuk buzzer
const int greenLedPin = 10; // Pin digital untuk LED hijau
const int redLedPin = 9; // Pin digital untuk LED merah
const int numReadings = 10; // Jumlah pembacaan untuk averaging
int readings[numReadings]; // Array untuk menyimpan pembacaan
int index = 0; // Indeks pembacaan saat ini
int total = 0; // Total pembacaan
int safeAngle = 45; // Sudut aman
void setup() {
// Inisialisasi LCD
lcd.init();
// Menampilkan pesan selamat datang
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("TILT SENSOR");
lcd.setCursor(0, 1);
lcd.print("SENSOR KEMIRINGAN");
delay(2000);
// Bersihkan LCD
lcd.clear();
// Inisialisasi pembacaan potensiometer
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0;
}
// Inisialisasi pin buzzer
pinMode(buzzerPin, OUTPUT);
// Inisialisasi pin LED hijau dan merah
pinMode(greenLedPin, OUTPUT);
pinMode(redLedPin, OUTPUT);
// Inisialisasi komunikasi serial dengan baud rate 9600
Serial.begin(9600);
}
void loop() {
total = total - readings[index]; // Kurangi nilai pembacaan yang akan di-overwrite
readings[index] = analogRead(potPin); // Baca nilai potensiometer
total = total + readings[index]; // Tambahkan nilai baru ke total
index = (index + 1) % numReadings; // Pindah ke indeks berikutnya, dengan pembulatan jika mencapai batas
int average = total / numReadings; // Hitung rata-rata pembacaan
int angle = map(average, 0, 1023, 0, 90); // Konversi nilai potensiometer ke sudut
// Tampilkan informasi sudut pada LCD
lcd.setCursor(0, 0);
lcd.print("Sudut: ");
lcd.print(angle);
lcd.print(" degree");
// Peringatkan jika sudut melewati batas aman
if (angle > safeAngle) {
lcd.setCursor(0, 1);
lcd.print("Status: Over ");
lcd.print(safeAngle);
lcd.print(" degree");
// Bunyikan buzzer
tone(buzzerPin, 1000); // Bunyikan buzzer dengan frekuensi 1000 Hz
// Nyalakan LED merah dan matikan LED hijau
digitalWrite(redLedPin, HIGH);
digitalWrite(greenLedPin, LOW);
// Kirim peringatan bahaya ke Serial Monitor
Serial.println("DANGER: Sudut melewati batas!");
} else {
noTone(buzzerPin); // Matikan bunyi jika sudut kembali aman
// Nyalakan LED hijau dan matikan LED merah
digitalWrite(greenLedPin, HIGH);
digitalWrite(redLedPin, LOW);
// Tampilkan status aman
lcd.setCursor(0, 1);
lcd.print("Status: Aman ");
}
delay(100); // Delay untuk stabilitas tampilan
}