Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

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

  • Ayo Migrasi TV Digital

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

  • Bermain DOT Matrix - LOVEHURT

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

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

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

  • Node Red - Kontrol Industri 4.0

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

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

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:

Rabu, 25 Oktober 2023

LoRaWan Antares - Faktor penyebab 'kenapa susah nyampai pesan nya ?'

 


Tentunya indah dan merdu suara burung di alam bebas ditambah dengan udara bersih dan segar. Namun mengingat 10 tahun lalu saya berkunjung ke sebuah hatchery jalak, banyak burung berkicau yang nasibnya kurang beruntung dikurung di sangkar besi. Lalu apa hubungannya dengan LoRaWan ? Kok sangat jauh sekali pembahasannya melenceng ? Ohhhh tentu tidak, dari kicauan burung inilah ide dari komunikasi LoRa dengan memanfaatkan prinsip "kicau" atau "chirp" menjadi CSS (Chirp Spread Spectrum) yang di klaim mampu mengirmkan sinyal digital lebih jauh dengan konsumsi daya paling irit.

Tentunya saya sebagai tukang solder digital yang kurang canggih dalam matematika teknik akan kesusahan dalam membahas teori CSS. Namun dalam tulisan kali ini tergerak dari sedikitnya pembahasan di blog maupun media internet lain berbahasa Indonesia, saya akan menjelaskan beberapa faktor yang mungkin akan membuat mereka yang mencoba belajar LoRaWan milik Telkom antares, akan tidak kapok untuk mecoba nya sampai berhasil. Terutama kawan-kawan dari Telkom University yang paling sering nyantol di WA saya setelah membaca tulisan saya.

  


- Pemilihan perangkat LoRa


Yang pertama yang akan saya ingatkan adalah kalau membeli modul siap pakai sangatlah disarankan, seperti TTGO / LiLyGo (berbasis ESP32) dimana sesuaikan frekuensi kerjanya LoRaWan di Indonesia yaitu band AS 923-2. Sehingga yang dibeli adalah  modul / kit Lorawan siap pakai dengan frekuensi kerja 850-950 Mhz. Namun jika anda kesulitan dana dan ingin mengoprek sejak awal bisa mengikuti prototype yang pernah saya bikin disini.



Modul Lora yang saya pake adalah semtech 1276 / RFM 95 dengan antena mini 900Mhz yang saya beli di seller tokped dari Bandung. Cukup mengeluarkan dana dibawah 200ribu saya bisa menghemat lebih dengan menggandengnya bersama jenis arduino paling sederhana pun. Jadi silahkan mampir ketulisan saya dilink diatas dan semoga rangkaiannya betul dan ketika di reset awal muncul "LoRa init succeeded."  pada layar terminal monitor.


- Pemilihan Lokasi BTS Gateway LoRaWan Telkom


Setelah hampir setahun komersial, lorawan milik telkom antares mulai menarik pelanggan yang memasang alat meternya berbasis LoRaWan. Hal ini menyebabkan terjadinya "Cell Breathing" yang merupakan salah satu kekurangan modulasi digital berbasis Spread Spectrum, dimana semakin banyak pengguna yang transmit bersamaan maka jangkauan gatewaynya mengempis/mengecil.  

Jangan lupa juga kalau CSS seperti halnya CDMA (maklum saya engineer certified CDMA namun teknologinya sudah usang hikss..) menggunakan kanal frekuensi yang relatif sedikit dan tidak ada proses membedakan antar device di udara. Jadi antar perangkat lain yg kirim bersamaan akan saling meng 'gugur' kan sinyal satu sama lain, alias interfrensi.  Makanya saran saya pilihlah frekuensi yang agak kosong di tempat dimana kalian mencoba kirim data LoRaWan. Bisa dilakukan seperti simulasi yang saya buat disini. 



Jadi pada lokasi yang mungkin padat, seperti halnya pada BTS di kampus Telkom University, maka akan kemungkinan jangkauan "ear" dari gatewaynya akan mengecil. Sehingga beberapa kali saya menyarankan mahasiswa yang berkonsultasi dengan saya untuk bergeser ke arah lokasi kantor STO telkom (yang ada towernya) dan akhirnya terselesaikan masalahnya. 


- Pemilihan Library dan Parameter LoRawan


Bukan menghina atau mengerdilkan teman-teman di telkom (mereka jago-jago kok), namun sebagai orang yang pernah bolak-balik kantor telkom maka ada sedikit pola yang sama saya alami, dimana para engineer nya akan mengalami mutasi tiap 5 tahun sekali. Ini menyebabkan pengelolaan hal-hal kecil seperti library pada LoRaWan Antares menjadi terpotong dan tidak ada evaluasi lanjutan. Asal sudah pernah di test jalan ya ditinggal aja. 

Beberapa kali mahasiswa Telkom University mengeluh dan saya kasi saran untuk menggunakan library dasar dari Sandeep Mistry seperti yang pernah saya tulis disini .


Parameter lainnya yang mungkin perlu diubah-ubah adalah Spread Factor (SF) dimana mengkompensasi jarak BTS dengan kecepatan data. SF ini bisa dilihat pada gambar spectrum garis miring diatas dimana saya sering menyarankan penggunan SF 10 dan 12 agar lebih lama dikirimkan sinyalnya (chirp nya lebih panjang) namun lebih gampang ditangkap "telinga" gateway LoRaWan.


- Kehabisan QUOTA Harian


Yang ini sangat "bang%&&**" menurut saya karena udah bayar mahal namun hanya dikasi quota 10 kali dalam sehari untuk 1 device. Dulu saat antares masih status trial sih aman-aman aja saya bisa keliling surabaya melakukan drive test sinyal sesuka hati saya.



Yahh habis ....wkwkwkwk....mau beli ya modal nya digedein lagi aja, kan anak mahasiswa jaman sekarang kaya-kaya juga. Atau trik yg pernah saya bahas ya bikin akun trial aja, lumayan 3 bulan. Bikin aja 10 akundan diganti-ganti. Hehehehe.




Nah demikianlah sharing saya kali ini, semoga gambar yg saya tampilkan diatas ini, persis yang kalian dapatkan saat melakukan kirim data melalui LoRaWan Antares. 


SELAMAT BELAJAR

Share:

Jumat, 22 September 2023

[Tutorial] Sensor Suhu Ds18b20 dan output ke display oled

 




Pada beberapa tulisan di blog ini telah sering dibahas mengenai sensor suhu dasar, baik yang paling sederhana LM35 dan yang lumayan cukup sering dipakai untuk sensor IOT yaitu DHT11. Namun untuk pengukuran yang lebih akurat dan mengakomodir suhu negatif, maka kali ini saya pilihkan sensor suhu digital DS18B20. Secara umum rangkaian DS18B20 memerlukan 3 pin dan sebuah resistor pull up data bernilai 4,7K ohm. Praktek kali ini dilakukan bersama mahasiswa teknik listrik vokasi unesa angkatan 2022.





Untuk dapat menjalankan sensor ini pada arduino atau esp8266, library yang perlu di install pada sketch arduino yaitu One Wire dan Dallas Temperature. Perhatikan penjelasan script dasar berikut ini untuk mendapatkan pembacaan suhu yang tepat.


#include <OneWire.h>
#include <DallasTemperature.h>

// Sensor data ke digital pin 4, sesuaikan yg dipakai
#define ONE_WIRE_BUS 4

// inisialisasi nama library one wire
OneWire oneWire(ONE_WIRE_BUS);

// menghubungkan library onewire vs Dallas Temperature 
DallasTemperature sensors(&oneWire);

void setup(void)
{
  // Start serial baud 9600
  Serial.begin(9600);
  // memulai ibrary library
  sensors.begin();
}

void loop(void){ 
  // Panggil pembacaan sensor pada bus one wire
  sensors.requestTemperatures(); 
  //tulis ke serial monitor
  Serial.print("Celsius temperature: ");
  // kasi index 0 karena cuman 1 sensor, bisa untuk banyak sensor
  Serial.print(sensors.getTempCByIndex(0)); 
  Serial.print(" - Fahrenheit temperature: ");
  Serial.println(sensors.getTempFByIndex(0));
  delay(1000);
}

Dan jika rangkaian sudah benar maka hasilnya seperti berikut ini :



Catatan jika menggunakan wemos atau nodemcu, pin yang digunakan disesuaikan dengan tulisan pin pada board, namun asal board yang digunakan sesuai. Perhatikan gambar dibawah ini :




Jadi jika library boardnya sesuai maka cukup mengikuti penamaan pada board yg dipakai, seperti contoh dibawah ini :

 
// Sensor data ke digital pin D4, sesuaikan yg dipakai
#define ONE_WIRE_BUS D4

-  Display Ke OLED 


Layar oled yang kita gunakan adalah OLED SSD12306 dengan lebar layar 128x64 pixel. 



Pin dari OLED ini berbasis I2C 3.3 volt, sehingga VCC/VDD jangan sampai salah colok harus ke pin 3.3 volt pada wemos kamu. I2C merupakan komunikasi data 2 kabel dengan SCK (serial clock) dan SDA (serial data), dimana pada wemos pin SCK = D1 , sedangkan SDA = D2. Untuk mencoba melakukan testing terhadap display oled kamu bisa menggunakan script example pada Library Adafruit_SSD1306 .








catatan: Pada example terdapat kesalahan address dari oled yang dijual dipasaran ( 128 x 64 ) yang seharusnya 0x3C

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


Lalu mari kita gabungkan 2 koding diatas untuk menampilkan pengukuran sensor suhu DS12B20 pada OLED.


#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>


#define SCREEN_WIDTH 128 // display display width, in pixels
#define SCREEN_HEIGHT 64 // display display height, in pixels

#define SENSOR_PIN D4   // pin sensor DS18B20
#define BUZZER_PIN D5   // pin buzzer

#define display_RESET     -1 // Reset pin 
#define SCREEN_ADDRESS 0x3C ///address i2c oled 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, display_RESET);

OneWire oneWire(SENSOR_PIN);         // setup a oneWire 
DallasTemperature tempSensor(&oneWire); // pass oneWire 



unsigned long previousMillis = 0;

String tempString,tempString1;
float batas = 35;     // batas suhu biar alarm
float tempCelsius;


void setup() {
  Serial.begin(9600);
  pinMode(BUZZER_PIN,OUTPUT);
  digitalWrite(BUZZER_PIN,LOW);

  // initialize display display with address 0x3C for 128x64
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    while (true);
  }

  delay(2000);         // wait for initializing
  display.clearDisplay(); // clear display

  display.setTextSize(1);          // text size
  display.setTextColor(WHITE);     // text color
  
  displayDisplayCenter("Teknik Listrik", 4);
  displayDisplayCenter("Vokasi Unesa 2023",56);

  display.setTextSize(2);
  display.setCursor(0, 32);        // position to display

  tempSensor.begin();     // initialize the sensor
  tempString.reserve(10); // to avoid fragmenting memory when using String


  

  
}

void loop() {
  tempSensor.requestTemperatures();             // send the command to get temperatures
  tempCelsius = tempSensor.getTempCByIndex(0);  // read temperature in Celsius

  
  tempString  = String(tempCelsius, 2); // two decimal places
  tempString += (char)247;
  tempString += "C";
  
  //biar ketumpuk hitam dulu jika suhu nya berubah
  if(tempString != tempString1)
  {
  display.setTextColor(BLACK);
  displayDisplayCenter(tempString1,28);
  }
  
  tempString1= tempString; 
  Serial.println(tempString); // print the temperature in Celsius to Serial Monitor
  
  //lanjut tulis warna putih
  display.setTextColor(WHITE);
  displayDisplayCenter(tempString,28);


  if( tempCelsius >= batas)  //cek alarm vs buzzer
   {

    digitalWrite(BUZZER_PIN,HIGH);
    delay(200);
    digitalWrite(BUZZER_PIN,LOW);
    delay(50);
   }
  
  else digitalWrite(BUZZER_PIN,LOW);
   
}

//function agar tulisan rata tengah (center)

void displayDisplayCenter(String text, int posisi) {
  int16_t x1;
  int16_t y1;
  uint16_t width;
  uint16_t height;

  display.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);

  display.setCursor((SCREEN_WIDTH - width) / 2, posisi);
  display.println(text); // text to display
  display.display();
}

Dan hasilnya menjadi keren seperti ini :




Share:

Rabu, 20 September 2023

[Tutorial] Dasar Input Analog Mikrokontroler - Output ke Led Strip WS2812

 


Kita lanjutkan pembelajaran kali ini bersama dengan kuliah mikrokontroler mahasiswa teknik listrik unesa surabaya, dengan topik analog input. Sebagai mana kita bahas sebelumnya, sketch arduino sudah memiliki contoh-contoh program yang bisa dilihat pada sketch langsung atau pada website arduino.cc . Saya sekarang akan mengambil sebuah potensiometer yang bisa digunakan pada pengatur volume audio dan saya buat sebagai rangkaian pembagi tegangan 5 volt.


Catatan : Jika pake esp8266 maka tegangan 0 - 3,3 volt


A0 sampai A5 merupakan analog input dari arduino dimana memiliki range tegangan yang di ijinkan 0-5 volt. Resolusi atau kerapatan data bit nya adalah 10 bit, sehingga 5 volt diwakili oleh binari 0b1111111111 atau desimal 1023. Dari rumus matematika  sederhana dengan membagi 5 volt dengan 1023,  maka kita bisa membuat voltmeter sederhana dan bisa membaca tegangan yang diberikan oleh pin tengah dari potensiometer 10 k ohm yang saya gunakan. Silahkan coba script berikut ini :


#define ADC_PIN 1   //pin ADC 

float tegangan ;  //variabel tegangan desimal


void setup() {

  //pakai monitor serial

  Serial.begin(9600);

}


void loop() {


   //resolusi per bit = 5v/1023 = 0.0049 volt

   //baca ADC

   tegangan = analogRead(ADC_PIN) * 0.0049;

 

   //kirimkan output pembacaan ke serial

   Serial.print( "Tegangan = ");

   Serial.print( String(tegangan,2) );

   Serial.println (" volt");

    

  delay(100); 

  

}





Dari hasil diatas dapat dilihat perubahan tiap bit mewakili 4.9 miliVolt. Lalu bagaimana membuatnya lebih menarik ? Kita gunakan Led Strip ws2812b yang lagi ngetop belakangan ini. Untuk itu baca dulu pembahasan di blog yang saya temukan di internet disini.

Saya telah membeli 30 buah led ws2812b seharga 900 rupiah sebiji dan saya rangkai dengan arduino pro mini milik saya. Bisa menggunakan arduino jenis lain maupun esp8266 yang dimiliki, dan usahakan jika lednya banyak maka gunakanlah power suply 5 volt terpisah seperti pada gambar dibawah ini :




*) gunakan resistor 330 ohm sebagai pengaman agar led awal tidak cepat rusak


Koding yang saya gunakan adalah sebagai berikut :


#include <Adafruit_NeoPixel.h> //library


#define LED_PIN 4         //sesuaikan pin data

#define LED_COUNT 30      //sesuaikan jumlah led


Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);


int posisi_led;     //variabel posisi led


void setup() {

//inisialisasi led strip 

  strip.begin();           

  strip.setBrightness(30); 


}


void loop() {

      

 // baca adc port A1 , sesuaikan

 //34 ==> pembulatan 1023/30LED

  

 posisi_led = analogRead(1)/34;

 

  strip.clear();

  strip.setPixelColor(posisi_led, 255, 255, 255);

  strip.show();   

 

  delay(100); 

  

}


Hasil dari coding diatas dapat dilihat pada animasi paling atas. Selamat Mencoba !! 

Share:

[Tutorial] Dasar Input - Output Pada Mikrokontroler




Pada umumnya terdapat 2 jenis input output yang terlihat paling "sederhana" dan paling sering dibahas pada sebuah sistem mikrokontroler AVR, arduino maupun ESP 8266. Dari list dibawah ini, nomer 1 dan 2 akan kita praktekkan pada tulisan blog kali ini, bersama dengan adik - adik mahasiswa di jurusan teknik listrik vokasi unesa Surabaya. 


Jenis Input Output :

  1. Digital Pin
  2. Analog Pin
  3. PWM
  4. Serial
  5. I2C
  6. SPI

- DIGITAL PIN

Digital pin ini merupakan hal yang paling dasar yang pertama kali harus dipraktekkan ketika memulai mikrokontroler sekelas arduino. Coba pembaca buka sketch dan akan menemukan example yang bernama "blink" yang merupakan coding untuk menyalakan dan mematikan LED internal pada bord arduino ( jenis apapun ) yang umumnya berada pada pin 13.


 void setup() {
  // inisialisasi digital pin LED_BUILTIN sebagai output.
  pinMode(LED_BUILTIN, OUTPUT);
}

//the loop function muter terus
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // HIGH = Nyala
  delay(1000);                      // Tunggu 1 detik
  digitalWrite(LED_BUILTIN, LOW);   // LOW = Mati
  delay(1000);                      // Tunggu 1 detik
}


Dan kemudian perhatikan gambar ekuivalen dari sebuah Bit Input Output pada mikrokontroler, melalui tombol sebagai Input dan Led sebagai output .



Saya ingin membuat penekanan tombol switch tactile bereaksi terhadap led, dan tidak ingin menjadi on off seperti saklar biasa. Jadi saat tombol (aktif low / pull up) maka akan merubah status dari led nyala atau mati. Perhatikan script berikut dan akan saya bahas per bagian.


const int buttonPin = 9;     // pin push button
const int ledPin =  13;      // pin LED

int buttonState = 0;         // variable status tombol
bool ledstate;

void setup() {
  //Pin LED sebagai output
  pinMode(ledPin, OUTPUT);
  // tombol sebagai intput
  pinMode(buttonPin, INPUT);
   
  //status awal led mati 
  ledstate = false;
  digitalWrite(ledPin, LOW);

  Serial.begin(9600); //agar bisa dilihat pada terminal
}

void loop() {

  // baca status tombol
  buttonState = digitalRead(buttonPin);

  // cek status tombol High atau Low
  if (buttonState == HIGH) {
    
    //nyalakan led dan ubah status led 
    if ( !ledstate){
      digitalWrite(ledPin, HIGH);
      ledstate =true;
      //kirim serial
      Serial.println("Kondisi led = Nyala");
     }
    //matikan led
     else {
      digitalWrite(ledPin, LOW);
      ledstate = false;
      Serial.println("Kondisi led = mati");
    }
  delay(200);
    
  } 
  
}


Dari script diatas, penjelasan perbagian  bisa dilihat pada bagian script berwarna merah, dan yang paling utama adalah proses perubahan status boolean dari led status yang akan tersimpan sesuai kondisi terakhir dari led.

    //nyalakan led dan ubah status led 
    if ( !ledstate){
      digitalWrite(ledPin, HIGH);
      ledstate =true;
      //kirim serial
      Serial.println("Kondisi led = Nyala");
     }

    //matikan led
    else {
      digitalWrite(ledPin, LOW);
      ledstate = false;
      Serial.println("Kondisi led = mati");
    }


Terdapat perintah Serial.println yang bertujuan untuk melihat kondisi led pada serial monitor yang merupakan fasilitas debuging paling utama pada sketch arduino.




Pada tulisan selanjutnya akan saya bahas input analog yang sangat bermanfaat.


Share:

Selasa, 06 Juni 2023

[ Node - RED ] Menghubungkan Relay Modbus Ke Dalam Node-Red Web UI


 

Untuk melanjutkan praktek berikut ini, disarankan terlebih dahulu membaca penjelasan mengenai Relay Modbus 4 channel disini dan persiapkan bahan-bahan nya yang masih sama. Kali ini akan saya jelaskan langkah menghubungkan Modul Relay Modbus-Rs485 ke node red, sehingga untuk pembaca yang belum mengenal node red dapat memulai perkenalannya dari tulisan saya sebelumnya disini.

Pada beberapa tulisan node-red sebelumnya saya hampir selalu menggunakan perangkat input / sensor modbus sehingga hanya terbatas pada function modbus 01, 03 dan 04 (read coil, input and read register) seperti pada praktek pembacaan pzem disini.  Kali ini saya bahas alat sebagai output yg cocok untuk membahas function 05 (write single coil). Perhatikan perintah serial modbus rtu untuk menghidupkan relay 1 berikut ini ( asumsi id device = 01):


01 05 00 01 FF 00 DD FA


Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar modbus adalah seperti berikut:

01     =  Alamat device id slave
05     =  Perintah Kontrol Single Relay/ function 05
00 01  = 2 byte alamat relay 0x0001
FF 00  = 2 byte yang menyatakan logic TRUE 
DD FA  = Checksum / CRC 16 modbus



Sedangkan untuk melepas / open  relay 3 kode modbus rtu nya seperti berikut ini :


01 05 00 03 00 00 3D CA


Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar modbus adalah seperti berikut:

01     =  Alamat device id slave
05     =  Perintah Kontrol Single Relay/ function 05
00 03  = 2 byte alamat relay 0x0001
00 00  = 2 byte yang menyatakan logic FALSE
3D CA  = Checksum / CRC 16 modbus


Sedangkan pada node red flow,  palete yg kita pilih adalah Modbus Write :




Penjelasan :

  1. Function yang dipilih 05 (Force Single Coil)
  2. Alamat dari relay (dimulai dari 0 untuk modul relay rs485 yg dipakai)
  3. Komunikasi yang dipakai, seting lanjutannya dibawah ini.




Jadi untuk meng-"CLOSE" dan "OPEN" relay sesuai address nya, maka cukup di inject nilai logika boolean True dan False ke Node Modbus Write.



Dari flow diatas maka ketika tombol inject ditekan akan mengirim logika true dan false langsung ke perangkat relay. Sesimpel itu kok ! Lalu bagaimana jika mengaktifkan dan mematikan semua relay? Kita akan gunakan perintah / function 15 (0F).



01 0F 00 00 00 08 01 FF BE D5


Kode diatas berupa Hexa jadi kalau dipisah-pisah berdasarkan standar modbus adalah seperti berikut:

01     =  Alamat device id slave
0F     =  Perintah Kontrol Multiple Relay/ function 15
00 00  = 2 byte alamat awal relay start 0x0000
00 08  = 2 byte alamat terakhir relay 0x0008 (kenapa 8 ? karena modul yg paling banyak 8 relay)
01     = 1 byte yang akan ditulis ke relay
FF     = 1 byte yang mewakili relay 8 s/d 0  sesuai bit nya, jadi bisa kombinasi bit

BE D5    = checksum

*) Keterangan FF berarti semua relay (8 buah ) mendapat logika 1 ( 1 1 1 1 1 1 1 1 ) alias nyala semua, jadi kalau 00 berarti mati semua relaynya




Pada flow node red kita akan gunakan function 15 dan kita inject berupa array / json yang berisi 8 buah logika true dan false. Contoh flownya bisa dilihat dibawah.








Sehingga akan sangat mudah merubah node inject menjadi node web ui berupa "switch" seperti pada gambar flow dibawah. Namun jika masih awam dengan web UI nya node red bisa membaca disini dan disini.






Outputnya menjadi lumayan menarik, bisa mengontrol modul relay modbus-rs485 melalui web browser.







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 (26) 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 (7) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (26) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) 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