Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Tampilkan postingan dengan label tutorial. Tampilkan semua postingan
Tampilkan postingan dengan label tutorial. Tampilkan semua postingan

Jumat, 12 Januari 2024

[Node Red] Deteksi Object Pada CCTV Menggunakan Yolo

 


Tutorial yang akan saya tuliskan pada blog kali ini merupakan penggabungan dari beberapa tulisan maupun video kuliah saya sebelumnya, sehingga untuk kelancaran tutorial harap menyimak pembahasan sebelumnya yaitu :


  • Yolo dan python untuk deteksi objek :  Videonya dilihat disini
  • Menjalankan python pada node-red : Klik disini

Untuk sumber dari gambar capture dari  CCTV bisa mengambil dari berbagai lokasi cctv publik yang ada di internet, dan yang saya pakai pada praktek kali ini adalah CCTV di wilayah jogja yang berbasis wowza sehingga source streamingnya dapat dilihat (melalui cara tertentu). Alamat untuk masuk ke koleksi CCTV kota jogja (paling menarik seputaran malioboro) dapat dilihat di alamat : https://cctv.jogjakota.go.id/. 




Lokasi diatas adalah monumen nol kilometer di ujung malioboro dengan alamat cctv nya : https://cctvjss.jogjakota.go.id/malioboro/NolKm_Timur.stream/chunklist_w221624478.m3u8 . Jadi jika url streaming diatas mati atau berubah, silahkan cari sendiri ya !


Script - Yolo - Python :

import cv2
import numpy as np
import time
import sys

#penghitung waktu proses
starting_time = time.time()

#cmd windows pake spasi biar bisa dieksekusi pada node-red
if len(sys.argv) != 2:
    print("Cara Pakai: python<spasi>script.py<spasi>alamat/stream_url")
    sys.exit(1)

# ambil cmd pada bagian sumber streaming sesuai usage
stream_url = sys.argv[1]

# Open the video stream
cap = cv2.VideoCapture(stream_url)

# ambil 1 frame terakhir aja
ret, img = cap.read()

# alamat direktori yolo harus lengkap
yolo = cv2.dnn.readNet("G:\\IOT\\node_red\\yolov3.weights", "G:\\IOT\\node_red\\yolov3.cfg")
classes = []

with open("G:\\IOT\\node_red\\coco.names", "r") as file:
    classes = [line.strip() for line in file.readlines()]

#proses yolo
layer_names = yolo.getLayerNames()
output_layers = [layer_names[i - 1] for i in yolo.getUnconnectedOutLayers()]

colorRed = (0,0,255)
colorGreen = (0,255,0)

# #Loading Images
#img = cv2.imread(name)
height, width, channels = img.shape

# # Detecting objects
blob = cv2.dnn.blobFromImage(img, 0.00392, (255, 255), (0, 0, 0), True, crop=False)

yolo.setInput(blob)
outputs = yolo.forward(output_layers)

# deteksi 3 object orang (0), mobil(2) dan motor(3)
class_ids = []
confidences = []
boxes = []
for output in outputs:
    for detection in output:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > 0.5 and ( class_id == 0 or class_id == 2 or class_id == 3): # 3 objek
            center_x = int(detection[0] * width)
            center_y = int(detection[1] * height)
            w = int(detection[2] * width)
            h = int(detection[3] * height)

            x = int(center_x - w / 2)
            y = int(center_y - h / 2)
			#simpan koordinat dan nilai keyakinan
            boxes.append([x, y, w, h]) 
            confidences.append(float(confidence))
            class_ids.append(class_id)



#perhitungan indeks dan 3 object
indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
org = 0
mob = 0
mot = 0

#kotak dan tulisan deteksi objek
for i in range(len(boxes)):
    if i in indexes:
        if class_ids[i] == 0:
            org = org + 1
            label = 'orang(' + repr(org)+ ')'
        elif class_ids[i] == 2:
            mob = mob + 1
            label = 'mobil(' + repr(mob)+ ')'
        elif class_ids[i] == 3:
            mot = mot + 1
            label = 'motor(' + repr(mot)+ ')'
        x, y, w, h = boxes[i]
        cv2.rectangle(img, (x, y), (x + w, y + h), colorGreen, 3)
        cv2.putText(img, label, (x, y -5), cv2.FONT_HERSHEY_DUPLEX, 2, (255,255,255) )


print("{")
print(f"\"Jumlah Orang\": {org},")
print(f"\"Jumlah Mobil\": {mob},")
print(f"\"Jumlah Motor\": {mot},")

elapsed_time = time.time() - starting_time
print("\"processing time\":" + repr(elapsed_time)  )
print("}")
## dibawah ini pilih mau simpan gambar atau tampilkan saja, sesuaikan kebutuhan
#cv2.imshow("Image", img)
cv2.imwrite("G:\\IOT\\node_red\\output.jpg",img) #
#cv2.waitKey(0)
#cv2.destroyAllWindows()


Hasil dari script diatas berupa string json yang nantinya berguna pada pengolahan data.




Node-Red Flow 


Untuk bagian ini cukup mengikuti pembahasan sebelumnya, dengan perbedaan inject yg digunakan berupa payload alamat stream dari CCTV.




Untuk menampilkan hasil pada flow, maka dibutuhkan pallete yang bernama : node-red-contrib-image-tools , dan untuk melakukan refresh agar tampilannya berubah setelah eksekusi script yolo selesai adalah dengan menggunakan function trigger.




Dengan konfigurasi diatas maka node image viewer akan menampilkan gambar bernama output.jpg setelah 250ms script yolo berhasil dieksekusi. Jika mau langsung import flow nya bisa copas json dibawah ini.


[
    {
        "id": "5e5b156e7f57b6cc",
        "type": "tab",
        "label": "aisi555 dot com",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "d4809067.5e61a",
        "type": "inject",
        "z": "5e5b156e7f57b6cc",
        "name": "nama stream",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": "20",
        "topic": "",
        "payload": "https://cctvjss.jogjakota.go.id/atcs/ATCS_Lampu_Merah_SugengJeroni1.stream/chunklist_w758098670.m3u8",
        "payloadType": "str",
        "x": 190,
        "y": 40,
        "wires": [
            [
                "7a4e8130.b846f8"
            ]
        ]
    },
    {
        "id": "7a4e8130.b846f8",
        "type": "exec",
        "z": "5e5b156e7f57b6cc",
        "command": "python G:\\IOT\\node_red\\yolo_stream.py ",
        "addpay": "payload",
        "append": "",
        "useSpawn": "false",
        "timer": "",
        "winHide": false,
        "oldrc": false,
        "name": "",
        "x": 520,
        "y": 40,
        "wires": [
            [
                "c95a2a0563597a2b",
                "50dcecd33a88080d"
            ],
            [],
            []
        ]
    },
    {
        "id": "c95a2a0563597a2b",
        "type": "debug",
        "z": "5e5b156e7f57b6cc",
        "name": "debug 6",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 920,
        "y": 20,
        "wires": []
    },
    {
        "id": "50dcecd33a88080d",
        "type": "trigger",
        "z": "5e5b156e7f57b6cc",
        "name": "",
        "op1": "",
        "op2": "G:/IOT/node_red/output.jpg",
        "op1type": "nul",
        "op2type": "str",
        "duration": "250",
        "extend": false,
        "overrideDelay": false,
        "units": "ms",
        "reset": "",
        "bytopic": "all",
        "topic": "topic",
        "outputs": 1,
        "x": 920,
        "y": 80,
        "wires": [
            [
                "d6cf44e31cac223d"
            ]
        ]
    },
    {
        "id": "d6cf44e31cac223d",
        "type": "image viewer",
        "z": "5e5b156e7f57b6cc",
        "name": "",
        "width": "800",
        "data": "payload",
        "dataType": "msg",
        "active": true,
        "x": 190,
        "y": 120,
        "wires": [
            []
        ]
    }
]


Dengan kreativitas pembaca maka flows diatas dapat diatur otomatis eksekusi tiap selesai script yolo di eksekusi, mungkin juga berdasarkan waktu atau sebagainya. Mungkin jika komputer kamu super cepat dengan VGA sekelas gamers maka pengolahan gambarnya bisa di level video  (25fps minimal).


Beberapa faktor yang mempengaruhi keberhasilan deteksi object sebagai berikut :

  • Yolo v3 yang digunakan masih menggunakan weights bawaan dari yolo, sehingga tingkat keberhasilan pendeteksiannya hanya dibilang "cukup" karena object yg bisa dideteksi banyak dan umum.
  • Untuk pendeteksian objek yang spesifik dan lebih teliti bisa melakukan training pada object-object yang di kehendaki saja dan akan dibahas pada kesempatan lainnya
  • Tingkat kualitas kamera sangat menentukan deteksi object 

Share:

[Node Red] Script Python Pada Flow Node Red

 


Python sebagai bahasa pemrograman "serba bisa"  sekarang ini cenderung diakomodir untuk bekerjasama (atau pun terpaksa agar lebih up to date) dengan berbagai platform pemrograman visual jaman sekarang. Al hasil - Node Red - sebagai platform pemrograman otomasi "drag and drop" juga memiliki beberapa fasilitas untuk menjalankan script python, baik secara flow/pallete langsung atau memanfaatkan cara paling mudah menurut saya yaitu melalui node eksekusi shell / cmd / terminal  bernama "EXEC".



Sesuai yang kita sudah pahami, perintah shell bermacam-macam yah mungkin jika anda menggunakan CMD pada windows anda bisa menulisakan perintah "date" atau ping ke IP tertentu, semisal ip nya di masukkan ke manual trigger sebagai payload. Output dari node EXEC ada tiga berupa standard output, standar error dan return /exit code. 

Untuk memahami bagaimana cara menjalankan script python pada node red, saya anggap pemahaman python pembaca sudah level dasar, sehingga mudah memahami script dibawah ini untuk membaca inputan dary SYS.ARGV .



Sys.argv akan membaca inputan sebagai list/array dengan anggota yang dipisahkan oleh spasi. Sehingga script diatas jika dijalankan pada shell akan mendapatkan balasan sesuai input yang diberikan. Mari kita pindahkan script ini menjadi bergabung dengan node-red.



Gambar diatas menunjukkan flow node red dimana saya akan menginjekkan suatu nilai msg.payload ke node EXEC dan kemudian akan meng-eksekusi scipt python sederhana pada gambar sebelumnya. Saya akan melakukan append msg.payload dibagian belakang dari perintah shell pythonnya, dan harus diingat semua dependencies dari direktori shellnya harus ditulis dengan lengkap.



Hasilnya seperti pada gambar, ketika saya inject timestamp maka output akan keluar sesuai yang diharapkan dari script pythonnya. Bagaimana jika nilai yang diinject kosong?



Terlihat yang dioutput pada debug node sesuai yang diharapkan, dimana script python akan menjawab "kamu kirim kosong". Dan jika terjadi error semisal coding python saya salah maka debug juga akan memberikan output kesalahan yg dialami asalkan node debugnya diletakkan pada flow yang benar.



Pada tulisan selanjutnya saya akan mempraktekkan kemampuan node-red untuk bekerjasama dengan script python-yolo untuk pengenalan object.




Share:

Jumat, 08 Desember 2023

Dimmer Arus AC: Menghubungkan Triac Dengan IOT - MQTT

 



Pembahasan saya kali ini merupakan kesimpulan dari 4 tulisan saya sebelumnya dan juga merupakan evaluasi dari pengumpulan tugas dari mahasiswa saya di jurusan teknik listrik - fakultas vokasi - unesa Surabaya. Tugas yang saya berikan bertujuan untuk memperkenalkan konsep elektronika daya modern yang terhubung dengan IOT sehingga mahasiswa mampu membayangkan kedepannya akan berhadapan dengan kelistrikan model terbaru.

Untuk menghubungkan Triac dimmer ke IOT sebenarnya bisa pembaca rangkai sendiri dengan menelusuri tulisan saya sebelumnya mengenai konsep mikrokontroller dengan protokol IOT MQTT. 

Ada 2 buah konsep PUBLISH dan SUBSCRIBE yang bisa dibaca dipenjelasan tulisan saya disini.


- Dimmer IOT tanpa ZCD

Perhatikan rangkaian dibawah ini, yang merupakan rangkaian dimmer yang sering dijumpai dan dapat dibeli di toko online, dan telah saya bahas sebelumnya disini.



Dari rangkaian sederhana diatas dapat dilihat bahwa pengaturan trigger dari Triac didapatkan oleh delay R-C yang terhubung dengan Diac. Dengan merubah nilai VR / potensiometer pada rangkaian diatas maka dapat pula merubah kecerahan dari lampu/beban akibat delay "firing angle" pada triac. Bagaimana kalau resistansinya ini kita ubah secara IOT ? Perhatikan ulasan pameran saya terdahulu yang bisa dibaca disini



Pada pameran ini saya mendapatkan ide untuk mengontrol lampu menggunakan fitting lampu ber LDR (yang umum ada di toko listrik) dimana saya akan menyalakan lampu dan mematikannya secara IOT. Untuk itu kita akan tiru konsepnya namun kini saya akan dengan merubah resistansi pada potensiometer dengan menggantinya dengan LDR dan memberikannya sumber cahaya dari LED. Jadi dengan merubah-ubah kecerahan lampu LED maka resistansi dari LDR akan ikut berubah dan berefek pada Triac dan beban lampu.


#include <ESP8266WiFi.h>
#include <PubSubClient.h> //library pubsub MQTT



const char *ssid =  "nama wifi";   // Gunakan sesuai wifi kamu
const char *pass =  "passwordnya";   // password

//inisialisasi broker
const char *mqtt_server = "broker.hivemq.com"; //BROKER GRATIS
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "namamu123456"; // Client connections random dan gak boleh sama

// Ubah nama topik biar unik gak nabrak sama rekan lainnya
#define TOPIC "/aisi555/dimmer"

//IO pin

#define LED_DIM D4  //prot D4 ke LED lalu menyinari LDR

WiFiClient wclient;            //wifi client terhubung lib pubsub
PubSubClient client(wclient);

void setup() {
  pinMode(LED_DIM, OUTPUT);  //inisialisasi LED

  digitalWrite(LED_DIM,LOW);
  
  //Inisialisasi broker & Callback sub message
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(mqtt_callback);
  Serial.begin(9600);
  delay(10);
  Serial.println();
  Serial.println();
  setupwifi();

}

void setupwifi()
{
   if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Terhubung Ke Wifi:  ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
      return;
    Serial.println("WiFi Terhubung");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
}

void reconnectmqtt() //function mengatur koneksi ke broker 
{
   
    
      Serial.println("Connecting to MQTT server..");
     
      if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
        Serial.println("Connected to MQTT server");
      } else {
        Serial.println("Could not connect to MQTT server");   
      }
   

    if (client.connected()){
      Serial.print("subscribe to topic: ");
      Serial.println(TOPIC);
      client.subscribe(TOPIC); //subscribe ke topic 
    }
  
}


//function callback saat ada pesan SUB yg masuk

void mqtt_callback(char* topic, byte* payload, unsigned int length) {
 
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
 
  Serial.print("Message:");
 
  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  //Conver *byte to String
  }
   Serial.print(message);
   
  analogWrite(LED_DIM, message.toInt()); //angka yg masuk 0-255 jadi sesuaikan
    
  Serial.println();
  Serial.println("-----------------------");  


}



void loop() {
 
  if (!client.connected()) 
   {
    reconnectmqtt();
   }
   else client.loop(); //cek terus kalau ada data masuk
  
  
}



Hasil dari script diatas seperti video praktek mahasiswa saya dibawah. Perhatikan bahwa perlu adanya penyesuaian jarak antara led vs LDR sehingga nilai yang didapatkan sesuai. Bisa juga dengan mengatur angka yang dikirim dicari minimum dan maksimum yang sesuai dengan tingkat kecerahan lampu.




- Dimmer Menggunakan ZCD


Script yang digunakan oleh mahasiswa saya kebanyakan menggunakan library dimmer dari robodyn, namun kesulitan mereka adalah memahami konsep dimmernya, apa sih yang dilakukan oleh Triac?

Sebenarnya konsepnya bisa dibaca pada tulisan saya sebelumnya disini, dimana yang diatur adalah delay firing angle atau "derajat tembak" dari triac setelah terjadi momen Zero crossing. Scriptnya cukup sederhana, hanya merubah sedikit saja.



#include <ESP8266WiFi.h>
#include <PubSubClient.h> //library pubsub by o'leary

const char *ssid =  "nama wifi";   // Gunakan sesuai wifi kamu
const char *pass =  "passwordnya";   //

//inisialisasi broker
const char *mqtt_server = "broker.hivemq.com"; //BROKER GRATIS
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "namamu123456"; // Client connections random dan gak boleh sama

// Ubah nama topik biar unik gak nabrak sama rekan lainnya
#define TOPIC "/aisi555/dimmer"

//IO pin
#define zcd_pin 3 //sesuaikan dengan pin zcd kamu
#define triac_pin 4 //sesuaikan dengan pin triac kamu

int nilai = 0;

WiFiClient wclient;            //wifi client terhubung lib pubsub
PubSubClient client(wclient);

void setup() {

  pinMode(zcd_pin, INPUT_PULLUP);
  pinMode(triac_pin, OUTPUT);
  attachInterrupt(zcd_pin, deteksi, FALLING); // attach Interrupt 
  digitalWrite(triac_pin, LOW);
  
  //Inisialisasi broker & Callback sub message
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(mqtt_callback);
  Serial.begin(9600);
  delay(10);
  Serial.println();
  Serial.println();
  setupwifi();
}

void setupwifi()
{
   if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Terhubung Ke Wifi:  ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

    if (WiFi.waitForConnectResult() != WL_CONNECTED)
     return;
    Serial.println("WiFi Terhubung");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());
  }
}

void reconnectmqtt() //function mengatur koneksi ke broker 
{
    
      Serial.println("Connecting to MQTT server..");
     
      if (client.connect(mqtt_client_name,mqtt_user, mqtt_pass)) {
        Serial.println("Connected to MQTT server");
      } else {
        Serial.println("Could not connect to MQTT server");   
      }
   

    if (client.connected()){
      Serial.print("subscribe to topic: ");
      Serial.println(TOPIC);
      client.subscribe(TOPIC); //subscribe ke topic 
    }
  
}



//function callback saat ada pesan SUB yg masuk

void mqtt_callback(char* topic, byte* payload, unsigned int length) {
 
  Serial.print("Message arrived in topic: ");
  Serial.println(topic);
 
  Serial.print("Message:");
 
  String message;
  for (int i = 0; i < length; i++) {
    message = message + (char)payload[i];  //Conver *byte to String
  }
   Serial.print(message);
   nilai= map(message.toInt(),0,100, 200,7200); // merubah message ke range yang sesuai 0-100
  
    
  Serial.println();
  Serial.println("-----------------------");  


}


ICHACE_RAM_ATTR void deteksi() //deteksi Zerro cross dan delay on triac
{
  delayMicroseconds(nilai); 
  digitalWrite(triac_pin, HIGH);
  
  
  delayMicroseconds(50);  //delay 50 uSec on output pulse to turn on triac
  digitalWrite(triac_pin, LOW);
}

void loop() {
 
  if (!client.connected()) 
   {
    reconnectmqtt();
   }
   else client.loop(); //cek terus kalau ada data masuk
  
  
  
}


Hasilnya bisa dilihat pada video mahasiswa saya dibawah ini :





Share:

Dimmer Arus AC: Menghubungkan ESP8266 Dengan Triac

 


DISCLAIMER : Bermain dengan listrik PLN 220 volt adalah berbahaya, selalu gunakan sarung tangan kain untuk menghindari terjadinya sengatan listrik


Untuk memperlancar pemahaman pada topik kali ini, diharapkan membaca dulu :


- Triac sebagai switch disini

- Zero Crossing Detector ESP8266 disini



Rangkaian yang akan saya gunakan sudah banyak beredar di berbagai sumber di internet, terdiri dari optotriac MOC3021, Triac BTXX dan beberapa resistor pembatas arus. Rangkaian pda umumnya seperti ini :




Script yang akan kita gunakan kali ini cukup sederhana saja, hanya akan memberikan delay beberapa waktu saat zero crossing terdeteksi lalu memutus triacs. Jika delay firing OFF nya lama maka lampu akan terang dan jika cepat saja maka akan menyebabkan triac hidup lebih sebentar dalam 1 periode sinus AC nya.




#include<NoDelay.h>


#define zcd_pin 3 //sesuaikan dengan pin zcd kamu
#define triac_pin 4 //sesuaikan dengan pin triac kamu


noDelay delaytime(500);//ubah waktu perubahan kecerahan



int x,y = 0;
bool naik = true;

void setup() {

  pinMode(zcd_pin, INPUT_PULLUP);
  pinMode(triac_pin, OUTPUT);
  attachInterrupt(zcd_pin, deteksi, FALLING); // attach Interrupt 
  
}

void loop() {

  if(delaytime.update())//buat tambah variabel x
  {
    
	if(naik) x+=10;
	else x=-10;
	
	
	if(x>=100) naik = false;
	else (x <=0 ) naik = true;
	
	y= map(x,0,100, 200,7200); // merubah x ke range y
  
  
  
  }
}

ICHACE_RAM_ATTR void deteksi()
{
  delayMicroseconds(y); 
  digitalWrite(triac_pin, HIGH);
  
  
  delayMicroseconds(50);  //delay 50 uSec on output pulse to turn on triac
  digitalWrite(triac_pin, LOW);
}



Dan efek apakah yang muncul pada lampu? Silahkan ubah-ubah angka yang ada pada script untuk membuat pembaca lebih mengerti maksud dari script diatas.



Jika pembaca sering main di blog ini, maka membuat otomasi lampu IOT seperti gambar diatas akan menjadi sangat mudah seperti yang saya rangkum disini.



SELAMAT BELAJAR.

Share:

Dimmer Arus AC - Mendeteksi Zero Cross Menggunakan ESP8266

 


DISCLAIMER : Bermain dengan listrik PLN 220 volt adalah berbahaya, selalu gunakan sarung tangan kain untuk menghindari terjadinya sengatan listrik


Gambar diatas adalah perubahan sinyal yang ingin kita capai untuk mendeteksi yang dinamakan Zero crossing dari gelombang sinusoidal listrik AC.  Perhatikan gambar rangkaian berikut dan akan saya jelaskan prinsip kerjanya.



  1. Resistor 47K berjumlah 2 buah sebagai pembatas arus sehingga dapat bekerja pada tegangan AC yang dapat ditolelir oleh dioda bridge
  2. Dioda bridge berfungsi untuk menjadi rectifier merubah sinus menjadi full wave rectified AC dimana saat sinus berada di tegangan negatif akan dibalik menjadi positif
  3. Optocoupler yang dipilihkan bisa berjenis 4N25 / PC817 yang kemudian akan mendeteksi ketika sinyal sinus berada disekitar 0 volt yang menyebabkan led internalnya OFF
  4. Resistor pull up 10K akan menyebabkan kondisi logic ZCD = 0 saat LED ON dan ketika LED OFF (pada optocoupler) maka akan menyebabkan pulse pada output ZCD yang menuju microcontroller.


- Interupt pada ESP8266 


ESP 8266 memiliki kecepatan prosesor yang cukup tinggi bila dibandingkan seri arduino, sehingga  portnya kebanyakan dapat digunakan sebagai input interrupt. Jika menggunakan arduino uno berbasis mega328 maka pin interruptnya hanya ada di pin I/O nomer 2. 

Untuk belajar konsep interrupt dapat dibaca pada tulisan saya sebelumnya disini.

Ada yang spesial pada interrupt di ESP8266 dimana function untuk melakukan interrupt harus disediakan di RAM, sehingga jika menggunakan contoh pada arduino akan terjadi overflow dan ram akan error. Untuk itu dibutuhkan penambahan ini :


ICHACE_RAM_ATTR void perintah_zcd()
{

// masukkan perintah eksekusi interupt jika memakai sketch jadul  
    
}

IRAM_ATTR void perintah_zcd()
{

// masukkan perintah eksekusi interupt jika sketch 3.o keatas  
    
}


Jadi script contoh yang lengkap untuk pendeteksi Zero Crossing sebagai berikut:


#define zcd_pin 3 //sesuaikan dengan pin esp kamu


int x = 0;

void setup() {
  Serial.begin(9600);
  pinMode(zcd_pin, INPUT_PULLUP);
  attachInterrupt(zcd_pin, deteksi, FALLING); // attach Interrupt 
  
}

void loop() {

 
}

ICHACE_RAM_ATTR void deteksi()
{
   x++;
   Serial.print("ZCD terdeteksi ke: ");
   Serial.println(x);
 
}

Sambungkan rangkaian pendeteksi ZCD ke pin ESP8266 dan upload script diatas dan lihatlah pada serial monitor kamu.
Share:

Selasa, 05 Desember 2023

Dimmer Arus AC - Merancang dengan Diac dan Triac

 



Pernahkah Anda bertanya-tanya bagaimana kita bisa mengatur kecerahan lampu dengan halus? Jawabannya ada pada perangkat kecil yang sering kita abaikan: Triac dan Diac dalam dimmer.


Triac dan Diac: Kombinasi yang Memungkinkan


Triac adalah semikonduktor yang memungkinkan arus listrik mengalir dalam kedua arah. Ini membuatnya ideal untuk pengatur daya pada sistem AC. Di sisi lain, Diac merupakan semikonduktor yang berfungsi sebagai pencetus / trigger untuk memicu triac ON.


Bagaimana Mereka Bekerja?


Rangkaian dimmer menggunakan diac untuk memicu triac pada titik-titik tertentu dari gelombang sinusoidal pada arus bolak-balik (AC). Saat gelombang melewati titik nol atau zero crossing, diac memberi isyarat pada triac untuk "mengaktifkan" aliran listrik. Triac kemudian menyalurkann aliran listrik ke lampu, memungkinkan kita mengatur kecerahan dengan mengatur momen / delay di mana triac diizinkan untuk mengalirkan listrik.



Dimmer yang menggunakan triac-diac merupakan metode yang digunakan untuk mengatur kecerahan lampu dengan mengubah besar kecilnya energi yang masuk ke lampu. Di bawah ini adalah penjelasan langkah demi langkah cara kerja dimmer tersebut:


Pengenalan Komponen:


Triac: Ini adalah semikonduktor yang dapat mengontrol arus listrik pada kedua arah, baik positif maupun negatif dalam siklus arus bolak-balik (AC). Triac dapat diaktifkan untuk memberikan aliran arus listrik setelah menerima impuls dari komponen pencetus atau trigger.

Diac (Diode for Alternating Current): Diac adalah semikonduktor yang bekerja sebagai pencetus atau trigger untuk mengaktifkan triak pada titik tertentu dari gelombang AC. Ketika tegangan di sekitar diak telah mencapai ambang batas (threshold), diak akan memberi sinyal atau impuls pada triac untuk mengizinkannya untuk mengalirkan arus listrik.


Prinsip Kerja Dimmer Triak-Diac:


  1. Rangkaian dimmer menggunakan diac untuk mendeteksi titik zero crossing atau titik nol dari gelombang sinusoidal pada arus AC. Zero crossing merupakan saat ketika gelombang AC melewati nilai nol di tengah-tengah gelombangnya.
  2. Ketika gelombang AC melewati titik nol, diac mendeteksi momen ini dan memberikan sinyal pada triac untuk diaktifkan.
  3. Setelah triac diaktifkan oleh diak, triak memungkinkan aliran arus listrik ke lampu. Dengan mengatur momen di mana triac diizinkan untuk mengalirkan arus, kita secara efektif mengontrol seberapa lama lampu akan menyala dalam setiap siklus gelombang AC.

Pembuatan Rangkaian Dimmer:


Rangkaian dimmer ini terdiri dari komponen-komponen dasar seperti diac, triac, dan beberapa elemen pengatur yang memungkinkan pengguna untuk mengatur kecerahan lampu sesuai keinginan.

Desain rangkaian dimmer ini memerlukan pemilihan komponen yang tepat sesuai dengan tegangan dan daya yang akan diatur.


Kit dimmer triacs-diacs yang umum dijual di pasaran



Pengaturan Kecerahan:


Dengan menggunakan potensiometer atau komponen pengatur lainnya pada rangkaian, pengguna dapat mengubah momen di mana triak diizinkan untuk mengalirkan arus listrik ke lampu. Hal ini akan mengatur kecerahan lampu dengan merubah proporsi energi yang masuk ke lampu pada setiap siklus gelombang AC.

Dengan memahami prinsip kerja dimmer yang menggunakan triak-diac, kita bisa merancang dan membuat rangkaian yang memungkinkan kontrol yang halus terhadap kecerahan lampu pada sistem listrik AC.

Share:

Dimmer Arus AC - Pengenalan Konsep Zero Crossing


Arus listrik, inti dari hampir semua perangkat elektronik, hadir dalam dua bentuk utama: arus bolak-balik (AC) yang berayun maju-mundur seperti gelombang dan arus searah (DC) yang alirannya konsisten ke satu arah. Perbedaan mendasar di antara keduanya terletak pada konsep zero crossing.

Arus Bolak-Balik (AC): Bayangkan gelombang sinusoidal yang naik dan turun, melintasi titik nol secara teratur. Inilah zero crossing pada AC. Titik di mana arus melintasi nilai nol pada gelombang sinusoidal, membuatnya melaju dari positif ke negatif sebelum kembali lagi ke nol. Konsep yang sederhana, tapi penting, karena memengaruhi banyak aspek aplikasi listrik kita sehari-hari.

Arus Searah (DC): Sebaliknya, dalam arus searah, tidak ada konsep zero crossing. Arusnya mengalir dalam satu arah saja tanpa gelombang atau fluktuasi nilai nol. Meskipun sederhana, DC memiliki peran yang krusial dalam teknologi baterai, perangkat portabel, dan sistem elektronik yang memerlukan aliran arus stabil.


Bagaimana Perbedaan Ini Mempengaruhi Kita?


Pada dasarnya, perbedaan zero crossing antara AC dan DC memengaruhi cara kita memanfaatkannya dalam teknologi sehari-hari. Pengaturan daya, sistem pengendalian, bahkan kecerahan lampu dapat dikendalikan dengan memanfaatkan momen zero crossing pada arus bolak-balik.



Contohnya, dalam pengaturan daya lampu dengan dimmer, zero crossing pada AC menjadi krusial. Ketika kita memotong aliran listrik pada titik-titik tertentu dari gelombang sinusoidal, itu bisa mengatur kecerahan lampu dengan halus.

Kemudian, dalam dunia arus searah, konsistensi aliran arusnya memainkan peran penting dalam perangkat yang memerlukan stabilitas. Baterai, peralatan portabel, dan beberapa sistem elektronik mengandalkan arus searah untuk operasi yang andal.

Perbedaan sederhana antara zero crossing pada AC dan ketiadaannya dalam DC membawa implikasi besar dalam desain sistem, penggunaan, dan efisiensi energi. Memahami kedua konsep ini membantu kita mengaplikasikan teknologi dengan lebih cerdas dan efektif.




Zero crossing pada listrik AC adalah saat sinyal listrik melintasi titik nol pada grafik gelombang sinusoidal. Pada tegangan atau arus AC, gelombang sinusoidal naik dari nilai nol, mencapai puncak positifnya, turun kembali ke nol, lalu melanjutkan ke nilai negatif sebelum kembali lagi ke nol. Titik di mana gelombang ini melewati nilai nol disebut zero crossing.

Zero crossing memiliki kegunaan penting dalam berbagai aplikasi listrik, terutama dalam elektronika daya dan pengendalian daya. Beberapa manfaatnya termasuk:


  • Pengaturan Pemutusan: Dalam sistem pengendalian daya, zero crossing sering digunakan untuk memutus atau menghubungkan sirkuit pada titik-titik tertentu pada gelombang sinusoidal untuk mengontrol peralihan atau pengaturan daya.
  • Dimmer dan Kontrol Lampu: Untuk mengatur kecerahan lampu pada sistem dimmer, zero crossing digunakan untuk mengetahui kapan harus memotong atau mengatur daya yang masuk ke lampu.
  • Pengendalian Motor: Dalam pengendalian motor, zero crossing bisa digunakan untuk memulai atau menghentikan rotasi motor pada titik-titik tertentu dari gelombang listrik.
  • Pengurangan Interferensi: Dalam beberapa aplikasi, zero crossing digunakan untuk mengurangi interferensi elektromagnetik antara peralatan elektronik.


Share:

Kamis, 09 November 2023

Cara Chat GPT Membantu Kodingan Kamu - Edisi Publish MQTT Web Socket

 



Perkenalan saya dengan fenomena Artificial Inteligent "Chat GPT" memasuki tahun ke dua dan terus menghasilkan rasa takjub di otak saya. Walau ada sedikit ke khawatiran yang selalu muncul sejak awal, yaitu mungkin akan mengakibatkan  'kemalasan' otak untuk berpikir. Namun atas saran seorang teman yang sangat membanggakan platform dari openAI apalagi si dia sudah mencoba versi 4 yang berbayar, saya makin gatel untuk mencobanya. Asalkan kamu bisa menggiring "prompt"  nya, maka semua pertanyaan yang kamu ajukan akan mendapatkan hasil yang memuaskan, begitu saran teman saya ini.

Seperti pada tulisan kali ini disaat suntuk kepanasan di siang bolong, saya membaca kembali tulisan saya sebelumnya tentang e-voting menggunakan MQTT dan python ( disini ), dan ketika melihat tampilan e-votingnya begitu 'rudimental' maka saya teringat dulu saya pernah juga membuat APK android  berbasis web saat bermain-main esp8266 dan kunci motor, bisa dibaca disini

Tapi permasalahannya saya gak paham apakah "plain" html dapat melakukan koding MQTT ? Seingat saya ada istilah di broker mqtt yang saya sering gunakan yaitu hivemq memiliki support terhadap protokol websocket di port 8000. Daripada pusing maka saya menggunakan fasilitas chat GPT untuk mencari jawaban bagaimana  cara coding htmlnya. Ayo saya share ke pembaca langkah2 saya menggunakan chat GPT.



Saya iseng aja membuka pembicaraan seperti gambar diatas dengan bertanya apakah chat gpt dapat mengirimkan pesan MQTT ? Ya tentu saja chat gpt namanya saja "chat" ya terbatas untuk mengirimkan jawaban dari pertanyaan. Selanjutnya saya menggiring chat gpt untuk menjawab pertanyaan seperti "kapan kira-kira bisanya kirim pesan mqtt?" , "apa kirim sms bisa lewat chat gpt?", "tolong dong kirimkan pesan mqtt", sangat iseng pokoknya.

Sampai saat saya waras kembali, saya mengajukan pertanyaan sederhana: " Can i send mqtt message via HTML ?" dan jawabannya mencerahkan saya.



Yes, you can send MQTT messages from a web page using HTML and JavaScript, but you would need to use a JavaScript library or framework that supports MQTT, such as the Eclipse Paho MQTT JavaScript library. Here are the general steps to send MQTT messages from a web page:

  1. Include the MQTT JavaScript library: You need to include the MQTT JavaScript library in your HTML page. You can do this by including the library's JavaScript file in your HTML, like this:
html
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>


Dan kemudian saya meminta untuk dituliskan contohnya, " show me complete html for mqtt publisher".

Creating a complete HTML page for an MQTT publisher requires more than just HTML; you'll need JavaScript and, optionally, CSS to create a user interface. Below is a basic example of an HTML page that includes JavaScript for an MQTT publisher. This example uses the Eclipse Paho MQTT JavaScript library to send messages to an MQTT broker. Remember to replace the MQTT broker and topic information with your own.

html
<!DOCTYPE html> 
<html> <head> <title>MQTT Publisher</title> </head> <body> <h1>MQTT Publisher</h1> <label for="message">Message:</label> <input type="text" id="message" placeholder="Enter your message"> <button id="publishButton">Publish Message</button> <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script> <script> // Function to handle the button click function publishMessage() { var messageInput = document.getElementById("message"); var message = messageInput.value; // Create an MQTT client var client = new Paho.MQTT.Client("mqtt.eclipse.org", 80, "clientId"); // Set up the connection options var options = { onSuccess: onConnect, onFailure: onFailure, }; // Connect to the MQTT broker client.connect(options); // Called when the connection is successful function onConnect() { console.log("Connected to the MQTT broker"); // Send the MQTT message var message = new Paho.MQTT.Message(message); message.destinationName = "your/topic"; // Replace with your desired MQTT topic client.send(message); } // Called when the connection fails function onFailure(message) { console.log("Connection failed: " + message.errorMessage); } } // Attach the click event to the button var publishButton = document.getElementById("publishButton"); publishButton.addEventListener("click", publishMessage); </script> </body> </html>
*)Scriptnya agak kacau disini, namun di chat gpt dan editor notepad saya rapi kok !


Wihhh ayo kita coba langsung copy paste di notepad, sesuaikan parameter dan jalankan ! namun ada error yang muncul pada console html ( pencet click kanan lalu pilih  inspeksi  atau CTRL+SHIFT+I) dimana  library java nya error. Lalu saya bertanya begini :

mqttws31.min.js got error


dan dijawab :


I apologize for any confusion. The mqttws31.min.js script I mentioned earlier might not be the latest version, and it's possible that it may not work as expected. HiveMQ and the Paho MQTT library may have evolved since my last update.

To ensure that you are using an up-to-date version of the Paho MQTT JavaScript library that works with HiveMQ, it's best to include the latest version from a reliable source. You can get the latest version from the Eclipse Paho GitHub repository or their official website.

Here's how to include the latest version from the Eclipse Paho GitHub repository:

html
<script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.1.0/mqttws31.min.js"></script>

Alternatively, you can download the library directly from the Eclipse Paho GitHub repository and host it on your own server to ensure you are using the most recent version:

  1. Go to the Eclipse Paho GitHub repository for JavaScript: https://github.com/eclipse/paho.mqtt.javascript

  2. Download the latest release of the Paho JavaScript library.

  3. Host the downloaded JavaScript file on your server or include it directly in your HTML as needed.

Remember to replace "your-hivemq-broker-url" and other configuration settings with the correct values for your HiveMQ instance. Additionally, make sure that your HiveMQ instance is properly configured to support WebSocket connections.



Dan hasilnya untuk contoh (yang sudah saya sesuaikan) script pub yang benar ke broker seperti berikut 

<!DOCTYPE html>
<html>
<head>
    <title>MQTT WebSocket Publisher</title>
</head>
<body>
    <h1>MQTT WebSocket Publisher</h1>
    
    <label for="message">Message:</label>
    <input type="text" id="message" placeholder="Enter your message">
    
    <button id="publishButton">Publish Message</button>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>
	
    <script>
        // Function to handle the button click
        function publishMessage() {
            var messageInput = document.getElementById("message");
            var pesan = messageInput.value;

            // Create an MQTT client
            var client = new Paho.MQTT.Client("broker.hivemq.com", Number(8000), "clientId-yttggg");

            // Set up the connection options
            var options = {
                useSSL: false,  // Set to true if your broker supports secure WebSocket connections
                onSuccess: onConnect,
                onFailure: onFailure,
            };

            // Connect to the MQTT broker via WebSocket
            client.connect(options);

            // Called when the connection is successful
            function onConnect() {
                console.log("Connected to the MQTT broker");

                // Send the MQTT message
                var message = new Paho.MQTT.Message(pesan);
                message.destinationName = "/ahocool/chatgpt"; // Replace with your desired MQTT topic
                client.send(message);

                // Disconnect after sending the message (optional)
                client.disconnect();
            }

            // Called when the connection fails
            function onFailure(message) {
                console.log("Connection failed: " + message.errorMessage);
            }
        }

        // Attach the click event to the button
        var publishButton = document.getElementById("publishButton");
        publishButton.addEventListener("click", publishMessage);
    </script>
</body>
</html>



Hasilnya ketika saya membuka client mqtt dan klik publish pada topik "/ahocool/chatgpt " seperti gambar berikut :




Selanjutnya pada tulisan berikut akan kita bahas mengenai proses subscribe dan masih dengan bantuan chatgpt.
Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (25) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (5) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (15) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (92) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika