Penutup buku: dua board berbicara satu sama lain tanpa kabel, lewat internet. Tombol di ESP32 menyalakan LED di NodeMCU yang menjalankan proyek 001, dan LED di ESP32 ikut menyala sebagai tanda NodeMCU sudah menjalankan perintah. Jaraknya bisa satu meja atau beda kota.
Selama 149 proyek, yang berbicara selalu board dan dashboard. Padahal MQTT tidak membedakan HP dan board: siapa pun boleh mengirim ke topic mana pun, selama tahu namanya. NodeMCU di proyek 001 mendengarkan topic ichibot/KODE/p001/led dan melaporkan keadaannya di .../p001/status. ESP32 di proyek ini tinggal mengirim ON/OFF ke topic led itu, sama persis seperti switch di Klenik.
Rangkaiannya: ESP32 dengan tombol dan LED seperti gambar, dan NodeMCU dengan LED di D1 seperti proyek 001. Upload proyek 001 ke NodeMCU dan proyek ini ke ESP32 dengan KODE yang sama.
ESP32 tidak menyalakan LED-nya sendiri saat tombol ditekan. LED itu baru menyala setelah NodeMCU melaporkan statusnya. Jadi LED di ESP32 adalah bukti bahwa pesan sudah sampai dan perintahnya sudah dijalankan. Pola kirim perintah lalu terima konfirmasi ini dipakai di hampir semua sistem IoT, dari lampu pintar sampai mesin industri.
Selamat, kamu sudah menyelesaikan 150 proyek! Dari sini kamu bisa menggabungkan proyek-proyek di buku ini menjadi sistem buatanmu sendiri.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| NodeMCU ESP8266 V3 (Lolin)untuk proyek 001 (pasangannya) | 1 | Rp42.000 |
| Push button 6×6 mm (isi 10)isi 10, terpakai 1 | 1 | Rp4.750 |
| LED 5 mm merah (isi 10)isi 10, terpakai 2 (1 di ESP32, 1 di NodeMCU) | 1 | Rp2.500 |
| Resistor 330 Ω (isi 10)isi 10, terpakai 2 | 1 | Rp1.800 |
| Breadboard mini 170 titik | 2 | Rp9.750 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 6 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 2 | Rp23.400 |
| Total (tanpa opsional) | Rp139.300 |
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 | → | D27 GPIO27 | biru |
| Push button 6×6 mm 2 | → | GND | hitam |
| LED merah + resistor 330 Ω + | → | D25 GPIO25 | merah |
| LED merah + resistor 330 Ω − | → | GND | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p150.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 Log Laporan dari NodeMCU | ichibot/KODE/p150/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 150 - Dua Board Saling Bicara lewat MQTT
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
// Pasangannya: NodeMCU yang menjalankan PROYEK 001 (Lampu LED dari HP), dengan KODE yang sama.
#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_LOG = "ichibot/budi1234/p150/log";
// topic proyek 001 di NodeMCU teman: KODE-nya harus sama
const char* TOPIK_TEMAN_LED = "ichibot/budi1234/p001/led";
const char* TOPIK_TEMAN_STATUS = "ichibot/budi1234/p001/status";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int TOMBOL = 27, LED = 25;
bool ledTeman = false, tadi = HIGH;
unsigned long waktuTekan = 0;
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
ledTeman = (p == "1"); // NodeMCU melaporkan keadaan LED-nya
digitalWrite(LED, ledTeman); // LED kita meniru LED di NodeMCU
mqtt.publish(TOPIK_LOG, ledTeman ? "LED NodeMCU menyala" : "LED NodeMCU mati");
}
void langganan() {
mqtt.subscribe(TOPIK_TEMAN_STATUS);
}
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);
pinMode(LED, OUTPUT);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
bool sekarang = digitalRead(TOMBOL);
if (sekarang != tadi && millis() - waktuTekan > 50) {
waktuTekan = millis();
tadi = sekarang;
if (sekarang == LOW) { // tekan: suruh NodeMCU membalik LED-nya
mqtt.publish(TOPIK_TEMAN_LED, ledTeman ? "OFF" : "ON");
}
}
}Langkah 4: Pahami kodenya
- Topic milik proyek 001, ditulis utuh seperti topic proyek ini sendiri. Board mana pun bisa mengendalikan proyek mana pun di buku ini, asal tahu topic lengkapnya.
- Membalik LED teman berdasarkan laporan terakhirnya, bukan tebakan sendiri, jadi selalu sinkron walaupun LED juga diubah dari HP.
- Konfirmasi: LED ESP32 hanya mengikuti laporan NodeMCU. Kalau NodeMCU mati, LED ESP32 tidak berubah walaupun tombol ditekan.