Tekan tombol di meja, dashboard di HP langsung mencatat. Bisa jadi bel panggil, tombol "tolong cek mesin", atau penghitung kunjungan.
Tombol dipasang antara D5 dan G, dan D5 diberi INPUT_PULLUP: resistor di dalam chip menarik pin ke HIGH saat tombol dilepas. Saat ditekan, pin tersambung ke G dan terbaca LOW. Tombol mekanis "memantul" beberapa milidetik saat ditekan, sehingga satu tekanan bisa terbaca sebagai beberapa. Perubahan yang terjadi kurang dari 50 ms setelah perubahan sebelumnya diabaikan (debounce).
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| Push button 6×6 mm (isi 10)isi 10, terpakai 1 | 1 | Rp4.750 |
| Breadboard mini 170 titik | 1 | Rp4.875 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 2 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp55.125 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Push button 6×6 mm 1 | → | D5 GPIO14 | biru |
| Push button 6×6 mm 2 | → | G | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p011.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 Tombol | ichibot/KODE/p011/tombol | ON = 1 “DITEKAN”, OFF = 0 |
| Text Log Notifikasi | ichibot/KODE/p011/notif | 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 011 - Tombol Fisik Kirim Notifikasi ke Dashboard
// 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_TOMBOL = "ichibot/budi1234/p011/tombol";
const char* TOPIK_NOTIF = "ichibot/budi1234/p011/notif";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int TOMBOL = D5; // GPIO14, kaki lain ke G
bool tadi = HIGH; // INPUT_PULLUP: tidak ditekan = HIGH
unsigned long waktuTekan = 0;
int jumlah = 0;
void langganan() {}
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(TOMBOL, INPUT_PULLUP);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
bool sekarang = digitalRead(TOMBOL);
if (sekarang != tadi && millis() - waktuTekan > 50) { // abaikan pantulan < 50 ms
waktuTekan = millis();
tadi = sekarang;
bool ditekan = (sekarang == LOW);
mqtt.publish(TOPIK_TOMBOL, ditekan ? "1" : "0");
if (ditekan) {
jumlah++;
String pesan = "Tombol ditekan (ke-" + String(jumlah) + ")";
mqtt.publish(TOPIK_NOTIF, pesan.c_str());
Serial.println(pesan);
}
}
}Langkah 4: Pahami kodenya
- Mengaktifkan resistor pull-up internal, jadi tidak perlu resistor tambahan di breadboard.
- Hanya bereaksi saat keadaan tombol berubah, dan sudah lebih dari 50 ms dari perubahan terakhir. Tombol yang ditahan tidak mengirim pesan berulang.
- Dengan pull-up logikanya terbalik: LOW berarti ditekan.
- Penghitung disimpan di RAM, jadi kembali ke 0 setelah NodeMCU restart. Nomor urut di pesan memudahkan melihat tekanan yang terlewat.