Komponen · 15 mnt baca

Sensor Suara Arduino (KY-038): Saklar Tepuk dan Tingkat Suara

Bagaimana cara kerja sensor suara Arduino KY-038/KY-037? Pengaturan potensiometer, tingkat suara peak-to-peak, lampu tepuk dua kali, bar LED, kode ESP32 dan Pico, serta fakta soal dB.

Ketika orang membicarakan sensor suara Arduino, biasanya yang dimaksud adalah KY-038: modul murah yang menggabungkan mikrofon electret kecil, komparator LM393, dan potensiometer sensitivitas berwarna biru dalam satu board. Saudaranya yang bermikrofon besar, KY-037, bekerja dengan cara yang sama. Kamu tidak butuh library: pin DO berubah state ketika suara melewati ambang dan dibaca dengan digitalRead(), sedangkan pin AO memberi sinyal mentah mikrofon dan dibaca dengan analogRead(). Lampu yang menyala dengan tepukan, alarm kebisingan, dan lampu yang bereaksi terhadap suara semuanya dibuat dengan modul ini.

Tapi sensor ini punya batasan penting yang sering dilewati banyak tutorial: KY-038 adalah pendeteksi ada suara / tidak ada suara. Sensor ini tidak merekam audio, tidak mengenali ucapan, dan tidak bisa mengukur desibel. Di artikel ini kamu akan mempelajari cara kerja rangkaian di modul, cara mengatur potensiometer dengan benar, kenapa pembacaan analog sering terlihat sama sekali tidak berubah, dan cara mengukur kerasnya suara dengan benar memakai metode peak-to-peak. Setelah itu kamu akan membuat lampu yang menyala dan mati dengan dua kali tepukan serta bar tingkat suara 8 LED, mengerjakan hal yang sama dengan ESP32 dan Raspberry Pi Pico, lalu melihat modul apa yang sebaiknya dipakai ketika kamu butuh pengukuran suara sungguhan.

Modul sensor suara KY-038 (mikrofon electret dan LM393)
Sensor suara KY-038: mikrofon electret di kanan, komparator LM393 dan potensiometer sensitivitas biru di tengah, serta pin AO, G, +, dan DO di kiri.

Apa itu sensor suara dan bagaimana cara kerjanya?

Silinder perak di ujung board adalah mikrofon kondensor electret. Di dalamnya, diafragma tipis berhadapan dengan pelat yang membawa muatan listrik permanen, sehingga membentuk kapasitor yang sangat kecil. Suara adalah gelombang tekanan di udara; ketika gelombang itu mendorong diafragma maju-mundur, kapasitansinya berubah dan muncul perubahan tegangan yang sangat kecil. Sebuah JFET mungil di dalam kapsul menjadi buffer untuk sinyal ini, itulah sebabnya mikrofon electret diberi daya lewat resistor dan punya polaritas. Hasilnya, di mikrofon muncul gelombang suara yang hanya beberapa milivolt dan menumpang di atas tegangan DC tetap.

Chip LM393 8 pin di tengah board berisi dua komparator, dan modul ini memakai salah satunya. Komparator membandingkan dua tegangan: sinyal dari mikrofon dan ambang yang diatur potensiometer. Begitu sinyal melewati ambang, output berubah state, lalu pin DO dan LED kedua di board ikut bereaksi. Ini detail yang sangat penting: komparator bukan penguat. Komparator tidak membesarkan sinyal; ia hanya menjawab pertanyaan “di atas atau di bawah ambang?”. Pin AO membawa sinyal mentah mikrofon yang tidak dikuatkan, dan karena itulah pembacaan analognya sangat lemah.

FiturNilai
MikrofonKapsul kondensor electret, omnidirectional
KomparatorLM393 (komparator ganda, satu yang dipakai)
Catu daya3,3–5 V
ArusBeberapa mA (sekitar 5–10 mA termasuk LED)
OutputAO: sinyal mentah mikrofon, DO: output ambang
Pengaturan sensitivitasTrimmer multi-putaran biru (biasanya tipe 3296)
LEDSatu untuk daya, satu untuk state DO
Urutan pinAO, G, +, DO

KY-038 vs KY-037

KY-038 dan KY-037 memakai rangkaian yang sama, LM393 yang sama, dan urutan pin yang sama, jadi setiap sketch di artikel ini berjalan di keduanya tanpa perubahan. Bedanya ada di kapsul mikrofon: KY-037 punya kapsul lebih besar dan dijual sebagai “sensor suara sensitivitas tinggi”, sedangkan KY-038 punya kapsul lebih kecil dan merupakan model yang paling sering kamu temukan di kit sensor. Dalam praktiknya, keduanya menangkap suara keras di dekatnya dengan baik, tapi tidak ada yang bisa mendengar orang berbicara di sisi lain ruangan. Kamu juga akan menemukan modul suara LM393 3 pin yang hanya punya output digital; pada kebanyakan modul ini, output menjadi LOW ketika ada suara.

ModelPinMikrofonCatatan
KY-038AO, G, +, DOKapsul kecilModel paling umum di kit sensor
KY-037AO, G, +, DOKapsul besarRangkaian dan kode yang sama; biasanya sedikit lebih sensitif
Modul suara LM393 3 pinVCC, GND, OUTKapsul kecilHanya output digital; OUT biasanya menjadi LOW ketika ada suara

Pengkabelan sensor suara: Arduino Uno, ESP32, dan Pico

Pin modulArduino UnoESP32Raspberry Pi Pico
+5V3V33V3(OUT), pin 36
GGNDGNDGND, pin 38
AOA0GPIO 34 (ADC1)GP26 (ADC0), pin 31
DOD2GPIO 27GP15, pin 20
Pin ESP32 dan Pico dirancang untuk 3,3 V. Di board ini, beri daya sensor suara dari pin 3V3, bukan dari 5V, VIN, atau VBUS; kalau tidak, output DO naik ke 5 V dan bisa merusak pin input. Di ESP32, pakai salah satu pin ADC1 (GPIO 32–39) untuk AO: pin ADC2 tidak bisa dibaca dengan analogRead() selama Wi-Fi aktif.

Output digital (DO) dan pengaturan potensiometer

Pin DO adalah jawaban ya/tidak. Di banyak board KY-038, DO menjadi HIGH dan LED kedua menyala ketika suara melewati ambang; di sebagian board tiruan dan modul 3 pin, kebalikannya. Karena itu sketch-nya menyimpan level yang berarti “ada suara” di konstanta bernama SOUND_ACTIVE. Poin penting kedua: DO tidak memberi satu pulsa panjang untuk setiap tepukan. Karena gelombang suara naik melewati ambang dan turun di bawahnya ratusan kali per detik, output juga menyala dan mati secepat itu; satu tepukan menghasilkan semburan pulsa pendek yang berlangsung beberapa puluh milidetik. Kebanyakan board tidak punya histeresis di komparatornya, jadi output juga bergetar naik-turun dengan suara yang dekat dengan ambang. Jadi, baca DO dengan loop cepat tanpa delay() atau dengan interrupt, dan anggap pulsa-pulsa yang berdekatan sebagai satu kejadian.

  1. Hubungkan modul dan letakkan sensor di tempat yang akan dipakai, pada waktu dengan kebisingan latar yang normal; selalu atur sensor di lingkungan sebenarnya.
  2. Lihat LED DO di board. Jika LED tetap menyala dalam keadaan hening, ambangnya terlalu sensitif; putar potensiometer dengan obeng kecil sampai LED padam.
  3. Jika LED tidak pernah menyala, putar ke arah sebaliknya untuk mencari titik ketika LED mulai menyala.
  4. Dari titik itu, putar balik setengah sampai satu putaran ke arah LED tetap padam. Dengan begitu, suara yang konstan seperti kulkas atau kipas tidak akan memicunya.
  5. Tepuk tangan dari jarak sekitar satu meter: LED harus berkedip sebentar. Jika LED juga menyala dengan percakapan biasa, putar sedikit ke arah kurang sensitif; jika tidak menyala dengan tepukan, putar sedikit ke arah lebih sensitif.
Potensiometer biru di board ini biasanya trimmer multi-putaran tipe 3296 yang butuh sekitar 25 putaran dari ujung ke ujung. Jika kamu memutarnya beberapa kali dan tidak melihat perubahan di LED, potensiometernya tidak rusak; kamu cuma perlu terus memutar. Di ujung jalurnya, sekrupnya mulai selip, jadi tidak perlu dipaksa.
C++ (Arduino IDE)
1// KY-038 DO testi: sesi algıla ve dahili LED'i yak / KY-038 DO test: detect sound and light the built-in LED
2const int SOUND_DO = 2;               // modülün DO pini / module DO pin
3const int SOUND_ACTIVE = HIGH;        // ses gelince HIGH; kartın tersse LOW / HIGH on sound; LOW if your board is inverted
4const unsigned long HOLD_MS = 200;    // yeni olay için gereken sessizlik / silence needed for a new event
5
6unsigned long lastSound = 0;
7unsigned long events = 0;
8
9void setup() {
10  Serial.begin(9600);
11  pinMode(SOUND_DO, INPUT);
12  pinMode(LED_BUILTIN, OUTPUT);
13}
14
15void loop() {
16  unsigned long now = millis();
17  if (digitalRead(SOUND_DO) == SOUND_ACTIVE) {
18    if (now - lastSound > HOLD_MS) {  // sessizlikten sonra ilk darbe / first pulse after silence
19      events++;
20      Serial.print(F("Ses algilandi / Sound detected #"));
21      Serial.println(events);
22    }
23    lastSound = now;                  // darbe yağmuru süreyi uzatır / the pulse burst extends the time
24  }
25  digitalWrite(LED_BUILTIN, now - lastSound < HOLD_MS ? HIGH : LOW);  // LED en az 200 ms yanar / LED stays on at least 200 ms
26}

Sketch ini membaca pin DO di setiap loop tanpa delay(). Setiap kali DO aktif, waktu lastSound diperbarui; kejadian baru hanya dihitung setelah 200 ms hening, jadi semburan pulsa dari satu tepukan muncul sebagai satu baris saja di Serial Monitor. LED bawaan juga dibiarkan menyala minimal 200 ms; kalau tidak, pulsa sepanjang milidetik tidak akan terlihat oleh matamu. Jika penghitungnya terus naik dalam keadaan hening, berarti ambangnya terlalu sensitif atau output DO board-mu terbalik; untuk kasus kedua, atur SOUND_ACTIVE ke LOW.

Kenapa pembacaan analog (AO) sangat lemah?

Kebanyakan pemula menghubungkan AO ke A0, menampilkan nilai analogRead(), lalu melihat angka sekitar 500 yang hampir tidak berubah walaupun ada suara. Sensornya tidak rusak; masalahnya ada di skala. ADC 10-bit di Arduino Uno membagi 0–5 V menjadi 1024 langkah, jadi satu langkah sekitar 4,9 mV. Dengan suara normal, sinyal yang dihasilkan mikrofon jauh lebih kecil dari satu langkah itu:

SuaraPerkiraan levelOutput mikrofon (peak-to-peak)Langkah ADC di Uno
Bisikan30 dB SPL~0,01 mV0
Percakapan biasa (1 m)60 dB SPL~0,4 mV0 (tidak terlihat)
TV yang keras, lalu lintas80 dB SPL~3,6 mV0–1
Suara sangat keras (1 Pa)94 dB SPL~18 mV3–4
Tepukan tajam atau klakson mobil dari dekat110 dB SPL~110 mV~23

Tabel ini dihitung dengan −44 dBV/Pa, sensitivitas kapsul electret pada umumnya, dengan asumsi suaranya berbentuk sinus. Tergantung resistor bias mikrofon di board-mu, nilai sebenarnya bisa beberapa kali lebih besar, tapi kesimpulannya tetap sama: AO hanya melihat dengan jelas suara yang dekat dan keras, sedangkan percakapan biasa dan bisikan jatuh di bawah resolusi Uno. Penjelasan lebih lanjut tentang cara kerja ADC ada di Apa Itu ADC?.

Alasan kedua adalah sifat suara itu sendiri. Suara adalah gelombang yang berayun naik-turun di sekitar level DC. Satu kali analogRead() menangkap momen acak dari gelombang itu: bisa jatuh di puncak, di lembah, atau tepat di tengah. Jadi besar satu pembacaan tidak memberi tahu apa pun tentang seberapa keras suaranya. Alasan ketiga adalah kecepatan: Uno butuh sekitar 100 mikrodetik untuk setiap pembacaan analog, jadi paling banyak hanya bisa mengambil sekitar 10.000 sampel per detik. Itu cukup untuk mengikuti tingkat suara, tapi tidak cukup untuk merekam audio atau menganalisis frekuensi. Terakhir, noise di catu 5 V dari USB langsung bocor ke AO. Dua masalah pertama bisa kamu atasi dengan metode pengukuran yang tepat.

Mengukur amplitudo peak-to-peak: membaca kerasnya suara dengan benar

Metode yang tepat adalah mengambil sampel sebanyak mungkin dalam jendela waktu yang singkat, lalu mencari nilai terbesar dan terkecilnya. Selisih keduanya adalah amplitudo peak-to-peak, dan nilai ini menunjukkan seberapa kuat suaranya tanpa terpengaruh level DC. 50 ms adalah jendela yang bagus: satu periode 20 Hz, frekuensi terendah yang bisa didengar telinga manusia, tepat 50 ms, jadi bahkan suara paling rendah pun muat satu gelombang penuh di jendela itu. Dalam waktu tersebut Uno mengambil sekitar 450–500 sampel.

C++ (Arduino IDE)
1// Tepe-tepe genlik ölçümü (Seri Çizici için) / Peak-to-peak amplitude (for the Serial Plotter)
2const int SOUND_AO = A0;                 // modülün AO pini / module AO pin
3const unsigned long WINDOW_MS = 50;      // 50 ms = 20 Hz'in bir periyodu / one period of 20 Hz
4
5void setup() {
6  Serial.begin(115200);
7}
8
9void loop() {
10  int minV = 1023, maxV = 0;
11  long sum = 0;
12  int count = 0;
13  unsigned long start = millis();
14  while (millis() - start < WINDOW_MS) { // yaklaşık 450-500 örnek / about 450-500 samples
15    int v = analogRead(SOUND_AO);
16    if (v < minV) minV = v;
17    if (v > maxV) maxV = v;
18    sum += v;
19    count++;
20  }
21  int p2p = maxV - minV;                 // tepe-tepe genlik / peak-to-peak amplitude
22  float mv = p2p * 5000.0 / 1024.0;      // milivolt karşılığı / in millivolts
23
24  Serial.print(F("p2p:"));
25  Serial.print(p2p);
26  Serial.print(F(" ortalama_avg:"));     // AO'nun DC seviyesi; istemezsen bu iki satırı sil / DC level of AO; delete these two lines if not needed
27  Serial.print(sum / count);
28  Serial.print(F(" mV:"));
29  Serial.println(mv, 1);
30}

Setelah meng-upload sketch, buka Serial Plotter dari menu Tools dan atur kecepatannya ke 115200. Di ruangan yang tenang, p2p biasanya tetap di antara 0 dan 3; nilainya naik beberapa unit ketika kamu berbicara di dekat mikrofon dan naik puluhan unit ketika kamu bertepuk tangan dari dekat. Nilai ortalama_avg adalah level DC dari AO, dan karena nilai ini memperlebar skala grafik, kamu bisa menghapus dua baris ortalama_avg kalau ingin mengikuti p2p dengan nyaman. Di sebagian board, potensiometer juga menggeser level DC ini; jika rata-ratanya tertahan di 0 atau 1023, sinyalnya terpotong (clipping), jadi putar potensiometer sampai nilainya mendekati tengah. Kalau kamu baru mengenal Serial Plotter, lihat Serial Monitor Arduino.

Langkah demi langkah: menyalakan lampu dengan dua kali tepukan

Lampu tepuk adalah proyek sensor suara yang paling terkenal, tapi rangkaian yang bekerja dengan satu tepukan juga terpicu oleh pintu yang dibanting, buku yang jatuh, atau batuk, sehingga lampunya terus menyala-mati. Solusinya adalah mencari ritme: sketch di bawah hanya bereaksi pada tepat dua tepukan yang berjarak 0,12 sampai 0,7 detik. Satu suara saja, atau tiga suara atau lebih (musik, tepuk tangan penonton, anjing menggonggong), diabaikan.

  1. Hubungkan pin + KY-038 ke 5V, G ke GND, dan DO ke D2.
  2. Hubungkan pin VCC modul relay ke 5V, GND ke GND, dan IN ke D7. Cara kerja relay dan cara menyambungkan sisi beban ada di Apa Itu Modul Relay?; lakukan uji pertamamu dengan LED bawaan relay, bukan dengan lampu.
  3. Upload sketch-nya dan buka Serial Monitor di 9600 baud.
  4. Tepuk tangan dua kali dari jarak satu atau dua meter. Kamu seharusnya hanya melihat satu baris “Alkis / Clap” untuk setiap tepukan; jika satu tepukan terhitung lebih dari sekali, putar potensiometer sedikit ke arah kurang sensitif.
  5. Perhatikan lampu berganti state sekitar 0,7 detik setelah tepukan kedua.
C++ (Arduino IDE)
1// Çift alkışla lamba (röle) / Double-clap lamp (relay)
2const int SOUND_DO = 2;                     // KY-038 DO pini / KY-038 DO pin
3const int RELAY = 7;                        // röle modülü IN / relay module IN
4const int SOUND_ACTIVE = HIGH;              // kartın tersse LOW / LOW if your board is inverted
5const int RELAY_ON = LOW;                   // aktif LOW röle modülü / active-LOW relay module
6const int RELAY_OFF = HIGH;
7const unsigned long QUIET_GAP_MS = 120;     // yeni alkış için gereken sessizlik / silence needed before a new clap
8const unsigned long CLAP_WINDOW_MS = 700;   // dizinin bittiğine karar verme süresi / time to decide the series is over
9const unsigned long LOCKOUT_MS = 1000;      // röle tıkırtısını yok say / ignore the relay click
10
11int clapCount = 0;
12unsigned long lastPulse = 0;                // DO'nun son aktif olduğu an / last time DO was active
13unsigned long lastToggle = 0;               // lambanın son değiştiği an / last time the lamp changed
14bool lampOn = false;
15
16void setup() {
17  Serial.begin(9600);
18  pinMode(SOUND_DO, INPUT);
19  pinMode(RELAY, OUTPUT);
20  digitalWrite(RELAY, RELAY_OFF);           // lamba kapalı başlar / lamp starts off
21}
22
23void loop() {
24  unsigned long now = millis();
25
26  if (digitalRead(SOUND_DO) == SOUND_ACTIVE) {
27    bool locked = now - lastToggle < LOCKOUT_MS;
28    if (!locked && now - lastPulse >= QUIET_GAP_MS) {  // sessizlikten sonra ilk darbe = yeni alkış / first pulse after silence = new clap
29      clapCount++;
30      Serial.print(F("Alkis / Clap: "));
31      Serial.println(clapCount);
32    }
33    lastPulse = now;                        // aynı alkışın darbeleri süreyi uzatır / pulses of the same clap extend the time
34  }
35
36  if (clapCount > 0 && now - lastPulse > CLAP_WINDOW_MS) {  // dizi bitti / the series is over
37    if (clapCount == 2) {                   // yalnız tam iki alkış / exactly two claps only
38      lampOn = !lampOn;
39      digitalWrite(RELAY, lampOn ? RELAY_ON : RELAY_OFF);
40      lastToggle = now;
41      if (lampOn) Serial.println(F("Lamba ACIK / Lamp ON"));
42      else Serial.println(F("Lamba KAPALI / Lamp OFF"));
43    }
44    clapCount = 0;                          // 1, 3 ve fazlası yok sayılır / 1, 3 or more are ignored
45  }
46}
KonstantaNilaiKegunaan
SOUND_ACTIVEHIGHLevel DO ketika ada suara; atur ke LOW jika board-mu terbalik
QUIET_GAP_MS120 msHening yang dibutuhkan sebelum tepukan baru dihitung; semburan pulsa dan gema dari satu tepukan dihitung sebagai satu tepukan
CLAP_WINDOW_MS700 msSetelah hening selama ini sejak suara terakhir, rangkaian tepukan dianggap selesai dan tepukannya dievaluasi
LOCKOUT_MS1000 msSetelah lampu berganti, suara diabaikan agar bunyi klik relay tidak dikira tepukan baru
RELAY_ON / RELAY_OFFLOW / HIGHUntuk modul relay aktif LOW; tukar nilainya di board aktif HIGH

Sketch ini tidak memakai delay(); semuanya diukur dengan millis(), jadi waktu tepukan tidak pernah terlewat. Pendekatan ini kami jelaskan secara detail di millis vs delay. Lampu yang berganti 0,7 detik setelah tepukan kedua, bukan langsung, adalah pilihan yang disengaja: sketch menunggu apakah ada tepukan ketiga. Kalau kamu ingin respons lebih cepat, kamu bisa menurunkan CLAP_WINDOW_MS ke 400–500 ms, tapi kamu harus bertepuk lebih cepat. Jika ruanganmu sangat bergema dan satu tepukan terhitung dua kali, naikkan QUIET_GAP_MS ke 150–200 ms.

Menyambung-putus tegangan listrik PLN (110–230 V) dengan relay bisa mematikan. Buat sambungan dengan steker tercabut, jangan sisakan ujung kabel yang terbuka, dan masukkan rangkaian ke kotak tertutup yang terisolasi; kalau ragu, coba dulu dengan LED strip 12 V. Jauhkan juga sensor dari relay: jika bunyi klik relay sangat dekat dengan mikrofon, bunyi itu bisa menimbulkan masalah walaupun sudah ada waktu lockout.

Bar tingkat suara: VU meter 8 LED

Memasukkan nilai peak-to-peak langsung ke LED memang bisa, tapi hasilnya terlihat kurang alami, karena telinga kita menangkap suara secara logaritmik: suara dengan amplitudo dua kali lipat tidak terdengar dua kali lebih keras. Itulah sebabnya suara diukur dalam desibel (dB). Untuk amplitudo, rumusnya dB = 20 × log10(p2p / referensi); amplitudo dua kali lipat berarti +6 dB dan sepuluh kali lipat berarti +20 dB. Sketch di bawah mengukur tingkat bising dasar ruangan selama satu detik ketika mulai berjalan dan memakainya sebagai referensi; setiap LED mewakili 3 dB di atas tingkat dasar itu. Hubungkan LED ke pin D3–D10, masing-masing dengan resistor 220 Ω; untuk LED warna lain, resistor yang tepat bisa kamu cari dengan kalkulator resistor LED.

C++ (Arduino IDE)
1// 8 LED'li ses seviyesi göstergesi (VU metre) / 8-LED sound level bar (VU meter)
2const int SOUND_AO = A0;                    // modülün AO pini / module AO pin
3const int LED_PINS[8] = {3, 4, 5, 6, 7, 8, 9, 10};  // her LED 220 Ω ile / each LED with 220 Ω
4const float DB_PER_LED = 3.0;               // her LED 3 dB / each LED is 3 dB
5const unsigned long FALL_MS = 80;           // LED'ler bu aralıkla birer birer söner / LEDs drop one by one at this rate
6
7float noiseFloor = 1.0;                     // sessiz ortamın p2p değeri / quiet-room p2p
8int shown = 0;                              // yanan LED sayısı / number of lit LEDs
9unsigned long lastFall = 0;
10
11int readPeakToPeak() {
12  int minV = 1023, maxV = 0;
13  unsigned long start = millis();
14  while (millis() - start < 50) {           // 50 ms pencere / 50 ms window
15    int v = analogRead(SOUND_AO);
16    if (v < minV) minV = v;
17    if (v > maxV) maxV = v;
18  }
19  return maxV - minV;
20}
21
22void setup() {
23  Serial.begin(115200);
24  for (int i = 0; i < 8; i++) pinMode(LED_PINS[i], OUTPUT);
25  long sum = 0;
26  for (int i = 0; i < 20; i++) sum += readPeakToPeak();  // 1 sn sessizlik ölç / measure 1 s of silence
27  noiseFloor = sum / 20.0;
28  if (noiseFloor < 1.0) noiseFloor = 1.0;
29}
30
31void loop() {
32  int p2p = readPeakToPeak();
33  if (p2p < 1) p2p = 1;
34  float db = 20.0 * log10(p2p / noiseFloor);  // tabana göre göreceli dB / relative dB above the floor
35  int level = constrain((int)(db / DB_PER_LED), 0, 8);
36
37  unsigned long now = millis();
38  if (level >= shown) {                     // yükselişte anında / rise instantly
39    shown = level;
40    lastFall = now;
41  } else if (now - lastFall >= FALL_MS) {   // inişte yavaşça / fall slowly
42    shown--;
43    lastFall = now;
44  }
45  for (int i = 0; i < 8; i++) digitalWrite(LED_PINS[i], i < shown ? HIGH : LOW);
46
47  Serial.print(F("dB:"));
48  Serial.println(db, 1);
49}

Tetaplah diam selama satu detik ketika sketch mulai berjalan; jika kamu berbicara pada waktu itu, tingkat dasarnya terukur terlalu tinggi dan bar-nya jadi kurang responsif. Bar naik seketika tapi turun pelan-pelan, satu LED setiap 80 ms; itu juga alasan VU meter sungguhan terlihat mulus, tidak bergetar. Karena sinyal analog KY-038 lemah, 2–3 dB per LED paling cocok; jika kamu memakai sketch yang sama dengan mikrofon berpenguat seperti MAX4466, kamu bisa menaikkan DB_PER_LED ke 4–6 dB. Untuk tampilan berwarna, kamu bisa memakai cincin NeoPixel sebagai pengganti LED; detailnya ada di LED WS2812B NeoPixel.

Sensor suara dengan ESP32: deteksi tepukan dengan interrupt

ADC ESP32 adalah 12-bit dan memberi nilai 0 sampai 4095; pada rentang 3,3 V, satu langkahnya sekitar 0,8 mV, kira-kira 6 kali lebih halus dari Uno. Di sisi lain, ADC ESP32 lebih banyak noise, jadi nilai p2p di ruangan yang tenang juga lebih tinggi; perhitungan dB relatif akan menyeimbangkan ini dengan sendirinya. Di sketch di bawah, pin DO dipasangi interrupt: pulsa tepukan tidak terlewat walaupun loop() sedang sibuk mengukur tingkat suara dari AO selama 50 ms. Fungsi interrupt ditaruh di RAM dengan IRAM_ATTR dan dibuat singkat, sedangkan variabel yang dipakai bersama oleh interrupt dan loop() dideklarasikan volatile dan dilindungi dengan critical section.

C++ (Arduino IDE)
1// ESP32: kesmeyle çift alkış + ses seviyesi / ESP32: double clap via interrupt + sound level
2const int SOUND_AO = 34;                    // ADC1 pini, Wi-Fi açıkken de çalışır / ADC1 pin, works with Wi-Fi on
3const int SOUND_DO = 27;                    // modülün DO pini / module DO pin
4const int RELAY = 26;                       // röle modülü IN / relay module IN
5const int SOUND_ACTIVE = HIGH;              // kartın tersse LOW / LOW if your board is inverted
6const int RELAY_ON = LOW;                   // aktif LOW röle / active-LOW relay
7const int RELAY_OFF = HIGH;
8const unsigned long QUIET_GAP_MS = 120;     // yeni alkış için sessizlik / silence before a new clap
9const unsigned long CLAP_WINDOW_MS = 700;   // dizinin bitmesi / end of the series
10const unsigned long LOCKOUT_MS = 1000;      // röle tıkırtısını yok say / ignore the relay click
11
12portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;  // kesme ile loop arasında kilit / lock between ISR and loop
13volatile int clapCount = 0;
14volatile unsigned long lastPulse = 0;
15volatile unsigned long lastToggle = 0;
16bool lampOn = false;
17float noiseFloor = 1.0;
18
19void IRAM_ATTR onSound() {                  // kısa tutulur, RAM'den çalışır / kept short, runs from RAM
20  unsigned long now = millis();
21  portENTER_CRITICAL_ISR(&mux);
22  if (now - lastToggle >= LOCKOUT_MS && now - lastPulse >= QUIET_GAP_MS) clapCount++;
23  lastPulse = now;
24  portEXIT_CRITICAL_ISR(&mux);
25}
26
27int readPeakToPeak() {
28  int minV = 4095, maxV = 0;
29  unsigned long start = millis();
30  while (millis() - start < 50) {           // 50 ms pencere / 50 ms window
31    int v = analogRead(SOUND_AO);           // 0-4095 (12 bit)
32    if (v < minV) minV = v;
33    if (v > maxV) maxV = v;
34  }
35  return maxV - minV;
36}
37
38void setup() {
39  Serial.begin(115200);
40  pinMode(SOUND_DO, INPUT);
41  pinMode(RELAY, OUTPUT);
42  digitalWrite(RELAY, RELAY_OFF);
43  long sum = 0;
44  for (int i = 0; i < 20; i++) sum += readPeakToPeak();  // 1 sn sessiz ortam / 1 s of quiet room
45  noiseFloor = sum / 20.0;
46  if (noiseFloor < 1.0) noiseFloor = 1.0;
47  attachInterrupt(digitalPinToInterrupt(SOUND_DO), onSound, SOUND_ACTIVE == HIGH ? RISING : FALLING);
48}
49
50void loop() {
51  int p2p = readPeakToPeak();               // bu sırada alkışları kesme yakalar / the interrupt catches claps meanwhile
52  float db = 20.0 * log10((p2p < 1 ? 1 : p2p) / noiseFloor);
53  Serial.printf("p2p:%d dB:%.1f\n", p2p, db);
54
55  portENTER_CRITICAL(&mux);
56  unsigned long now = millis();
57  int claps = clapCount;
58  bool finished = claps > 0 && now - lastPulse > CLAP_WINDOW_MS;
59  if (finished) clapCount = 0;              // dizi bitti, sayacı sıfırla / series over, reset the counter
60  portEXIT_CRITICAL(&mux);
61
62  if (finished && claps == 2) {             // yalnız tam iki alkış / exactly two claps only
63    lampOn = !lampOn;
64    digitalWrite(RELAY, lampOn ? RELAY_ON : RELAY_OFF);
65    portENTER_CRITICAL(&mux);
66    lastToggle = millis();
67    portEXIT_CRITICAL(&mux);
68    Serial.println(lampOn ? "Lamba ACIK / Lamp ON" : "Lamba KAPALI / Lamp OFF");
69  }
70}

Sketch ini menjalankan logika tepuk dua kali yang sama seperti di Uno, hanya saja di dalam interrupt, dan menampilkan tingkat suara dalam dB kira-kira setiap 50 ms. Hubungkan pin IN modul relay ke GPIO 26; sebagian modul relay aktif LOW yang diberi daya 5 V tidak benar-benar lepas dengan level HIGH 3,3 V dari ESP32, jadi dalam kasus itu pilih modul yang bisa dikendalikan dengan 3,3 V. Kekuatan sebenarnya ESP32 adalah Wi-Fi: jika tingkat suara tetap di atas ambang selama beberapa detik (misalnya bayi menangis atau anjing menggonggong), kamu bisa mengirim notifikasi ke ponselmu. Untuk itu pakai cara di Bot Telegram ESP32, dan MQTT ESP32 dan Home Assistant untuk menghubungkannya ke sistem otomasi rumah.

Sensor suara dengan Raspberry Pi Pico dan MicroPython

Di Raspberry Pi Pico, beri daya modul dari pin 3V3(OUT), lalu hubungkan AO ke GP26 dan DO ke GP15; sebagai pengganti lampu, pasang LED dengan resistor 220 Ω di GP14. ADC Pico adalah 12-bit, tapi di MicroPython read_u16() menskalakan nilainya ke 0–65535; itulah sebabnya angka p2p terlihat jauh lebih besar daripada di Uno, sedangkan perhitungan dB relatifnya tetap sama. Interrupt di pin DO dipasang dengan Pin.irq().

MicroPython
1# Raspberry Pi Pico: çift alkış + ses seviyesi / double clap + sound level
2from machine import Pin, ADC
3import time, math
4
5sound_ao = ADC(26)                  # GP26 = ADC0, modülün AO pini / module AO pin
6sound_do = Pin(15, Pin.IN)          # modülün DO pini / module DO pin
7lamp = Pin(14, Pin.OUT, value=0)    # LED (220 Ω ile) / LED (with 220 Ω)
8
9QUIET_GAP_MS = 120                  # yeni alkış için sessizlik / silence before a new clap
10CLAP_WINDOW_MS = 700                # dizinin bitmesi / end of the series
11LOCKOUT_MS = 1000                   # değişimden sonra sesleri yok say / ignore sounds after a toggle
12
13claps = 0
14last_pulse = time.ticks_ms()
15last_toggle = time.ticks_ms()
16
17def on_sound(pin):                  # kesme fonksiyonu / interrupt handler
18    global claps, last_pulse
19    now = time.ticks_ms()
20    if (time.ticks_diff(now, last_toggle) >= LOCKOUT_MS
21            and time.ticks_diff(now, last_pulse) >= QUIET_GAP_MS):
22        claps += 1
23    last_pulse = now
24
25# DO sesle LOW oluyorsa IRQ_FALLING yaz / use IRQ_FALLING if DO goes LOW on sound
26sound_do.irq(trigger=Pin.IRQ_RISING, handler=on_sound)
27
28def peak_to_peak(window_ms=50):     # 50 ms boyunca en büyük - en küçük / max - min over 50 ms
29    lo, hi = 65535, 0
30    start = time.ticks_ms()
31    while time.ticks_diff(time.ticks_ms(), start) < window_ms:
32        v = sound_ao.read_u16()     # 0-65535
33        if v < lo:
34            lo = v
35        if v > hi:
36            hi = v
37    return hi - lo
38
39noise_floor = max(1, sum(peak_to_peak() for _ in range(20)) / 20)  # 1 sn sessizlik / 1 s of silence
40
41while True:
42    p2p = peak_to_peak()
43    db = 20 * math.log10(max(p2p, 1) / noise_floor)   # göreceli dB / relative dB
44    print("p2p:", p2p, "dB:", round(db, 1))
45
46    now = time.ticks_ms()
47    if claps and time.ticks_diff(now, last_pulse) > CLAP_WINDOW_MS:
48        if claps == 2:              # yalnız tam iki alkış / exactly two claps only
49            lamp.toggle()
50            last_toggle = now
51            print("Lamba / Lamp:", "ON" if lamp.value() else "OFF")
52        claps = 0

Ketika kamu menjalankan kodenya di Thonny, nilai p2p dan dB akan terlihat di Shell; buka Plotter dari menu View untuk mengikutinya sebagai grafik. Jika output DO board-mu menjadi LOW ketika ada suara, tulis IRQ_FALLING sebagai ganti IRQ_RISING. Agar program berjalan sendiri ketika Pico diberi daya, simpan file-nya ke Pico sebagai main.py. Kalau kamu baru mengenal MicroPython, Dasar-Dasar MicroPython adalah tempat yang bagus untuk memulai.

Bisakah sensor suara mengukur desibel?

Jawaban singkatnya: tidak. Di internet kamu akan menemukan banyak sketch yang memakai map() untuk mengubah nilai peak-to-peak KY-038 menjadi rentang seperti 49–90 dB; itu tebakan, bukan pengukuran. Untuk mengukur tingkat tekanan suara (dB SPL) yang sebenarnya, kamu butuh mikrofon dengan sensitivitas yang diketahui dan sistem yang dikalibrasi dengan kalibrator 94 dB, penguatan sinyal yang linear, nilai RMS yang dihitung dalam waktu tertentu (125 ms pada mode fast, 1 dtk pada mode slow), serta filter A-weighting yang meniru sensitivitas telinga. Karena itulah sound level meter dibuat sesuai standar IEC 61672.

KY-038 tidak memenuhi satu pun syarat ini: penguatan board-nya tidak diketahui, sensitivitas kapsul mikrofon berbeda beberapa dB antara satu dan lainnya, potensiometer dan tegangan catu mengubah level sinyal, dan di Uno semua suara normal terjepit dalam beberapa langkah ADC saja. Hal paling jujur yang bisa kamu lakukan adalah pengukuran relatif: mengatakan “sekarang suaranya 12 dB lebih keras daripada ruangan yang tenang”. Itu pun sudah lebih dari cukup untuk alarm kebisingan, lampu lalu lintas kebisingan di kelas, atau VU meter. Kamu bisa melakukan kalibrasi kasar dengan membandingkannya dengan aplikasi ponsel di satu titik, tapi kalibrasi itu kehilangan maknanya di tingkat suara lain dan di board lain.

Alternatif: MAX4466, MAX9814, dan INMP441

ModulOutputPenguatanPengukuran desibelBoard yang cocok
KY-038 / KY-037AO (mentah) + DO (ambang)Tidak adaTidakSemua
MAX4466Analog, berpusat di VCC/225–125×, bisa diaturHanya relatifSemua
MAX9814Analog, berpusat di 1,25 V, maks. 2 Vpp40 / 50 / 60 dB + kendali penguatan otomatis (AGC)Tidak, AGC memampatkan levelSemua
INMP441I2S digital, 24-bitTidak diperlukanPerkiraan dB SPLESP32, Pico (bukan Uno)
Modul tingkat suara siap pakai (mis. DFRobot SEN0232)Analog, langsung dalam dBADikalibrasi di pabrikYa, 30–130 dBA, ±1,5 dBSemua

MAX4466 menggabungkan mikrofon electret sejenis dengan op-amp yang penguatannya bisa diatur. Dalam keadaan hening, outputnya berada di setengah tegangan catu, dan dengan percakapan biasa di dekatnya, modul ini memberi sinyal ratusan milivolt; dengan kata lain, sinyal KY-038 yang hanya beberapa langkah ADC menjadi puluhan bahkan ratusan langkah. Sketch peak-to-peak dan VU meter di artikel ini bekerja dengan MAX4466 tanpa perubahan apa pun. Kalau kamu penasaran cara menghitung penguatannya, lihat kalkulator penguatan op-amp dan Apa Itu Op-Amp?. Memberi daya modul dari pin 3.3V Uno yang lebih bersih akan mengurangi noise. Sementara itu, MAX9814 memakai kendali penguatan otomatis untuk menaikkan bahkan suara bicara dari jauh ke level yang bisa dipakai; modul ini bagus untuk merekam dan mendeteksi suara, tapi karena ia mendekatkan lingkungan yang tenang dan yang bising, modul ini tidak cocok untuk mengukur level.

INMP441 sama sekali bukan analog, melainkan mikrofon MEMS digital: mikrofon ini mengubah suara menjadi angka 24-bit di dalamnya dan mengirimnya lewat bus I2S, jadi noise di kabel tidak masuk ke pengukuran. Keunggulan utamanya adalah produsennya menyebutkan sensitivitasnya dengan toleransi yang ketat: suara 94 dB SPL terbaca sebagai −26 dBFS. Jadi, jika kamu mengubah nilai RMS yang kamu ukur ke dBFS lalu menambahkan 120, kamu mendapat nilai perkiraan dB SPL. I2S butuh ESP32 atau Pico; Arduino Uno tidak punya hardware I2S. Modul hobi INMP441 murah dan mudah dicari, dan ICS-43434 serta SPH0645 adalah mikrofon I2S yang mirip. Kalau kamu benar-benar butuh pengukuran kebisingan yang akurat, cara termudah adalah memakai modul tingkat suara siap pakai dengan output yang sudah ber-A-weighting dan terkalibrasi; misalnya, mengalikan tegangan output DFRobot SEN0232 dengan 50 langsung memberimu nilai dBA.

Ide proyek sensor suara

  • Lampu tepuk: Tambahkan modul relay ke sketch tepuk dua kali di atas untuk mengendalikan lampu mejamu atau LED strip, dan pakai tiga tepukan untuk perangkat kedua.
  • Lampu lalu lintas kebisingan di kelas: Tampilan kebisingan yang menyalakan LED hijau, kuning, dan merah berdasarkan nilai dB relatif; guru pasti suka.
  • Monitor bayi dan hewan peliharaan: Jika suara tetap keras lebih dari 5 detik, buat ESP32 mengirim pesan Telegram ke ponselmu.
  • Lampu yang bereaksi terhadap suara: Cincin atau strip NeoPixel yang berdenyut mengikuti ketukan musik.
  • Pendeteksi ketukan pintu: Sistem yang memberi tahu lewat buzzer atau LED ketika ada yang mengetuk; untuk menangkap ketukan sebagai getaran alih-alih suara, sensor getaran SW-420 juga pilihan yang bagus.
  • Skenario rumah pintar: Gabungkan suara dengan sensor gerak dan cahaya untuk mematikan lampu ketika tidak ada orang di ruangan; untuk ide-idenya, lihat Proyek Rumah Pintar Arduino.

Kesalahan umum dan cara memperbaikinya

GejalaKemungkinan penyebabSolusi
LED DO terus menyalaAmbang terlalu sensitif atau ada bising yang konstan (kipas, kulkas)Putar potensiometer dalam keadaan hening sampai LED padam, dan jauhkan sensor dari sumber bising
Tidak terjadi apa-apa ketika kamu bertepuk tanganAmbang terlalu tinggi atau DO terpasang di pin yang salahPertama, pastikan LED di board berkedip ketika ada tepukan, lalu periksa kabel dan nomor pin di kode
Penghitung naik dalam keadaan hening dan berhenti ketika ada suaraOutput DO board-nya aktif LOWAtur SOUND_ACTIVE ke LOW; di Pico pakai IRQ_FALLING
analogRead tetap di sekitar 500 dan hanya berubah 1–2 ketika ada suaraAO tidak dikuatkan dan hanya diambil pembacaan tunggalPakai metode peak-to-peak, dekatkan sumber suara, atau ganti ke MAX4466
AO selalu 0 atau 1023AO dan DO tertukar, atau level DC bergeser ke ujungPeriksa pengkabelan dan pakai potensiometer untuk membawa rata-ratanya ke tengah
Satu tepukan terhitung dua kaliRuangan bergema atau QUIET_GAP_MS terlalu pendekAtur QUIET_GAP_MS ke 150–200 ms dan buat ambangnya sedikit kurang sensitif
Lampu menyala dan mati sendiriBunyi klik relay, pintu yang dibanting, atau musikNaikkan LOCKOUT_MS, jauhkan sensor dari relay, dan pertahankan aturan tepuk dua kali
Di ESP32, AO berhenti terbaca ketika Wi-Fi aktifAO terpasang di pin ADC2Pindahkan AO ke pin ADC1 antara GPIO 32 dan 39
Cara praktis untuk menguji sensor suara adalah aplikasi pembangkit nada di ponselmu. Putar nada 1 kHz yang stabil dan pegang ponsel pada jarak 10, 20, dan 40 cm dari mikrofon: di ruang terbuka, setiap kali jaraknya menjadi dua kali lipat, tekanan suaranya turun setengah, jadi p2p seharusnya turun menjadi sekitar setengahnya dan nilai dB turun sekitar 6 dB. Eksperimen sederhana ini memeriksa pengkabelan sekaligus kodemu.

Dengan beberapa kabel dan kode yang ditulis dengan baik, KY-038 mengajarkan banyak dasar elektronika sekaligus: komparator, konversi analog ke digital, interrupt, pengaturan waktu, dan matematika desibel. Mulailah dengan mendeteksi tepukan lewat DO, ukur tingkat suara dengan metode peak-to-peak, lalu beralih ke MAX4466 atau INMP441 ketika kamu butuh pengukuran suara sungguhan. Di aplikasi BlueGrays kamu bisa menemukan proyek lampu dengan relay, LED berjalan, lampu pintar ESP32, dan strip NeoPixel lengkap dengan skema rangkaian dan kode langkah demi langkah; menambahkan sensor suara ke proyek-proyek itu adalah cara termudah untuk mengubahnya menjadi sistem yang bereaksi terhadap tepukan atau suara.

Pertanyaan umum

Bagaimana cara kerja sensor suara Arduino?

Sensor suara memakai komparator LM393 untuk membandingkan tegangan kecil dari mikrofon electret-nya dengan ambang yang diatur lewat potensiometer. Ketika suara melewati ambang, pin DO berubah state dan LED di board menyala. Pin AO memberi sinyal mentah mikrofon yang tidak dikuatkan, yang kamu baca dengan analogRead().

Apa bedanya KY-038 dan KY-037?

Keduanya memakai rangkaian LM393 yang sama dan urutan pin AO, G, +, DO yang sama, dan kodenya identik. KY-037 punya kapsul mikrofon lebih besar dan biasanya sedikit lebih sensitif; KY-038 lebih kecil dan lebih umum di kit sensor.

Bagaimana cara mengatur sensitivitas sensor suara?

Dalam keadaan hening, putar potensiometer biru ke titik ketika LED DO berkedip, lalu putar balik setengah sampai satu putaran ke arah LED tetap padam. Karena potensiometernya multi-putaran, mungkin perlu beberapa putaran sebelum kamu melihat perubahan. Selalu atur di tempat sensor akan dipakai.

Bisakah sensor suara mengukur desibel?

KY-038 dan KY-037 tidak bisa mengukur desibel sungguhan (dB SPL): penguatan board dan sensitivitas mikrofonnya tidak diketahui, dan tidak ada kalibrasi maupun A-weighting. Kamu hanya bisa menghitung dB relatif dibandingkan ruangan yang tenang. Untuk pengukuran sungguhan, pakai mikrofon I2S dengan sensitivitas yang diketahui seperti INMP441, atau modul tingkat suara yang sudah dikalibrasi.

Kenapa nilai analog sensor suaraku tidak berubah?

Output AO adalah sinyal mikrofon yang tidak dikuatkan, dan dengan suara normal sinyal ini lebih kecil dari satu langkah ADC 4,9 mV di Uno. Selain itu, satu kali analogRead() membaca momen acak dari gelombang suara. Ambil sampel selama 50 ms dan hitung selisih nilai terbesar dan terkecil (peak-to-peak), maka perubahannya akan terlihat jelas.

Apakah sensor suara bisa dipakai dengan ESP32 dan Raspberry Pi Pico?

Bisa, modul ini juga bekerja di 3,3 V; di ESP32 dan Pico, beri daya dari pin 3V3 agar output DO tidak pernah melebihi 3,3 V. Di ESP32, hubungkan AO ke pin ADC1 (GPIO 32–39) yang tidak bentrok dengan Wi-Fi, dan di Pico ke GP26, GP27, atau GP28.

Lihat semua proyek
Nyala/Mati LED dengan Tombol (On/Off)
#10Pemula

Nyala/Mati LED dengan Tombol (On/Off)

Tekan tombol sekali dan lampu menyala, tekan lagi dan lampu mati, persis seperti sakelar lampu di kamarmu. Arduino menyadari setiap tekanan dan membalik LED ke keadaan sebaliknya, sambil menunggu sebe

4.8(100)
167
Kendali LED dengan Tombol Tekan ESP32 (Toggle)
#105Pemula

Kendali LED dengan Tombol Tekan ESP32 (Toggle)

Setiap kali tombol ditekan, keadaan LED berubah: jika menyala jadi mati, jika mati jadi menyala. Pola toggle klasik. Dengan debounce, kita membersihkan derau mekanis tombol tekan agar satu tekanan menghasilkan satu kali toggle.

4.6(39)
57
LED Berjalan
#5Menengah

LED Berjalan

Lampu-lampu yang menyala satu demi satu, seolah sedang berlari. Arduino menyalakan enam LED satu per satu; masing-masing menyala sebentar lalu padam, sehingga cahayanya berjalan dari awal ke akhir lal

4.6(85)
207
Menyalakan Bohlam 220V dengan Tombol (On-Off)
#20Mahir
Premium

Menyalakan Bohlam 220V dengan Tombol (On-Off)

Ingin menyalakan dan mematikan bohlam rumah sungguhan dengan tombol kecil? Setiap kali kamu menekan tombol, Arduino membalik relay dan bohlam menyala; tekan lagi dan bohlam mati. Relay adalah perantar

4.5(33)
44
LED Toggle dengan Tombol Raspberry Pi Pico
#156Pemula

LED Toggle dengan Tombol Raspberry Pi Pico

Tombol + LED, level berikutnya! Berbeda dengan proyek tombol dasar, tombol tidak perlu ditahan. Tekan dan lepas → LED menyala. Tekan dan lepas lagi → LED mati (toggle). Rangkaiannya sama (LED GP14, Tombol GP2), tetapi kodenya sangat berbeda. Pelajari deteksi tepi (menangkap momen turun 1→0), pelacakan status, dan debounce (penyaring pantulan mekanis). led.toggle() MicroPython menukar status dalam satu baris. Dasar semua proyek tombol interaktif (pengganti mode, IRQ, klik ganda).

0.0(0)
9
Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)
#141Mahir
Premium

Lampu Pintar ESP32 (PIR + LDR + Relay + OLED)

Ubah lorong, kamar mandi, atau gudangmu menjadi lampu pintar dengan ESP32! Dengan sensor gerak PIR, sensor cahaya LDR, dan modul relay, kita membuat skenario klasik "lampu menyala ketika ada gerakan dalam gelap"; jika sudah terang, gerakan TIDAK menyalakan lampu, jadi energi hemat di siang hari. Lampu menyala 30 detik; jika gerakan berlanjut, timer diulang. OLED SSD1306 menampilkan status dengan font besar (NYALA / SIANG / MENUNGGU) dan hitung mundur.

4.3(6)
11
Sensor Parkir ESP32 (HC-SR04 + Bar 5 LED + Buzzer + OLED)
#142Mahir
Premium

Sensor Parkir ESP32 (HC-SR04 + Bar 5 LED + Buzzer + OLED)

Versi ESP32 dari sensor parkir mobil! Kita memakai sensor ultrasonik HC-SR04 untuk mengukur jarak ke benda di depannya. Semakin dekat jaraknya, bar 5 LED semakin penuh (hijau → kuning → merah) dan jeda bunyi bip buzzer semakin pendek. Ketika benda sudah sangat dekat (di bawah 10 cm), alarm berbunyi terus dan semua LED menyala. Layar OLED SSD1306 menampilkan jarak terkini dalam cm dengan font besar, pesan status (STOP / CAUTION / CLOSE / STOP! / DANGER), dan simulasi bar jarak.

0.0(0)
14
Kendali Strip NeoPixel WS2812B ESP32
#126Menengah
Premium

Kendali Strip NeoPixel WS2812B ESP32

LED addressable WS2812B (NeoPixel) adalah LED RGB pintar yang bisa dikendalikan secara berantai lewat satu pin data. Di proyek ini, kita mengendalikan strip WS2812B 8 LED dengan library Adafruit_NeoPixel untuk membuat animasi pelangi yang halus. Meskipun level logika 3,3V ESP32 bekerja lancar dengan sebagian besar komponen WS2812B, kita menunjukkan solusi dengan resistor seri 470Ω dan kapasitor 1000µF untuk berjaga-jaga jika tidak stabil. Animasinya dibuat dengan menggeser nilai hue.

4.9(19)
30