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.
  1. 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)
  1. Rangkaian dan Skema
Wiring ESP32 ke Relay

esp32 opencv

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.

  1. Instalasi Software
a.Arduino IDE
        1. Pasang Board ESP32 di Arduino IDE melalui Board Manager.
        2. Install library PubSubClient untuk MQTT.
b.Python di Laptop/PC
        1. Install Python 3.10+
        2. Buka terminal/Command Prompt:
        1. pip install opencv-python mediapipe paho-mqtt
  1. 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()
  1. 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();

}
  1. Pengujian
    1. Pastikan rangkaian benar dan lampu terpasang aman.
    2. Jalankan kode ESP32 dan buka Serial Monitor.
    3. Jalankan hand_control.py di laptop.
    4. Arahkan tangan ke kamera:
      • Telapak terbuka → Lampu MENYALA.
      • Tangan mengepal → Lampu PADAM.
  1. 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.

 

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Daftar Sekarang
CLOSE