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 iot. Tampilkan semua postingan
Tampilkan postingan dengan label iot. 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:

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.


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:

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:

Sabtu, 04 November 2023

E-Voting sederhana menggunakan Mqtt - Python

 



Tulisan kali ini merupakan pembahasan praktek pengenalan konsep MQTT sebagai protokol paling terkenal yang digunakan pada dunia IOT. Praktek ini telah dilakukan pada kelas mikrokontroler di Jurusan Teknik Listrik - Fakultas Vokasi - Universitas Negeri Surabaya dan respon mahasiswa peserta kuliah sangat 'heboh' karena dengan MQTT-Python-Excel bisa mengumpulkan data pooling secara cepat namun sederhana karena menggunakan bahan-bahan yang sudah ada pada laptop mahasiswa. 

Sebagai bahan bacaan agar tidak menimbulkan 'ndas ngelu' sebaiknya dibaca dulu tulisan mengenai perkenalan MQTT bisa di klik  disini : https://www.aisi555.com/2023/10/pengenalan-protokol-iot-mqtt-melalui.html


Titik berat pada praktek ini adalah coding python dengan library siap pakai berupa :

  • Paho-MQTT : Library untuk melakukan PUB-SUB data mqtt (baca disini)
  • Xlwing : Library untuk pengolahan data ke excel (baca disini)


Praktek pertama yang saya berikan adalah pengambilan data hoby dari mahasiswa, cukup sederhana dengan script seperti dibawah ini :


import random
from datetime import datetime
from paho.mqtt import client as mqtt_client
import xlwings as xw


#file excel nama dan sheetnya harus sama, jangan lupa dibuka
wb = xw.Book('koleksi.xlsx')
sht = wb.sheets['data']
row = 5 #global var buat awal row

#server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicsub = "/unesa/hobi"  

# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''


#koneksi
def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client
    

#subscribe ke mqtt broker
def subscribe(client: mqtt_client):
    #routine ketika ada pesan masuk
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
        to_excel(msg.payload.decode()) #kirim ke excel
    # daftar pada kedua topic
    client.subscribe(topicsub)
    client.on_message = on_message 


def to_excel(data):
    datae = data.split(',')
    sekarang = datetime.now()   
    global row
    #menulis ke kolom excel
    nim = 'B' + str(row)
    nama = 'C' + str(row)
    hobi =  'D' + str(row)
    ct = 'E' + str(row)
    sht.range(nim).value = datae[0]
    sht.range(nama).value = datae[1]
    sht.range(hobi).value = datae[2]
    sht.range(ct).value = sekarang
    row = row + 1

def run():
    client= connect_mqtt()
    subscribe(client)
    client.loop_forever()
    
if __name__ == '__main__':
    run()
    
    


Script diatas sangat 'straight forward, dimana ada sebuah topik '/unesa/hobi' yang akan dikirimkan data pesan melalui broker mqtt dan client cukup menginputkan teks 'nim,nama,hobi'. Tiap pesan akan diparsing / dipecah oleh tanda koma dan kemudian dilemparkan ke excel melalui package 'xlwings'.





Saking sederhananya koding python yg saya buat, kekurangannya tidak ada filtering terhadap mahasiswa yang sudah mengririmkan data masih bisa kirim data kembali, begitu juga dengan pesan-pesan ngawur yang akhirnya meng 'hang' kan script python. Tapi setidaknya mahasiswa merasakan kecepatan proses PUB-SUB dari MQTT yang ordenya milisecond. Pokonya konsepnya sudah tersampaikan dengan benar.

Untuk itu pada praktek selanjutnya yaitu pooling "JIKA PEMILU HARI INI" saya membuat lebih tertib dengan rincian sebagai berikut :


- Data pemilih yang berhak dan pass key 



Pada gambar diatas saya mebuat data berupa NIM dari peserta voting yang berhak melakukan voting (saya ambil data peserta kuliah dan copas pada bagian bawah sheet pooling agar tidak kelihatan). Kemudian di kolom selanjutnya saya generate data nomor random sebagai password untuk melakukan voting secara sah. 

Kalau pada kejadian voting atau pemilu sesungguhnya, mungkin password / passkey ini diberikan kepada pemilih saat pemberian surat undangan. Hati-hati jangan menempatkan formula random pada cell yg digunakan sebagai database karena nilai random akan berubah-ubah saat melakukan perubahan pada sheet. Jadi solusinya membuat formula pada kolom kosong di sebelah lalu copy paste valuenya saja pada  kolom yang akan diambil datanya. Saya juga menambahkan status voting dari tiap nim agar tidak terjadi double voting.


- Pemilih hanya voting 1 kali
#ambil database pemilih
data_pemilih =[]
baris_awal=33  # baris awal dari data pemilih
baris=0
while sht.range('D'+str(baris + baris_awal)).value !=None :
    dict_pilih= {'nim':sht.range('D'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
    'key':sht.range('E'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
    'pool':sht.range('F'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value}
    data_pemilih.append(dict_pilih)
    baris+=1
    
#ngecek data pemilih tampil dilayar
for x in data_pemilih:
    print(x)


Potongan koding diatas berfungsi sebagai pemindah data pemilih pada cell excel dan kemudian dipindahkan menuju variable berupa list python dengan tiap anggotanya merupakan dictionary seperti hasil dibawah ini :




Jadi ada sejumlah data list yang berisikan data seperti ini :  {'nim': '22091387017', 'key': '20204', 'pool': '0'}. Data ini nanti akan membandingkan data['nim'] , data['key'] serta data['pool'] dengan hasil pengiriman data MQTT saat voting sehingga dapat mengecek mahasiswa yang berhak melakukan voting. Koding yang akan 'trap' data pemilih seperti berikut ini :


def to_excel(data):
    datae = data.split(',') # parsing data yang masuk di topik mqtt
    
    #kemudian tiap data di cek apakah pemilih terdaftar dan pascode benar serta belum vote
    index_list=0
    for y in data_pemilih:
        #data pemilih sesuai dan belum vote
        if y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] =='0': 
            #cek inputan nama pasangan calon presiden / wakil presiden
            if datae[2].lower() == 'amin':
                nilai = sht.range('D20').value + 1
                sht.range('D20').value = nilai
            elif datae[2].lower() == 'gofud':
                nilai = sht.range('J20').value + 1
                sht.range('J20').value = nilai
            elif datae[2].lower() == 'praban':
                nilai = sht.range('P20').value + 1
                sht.range('P20').value = nilai     
            else : #calon presiden namanya salah
                client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", pilihan anda salah")
                break
                
            #kirim notif ke nim bahwa berhasil vote
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Terimakasih sudah melakukan voting")
            #update dict dari pool
            data_pemilih[index_list]={'nim':str(datae[0]),'key':str(datae[1]),'pool':'1'}
            #update cell hitungan voting di excel
            sht.range('F' +str(index_list+ baris_awal)).value = 1
            break
        
        elif y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] !='0':
            #kirim notif sudah melakukan vote
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Sepertinya anda sudah voting tadi!")
            break
        elif y['nim'] == datae[0] and y['key'] != datae[1] :
            #kirim notif passkey anda salah
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", passkey anda salah !")
            break
        index_list+=1
        
    if index_list >= baris :
            #kirim notif anda belum terdaftar
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", anda bukan pemilih sah !")
            


- Notifikasi status voting


Pada koding diatas dapat dilihat ada pengiriman notifikasi ke topik "/unesa/pemilu/[nim]" dimana nim merupakan nim dari pemilih. Sehingga pada aplikasi client bisa juga melakukan pengecekan status voting, asal kan subscribe pada topik yang sama.


Contoh proses voting dan notifikasi voting pada client smartphone IOTMQTTPANEL seperti berikut ini :

*)Topik Voting "/unesa/pemilu"



Memang tampilan IOTMQTTPANEL sangat 'rudimental' namun sudah mewakili konsep dan proses e-voting yang lebih cepat melalui mqtt-pyhton. Jangan lupa menambahkan gambar pasangan capres cawapres pada sheet excel dan mengatur lebar kolom/baris agar sesuai (contoh gambar paling atas). Dalam kesempatan berikutnya saya akan mencoba membuat tampilan UI voting lebih menarik, atau mungkin ada mahasiswa yang mau dapat nilai A secara otomatis? Kontak saya aja ya....

PS: Ehhh gak sampe seminggu saya berhasil membuat apk nya berbasis websocket. Jika mau belajar cara bikin aplikasi mqtt di html / javascript silahkan bisa request belajar private.





Koding lengkap :

from paho.mqtt import client as mqtt_client
import xlwings as xw
import random


#file excel nama dan sheetnya harus sama, jangan lupa dibuka
wb = xw.Book('koleksi.xlsx')
sht = wb.sheets['pool']


#server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicsub = "/unesa/pemilu"  

# client id random karena gak boleh sama antar client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''


#ambil database pemilih
data_pemilih =[]
baris_awal=33  # baris awal dari data pemilih
baris=0
while sht.range('D'+str(baris + baris_awal)).value !=None :
    dict_pilih= {'nim':sht.range('D'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
    'key':sht.range('E'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value,
    'pool':sht.range('F'+str(baris + baris_awal)).options(numbers=lambda x: str(int(x))).value}
    data_pemilih.append(dict_pilih)
    baris+=1
    
#ngecek data pemilih tampil dilayar
for x in data_pemilih:
    print(x)
    


#koneksi ke broker
def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client
    

#subscribe ke mqtt broker 
def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg): #jika ada pesan masuk
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
        to_excel(msg.payload.decode())
    # daftar pada kedua topic
    client.subscribe(topicsub)
    client.on_message = on_message 


def to_excel(data):
    datae = data.split(',') # parsing data yang masuk di topik mqtt
    
    #kemudian tiap data di cek apakah pemilih terdaftar dan pascode benar serta belum vote
    index_list=0
    for y in data_pemilih:
        #data pemilih sesuai dan belum vote
        if y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] =='0': 
            #cek inputan nama pasangan calon presiden / wakil presiden
            if datae[2].lower() == 'amin':
                nilai = sht.range('D20').value + 1
                sht.range('D20').value = nilai
            elif datae[2].lower() == 'gofud':
                nilai = sht.range('J20').value + 1
                sht.range('J20').value = nilai
            elif datae[2].lower() == 'praban':
                nilai = sht.range('P20').value + 1
                sht.range('P20').value = nilai     
            else : #calon presiden namanya salah
                client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", pilihan anda salah")
                break
                
            #kirim notif ke nim bahwa berhasil vote
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Terimakasih sudah melakukan voting")
            #update dict dari pool
            data_pemilih[index_list]={'nim':str(datae[0]),'key':str(datae[1]),'pool':'1'}
            #update cell hitungan voting di excel
            sht.range('F' +str(index_list+ baris_awal)).value = 1
            break
        
        elif y['nim'] == datae[0] and y['key'] == datae[1] and y['pool'] !='0':
            #kirim notif sudah melakukan vote
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", Sepertinya anda sudah voting tadi!")
            break
        elif y['nim'] == datae[0] and y['key'] != datae[1] :
            #kirim notif passkey anda salah
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", passkey anda salah !")
            break
        index_list+=1
        
    if index_list >= baris :
            #kirim notif anda belum terdaftar
            client.publish(topicsub + "/" + datae[0],"Hai " + datae[0] +", anda bukan pemilih sah !")
            


def run():
    global client
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()
    

if __name__ == '__main__':
    run()

SELAMAT BELAJAR !!

Share:

Kamis, 26 Oktober 2023

Pengenalan Protokol IOT - MQTT Melalui Simulasi Wokwi

 


Untuk melanjutkan praktek kali ini ada baiknya mengikuti pembahasan sebelumnya agar tidak tersesat :



Sebenarnya saya tidak terlalu suka dengan simulasi elektronika karena saya terbiasa membuat prototype pada breadboard, namun ketika saya menemukan simulator yang bernama  wokwi saya menjadi sangat kagum karena wokwi bisa menghubungkan board microcontroller yang dipakai dengan simulator wifi sesungguhnya. Nama AP wifi yang dipakai pada wokwi adalah  "Wokwi-GUEST" dan saya masih belum terpikir gimana script HTML pada cloud bisa menjadi Access point wifi. AMAZING !

Untuk mempersingkat waktu maka sebaiknya pembaca bikin aja akun wokwi kemudian baca dan pahami contoh-contoh yang telah ada. Untuk platform IOT maka mikrokontroler yang disediakan adalah ESP32 (sayangnya bukan ESP 8266 namun bisa dimaklumi, sama aja kok). Saya telah membuat simulasi pengukuran suhu dengan sensor DHT22 dan kemudian dilempar ke broker MQTT ( bisa dibaca disini )






Scriptnya seperti berikut :

#include <WiFi.h>
#include <PubSubClient.h>
#include <DHTesp.h>

const int DHT_PIN = 13;
DHTesp dht;

// Ini untuk wifi kusus di simulasi wokwi

const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";

//ubah dengan nama topik (namakamu) yg berbeda dengan teman kamu

#define TOPIK_SUHU "/namakamu/suhu"
#define TOPIK_HUMI "/namakamu/humi"

WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;

float temp = 0;
float hum = 0;

void setup_wifi() { //perintah koneksi wifi
  delay(10);
  // mulai konek ke wifi
  Serial.println();
  Serial.print("Terhubung ke .. ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA); //setting wifi chip sebagai station/client
  WiFi.begin(ssid, password); //koneksi ke jaringan wifi

  while (WiFi.status() != WL_CONNECTED) { //perintah tunggu esp32 sampi terkoneksi ke wifi
    delay(500);
    Serial.print(".");
  }

  randomSeed(micros());

  Serial.println("");
  Serial.println("WiFi terhubung");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}



void reconnect() { //perintah koneksi esp32 ke mqtt broker baik itu sebagai publusher atau subscriber
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // perintah membuat client id unik agar broker menerima
    String clientId = "Unesa-d4-";
    clientId += String(random(0xffff), HEX);
    // Attempt to connect
    if (client.connect(clientId.c_str())) {
      Serial.println("Terhubung ke broker ..");
     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void setup() {
 
  Serial.begin(115200);
 
  setup_wifi(); //memanggil setup_wifi untuk dieksekusi
 
  client.setServer(mqtt_server, 1883); //konek ke broker
 
  dht.setup(DHT_PIN, DHTesp::DHT22);//inisialiasi komunikasi dengan sensor dht22
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > 5000) { //perintah publish data tiap 5 detik
    lastMsg = now;
    TempAndHumidity  data = dht.getTempAndHumidity();

    String temp = String(data.temperature, 2); //membuat variabel temp untuk di publish ke broker mqtt
    client.publish(TOPIK_SUHU, temp.c_str()); //publish data dari varibel temp ke broker mqtt
   
    String hum = String(data.humidity, 1); //membuat variabel hum untuk di publish ke broker mqtt
    client.publish(TOPIK_HUMI, hum.c_str()); //publish data dari varibel hum ke broker mqtt

    Serial.print("Temperature: ");
    Serial.println(temp);
    Serial.print("Humidity: ");
    Serial.println(hum);
  }
}


Sehingga saat dijalankan secara amazing bisa melempar data suhu dan kelembaban melalui broker hivemq. Dan sebagai PC client yang akan membaca data suhu dan kelembaban ini saya gunakan MQTT explorer yang sudah pernah dibahas pada tulisan sebelumnya.





Lakukan penambahan TOPIK suhu dan kelembaban untuk melakukan subscribe atau berlangganan data yang diinginkan.






Dan hasilnya bisa dilihat pada layar muncul data dari topik yang telah di subscribe dan kemudian  bisa ditampilkan pada grafik seperti berikut.






Jika ingin melempar data ke smartphone, maka gunakan aplikasi "IOT MQTT PANEL" yang dapat di unduh di play store. Gambar grafik smartphone contohnya bisa dilihat pada gambar animasi paling atas atau bisa dilihat pada video youtube disini.





Jika ingin belajar menampilkan grafik pada smartphone melalui aplikasi diatas, kontak saya aja 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 (8) arduino (24) 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 (7) 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 (1) 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 (90) 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