Modul mikrofon FC-04 memberi tahu dashboard setiap kali ada suara keras: pintu dibanting, barang jatuh, atau anjing menggonggong. Klenik juga mencatat berapa kali suara keras terjadi tiap menit.
FC-04 punya mikrofon dan komparator. Selama suara di bawah ambang, pin OUT bernilai HIGH. Begitu suara lebih keras dari ambang, OUT turun ke LOW sesaat dan LED kecil di modul ikut menyala. Ambangnya diatur dengan memutar trimpot biru di modul.
Satu tepukan atau benturan membuat OUT berkedip beberapa kali, jadi setelah satu deteksi ESP8266 mengabaikan sensor selama 300 ms. Indikator di dashboard menyala saat suara pertama dan baru padam 2 detik setelah suara terakhir. Setiap 60 detik jumlah suara keras dikirim ke gauge lalu dihitung ulang dari nol.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| Modul Sensor Suara FC-04 Sound Detector Module M | 1 | Rp8.245 |
| Kabel jumper female-female 10 cm (isi 10)isi 10, terpakai 3 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp53.745 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Sensor suara FC-04 (keluaran digital) OUT | → | D7 GPIO13 | kuning |
| Sensor suara FC-04 (keluaran digital) VCC | → | 3V | merah |
| Sensor suara FC-04 (keluaran digital) GND | → | G | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p053.json, ganti budi1234 dengan KODE-mu, lalu import di Klenik (menu titik tiga → Export / Import → Import → Ganti total). Langkah lengkapnya ada di Panduan Klenik.
| Widget | Topic | Setting |
|---|---|---|
| Indikator Boolean Suara Keras | ichibot/KODE/p053/keras | ON = 1 “BERISIK!”, OFF = 0 |
| Gauge Suara Keras per Menit | ichibot/KODE/p053/jumlah | 0–60 x |
| Text Log Kejadian | ichibot/KODE/p053/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). Board di Arduino IDE: NodeMCU 1.0 (ESP-12E Module).
Isi dulu nama WiFi dan password di bagian ISI DULU, lalu ganti budi1234 di baris topic dengan KODE-mu, lalu upload dan buka Serial Monitor (115200).
// Proyek 053 - Detektor Suara Keras
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// ===== ISI DULU =====
const char* WIFI_NAMA = "nama-wifi-kamu";
const char* WIFI_PASS = "password-wifi-kamu";
// topic MQTT: ganti budi1234 dengan KODE-mu (sama dengan di dashboard Klenik)
const char* TOPIK_KERAS = "ichibot/budi1234/p053/keras";
const char* TOPIK_LOG = "ichibot/budi1234/p053/log";
const char* TOPIK_JUMLAH = "ichibot/budi1234/p053/jumlah";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int SENSOR = D7; // OUT FC-04: LOW saat suara melewati ambang
int jumlah = 0; // suara keras dalam menit ini
unsigned long terakhir = 0, awalMenit = 0, nyalaSampai = 0;
void langganan() {
// proyek ini hanya mengirim, tidak berlangganan topic apa pun
}
sambungWiFi() dan sambungMQTT(): sama di semua proyek (klik untuk lihat)
void sambungWiFi() {
WiFi.begin(WIFI_NAMA, WIFI_PASS);
Serial.print("WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" OK, IP " + WiFi.localIP().toString());
}
void sambungMQTT() {
while (!mqtt.connected()) {
if (mqtt.connect(WiFi.macAddress().c_str())) {
Serial.println("Terhubung ke Klenik");
langganan();
} else {
Serial.println("Broker gagal, coba lagi 3 detik");
delay(3000);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(SENSOR, INPUT);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (digitalRead(SENSOR) == LOW && millis() - terakhir > 300) {
terakhir = millis();
jumlah++;
if (!nyalaSampai) { // awal rentetan suara: kabari sekali saja
mqtt.publish(TOPIK_KERAS, "1");
mqtt.publish(TOPIK_LOG, "Ada suara keras!");
}
nyalaSampai = millis() + 2000; // indikator padam 2 detik setelah suara terakhir
}
if (nyalaSampai && (long)(millis() - nyalaSampai) >= 0) {
nyalaSampai = 0;
mqtt.publish(TOPIK_KERAS, "0");
}
if (millis() - awalMenit >= 60000) {
awalMenit = millis();
mqtt.publish(TOPIK_JUMLAH, String(jumlah).c_str());
Serial.println("Suara keras menit ini: " + String(jumlah));
jumlah = 0;
}
}Langkah 4: Pahami kodenya
- OUT dari FC-04 hanya HIGH atau LOW, jadi cukup pin digital biasa. Modul ini tidak bisa mengukur seberapa keras suaranya. Untuk itu pakai MAX4466 di proyek 054.
- Jeda 300 ms setelah tiap deteksi supaya satu benturan tidak terhitung berkali-kali.
- Pesan ke Text Log hanya dikirim di awal rentetan suara. Tanpa ini, satu menit ribut bisa mengirim puluhan pesan yang sama.
- Setiap 60 detik hitungan dikirim ke gauge, lalu diulang dari nol.