Satu tombol di pintu ruangan: setiap orang yang datang menekan sekali. Dashboard mencatat jam kedatangan dan jumlah yang hadir. Cocok untuk kelas, lab, atau rapat.
Setelah WiFi tersambung, NodeMCU mengambil jam dari internet lewat NTP (pool.ntp.org) dan menyetelnya ke WIB (UTC+7). Setiap tekanan menambah hitungan, membuat pesan seperti "07:58 Lab Komputer: hadir ke-12", dan menyalakan LED hijau sebentar sebagai tanda tercatat. Switch "Daftar baru" di HP mengembalikan hitungan ke 0 untuk sesi berikutnya.
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 |
| LED 5 mm hijau (isi 10)isi 10, terpakai 1 | 1 | Rp2.850 |
| Resistor 330 Ω (isi 10)isi 10, terpakai 1 | 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) | Rp59.775 |
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 |
| LED hijau + resistor 330 Ω + | → | D1 GPIO5 | hijau |
| LED hijau + resistor 330 Ω − | → | G | hitam |
Langkah 2: Siapkan dashboard Klenik
Cara cepat: unduh p020.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 Jumlah Hadir | ichibot/KODE/p020/hadir | 0–40 |
| Switch Daftar Baru | ichibot/KODE/p020/baru | payload ON / OFF |
| Text Log Daftar Hadir | ichibot/KODE/p020/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 020 - Absensi Tombol Hadir per Ruangan
// Board: NodeMCU ESP8266 V3 | Dashboard: klenik.ichibot.id
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <time.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_HADIR = "ichibot/budi1234/p020/hadir";
const char* TOPIK_LOG = "ichibot/budi1234/p020/log";
const char* TOPIK_BARU = "ichibot/budi1234/p020/baru";
const char* BROKER = "mqtt.ichibot.id";
WiFiClient wifi;
PubSubClient mqtt(wifi);
const char* RUANGAN = "Lab Komputer";
const int TOMBOL = D5, LED = D1;
bool tadi = HIGH;
unsigned long waktuTekan = 0;
int hadir = 0;
String jamSekarang() {
time_t t = time(nullptr);
struct tm* w = localtime(&t);
char buf[6];
strftime(buf, sizeof(buf), "%H:%M", w);
return String(buf);
}
void pesanMasuk(char* t, byte* isi, unsigned int panjang) {
String p;
for (unsigned int i = 0; i < panjang; i++) p += (char)isi[i];
if (p == "ON") {
hadir = 0;
mqtt.publish(TOPIK_HADIR, "0", true);
mqtt.publish(TOPIK_LOG, "Daftar hadir baru dimulai");
}
}
void langganan() {
mqtt.subscribe(TOPIK_BARU);
}
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();
configTime(7 * 3600, 0, "pool.ntp.org"); // WIB = UTC+7
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) {
hadir++;
String pesan = jamSekarang() + " " + RUANGAN + ": hadir ke-" + String(hadir);
mqtt.publish(TOPIK_LOG, pesan.c_str());
mqtt.publish(TOPIK_HADIR, String(hadir).c_str(), true);
digitalWrite(LED, HIGH); // tanda tercatat
delay(400);
digitalWrite(LED, LOW);
}
}
}Langkah 4: Pahami kodenya
- Ganti dengan nama ruanganmu. Kalau ada beberapa ruangan, buat satu alat per ruangan dengan nama berbeda dan topic yang sama.
- Mengubah waktu menjadi teks jam:menit. Ganti format jadi
"%d/%m %H:%M"kalau tanggal juga perlu dicatat. - Sinkron jam dari internet. 7 × 3600 detik = UTC+7 (WIB). Untuk WITA pakai 8, untuk WIT pakai 9.
- Satu-satunya
delay()di proyek ini: LED tanda tercatat menyala 0,4 detik. Masih aman karena singkat.