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.








