#include <Wire.h>
#include <MPU6050_tockn.h>
#include <Tone.h>
MPU6050 mpu(Wire);
Tone speaker;
const int ledPin = 13; // Pin LED built-in pada Arduino
const unsigned long interval = 5000; // Interval waktu tanpa gerakan (dalam milidetik)
unsigned long previousMillis = 0;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
// Inisialisasi sensor MPU6050
mpu.begin();
speaker.begin(10); // Inisialisasi speaker pada pin 10
}
void loop() {
// Baca data akselerometer
mpu.update();
float ax = mpu.getAccX();
float ay = mpu.getAccY();
float az = mpu.getAccZ();
// Hitung total akselerasi
const int totalAccel = abs(ax) + abs(ay) + abs(az);
// Baca data giroskop
float gx = mpu.getGyroX();
float gy = mpu.getGyroY();
float gz = mpu.getGyroZ();
// Hitung sudut kemiringan (pitch) berdasarkan data giroskop
const float pitch = atan2(-ax, sqrt(pow(ay, 2) + pow(az, 2))) * 180 / PI;
// Cek apakah ada gerakan atau posisi tubuh terjatuh
if (abs(gz) < 10 && totalAccel == 0) {
// Tidak ada gerakan dan postur tubuh vertikal, cek waktu tanpa gerakan
const unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// Tidak ada gerakan selama interval waktu tertentu, berikan output
for (int i = 0; i < 50; i++) { // Ulangi 50 kali
speaker.play(NOTE_A5); // Mainkan bunyi speaker
digitalWrite(ledPin, HIGH); // Nyalakan LED
delay(100); // Tunda 100 ms
digitalWrite(ledPin, LOW); // Matikan LED
delay(100); // Tunda 100 ms
}
}
} else {
// Ada gerakan atau postur tubuh tidak vertikal, reset timer
previousMillis = millis();
digitalWrite(ledPin, LOW); // Matikan LED
}
delay(100); // Tunda sedikit untuk mengurangi frekuensi pembacaan
}