Ketik not lagu di HP, misalnya ccggaag-ffeeddc (Twinkle Twinkle), dan ESP32 memainkannya lewat buzzer pasif. Proyek ini mengenalkan frekuensi suara dan cara menulis melodi sebagai teks.
Buzzer pasif tidak punya osilator, jadi ESP32 yang membuat getarannya dengan tone(), yaitu gelombang kotak pada frekuensi tertentu. Nada A = 440 Hz, C tengah = 262 Hz. Teks dari widget Text Input dibaca huruf demi huruf, setiap huruf diubah menjadi frekuensi, lalu dimainkan 250 ms dengan jeda 50 ms. Tanda - berarti diam satu ketukan.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Modul buzzer pasif | 1 | Rp7.500 |
| 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) | Rp86.000 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Modul buzzer pasif S | → | D26 GPIO26 | biru |
| Modul buzzer pasif + | → | 3V3 | merah |
| Modul buzzer pasif − | → | GND | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p052.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 |
|---|---|---|
| TEXT_INPUT Tulis Lagu | ichibot/KODE/p052/lagu | teks bebas |
| Text Log Diputar | ichibot/KODE/p052/log | menampilkan teks masuk |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary). Board di Arduino IDE: ESP32 Dev 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 052 - Mainkan Nada dari Dashboard (Buzzer Pasif)
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.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_LAGU = "ichibot/budi1234/p052/lagu";
const char* TOPIK_LOG = "ichibot/budi1234/p052/log";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int BUZZER = 26; // buzzer PASIF: butuh frekuensi, tidak bisa sekadar HIGH
String antre = ""; // lagu yang menunggu dimainkan
// Not: c d e f g a b (oktaf tengah), C = c tinggi, '-' = diam. Contoh: "ccggaag-ffeeddc"
int frek(char n) {
switch (n) {
case 'c': return 262; case 'd': return 294; case 'e': return 330; case 'f': return 349;
case 'g': return 392; case 'a': return 440; case 'b': return 494; case 'C': return 523;
}
return 0;
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
antre = "";
for (unsigned int i = 0; i < panjang; i++) antre += (char)isi[i];
}
void langganan() {
mqtt.subscribe(TOPIK_LAGU);
}
void mainkan(String lagu) {
mqtt.publish(TOPIK_LOG, ("Memainkan: " + lagu).c_str());
for (unsigned int i = 0; i < lagu.length(); i++) {
int f = frek(lagu[i]);
if (f) tone(BUZZER, f, 250);
delay(300); // durasi satu ketukan + jeda
mqtt.loop(); // tetap jaga koneksi selama lagu
}
noTone(BUZZER);
}
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);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (antre.length()) {
String lagu = antre;
antre = "";
mainkan(lagu);
}
}Langkah 4: Pahami kodenya
- Tabel huruf ke frekuensi (Hz) untuk satu oktaf, ditambah C tinggi. Tambahkan huruf lain untuk oktaf berikutnya (frekuensinya dikali 2).
tone(pin, frekuensi, durasi). Buzzer aktif tidak bisa dipakai di sini, karena bunyinya selalu satu nada.- Lagu panjang memakai
delay(). Memanggilmqtt.loop()di setiap not menjaga koneksi ke broker tetap hidup.