Tiga LED berganti merah, hijau, kuning seperti lampu perempatan. Lama lampu hijau diatur dari HP, ada tombol darurat untuk menahan merah, dan setiap pergantian tercatat di dashboard.
Program menyimpan fase sekarang (0 merah, 1 hijau, 2 kuning) dan kapan fase itu dimulai. Setiap loop() dicek: kalau lama fase sudah habis, pindah ke fase berikutnya. Urutannya mengikuti lampu sungguhan: merah ke hijau, hijau ke kuning, kuning ke merah. Merah 5 detik dan kuning 2 detik tetap, hijau mengikuti slider. Setiap pergantian dikirim sebagai teks ke widget Text Log.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| LED 5 mm merah (isi 10)LED merah, isi 10 | 1 | Rp2.500 |
| LED 5 mm kuning (isi 10)LED kuning, isi 10 | 1 | Rp2.500 |
| LED 5 mm hijau (isi 10)LED hijau, isi 10 | 1 | Rp2.850 |
| Resistor 330 Ω (isi 10)isi 10, terpakai 3 | 1 | Rp1.800 |
| Breadboard mini 170 titik | 1 | Rp4.875 |
| Kabel jumper male-female 10 cm (isi 10)isi 10, terpakai 4 | 1 | Rp3.500 |
| Kabel micro USB data 30 cmopsional, kalau belum punya kabel micro USB data | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp60.025 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| 3 LED + 3 resistor 330 Ω (kaki − disatukan) M | → | D1 GPIO5 | merah |
| 3 LED + 3 resistor 330 Ω (kaki − disatukan) K | → | D2 GPIO4 | kuning |
| 3 LED + 3 resistor 330 Ω (kaki − disatukan) H | → | D5 GPIO14 | hijau |
| 3 LED + 3 resistor 330 Ω (kaki − disatukan) − | → | G | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p004.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 |
|---|---|---|
| Switch Mode Otomatis | ichibot/KODE/p004/otomatis | payload ON / OFF |
| Switch Darurat | ichibot/KODE/p004/darurat | payload ON / OFF |
| Slider Output Lama Hijau | ichibot/KODE/p004/hijau | 2–30 detik |
| Text Log Lampu Sekarang | ichibot/KODE/p004/lampu | 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 004 - Lampu Lalu Lintas Mini
// 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_LAMPU = "ichibot/budi1234/p004/lampu";
const char* TOPIK_OTOMATIS = "ichibot/budi1234/p004/otomatis";
const char* TOPIK_HIJAU = "ichibot/budi1234/p004/hijau";
const char* TOPIK_DARURAT = "ichibot/budi1234/p004/darurat";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int MERAH = D1, KUNING = D2, HIJAU = D5;
bool otomatis = true;
int detikHijau = 5; // lama lampu hijau, diatur dari slider
int fase = 0; // 0 merah, 1 hijau, 2 kuning
unsigned long mulai = 0;
void nyalakan(int f) {
fase = f;
mulai = millis();
digitalWrite(MERAH, f == 0);
digitalWrite(HIJAU, f == 1);
digitalWrite(KUNING, f == 2);
const char* nama[] = {"MERAH", "HIJAU", "KUNING"};
mqtt.publish(TOPIK_LAMPU, nama[f]);
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String topik = t, p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
if (topik == TOPIK_OTOMATIS) otomatis = (p == "ON");
else if (topik == TOPIK_HIJAU) detikHijau = constrain(p.toInt(), 2, 30);
else if (topik == TOPIK_DARURAT && p == "ON") { otomatis = false; nyalakan(0); }
}
void langganan() {
mqtt.subscribe(TOPIK_OTOMATIS);
mqtt.subscribe(TOPIK_HIJAU);
mqtt.subscribe(TOPIK_DARURAT);
}
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(MERAH, OUTPUT); pinMode(KUNING, OUTPUT); pinMode(HIJAU, OUTPUT);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
nyalakan(0);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
if (!otomatis) return;
unsigned long lama[] = {5000, (unsigned long)detikHijau * 1000, 2000};
if (millis() - mulai >= lama[fase]) {
int urutan[] = {1, 2, 0}; // merah -> hijau -> kuning -> merah
nyalakan(urutan[fase]);
}
}Langkah 4: Pahami kodenya
- Satu angka untuk mengingat lampu mana yang sedang menyala. Menyimpan fase sebagai angka membuat urutannya mudah ditulis sebagai larik.
f == 0bernilaitrue(HIGH) hanya saat fase merah. Tiga baris ini memastikan selalu tepat satu LED yang menyala.- Tombol darurat mematikan mode otomatis dan menahan merah. Untuk jalan lagi, nyalakan ulang switch Mode Otomatis.
- Tabel fase berikutnya: dari 0 (merah) ke 1 (hijau), dari 1 ke 2 (kuning), dari 2 kembali ke 0.