#define BLYNK_TEMPLATE_ID "TMPL6Hk6D4GHD"
#define BLYNK_TEMPLATE_NAME "Chongtromxemay"
#define BLYNK_AUTH_TOKEN "IvbuOmyldoRwcKtJdDYKFAOD-8SZ1D8s"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <MPU6050_light.h> // cài qua Library Manager: "MPU6050_light" by rfetick
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "TenWifi";
char pass[] = "MatKhauWifi";
#define RELAY_COI 16
#define NGUONG_RUNG 3.0 // ngưỡng gia tốc (m/s^2), cần tự thử nghiệm chỉnh lại
#define SO_LAN_CAN_THIET 5 // số lần rung liên tiếp mới coi là thật
MPU6050 mpu(Wire);
bool dangArm = false;
bool coiDangKeu = false;
int demSoLanRung = 0;
BLYNK_WRITE(V0) { // V0: công tắc Arm/Disarm từ app
dangArm = param.asInt();
if (!dangArm) {
demSoLanRung = 0;
coiDangKeu = false;
digitalWrite(RELAY_COI, LOW);
}
}
BLYNK_WRITE(V1) { // V1: nút "Tắt còi" từ xa
if (param.asInt() == 1) {
coiDangKeu = false;
demSoLanRung = 0;
digitalWrite(RELAY_COI, LOW);
}
}
void setup() {
Serial.begin(115200);
pinMode(RELAY_COI, OUTPUT);
digitalWrite(RELAY_COI, LOW);
Wire.begin();
mpu.begin();
mpu.calcOffsets(); // hiệu chỉnh cảm biến lúc đứng yên, cần giữ yên vài giây khi khởi động
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run();
mpu.update();
if (!dangArm) return; // chưa Arm thì không kiểm tra gì cả
float gocX = abs(mpu.getAngleX());
float gocY = abs(mpu.getAngleY());
float giaToc = abs(mpu.getAccX()) + abs(mpu.getAccY()) + abs(mpu.getAccZ());
if (giaToc > NGUONG_RUNG || gocX > 25 || gocY > 25) {
demSoLanRung++;
} else {
if (demSoLanRung > 0) demSoLanRung--; // giảm dần, chống nhiễu tức thời
}
if (demSoLanRung >= SO_LAN_CAN_THIET && !coiDangKeu) {
coiDangKeu = true;
digitalWrite(RELAY_COI, HIGH);
Blynk.virtualWrite(V2, "CANH BAO: XE BI TAC DONG!");
Blynk.logEvent("bao_dong"); // gửi thông báo đẩy (push notification) qua app Blynk
}
delay(100);
}