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:
- Đọc rung local và hiển thị Serial
- 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)
- Có 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 = 1 | Có rung |
| vibration = 0 | Bì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
- Có 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


