IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 4 – Đọc cảm biến SW-420 bằng ESP32: phát hiện rung/va chạm & theo dõi realtime

Trong bài này, chúng ta sử dụng cảm biến rung SW-420 để phát hiện rung, va chạm hoặc tác động mạnh. Đây là cảm biến rất hay dùng trong các bài toán:

  • Phát hiện va chạm / rung bất thường
  • Báo động xê dịch thiết bị
  • Giám sát tủ, cửa, xe, hộp thiết bị

Bài viết gồm 2 ví dụ code:

  1. Đọc rung local và hiển thị Serial
  2. Gửi sự kiện rung lên IoTLabs Cloud MQTT để theo dõi realtime

1) Cảm biến SW-420 là gì?

  • SW-420 là cảm biến rung dạng digital
  • Bên trong có:
    • Ống rung (spring sensor)
    • Mạch so sánh + biến trở chỉnh ngưỡng

Nguyên lý hoạt động

  • Khi có rung/va chạm vượt ngưỡng → OUT = HIGH
  • Khi đứng yên → OUT = LOW

📌 Lưu ý quan trọng:
SW-420 không đo cường độ rung, chỉ cho biết có rung hay không.

2) Chuẩn bị

Phần cứng

  • ESP32-C3 SuperMini (Tenstar Robot)
  • Cảm biến rung SW-420 module
  • Breadboard + dây

Chân sử dụng

  • OUT → GPIO1
  • VCC → 5V
  • GND → GND

⚠️ SW-420 nên cấp 5V để mạch so sánh hoạt động ổn định.
Tín hiệu OUT an toàn cho GPIO ESP32 (3.3V logic).

3) Nối dây SW-420 với ESP32

SW-420 Module       ESP32-C3 SuperMini
------------------------------------
VCC   ------------ 5V
GND   ------------ GND
OUT   ------------ GPIO1

Chỉnh độ nhạy

  • Vặn biến trở trên module
  • Vặn theo chiều kim đồng hồ → nhạy hơn
  • Nên chỉnh sao cho:
    • Không rung → OUT = LOW
    • Gõ nhẹ / rung rõ → OUT = HIGH

4) Đặc điểm tín hiệu cần lưu ý

  • Tín hiệu OUT có thể nhảy rất nhanh
  • Dễ gây spam sự kiện
    ➡️ Cần:
  • Phát hiện cạnh (edge detect)
  • cooldown giữa các lần gửi MQTT

Ví dụ 1 — Code local đơn giản (đọc rung + Serial)

Mục tiêu: phát hiện thời điểm có rung.

// ===== SW-420 Local Read =====
const int SW_PIN = 1;

int lastState = LOW;

void setup() {
  Serial.begin(115200);
  delay(200);

  pinMode(SW_PIN, INPUT);
  Serial.println("SW-420 vibration monitor started...");
}

void loop() {
  int state = digitalRead(SW_PIN);

  if (state == HIGH && lastState == LOW) {
    Serial.println("⚠️ Phát hiện RUNG / VA CHẠM!");
  }

  lastState = state;
  delay(20);
}

✅ Kết quả:

  • Khi có rung → in thông báo
  • Khi hết rung → không in thêm (tránh spam)

5) Chuẩn dữ liệu realtime cho IoTLabs Cloud

Topic

iotlabs/<orgId>/devices/<deviceId>/telemetry

Payload JSON

{
  "ts": 1760000000,
  "metrics": {
    "vibration": 1
  },
  "status": {
    "vibration": "detected"
  }
}
Giá trịÝ nghĩa
vibration = 1Có rung
vibration = 0Bình thường

Ví dụ 2 — Gửi sự kiện rung lên IoTLabs Cloud MQTT

Chiến lược:

  • Gửi 1 event / lần rung
  • cooldown để tránh spam
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

// ===== CONFIG =====
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";

const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int   MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";
const char* MQTT_TOPIC =
  "iotlabs/<orgId>/devices/<deviceId>/telemetry";

// ===== SW-420 =====
const int SW_PIN = 1;
int lastState = LOW;

unsigned long lastEventMs = 0;
const unsigned long COOLDOWN_MS = 2000;

WiFiClientSecure net;
PubSubClient mqtt(net);

void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(400);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
}

void connectMQTT() {
  net.setInsecure(); // demo
  mqtt.setServer(MQTT_HOST, MQTT_PORT);

  while (!mqtt.connected()) {
    if (mqtt.connect("esp32c3-sw420", MQTT_USER, MQTT_PASS)) {
      Serial.println("MQTT connected");
      break;
    }
    delay(1000);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode(SW_PIN, INPUT);

  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  int state = digitalRead(SW_PIN);
  unsigned long now = millis();

  if (state == HIGH && lastState == LOW && now - lastEventMs > COOLDOWN_MS) {
    lastEventMs = now;

    long ts = millis() / 1000;

    String payload = "{";
    payload += "\"ts\":" + String(ts) + ",";
    payload += "\"metrics\":{\"vibration\":1},";
    payload += "\"status\":{\"vibration\":\"detected\"}";
    payload += "}";

    mqtt.publish(MQTT_TOPIC, payload.c_str());
    Serial.println(payload);
  }

  lastState = state;
  delay(20);
}

6) Lỗi thường gặp & kinh nghiệm thực tế

  • Rung nhẹ cũng trigger
    • Giảm độ nhạy bằng biến trở
  • Spam MQTT liên tục
    • Luôn dùng edge detect + cooldown
  • Nhiễu khi gắn trên vỏ kim loại
    • Thử gắn đệm cao su hoặc thay vị trí

7) Ứng dụng thực tế

  • Báo rung tủ / két / hộp thiết bị
  • Phát hiện xe bị xê dịch
  • Kết hợp Reed Switch để xác nhận mở cửa + rung
  • Gửi cảnh báo Telegram (bài nâng cao sau)

Bài tiếp theo (Level 1)

👉 Bài 5: Hướng dẫn đọc cảm biến Tilt Switch bằng ESP32: phát hiện nghiêng/đổ & theo dõi realtime