Menyalakan Lampu AC Menggunakan ESP32 & OpenCV (Kontrol Gerakan Tangan)

Tujuan
- Mendeteksi gerakan tangan (gesture) menggunakan kamera dan OpenCV.
- Mengirim perintah ON/OFF melalui WiFi dan MQTT.
- Mengendalikan relay ESP32 untuk menyalakan dan mematikan lampu AC.
⚠️ PERINGATAN KESELAMATAN LISTRIK Tegangan AC 220V/110V berbahaya! Semua sambungan listrik AC harus dilakukan oleh teknisi atau orang dewasa yang berpengalaman. Gunakan relay yang dilengkapi opto-isolator dan kotak pelindung.
-
Alat dan Bahan
Hardware
-
-
- 1 × ESP32 DevKit
- 1 × Modul relay 4-channel opto-isolated (bisa 1-channel sesuai kebutuhan)
- 3–4 × Lampu LED AC + fitting + kabel (atau gunakan beban DC untuk latihan aman)
- Kabel jumper male-female
- Webcam atau kamera laptop
-
Software
-
-
- Arduino IDE (untuk memprogram ESP32)
- Python 3.x
- Library Python: opencv-python, mediapipe, paho-mqtt
- Broker MQTT:
- Publik: test.mosquitto.org
- atau broker lokal (Mosquitto)
-
-
Rangkaian dan Skema
Wiring ESP32 ke Relay
Berdasarkan gambar rangkaian:
ESP32 Pin | Relay Pin |
VIN (5V) | VCC |
GND | GND |
GPIO 26 | IN1 |
GPIO 27 | IN2 |
GPIO 14 | IN3 |
GPIO 12 | IN4 |
Koneksi Lampu AC:
Kabel fase (L) diputus lewat relay. NO (Normally Open) disambungkan ke lampu. Netral (N) langsung ke lampu. Seluruh sambungan AC harus berada di box tertutup.
-
Instalasi Software
a.Arduino IDE
-
-
-
- Pasang Board ESP32 di Arduino IDE melalui Board Manager.
- Install library PubSubClient untuk MQTT.
-
-
b.Python di Laptop/PC
-
-
-
- Install Python 3.10+
- Buka terminal/Command Prompt:
-
-
-
-
-
- pip install opencv-python mediapipe paho-mqtt
-
-
-
Program Laptop/PC – Deteksi Tangan & MQTT
Gunakan kamera untuk mendeteksi gesture tangan (terbuka = ON, tertutup = OFF).
Kode Python (hand_control.py):
import cv2 import mediapipe as mp import paho.mqtt.client as mqtt import time BROKER = "test.mosquitto.org" TOPIC = "rumah/lampu/ruang_tamu/set" client = mqtt.Client("gesture_pc") client.connect(BROKER, 1883, 60) mp_hands = mp.solutions.hands mp_draw = mp.solutions.drawing_utils cap = cv2.VideoCapture(0) last_state = None last_send = 0 def count_fingers(hand): tips = [4,8,12,16,20] lm = hand.landmark fingers = 0 for tip,pip in [(8,6),(12,10),(16,14),(20,18)]: if lm[tip].y < lm[pip].y: fingers += 1 return fingers with mp_hands.Hands(max_num_hands=1) as hands: while True: ret, frame = cap.read() if not ret: break frame = cv2.flip(frame, 1) rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) result = hands.process(rgb) gesture = None if result.multi_hand_landmarks: for hand in result.multi_hand_landmarks: mp_draw.draw_landmarks(frame, hand, mp_hands.HAND_CONNECTIONS) fingers = count_fingers(hand) if fingers >= 4: gesture = "ON" elif fingers <= 1: gesture = "OFF" if gesture and gesture != last_state and time.time()-last_send > 1: client.publish(TOPIC, gesture) last_state = gesture last_send = time.time() print("Sent:", gesture) cv2.putText(frame, f"Gesture: {gesture}", (10,30), cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2) cv2.imshow("Hand Control", frame) if cv2.waitKey(1) & 0xFF == 27: break cap.release() cv2.destroyAllWindows()
-
Program ESP32 – Menerima Perintah MQTT & Mengontrol Relay
Kode Arduino (ESP32):
#include <WiFi.h> #include <PubSubClient.h> const char* ssid = "NAMA_WIFI"; const char* password = "PASSWORD_WIFI"; const char* mqtt_server = "test.mosquitto.org"; const char* topic = "rumah/lampu/ruang_tamu/set"; WiFiClient espClient; PubSubClient client(espClient); const int relays[4] = {26,27,14,12}; void callback(char* t, byte* payload, unsigned int len) { String msg; for (int i=0;i<len;i++) msg += (char)payload[i]; msg.trim(); Serial.println("Pesan: " + msg); int state = (msg=="ON") ? LOW : HIGH; for(int i=0;i<4;i++) digitalWrite(relays[i], state); } void reconnect() { while (!client.connected()) { if (client.connect("ESP32Client")) { client.subscribe(topic); } else { delay(2000); } } } void setup() { Serial.begin(115200); for(int i=0;i<4;i++){ pinMode(relays[i], OUTPUT); digitalWrite(relays[i], HIGH);} WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) delay(500); client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) reconnect(); client.loop(); }
-
Pengujian
-
- Pastikan rangkaian benar dan lampu terpasang aman.
- Jalankan kode ESP32 dan buka Serial Monitor.
- Jalankan hand_control.py di laptop.
- Arahkan tangan ke kamera:
- Telapak terbuka → Lampu MENYALA.
- Tangan mengepal → Lampu PADAM.
-
Tips Keamanan & Perluasan
-
- Selalu matikan MCB sebelum menyentuh kabel AC.
- Gunakan box pelindung untuk relay dan sambungan kabel.
- Bisa menambah indikator LED kecil di rangkaian ESP32 untuk memantau status ON/OFF tanpa AC.
- Untuk pengembangan lanjut, integrasikan dengan Home Assistant atau Google Assistant.
Dengan jobsheet ini, kamu sudah memiliki panduan lengkap AI + IoT: deteksi gerakan tangan → kirim perintah via WiFi → kendalikan relay ESP32 → nyalakan lampu AC dengan aman.