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

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:

Senin, 18 Desember 2023

Antares Webhooks - Solusi Pengolahan Data Realtime Memanfaatkan Google Sheets

 



Tulisan ini merupakan kelanjutan dari pembahasan pengolahan data REALTIME antares menggunakan MQTT (dapat dibaca disini ). Lalu bagaimana jika pengolahan datanya dilakukan oleh script yang tidak mengenal event based seperti API ? Tenang saja ternyata tombol SUBSCRIBE pada console device antares merupakan fasilitas pengolahan data bernama WEBHOOK. Apa itu ? Mari kita tanya chatGPT.


Breaking news: Telkom akan melakukan migrasi LoRaWan ke Telkomiot.id, Silahkan baca disini


API (Application Programming Interface):


API (Application Programming Interface) adalah kumpulan aturan yang memungkinkan satu aplikasi perangkat lunak berinteraksi dengan aplikasi lainnya. API menyediakan cara bagi sistem perangkat lunak yang berbeda untuk berkomunikasi satu sama lain dengan mendefinisikan metode dan format data yang dapat digunakan aplikasi untuk meminta dan bertukar informasi. API bisa digunakan untuk mengambil data, melakukan tindakan, atau mengintegrasikan fungsionalitas dari satu sistem ke sistem lainnya. Biasanya melibatkan mekanisme permintaan-respons, di mana aplikasi mengirim permintaan data atau aksi ke API, dan API mengembalikan respons.


Webhook:

Webhook, di sisi lain, adalah mekanisme bagi aplikasi web untuk memberikan informasi secara real-time kepada aplikasi atau sistem lainnya. Berbeda dengan API yang bergantung pada aplikasi untuk melakukan permintaan informasi, webhook mengirim data secara otomatis dari satu aplikasi ke aplikasi lainnya ketika terjadi peristiwa atau pemicu tertentu. Webhook adalah cara bagi aplikasi untuk memberi tahu satu sama lain tentang peristiwa atau pembaruan tanpa memerlukan polling terus-menerus untuk informasi. Ketika peristiwa yang telah ditentukan terjadi, aplikasi yang meng-host webhook akan mengirim permintaan HTTP POST ke URL tertentu, biasanya berisi data yang relevan dengan peristiwa tersebut.


Perbedaan:

Perbedaan kunci antara API dan webhook terletak pada arah komunikasi dan mekanisme pemicu:

  • API umumnya melibatkan model permintaan-respons di mana aplikasi secara aktif meminta data atau aksi dari titik akhir yang telah ditentukan aplikasi lain.
  • Webhook beroperasi dalam model push, di mana data secara otomatis dikirim dari satu aplikasi ke aplikasi lain berdasarkan peristiwa atau pemicu tertentu tanpa perlu permintaan yang berkelanjutan.

Jadi, API digunakan untuk permintaan dan respons sesuai kebutuhan, sementara webhook digunakan untuk notifikasi peristiwa real-time dan berbagi data antar aplikasi.


Untuk mencobanya (pertama kali bagi saya) mari kita lanjutkan praktek simulasi data IOT - python dari google colab (tulisan saya sebelumnya) menuju kke antares, dan kemudian kita gunakan layanan testing webhookd bernama REQUESTCATCHER.


1. Buat alamat endpoint webhooks anda secara gratis di website requestcatcher.com



2. Masukkan endpoint webhooks di tombol subscribe pada console device antares. Dan masukkan seperti contoh pada gambar alamatnya https://ahocool.requestcatcher.com/test


 


3. Jalankan script simulasi pengiriman data suhu dan kelembaban pada google colab dan perhatikan data yang masuk pada console antares akan muncul juga pada alamat requestcatcher secara realtime.




Lalu bagaimana pengolahan datanya agar lebih berguna , secara endpoint nya memerlukan server dan pengolahanya pun di servercloud ? Tenang ! Ternyata google sheets memiliki fasilitas ekstensi / addons yang beranama "webhooks for sheets". Banyak video membahas cara registrasi dan setingnya, pada intinya ikuti langkah-langkah pada google sheets terutama pada bagian pengaktifkan scripts pada akun google anda.


1. Lakukan setting webhook paga google sheets kamu sampai muncul gambar astronot seperti dibawah ini. Link yang ada dibawahnya merupakan ENDPOINT dari webhooknya.


2. Lakukan subscribe pada antares dan masukkan endpoint webhooks dari google sheets.



3. Jika subscribe berhasil akan muncul tampilan testing seperti berikut :




4. Jalankan script simulasi data IOT pada google colab dan data akan masuk ke google sheets. Kita kemudian ambil data pada kolom yang berguna dan lalu kita masukkan ke sheets2 untuk diolah grafiknya.


5. Perlu parsing teks serta pengolahan jenis data yang tepat sehingga data yang masuk bisa menjadi NUMBER sebagai syarat agar bisa dimasukkan ke CHART / GRAFIK.





6. Hasilnya grafik realtime dapat di nikmati oleh yang memerlukan data.




Share:

Jumat, 15 Desember 2023

Membedah keruwetan Pub-Sub MQTT pada antares


Satu kata yang dapat menjabarkan MQTT pada platform IOT milik telkom antares adalah keruwetannya, namun saya sudah terlebih dahulu mengalami pusing saat membedahnya 3 tahun yang lalu pada tulisan saya disini:  https://www.aisi555.com/2020/06/solved-bug-fatal-pada-mqtt-subscription.html, dan saya sudah "khatam" dengan ini. Buat anda sepertinya harus paham prinsisp M2M IOT yg dipakai oleh antares yaitu :

  • Proses PUB antares spesifik dikirimkan ke project/device namun berbeda dengan SUB pada Antares yang menggunakan 1 topik yg sama untuk kemudian lebih tepatnya dinamakan proses RESPONSE. Jadi ketika data MQTT realtime diterima antares (pada akun yang sama), maka semua data dari semua device yg PUB akan diberikan/relay kepada client yang SUB (secara realtime juga), jadi butuh parsing data  payload dengan metode tertentu baru data yg di inginkan muncul. Bisa dibaca disini  ,  disini , dan disini 
  • Python Paho-mqtt sebagai library paling umum untuk menerima dan mengolah protokol mqtt sehingga dapat dilanjutkan ke proses advance seperti menyimpan database, membuat grafik atau mengirim ke bot telegram. Bisa dibaca dulu agar mengerti disini dan disini.

Untuk kali ini saya memanfaatkan google colab untuk melakukan PUBLISH data random ke antares melaui script python, dan dapat dicoba GRATIS dengan script dibawah ini : jangan lupa  install paho-mqtt dulu di colab!



import paho.mqtt.client as mqtt
from time import sleep
from random import randrange

# Inisialisasi broker
broker_address="mqtt.antares.id"
broker_port=1883
antareskey= "aaaaaaaaaaaaaaaa:bbbbbbbbbbbbbbbb" #sesuaikan key antares anda
antaresdevice ="Project/DHT11" #sesuaikan project/device anda

topicpubantares = f'/oneM2M/req/{antareskey}/antares-cse/json'

def on_publish(client,userdata,result):                  
    print("data terkirim ke broker")
    pass


def antares_pub(datae):
    print(datae)
    data_raw = ("{"
      "\"m2m:rqp\": {"
      f'\"fr\": {{antareskey}},'
      f'\"to\": \"/antares-cse/antares-id/{antaresdevice}\",'
      "\"op\": 1,"    
      "\"rqi\": 123456,"
      "\"pc\": {"
          "\"m2m:cin\": {"
            "\"cnf\": \"message\","
            f'\"con\": \"{datae}\"'
          "}"
        "},"
      "\"ty\": 4"
      " }"
      "}")
    ret=client.publish(topicpubantares,data_raw)


client= mqtt.Client(f'unesa-client-{randrange(0,1000)}')  #clientnya harus random
client.on_publish = on_publish                           #assign function to callback
client.connect(broker_address,broker_port)               #establish connection


while 1:                                                  #loop terus sambil kirim data
    suhu = float( randrange(250,350,2) / 10)              #random suhu dan kelembaban
    humi = randrange(80,95,2)
    datanya = {"suhu": suhu, "humi": humi}
    antares_pub(datanya)
    sleep(5)



Jadi ubah dulu parameter akun dan device sesuai yang anda buat di antares. Selajutnya gunakan MQTT explorer untuk membuat demo proses SUB nya.


1. Masuk ke MQTT EXPLORER dengan parameter MQTT Servernya di : mqtt.antares.id port 1883. Username dan password jangan diisi, namun pada bagian advance anda perlu subscribe pada topik yang ada input User:Key antares anda.





TOPIK  SUBSCRIBE :
  /oneM2M/resp/antares-cse/access:key/json


2. Masuk/konek ke mqtt explorer lalu running script python pada google colab,
dan jika benar akan muncul hasil seperti ini






Videonya dapat di lihat disini







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 Subscribe Topic MQTT Web Socket

 



Chat GPT versi gratis 3.5 memang memiliki keterbatasan, "coba bandingkan dengan versi 4 yang berbayar", kata teman saya. Tidak langsung bisa dipakai dan akan memungkinkan sekali terjadi kesalahan konsep maupun koding dari jawaban yang  diberikan. Namun setidaknya sudah membuka pikiran lah kata teman saya yang ahli coding sejak kuliah. Lhaa ada teman lain yang kapok mecoba chatgpt karena malah membikin  tambah pusing karena jawabannya gak pernah sesuai. Ingat chatGPT itu memperoleh jawaban dari hasil training berulang-ulang dari konteks yang diberikan oleh coder nya maupun hasil interaksi dengan pengguna. Jadi tunggu beberapa tahun lagi maka sepertinya semakin menjadi benar apa yang dijawab oleh chatGPT.


Baca dulu : ChatGPT dan Publish MQTT melalui websocket


Seperti pada response chatGPT atas  pertanyaan saya tentang coding subscribe MQTT dibawah ini, dan perhatikan muncul error pada console di web browser.


<!DOCTYPE html>
<html>
<head>
    <title>MQTT WebSocket Subscriber</title>
</head>
<body>
    <h1>MQTT WebSocket Subscriber</h1>

    <label for="topic">Topic:</label>
    <input type="text" id="topic" placeholder="Enter the topic to subscribe to">
    
    <button id="subscribeButton">Subscribe to Topic</button>

    <div id="messageDisplay">
        <!-- Received messages will be displayed here -->
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js"></script>
    <script>
        var client = null; // MQTT client
        
        // Function to handle the button click
        function subscribeToTopic() {
            var topicInput = document.getElementById("topic");
            var topic = topicInput.value;

            if (!client) {
                client = new Paho.MQTT.Client("broker.hivemq.com", Number(8000), "clientId");

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

                // Set up the message handler
                client.onMessageArrived = onMessageArrived;
                
                // Connect to the MQTT broker via WebSocket
                client.connect(options);
            }

            // Subscribe to the specified MQTT topic
            client.subscribe(topic);
        }

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

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

        // Called when a message is received
        function onMessageArrived(message) {
            var messageDisplay = document.getElementById("messageDisplay");
            messageDisplay.innerHTML += "Received message: " + message.payloadString + "<br>";
        }

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

Console menampilkan hasil error berikut :


Ternyata subscribe ke topik gagal karena terjadi kesalahan berupa koneksi ke broker belum terjadi. Bagaimana bisa subscribe kalau konek aja belum ? Jadi saya harus memperbaiki dengan mengeluarkan proses connect ke luar dari function " subscribeToTopic() " dan menempatkan diawal <script>.


        if (!client) {
            client = new Paho.MQTT.Client("broker.hivemq.com", Number(8000), "clientId-12323");

                // Set up the connection options
           var options = {
                    useSSL: false, // Set to true if your broker supports secure WebSocket connections
                    onSuccess: onConnect,
                    onFailure: onFailure,
                };
		        // Set up the message handler
                client.onMessageArrived = onMessageArrived;
                
                // Connect to the MQTT broker via WebSocket
                client.connect(options);
            }



Dan benar saja pesan dapat dikirimkan dari client mqtt explorer dari PC saya menuju web browser melalui websocket port 8000.




Selanjutnya saya tinggal mengabungkan script sub dan pub sebelumnya untuk membuat aplikasi "e-voting" yang lebih menarik "UI" nya dan siap didemokan.




Chat GPT memang keren broooo....asal bisa menggiringnya saja ya...
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 (11) arduino (27) 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 (26) euro2020 (13) gcc (1) gsm (1) iklan (1) infrared (2) Input Output (3) iot (74) 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 (11) lorawan (2) 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 (8) radio (28) raspberry pi (9) 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) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (7)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika