#include <Wire.h>
#include <MPU6050.h> // Library untuk MPU-6050
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C
MPU6050 mpu;
// Inisialisasi LCD I2C dengan alamat (sesuaikan alamat jika perlu)
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C biasanya 0x27 atau 0x3F
int gerakan = 0; // Variabel untuk menghitung jumlah gerakan
float threshold = 2000; // Nilai threshold untuk mendeteksi perubahan akselerasi
long lastTime = 0;
long interval = 60000; // Waktu untuk menghitung gerakan selama 1 menit (60000 ms)
float ax, ay, az; // Variabel untuk menyimpan data akselerasi
void setup() {
Serial.begin(9600);
Wire.begin();
// Inisialisasi sensor MPU6050 dan cek koneksi
mpu.initialize();
if (!mpu.testConnection()) {
Serial.println("Koneksi ke MPU6050 gagal!");
lcd.begin(16, 2); // Inisialisasi LCD dengan ukuran 16x2
lcd.backlight(); // Aktifkan lampu latar LCD
lcd.print("MPU6050 Error!");
while (1); // Jika gagal terhubung, berhenti di sini
}
Serial.println("MPU6050 terhubung!");
// Kalibrasi MPU6050 (opsional, disesuaikan sesuai kebutuhan)
mpu.setXAccelOffset(0); // Kalibrasi sumbu X
mpu.setYAccelOffset(0); // Kalibrasi sumbu Y
mpu.setZAccelOffset(0); // Kalibrasi sumbu Z
// Inisialisasi LCD I2C
lcd.begin(16, 2); // Inisialisasi LCD dengan ukuran 16x2
lcd.backlight(); // Aktifkan lampu latar LCD
lcd.print("MPU6050 Ready!"); // Tampilkan pesan inisialisasi di LCD
delay(2000); // Tampilkan selama 2 detik sebelum mulai
lcd.clear(); // Hapus tampilan LCD
lastTime = millis(); // Menyimpan waktu awal
}
void loop() {
// Membaca nilai akselerasi dari sensor
ax = mpu.getAccelerationX();
ay = mpu.getAccelerationY();
az = mpu.getAccelerationZ();
// Menghitung total perubahan akselerasi
float perubahanAkselerasi = sqrt(ax * ax + ay * ay + az * az);
// Jika perubahan akselerasi melewati threshold, dianggap sebagai gerakan
if (perubahanAkselerasi > threshold) {
gerakan++;
Serial.print("Gerakan terdeteksi! Total gerakan: ");
Serial.println(gerakan);
}
// Periksa jika sudah 1 menit berlalu
if (millis() - lastTime >= interval) {
lcd.clear(); // Bersihkan LCD sebelum menampilkan hasil
lcd.setCursor(0, 0); // Set posisi kursor di baris pertama
// Evaluasi tingkat kecemasan dan tampilkan di LCD baris pertama
if (gerakan >= 1 && gerakan <= 10) {
Serial.println("Cemas ringan");
lcd.print("Cemas ringan");
} else if (gerakan >= 11 && gerakan <= 20) {
Serial.println("Cemas sedang");
lcd.print("Cemas sedang");
} else if (gerakan >= 21 && gerakan <= 30) {
Serial.println("Cemas berat");
lcd.print("Cemas berat");
} else if (gerakan == 0) {
Serial.println("Tidak ada gerakan");
lcd.print("Tidak ada gerak");
} else {
Serial.println("Gerakan ekstrem");
lcd.print("Gerakan ekstrem");
}
// Tampilkan jumlah gerakan di baris kedua LCD
lcd.setCursor(0, 1);
lcd.print("Gerakan: ");
lcd.print(gerakan);
// Reset variabel
gerakan = 0;
lastTime = millis(); // Restart penghitungan waktu
}
}