Sensor inframerah E18-D80NK di samping konveyor atau jalur produk menghitung setiap barang yang lewat. Klenik menampilkan total hari ini, laju per menit, dan pemberitahuan saat target produksi tercapai, seperti penghitung di pabrik sungguhan.
E18-D80NK memancarkan inframerah dan mendeteksi pantulan dari benda sampai sekitar 80 cm. Jaraknya diatur dengan sekrup di belakang. Keluarannya NPN: menarik pin ke GND (LOW) saat ada benda, sehingga butuh INPUT_PULLUP. Sensor ini diberi 5V dari pin VU, dan pin OUT yang hanya menarik ke GND aman untuk NodeMCU.
Yang dihitung adalah perubahan dari tidak ada benda ke ada benda, dengan jeda minimum 150 ms supaya getaran tepi benda tidak terhitung dua. Laju per menit menunjukkan kecepatan lini produksi, dan target dari slider memberi tanda saat pesanan sudah terpenuhi.
Komponen
| Komponen | Qty | Harga |
|---|---|---|
| NodeMCU ESP8266 V3 (Lolin) | 1 | Rp42.000 |
| Sensor IR E18-D80NK | 1 | Rp33.950 |
| Kabel jumper male-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) | Rp79.450 |
Langkah 1: Rangkai komponen
Sambungkan kabel sesuai gambar di atas. Kalau gambar dan tabel terlihat berbeda, ikuti tabel.
| Dari | Ke | Kabel | |
|---|---|---|---|
| E18-D80NK (coklat +, hitam OUT, biru −) + | → | VU | coklat |
| E18-D80NK (coklat +, hitam OUT, biru −) OUT | → | D5 GPIO14 | hitam |
| E18-D80NK (coklat +, hitam OUT, biru −) − | → | G | biru |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p139.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 |
|---|---|---|
| Gauge Produk Terhitung | ichibot/KODE/p139/jumlah | 0–500 |
| Chart Laju per Menit | ichibot/KODE/p139/laju | 0–60 /mnt |
| Slider Output Target | ichibot/KODE/p139/target | 10–1000 |
| Switch Mulai dari 0 | ichibot/KODE/p139/ulang | payload ON / OFF |
| Text Log Pemberitahuan | ichibot/KODE/p139/log | 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 139 - Penghitung Produk di Konveyor 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_JUMLAH = "ichibot/budi1234/p139/jumlah";
const char* TOPIK_ULANG = "ichibot/budi1234/p139/ulang";
const char* TOPIK_TARGET = "ichibot/budi1234/p139/target";
const char* TOPIK_LOG = "ichibot/budi1234/p139/log";
const char* TOPIK_LAJU = "ichibot/budi1234/p139/laju";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const int SENSOR = D5; // E18-D80NK: LOW saat ada benda
long jumlah = 0, target = 100;
int perMenit = 0;
bool adaTadi = false, targetTercapai = false;
unsigned long lewatTerakhir = 0, menitTerakhir = 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_TARGET) target = p.toInt();
else if (topik == TOPIK_ULANG && p == "ON") {
jumlah = 0;
targetTercapai = false;
mqtt.publish(TOPIK_JUMLAH, "0", true);
mqtt.publish(TOPIK_ULANG, "OFF");
}
}
void langganan() {
mqtt.subscribe(TOPIK_TARGET);
mqtt.subscribe(TOPIK_ULANG);
}
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_PULLUP); // keluaran E18 butuh pull-up
sambungWiFi();
mqtt.setServer(BROKER, 1883);
mqtt.setCallback(pesanMasuk);
}
void loop() {
if (!mqtt.connected()) sambungMQTT();
mqtt.loop();
bool ada = digitalRead(SENSOR) == LOW;
if (ada && !adaTadi && millis() - lewatTerakhir > 150) { // satu benda = satu hitungan
lewatTerakhir = millis();
jumlah++;
perMenit++;
mqtt.publish(TOPIK_JUMLAH, String(jumlah).c_str(), true);
if (!targetTercapai && jumlah >= target) {
targetTercapai = true;
mqtt.publish(TOPIK_LOG, ("Target " + String(target) + " produk tercapai!").c_str());
}
}
adaTadi = ada;
if (millis() - menitTerakhir >= 60000) {
menitTerakhir = millis();
mqtt.publish(TOPIK_LAJU, String(perMenit).c_str());
perMenit = 0;
}
}Langkah 4: Pahami kodenya
- Keluaran NPN hanya bisa menarik ke GND. Tanpa pull-up, pin melayang saat tidak ada benda.
- Hitungan hanya di tepi naik (benda mulai terlihat), dengan jeda minimum 150 ms.