IoTLabs

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

Series ESP32 & Cảm biến: Bài 10 – Đọc cảm biến Sound Sensor (KY-038/KY-037): đo mức âm thanh & theo dõi realtime

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ườngtheo 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:

  1. Đọc mức âm thanh local (Serial)
  2. 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 thanhADC (ước lượng)
Yên tĩnh0 – 300
Bình thường300 – 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–30yên tĩnh
30–70bì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