Model palang parkir: mobil mainan mendekat, sensor IR melihatnya, palang servo naik, lalu turun 2 detik setelah mobil lewat. Klenik menghitung mobil yang masuk dan bisa mengunci palang saat parkiran penuh.
Sensor KY-032 memancarkan inframerah dan menerima pantulannya. Kalau ada benda di depannya (5-15 cm, diatur dengan trimpot), pin OUT menjadi LOW. ESP32 menaikkan palang (servo ke 90°) dan menambah hitungan mobil.
Palang tidak langsung turun saat sensor kosong. ESP32 menunggu 2 detik untuk memastikan mobil sudah lewat seluruhnya, karena celah di antara roda bisa membuat sensor sesaat tidak melihat apa-apa. Selama sensor masih melihat mobil, hitungan 2 detik diulang.
Switch Kunci membuat palang tidak mau naik, seperti saat parkiran penuh. Mobil yang sudah di depan sensor tetap tertahan.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| ESP32 DOIT DevKit V1 30 pin | 1 | Rp75.000 |
| Servo MG90 Metal Gear Micro 9g Tower Pro 180 Der | 1 | Rp33.950 |
| Sensor IR KY-032 | 1 | Rp7.500 |
| 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 | 1 | Rp11.700 |
| Total (tanpa opsional) | Rp119.950 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| Servo MG90 (coklat −, merah +, oranye S) − | → | GND | coklat |
| Servo MG90 (coklat −, merah +, oranye S) + | → | VIN | merah |
| Servo MG90 (coklat −, merah +, oranye S) S | → | D13 GPIO13 | oranye |
| Sensor IR KY-032 GND | → | GND | hitam |
| Sensor IR KY-032 + | → | 3V3 | merah |
| Sensor IR KY-032 OUT | → | D27 GPIO27 | biru |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p098.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 Palang | ichibot/KODE/p098/palang | ON = 1 “NAIK”, OFF = 0 |
| Gauge Mobil Masuk | ichibot/KODE/p098/jumlah | 0–50 |
| Switch Kunci Palang (penuh) | ichibot/KODE/p098/kunci | payload ON / OFF |
| Switch Reset Hitungan | ichibot/KODE/p098/reset | payload ON / OFF |
Langkah 3: Upload kode
Library: PubSubClient (Nick O'Leary), ESP32Servo. 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 098 - Palang Parkir Mini
// Board: ESP32 DOIT DevKit V1 | Dashboard: klenik.ichibot.id
#include <WiFi.h>
#include <PubSubClient.h>
#include <ESP32Servo.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_JUMLAH = "ichibot/budi1234/p098/jumlah";
const char* TOPIK_RESET = "ichibot/budi1234/p098/reset";
const char* TOPIK_KUNCI = "ichibot/budi1234/p098/kunci";
const char* TOPIK_PALANG = "ichibot/budi1234/p098/palang";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
Servo palang;
const int PIN_SERVO = 13, SENSOR = 27; // KY-032 OUT: LOW saat ada benda
const int TURUN = 0, NAIK = 90;
const unsigned long JEDA_TURUN = 2000; // palang turun 2 detik setelah mobil lewat
bool terbuka = false, kunci = false;
unsigned long kosongSejak = 0;
int jumlahMobil = 0;
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String topik = t;
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
if (topik == TOPIK_KUNCI) kunci = (p == "ON"); // parkiran penuh/tutup: palang tidak naik
else if (topik == TOPIK_RESET && p == "ON") {
jumlahMobil = 0;
mqtt.publish(TOPIK_JUMLAH, "0");
mqtt.publish(TOPIK_RESET, "OFF");
}
}
void langganan() {
mqtt.subscribe(TOPIK_KUNCI);
mqtt.subscribe(TOPIK_RESET);
}
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(SENSOR, INPUT);
palang.setPeriodHertz(50);
palang.attach(PIN_SERVO, 500, 2400);
palang.write(TURUN);
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
bool adaMobil = digitalRead(SENSOR) == LOW;
if (adaMobil) {
kosongSejak = 0;
if (!terbuka && !kunci) {
terbuka = true;
palang.write(NAIK);
jumlahMobil++;
mqtt.publish(TOPIK_PALANG, "1");
mqtt.publish(TOPIK_JUMLAH, String(jumlahMobil).c_str());
}
} else if (terbuka) {
if (kosongSejak == 0) kosongSejak = millis();
if (millis() - kosongSejak > JEDA_TURUN) {
terbuka = false;
palang.write(TURUN);
mqtt.publish(TOPIK_PALANG, "0");
}
}
}Langkah 4: Pahami kodenya
- Palang turun setelah sensor kosong 2 detik berturut-turut. Jeda ini juga mencegah palang menghantam mobil yang berhenti sesaat di bawahnya.
- Mobil hanya dihitung sekali, saat palang mulai naik, bukan selama mobil berada di depan sensor.
- Pasang lengan palang (stik es krim) saat servo di posisi TURUN, lalu sesuaikan sudut kalau palang kurang tegak.