Trong bài này, chúng ta sử dụng Sound Sensor (KY-038 / KY-037) để đo mức âm thanh môi trường và theo dõi realtime thông qua IoTLabs Cloud MQTT.
Đây là cảm biến analog rất phổ biến trong DIY/maker, thường dùng cho:
- Phát hiện tiếng động bất thường
- Báo động cơ bản
- Smart room / smart office
- Trigger sự kiện theo ngưỡng âm thanh
Bài viết gồm 2 ví dụ code:
- Đọc mức âm thanh local (Serial)
- Gửi mức âm thanh lên IoTLabs Cloud MQTT để theo dõi realtime
1) Sound Sensor (KY-038 / KY-037) là gì?
- Cảm biến sử dụng microphone điện dung
- Module phổ biến gồm:
- AO (Analog Output) → mức âm thanh
- DO (Digital Output) → vượt ngưỡng (ít chính xác)
📌 Trong bài này:
- Dùng AO (analog) để:
- Đo mức âm thanh tương đối
- Linh hoạt xử lý ngưỡng bằng code
2) Chuẩn bị
Phần cứng
- ESP32-C3 SuperMini (Tenstar Robot)
- Sound Sensor KY-038 hoặc KY-037
- Breadboard + dây nối
Chân sử dụng
- AO → GPIO2 (ADC)
- VCC → 5V
- GND → GND
⚠️ Nên cấp 5V cho module để micro hoạt động ổn định
ESP32 chỉ đọc ADC (3.3V safe)
3) Nối dây Sound Sensor với ESP32
Sound Sensor ESP32-C3 SuperMini
------------------------------------
VCC ------------ 5V
GND ------------ GND
AO ------------ GPIO2 (ADC)
4) Giá trị đọc & cách hiểu
ESP32 ADC (12-bit):
- Giá trị đọc: 0 → 4095
| Mức âm thanh | ADC (ước lượng) |
|---|---|
| Yên tĩnh | 0 – 300 |
| Bình thường | 300 – 1200 |
| Ồn / tiếng động | > 1200 |
📌 Sound Sensor không đo dB chuẩn, chỉ cho giá trị tương đối.
Ví dụ 1 — Code local đơn giản (đo mức âm thanh)
Mục tiêu: đọc mức âm thanh và in ra Serial.
// ===== Sound Sensor Local Read =====
const int SOUND_PIN = 2; // ADC
void setup() {
Serial.begin(115200);
delay(200);
Serial.println("Sound sensor monitor started...");
}
void loop() {
int raw = analogRead(SOUND_PIN);
// Chuẩn hoá % (0 = yên tĩnh, 100 = rất ồn)
int soundPct = map(raw, 0, 4095, 0, 100);
soundPct = constrain(soundPct, 0, 100);
Serial.print("ADC: ");
Serial.print(raw);
Serial.print(" | Sound level: ");
Serial.print(soundPct);
Serial.println("%");
delay(500);
}
5) Chuẩn dữ liệu realtime
Topic
iotlabs/<orgId>/devices/<deviceId>/telemetry
Payload JSON
{
"ts": 1760000000,
"metrics": {
"sound_level": 45
},
"status": {
"noise": "normal"
}
}
| sound_level | Ý nghĩa |
|---|---|
| 0–30 | yên tĩnh |
| 30–70 | bình thường |
| >70 | ồn |
Ví dụ 2 — Gửi mức âm thanh lên Cloud MQTT
Chiến lược:
- Gửi định kỳ 3–5 giây
- Có thể nâng cấp cảnh báo ngưỡng (Level 2)
#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";
// ===== SOUND =====
const int SOUND_PIN = 2;
WiFiClientSecure net;
PubSubClient mqtt(net);
unsigned long lastSend = 0;
const unsigned long SEND_INTERVAL = 4000;
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-sound", MQTT_USER, MQTT_PASS)) {
Serial.println("MQTT connected");
break;
}
delay(1000);
}
}
void setup() {
Serial.begin(115200);
connectWiFi();
connectMQTT();
}
void loop() {
if (!mqtt.connected()) connectMQTT();
mqtt.loop();
unsigned long now = millis();
if (now - lastSend > SEND_INTERVAL) {
lastSend = now;
int raw = analogRead(SOUND_PIN);
int soundPct = map(raw, 0, 4095, 0, 100);
soundPct = constrain(soundPct, 0, 100);
long ts = millis() / 1000;
String payload = "{";
payload += "\"ts\":" + String(ts) + ",";
payload += "\"metrics\":{\"sound_level\":" + String(soundPct) + "},";
payload += "\"status\":{\"noise\":\"normal\"}";
payload += "}";
mqtt.publish(MQTT_TOPIC, payload.c_str());
Serial.println(payload);
}
}
6) Lỗi thường gặp & kinh nghiệm thực tế
- ADC nhảy loạn
- Lấy trung bình 10–20 mẫu
- Nhạy quá
- Giảm gain bằng biến trở trên module
- Dùng DO cho sai
- AO chính xác & linh hoạt hơn
7) Ứng dụng thực tế
- Phát hiện tiếng động ban đêm
- Smart room (vỗ tay bật đèn – nâng cao)
- Báo động đơn giản
- Phân tích môi trường âm thanh
🎯 TỔNG KẾT LEVEL 1 – ESP32 & CẢM BIẾN
Sau 10 bài, bạn đã:
- Làm chủ digital sensor
- Hiểu và dùng được analog sensor cơ bản
- Chuẩn hoá dữ liệu IoT (ADC → % → MQTT)
- Theo dõi realtime trên IoTLabs Cloud
👉 Level 2 sẽ bắt đầu với cảm biến analog nâng cao:
- MQ-x (Gas, Air Quality)
- Soil Moisture
- Temp / Humidity (DHT, SHT)
- Threshold + Rule Engine


