#include <Wire.h>
#include <MPU6050_light.h>
#include <LiquidCrystal_I2C.h>
// Tạo đối tượng cho MPU6050
// Khởi tạo màn hình LCD 20x4 với địa chỉ I2C là 0x3F (địa chỉ thường gặp, nếu không được, thử các địa chỉ khác như 0x27)
LiquidCrystal_I2C lcd(0x27, 20, 4); // Địa chỉ I2C của màn hình, kích thước màn hình 20x4
MPU6050 mpu(Wire);
const int AD0pin = 16; // Chân AD0 của MPU6050
const int mpuAddr = 0x68; // Địa chỉ mặc định của MPU6050
unsigned long previousMillisAcc = 0; // Thời gian kiểm tra gia tốc (không trùng lặp với thời gian chuyển đổi LCD)
const unsigned long intervalAcc = 1000; // Thời gian kiểm tra gia tốc (ms), bạn có thể điều chỉnh lại nếu cần
// Biến lưu giá trị gia tốc trước đó và hiện tại
float prevAccY = 0; // Gia tốc trục Y trước đó
float currentAccY = 0; // Gia tốc trục Y hiện tại
float deltaY = 0; // Sự thay đổi gia tốc trên trục Y
void setup() {
Wire.begin(); // SDA = 21, SCL = 22 cho ESP32
// Khởi tạo chân AD0
pinMode(AD0pin, OUTPUT);
digitalWrite(AD0pin, LOW); // AD0 = LOW để sử dụng địa chỉ 0x68
// Khởi tạo MPU6050
byte status = mpu.begin();
if (status != 0) {
while (1); // Dừng chương trình nếu khởi tạo thất bại
}
// Tính toán offsets
mpu.calcOffsets(true, true); // Gyro và Accel
// Khởi tạo màn hình LCD
lcd.begin(20, 4); // Kích thước màn hình 20x4
lcd.backlight(); // Bật đèn nền
lcd.clear(); // Xóa màn hình trước khi bắt đầu
}
void loop() {
unsigned long MPcurrentMillis = millis();
// Cập nhật giá trị từ MPU6050
mpu.update();
// Kiểm tra dữ liệu mỗi "interval" ms
// Kiểm tra dữ liệu mỗi "intervalAcc" ms cho gia tốc
if (MPcurrentMillis - previousMillisAcc >= intervalAcc) {
previousMillisAcc = MPcurrentMillis;
// Đọc gia tốc trên trục Y
currentAccY = mpu.getAccY();
// Tính sự thay đổi gia tốc trên trục Y
deltaY = abs(currentAccY - prevAccY);
// Phát hiện chấn động nhẹ (CD nhẹ)
if (deltaY >= 0.2 && deltaY < 1.0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ChanDongnhe");
}
// Phát hiện chấn động mạnh (CD mạnh)
else if (deltaY >= 1.0 && deltaY < 2.0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ChandongManh");
}
// Phát hiện nổ (Nổ)
else if (deltaY >= 2.0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Phathienno");
}
// Trường hợp không phát hiện chấn động mạnh hoặc nổ: Hiển thị trạng thái an toàn
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("An Toan.");
}
// Cập nhật giá trị trước đó
prevAccY = currentAccY;
// Hiển thị giá trị gia tốc lên màn hình LCD
lcd.setCursor(0, 1);
lcd.print("AccY: ");
lcd.print(currentAccY, 2);
lcd.print(" g");
}
}MPU 0