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

Kamis, 02 September 2021

Python ESP8266 - Part4 - Web Server DHT11 Micropython

 



Webserver pada dasarnya adalah komunikasi TCP antara server dengan client yang formatnya telah disepakati secara universal melalui konsorsium WWW. Dalam sekala kecil di dunia microcontroller sekelas ESP8266 maka kesepakatannya itu adalah port server yg digunakan adalah 80, yang merupakan  standar akses ke webserver di manapun. Sedangkan standar keduanya adalah http dan html yang merupakan protokol dan standar text yg dikirim terima dan kemudian diterjemahkan oleh browser yg kalian gunakan menjadi tampilan yang menarik. jadi pada dasarnya hanya melanjutkan pembahasan sebelumnya pada bagian komunikasi TCP.


Contoh script html paling sederhana adalah sebagai berikut :


<!DOCTYPE html>
<html>
<body>

<h1>HALO APA KABAR</h1>
<p>Saya menulis html sederhana</p>

</body>
</html>


Kalau text atau scipt diatas kamu tulis di PC lewat notepad kemudian kamu save dan dinamakan sebagai semisal 'coba.html', maka ketika dibuka pada browser akan menjadi tampil seperti berikut:



Tugas kita selanjutnya adalah menempatkan text html tadi menjadi request dan respon http pada port 80 dan diakses melalui protocol TCP pada ESP8266. Bagaimana caranya ? Begini script yg kamu tuliskan pada IDE python Thonny.org kamu.


import socket
import network

def laman_web():
    
    html= " <!DOCTYPE html><html><body><h1>HALO APA KABAR</h1><p>Saya menulis html sederhana</p></body></html>"
    return html

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
  conn, addr = s.accept()
  print('koneksi dari %s' % str(addr))
  response = laman_web()
  conn.send('HTTP/1.1 200 OK\n')
  conn.send('Content-Type: text/html\n')
  conn.send('Connection: close\n\n')
  conn.sendall(response)
  conn.close()


Dan hasilnya ketika saya akses dari web browser HP saya seperti ini.





Jadi ada kesepakatan dari format text response yg diberikan oleh server yang kemudian diterjemahkan oleh browser. Begitu juga jika ingin menambahkan atau mempercantik tampilan maka bisa mempelajari lebih lanjut ilmu html dan juga script CSS yg memperindah tampilan pada web, seperti script berikut ini yang menambahkan tombol untuk menyalakan dan mematikan LED pada ESP8266.


import socket
import network
from machine import Pin

led = Pin(2, Pin.OUT)
led.value(1) # active low,matikan dulu 

def laman_web():
    if led.value() == 0:
        lednya="ON"
    else:
        lednya="OFF"
    
    html = """<html><head> <title>TOMBOL ULO</title> <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
    h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none; 
    border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
    .button2{background-color: #4286f4;}</style></head><body> <h1>ESP ULO LED</h1> 
    <p>LED : <strong>""" + lednya + """</strong></p><p><a href="/?ledon"><button class="button">ON</button></a></p>
    <p><a href="/?ledoff"><button class="button button2">OFF</button></a></p></body></html>"""
    return html

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
  conn, addr = s.accept()
  print('koneksi dari %s' % str(addr))
  request = conn.recv(1024).decode('UTF-8')
  print('Isi request = %s' % request)
  if request.find('ledon') == 6:
    print('LED ON')
    led.value(0)
  if request.find('ledoff') == 6:
    print('LED OFF')
    led.value(1)
  response = laman_web()
  conn.send('HTTP/1.1 200 OK\n')
  conn.send('Content-Type: text/html\n')
  conn.send('Connection: close\n\n')
  conn.sendall(response)
  conn.close()


Hasil pada browser sebagai berikut :




Penjelasan :


import socket
import network
from machine import Pin

led = Pin(2, Pin.OUT)
led.value(1) # active low,matikan dulu 

Merupakan script inisialisasi dari package yg dipakai dan pin led dari ESP8266, untuk koneksi wifinya kenapa gak ditulis bisa dibaca penjelasannya pada part 3.


def laman_web():
    if led.value() == 0:
        lednya="ON"
    else:
        lednya="OFF"
    
    html = """<html><head> <title>TOMBOL ULO</title> <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="icon" href="data:,"> <style>html{font-family: Helvetica; display:inline-block; margin: 0px auto; text-align: center;}
    h1{color: #0F3376; padding: 2vh;}p{font-size: 1.5rem;}.button{display: inline-block; background-color: #e7bd3b; border: none; 
    border-radius: 4px; color: white; padding: 16px 40px; text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
    .button2{background-color: #4286f4;}</style></head><body> <h1>ESP ULO LED</h1> 
    <p>LED : <strong>""" + lednya + """</strong></p><p><a href="/?ledon"><button class="button">ON</button></a></p>
    <p><a href="/?ledoff"><button class="button button2">OFF</button></a></p></body></html>"""
    return html


Script function laman_web( ) diatas utamanya berisikan CSS dari script html yang menampilkan tombol dan status LED dengan style yang lebih menarik. Tombol diberikan 2 buah a href / link yang nantinya akan memberikan request GET berupa "/?ledon" dan "/?ledoff" .


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

Koneksi socket di bind ke port 80 dan kemudian melakukan listen menunggu ada request dari client.


while True:
  conn, addr = s.accept()
  print('koneksi dari %s' % str(addr))
  request = conn.recv(1024).decode('UTF-8')
  print('Isi request = %s' % request)
  if request.find('ledon') == 6:
    print('LED ON')
    led.value(0)
  if request.find('ledoff') == 6:
    print('LED OFF')
    led.value(1)
  response = laman_web()
  conn.send('HTTP/1.1 200 OK\n')
  conn.send('Content-Type: text/html\n')
  conn.send('Connection: close\n\n')
  conn.sendall(response)
  conn.close()


Membaca Request dari browser / client dan kemudian mengecek melalui string.find untuk menentukan apakah LED mau di ON atau di OFF kan. Pada bagian akhir diberikan response standar closing socket http dan html 


Untuk DHT11 tinggal mengikuti saja pola CSS dan request nya serta praktek DHT11 pada part 2, selengkapnya script seperti berikut :


import socket
import network
from machine import Pin
import dht

sensor = dht.DHT11(Pin(13))

def read_sensor():
  global temp, hum
  temp = hum = 0
  try:
    sensor.measure()
    temp = sensor.temperature()
    hum = sensor.humidity()
    if (isinstance(temp, float) and isinstance(hum, float)) or (isinstance(temp, int) and isinstance(hum, int)):
      msg = (b'{0:3.1f},{1:3.1f}'.format(temp, hum))

      # uncomment for Fahrenheit
      #temp = temp * (9/5) + 32.0

      hum = round(hum, 2)
      return(msg)
    else:
      return('Invalid sensor readings.')
  except OSError as e:
    return('Failed to read sensor.')

def web_page():
  html = """<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP DHT Server</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Temperature</span> 
    <span>"""+str(temp)+"""</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Humidity</span>
    <span>"""+str(hum)+"""</span>
    <sup class="units">%</sup>
  </p>
</body>
</html>"""
  return html

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 80))
s.listen(5)

while True:
  conn, addr = s.accept()
  print('Got a connection from %s' % str(addr))
  request = conn.recv(1024)
  print('Content = %s' % str(request))
  sensor_readings = read_sensor()
  print(sensor_readings)
  response = web_page()
  conn.send('HTTP/1.1 200 OK\n')
  conn.send('Content-Type: text/html\n')
  conn.send('Connection: close\n\n')
  conn.sendall(response)
  conn.close()





Tampilannya keren dengan tombol icon yg diambil dari internet langsung. SELAMAT MENCOBA !

Share:

Python ESP8266 - Part3 - Kirim Terima TCP Socket di MicroPython

 



Untuk praktek kali ini diperlukan aplikasi TCP server yg bisa menggunakan pc maupun smartphone android yang pernah saya bahas sebelumnya dalam pembahasan dasar wemos (klik disini). Kali ini akan saya singkat saja karena pada dasarnya untuk pemahamannya tidak jauh berbeda, hanya cukup memahami proses pada gambar berikut ini :




Penjelasan dari REPL micropython diatas sebagai berikut :


1 . Inisialisasi package socket pada micropython

>>> import socket  

>>> s=socket.socket()


2. IP dan port dari socket yg akan dikirimi  data,  alamatnya berupa tupple berisi 5 anggota


>>> alamat=socket.getaddrinfo('192.168.1.65',4000)

>>> print(alamat)

[(2, 1, 0, '', ('192.168.1.65', 4000))]


3. Hanya dibutuhkan   sampai isi tupple [-1] untuk koneksi socket


>>> s.connect(alamat[0][-1])


4. Kirim data teks ke lawan 


>>> sock.send('halo bos..apa kabar ?')

>>> s.send('halo bos..apa kabar ?')
21

>>> s.send('\n')
1

>>> s.send('sudah makan siang apa belum ?')
29

5. Jangan lupa menutup socket kalau sudah selesai 


>>> s.close()


6. Hasilnya pada aplikasi tcp terminal di smartphone saya seperti berikut ini : 





Pasti anda bertanya ? Kok langsung bisa kirim data padahal wifinya belum tersambung ? Ini dikarenakan ESP8266 saya sudah pernah melakukan sambungan dan sukses terhubung dengan router wifi dirumah. Lalu kalau belum bagaimana caranya ? Begini caranya jika ingin melakukan hubungan antara ESP8266 dengan access point atau wifi baru.





Script diatas akan melakukan scan terhadap wifi disektar ESP8266 dan akan menghasilkan tupple / list berupa data hasil scan, sehingga dengan perintah for diambil bagian pertama saja dari list ( net[0] ) untuk menampilkan nama hotspot hasil scan.

 
Sedangkan untuk konek ke wifinya seperti berikut :





Jadi sekali saja perlu dijalankan perintah atau script diatas, maka otomastis ESP8266 meningat koneksi terakhirnya.


Bagaimana kalau ESP8266 ingin menjadi servernya, dan siap dikirimi perintah untuk menghidupkan atau mematikan  LED ? Kalau yang seperti ini kita butuhkan python IDE Thonny.org, seperti yg saya gunakan digambar diatas biar lebih mudah mengetiknya.



import network
import socket
import time
from machine import Pin

wlan = network.WLAN(network.STA_IF)

conf=wlan.ifconfig()
print( 'IP : {}'.format(conf[0]))

led = Pin(2, Pin.OUT)
led.value(1) # active Low, matikan dulu

s = socket.socket()
s.bind(('', 8000))
s.listen(5)

while True:
  conn, addr = s.accept()
  print('Got a connection from %s' % str(addr))
  request = conn.recv(10).decode('UTF-8')
  print('Content = %s' % request)
  if request == 'ledon':
    print('LED ON')
    led.value(0)
    conn.send('LED telah dinyalakan\n')
    time.sleep(1)
  if request == 'ledoff':
    print('LED OFF')
    led.value(1)
    conn.send('LED telah dimatikan\n')
    time.sleep(1)
  conn.close()




Penjelasan :


  • Esp8266 micropython sebagai server, dan aplikasi smartphone TCP terminal sebagai client
  • Client akan mengirimkan text dan kemudian sesuai prinsip TCP / IP maka akan koneksi segera di close oleh server setelah selesai menerima data. Jadi butuh proses koneksi ulang jika mengirim perintah baru.
  • Jika ada data yg dikirim atau istilah TCP nya request, maka data yg masuk akan di bandingkan sesuai kondisi ledon atau ledoff



Share:

Rabu, 01 September 2021

Python ESP8266 - Part 2 - Membaca DHT11 Dengan MicroPython

 


Sensor sejuta umat yang merupakan penggerak data IOT paling murah meriah yaitu DHT 11, ternyata oleh opreker micropython untuk esp8266, sudah tersedia dan siap digunakan, ini dibuktikan jika ditekan TAB atau diketik help(dht), maka tersedia beberapa text pada interpreter micropython / REPL.



Penjelasan scrypt python dari cara pembacaan DHT 11 diatas adalah :


  • import dht   : Memanggil package sensor suhu kelembaban dht
  • from machine import Pin :  Inisialisasi package dari GPIO esp8266
  • sensor = dht11(pin(13))   : Pin dht 11 saya letakkan di pin GPIO 13
  • sensor.measure()   : Ambil data suhu kelembaban
  • sensor.temperature  : Tulis data suhu
  • sensor.humidity  : Tulis data kelembaban


Sedangkan sambungan ke wemosnya seperti ini (sesuaikan port GPIO) :




Lalu jika ingin melakukan pembacaan DHT 11 secara berkala, maka tambahkan perintah while sebagai loop nya. Sebaiknya lakukan penulisan script di IDE python seperti Thonny.org.





Script lengkapnya seperti berikut ini :



from machine import Pin

from time import sleep

import dht 


sensor = dht.DHT11(Pin(13))


while True:

  try:

    sleep(2)

    sensor.measure()

    temp = sensor.temperature()

    hum = sensor.humidity()

    print('Suhu: %3.1f C' %temp)

    print('Kelembaban: %3.1f %%' %hum)

  except OSError as e:

    print('Gagal Membaca Sensor.')




Jangan lupa sebelumnya untuk membaca cara melakukan flashing modul Wemos / node mcu atau ESP8266 lainnya, di link ini : https://www.aisi555.com/2021/09/wemos-esp-8266-merubah-berbasis.html

Share:

Python ESP8266 - Part 1 - Merubah Jadi Berbasis MicroPython

 



Bahasa coding yang paling dianggap  perlu dikuasai oleh para coder jaman now adalah bahasa "Uler" ehh python, dan beberapa kali dalam tulisan pada blog ini sudah pernah membahas python sebagai jembatan antara dunia mikrokontroler 8 bit dengan layanan komputasi tingkat tinggi semacam database, yg bisa dibaca pada tulisan saya: https://www.aisi555.com/2019/10/iot-menyimpan-data-sensor-lewat-nbiot.html . Jadi si microcontroller yg dapat secara cepat mengolah data sensor ini ternyata memiliki batasan ketika berhubungan dengan komputasi yg levelnya lebih advance. Lalu pertanyaannya apakah python dapat langsung dimasukkan ke miicrocontroller ?

Ternyata jawabanya BISA lho ! Masih teringat saat saya menggunakan interpretter pyhton pada Raspberry PI untuk mengakses pin I/O untuk tombol dan bermain layar TV, lumayan simple dan " to the point " apalagi dengan banyaknya library/package siap pakai ( bisa dibaca disini ) . Nah Raspi merupakan microcontroller berbasis ARM dan begitu juga ESP8266. Jadi oleh beberapa orang yg cukup rajin membuat github, maka dibuatlah sebuah firmware yang dapat membuat ESP8266 atau modul wemos kamu menjadi sebuah microcontroller berbasis python.



Berikut langkah-langkah menjadikan wemos D1 / Esp8266 jenis apapun menjadi micropython:


1. Unduh tools flashing ESP8266 dan Firmware Micropython
2. Lakukan flashing firmware seperti contoh dibawah, sesuaikan COM yg kamu pakai


esptool.exe --port COMX --baud 115200 write_flash -fm dio -fs 4MB 0x0000 micropython_esp.bin

*) Ganti esptool.exe dengan esptool.py jika menggunakan script python di PC kamu



3. Testing dengan serial terminal/COM baudrate 115200, dan tekan enter sampai muncul console seperti pada gambar berikut, ketikkan program python sederhana.




Lalu bagaimana berkreasi lebih lanjut ? Jika kamu tekan TAB maka akan muncul package standar pada micropython yg diinstall pada ESP8266 kamu. Paling dasar adalah package machine seperti gambar berikut:




Untuk menghidupkan led pada ESP (GPIO2) ketikkan perintah berikut :


from machine import Pin
import time
led = Pin(2, Pin.OUT)

while True:
    led.value(1)
    time.sleep(0.5)
    led.value(0)
    time.sleep(0.5)   


Tapi karena keterbatasan indenation / pengetikan pada console, maka perlu sebuah IDE python yg bisa melakukan coding terhadap micropython, saya pilihkan yg paling mudah yaitu  Thonny .


Setting options hardware micropython dan COM portnya


Dan script kalian jadi tidak berantakan lagi seperti contoh dibawah ini untuk melakukan blink led pada ESP8266.



Catatan: jika script kamu akan kalian simpan / save, maka akan diminta menyimpan di perangkat micropython atau pada PC kamu. Untuk praktek kali ini disimpannya di PC aja dulu ya... SELAMAT MENCOBA

Share:

Senin, 23 Agustus 2021

Wemos ESP 8266 - Part 7 (End) - Kesimpulan Dan Manfaat


Perangkat elektronika digital dalam kehidupan sehari-hari semakin mudah diakses masyarakat awam, ini salah satunya di gawangi oleh kemajuan dunia smartphone. Namun perjalanan yg mulus dari keberhasilan gawai layar sentuh ini tidak terjadi di dunia kontrol digital. Penulis teringat memori 10 tahun yg lalu ketika diminta merancang kontrol inkubator / tetas telur burung jalak bali, dimana celetukan dari pegawai disana terdengar sedikit nyinyir, " Kalau hanya bolak balik telor dan atur kipas angin pake orang aja napa pak, rugi beli mahal-mahal !" 



Momen "eaalaahhh" ini sebenernya bukan kali ini saja terjadi, ada kala para peternak burung walet saling berebut untuk membuat "canggih" kandang burung mereka dan jadi ajang pamer ke komunitas peternak. Namun karena para peternak saling berebut bikin keren rumah waletnya membuat orderan alat kontrol suhu kelembaban ke saya jadi banyak, dan  saya yg tukang solder ini ya mau-mau saja lahh. Alatnya berguna? Lebih peka perasaan manusia kok untuk melihat apakah kandang waletnya kondisinya terlalu panas atau lembab, karena gak ada sensor sebaik buatan tuhan yg mampu untuk melihat menganalisa pola terbang walet "gelisah" akibat lokasi yg kurang nyaman.

Lantas ketika  IOT rame-rame dibicarakan, apakah bisa dimanfaatkan untuk semisal mengontrol pompa sprinkler pada pertanian cabe seperti gambar diatas? Kalau hanya ON-OFF springkler pake telunjuk lewat gawai, memonitoring suhu atau kelembaban serta kondisi tanah, itu sih layaknya kamu punya CCTV yg  dipasang di ujung gang perumahan, ributnya terjadi ketika malingnya sudah menjual sepeda curian nya. Nah inilah kendala pemahaman SMART Something yg bukan dilihat dari canggihnya dan modern nya alat yg dipasang, namun bagaimana mengolah datanya secara realtime sehingga kamera CCTV yg terhubung ke database polisi dapat membangunkan warga saat face recognition nya CCTV  match dengan wajah residivis kambuhan tukang maling sepeda BMX.


Lalu apa hubungannya dengan praktek wemos yg saya bahas belakangan ini ?


Semisal nih, saya punya 10 sensor suhu dan kelembaban di kumbung jamur, saya ingin mengontrol blower + mistmaker / pembuat kabut nyala ketika kelembaban turun dibawah 80% dan mati saat sudah tercapai 90%.  Sebenernya ini gak perlu IOT-IOT an, cukup microcontroller sekelas arduino saja yg dipasang dan diberikan perintah logika sederhana seperti itu. 

Lalu apa sih yg bisa lebih di tingkatkan dari kontrol sederhana tadi ? Ini pengalaman saya di bandung 8 tahun yg lalu saat pemuda dari poltek bandung, namanya Taufik Hidayat, menghubungi saya untuk membantu skripsinya di jurusan elektronika, yg berhubungan dengan usaha yg sedang rame di kampungnya di pengalengan yaitu kumbung/rumah jamur. Dan dari komunikasi dan bimbingan saya , dia berhasil membuat kontrol monitoring kumbung jamur dari modifikasi kontrol rumah walet saya yg kembangkan sebelumnya.





Terkejutnya saya si taufik hidayat ini ujug-ujug masuk kick andy metro tv, iya pak botak itu mengundangnya sebagai pemuda berprestasi yg dikirim ke kanada untuk inkubasi bisnis jamurnya. Langsung saja saya kontak dan mengucapkan selamat, dan saya sedikit "kecelik" karena saya kira alat kontrol digitalnya yang saya kembangkan bersama yg membawanya ke kanada. Malunya saya saat ternyata taufik  bilang "Ilmu mikrokontroller saya gak kepake mas, yg penting bisa menjual jamurnya". 

Jiahh ternyata kadang tidak semua yg terlihat modern serba digital, bisa menghasilkan hasil maksimum. Tepat Guna ! Ya karena skripsi jurusan elektro pasti sangat tepat memilih topik jamur pake mikrokontroller, tapi saat dihadapkan dengan kondisi dipedesaan ? Tepat gunanya di skripsi malah membebankan mungkin di petani tingkat desa...mungkin lhooo ....namun ...ada analisa saya kenapa taufik melupakan ilmu mikrokontrollernya? 




Sebabnya begini, dia ini menonjolkan sisi penjualan produk rumah kumbung jamurnya (beserta jasa instalasi) dan dijual ke petani pemula, begitu juga penjualan bag log / media tanam jamur serta bibit siap tanam.  Taufik juga menjual secara franchise gerobak produk olahan jamur yg memang lagi ramai di depan minimart atau mall. Jadi si taufik ini lebih ke sisi ekonomi praktisnya ketimbang ribet ngurusin solder menyolder lagi 





Yang menjadi angan saya, mampukah IOT menambah nilai jual kumbung jamur si taufik ? Sedikit berhayal kan boleh, apalagi sudah praktek IOT pake sensor, ditambah ilmu python yg cukup powerfull. Begini kira-kira penuangan ide saya.


  • Threshold dari suhu dan kelembaban untuk menggerakkan aktuator berupa pompa atau blower dapat diatur dari kejauhan melalui Internet. Kalau internet nya terkendala infrastruktur maka EDGE analisis  di gateway local bisa diberikan secara periodik, semisal nih mingguan datang ke kumbung lalu PC atau gateway lokal, dan  disana diberikan pola timer, pola threshold, data prakiraan cuaca dan sebagainya.
  • Pemanfaatan data cuaca yg secara Real Time melalui Internet atau cloud secara otomatis  merubah dan mengkompensasi logika microcontroller dilapangan. Ini sangat mungkin dan mudah dilakukan dengan metode PUB SUB MQTT yg header + datanya sangat irit sehingga jaringan internet GSM ke pegunungan yg kurang bagus masih bisa melakukan kirim-terima data.
  • Memungkinkan juga sistem di lapangan mengirimkan perkiraan waktu panen, lalu cloud mengirmkan SMS atau pesan WA/Telegram ke pedagang yg sekiranya akan membeli. 
  • Selain disisi pertaniannya, juga bisa dikontrol secara IOT di sisi perangkat pendukung, semisal pasokan listrik, kondisi sumber air, keamanan dan sebagainya.  





ESP32-cam merupakan salah satu favorit untuk pengembangan IOT berbasis imaging, dan memungkinkan mengrim data image ke cloud untuk kemudian diolah datanya. Semisal untuk melihat dan menentukan (secara machine learning) apakah kondisi jamurnya siap panen atau tidak. Pengembangan yang tidak menghabiskan dana sampai100 rb ini merupakan solusi untuk menambah nilai jual dari pertanian tradisonal, sehingga mampu bersaing dengan sistem pertanian modern diluar sana dari segi efektivitas dan kemampuan menghasilkan pertanian yg menguntungkan tentunya. Toh tujuan akhirnya seperti akang taufik yg saya ceritakan tadi adalah "Mampu Menjual", sebuah kata keramat yg harus terpatri di jidat pengusaha.  


Share:

Minggu, 22 Agustus 2021

Wemos ESP8266 - Part 6 - Visualisasi Data Ke Excel

 


Bagian terpenting dan paling diminta oleh para pengguna perangkat IOT (yang kebanyakan ribet di hardware) adalah penyampaian data kedalam bentuk visual. Para penikmat data ini biasanya tidak mau tahu cerita apa yg terjadi dibelakang layar sebelum grafik seperti diatas tersaji didepan laptop mereka.  Namun karena visualisasi umumnya menentukan "invoice proyek"  turun dan cair dari bagian akunting, maka jangan sampai terlupakan ilmu yang sebenarnya susah-susah gampang ini.

Mungkin yg terbesit kala membayangkan visualisasi data sesuai praktek wemos - esp8266 yg saya tulis sampai serinya ada 5, pasti terbayang database mysql, phpchart, javaFX dan sebagainya. Wahhh..itu membikin minder mereka yg kurang paham koding panjang-panjang. 

Hasil googling ada yg menyarankan matplotlib di python, dan memang saja python merupakan bahasa coding yg to the point dan lumayan mudah dipelajari. Namun kendalanya matplotlib mungkin kurang bisa dipahami jika anda baru belajar dasar python.




Teringat pada sebuah project tahun lalu dimana saya dan teman diminta menampilkan data dari sebuah data realtime, langsung tampil di excel. Kenapa excel ? Ya karena pelaporannya memang menggunakan excel agar si bos yg sudah 'berumur' tidak menginstal laptopnya dengan tools lainnya. Bagaimana dengan Web ? Pokoknya excel aja, dan berujung pada sebuah library python xlwings,  yg ketika saya coba dengan script dibawah ini maka data apapun akan bisa ditampilkan pada kolom excel.


import xlwings as xw   #library

wb = xw.Book('Book1.xlsx') #nama file excel
sht = wb.sheets['coba']  #nama sheets

sht.range('C1').value= 10
sht.range('C2:C10').value='aku menulis'


for x in range(1,50): 
    a='A'+str(x)
    b='B'+str(x)
    sht.range(a).value= x*3
    sht.range(b).value= x*2
*) jangan lupa saat menjalankan script python diatas file excel terbuka pada desktop dengan nama file xls dan nama sheet yg sesuai.


Sedangkan untuk data dari wemos yg sudah sampai pada broker MQTT kita akan sisipkan ke cell dari spreadsheet diatas melalui library PUBSUB pada python bernama PAHO-MQTT


>>> pip install paho-mqtt

Sesuai praktek PART5 , kita akan menggunakan broker gratis : broker.hivemq.com port 1883, dan ada dua topik yg di subscribe yaitu : /testyuk/suhu dan /testyuk/humi . Untuk itu perhatikan script python dibawah ini untuk melakukan proses Subscribe pada topik dan menampilkannya di layar :

import random
from paho.mqtt import client as mqtt_client
#server/broker mqtt
broker =
'broker.hivemq.com'
port = 1883
topicsuhu = "/testyuk/suhu" #sesuaikan topic di praktek sebelumnya
topichumi = "/testyuk/humi"
# 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):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
# daftar pada kedua topic
client.subscribe(topicsuhu)
client.subscribe(topichumi)
client.on_message = on_message


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


if __name__ == '__main__':
run()

Hasilnya jika kita run sebagai berikut :





Nah..selanjutnya tinggal memberikan perintah untuk menulis ke kolom excel tiap kali kedua pesan lengkap terkirim. Atau jika mau satu persatu tipa juga boleh, tapi karena jarak antara tiap kali pesan yg di PUB oleh wemos beriringan antara suhu lalu humi dan jeda 10 detik, maka ada kemungkinan proses satu-persatu bisa kacau kalau function menulis ke excel nya belum selesai dikerjakan. Kecuali script pada Wemosnya diberikan jeda yg cukup antara suhu dan humi nya. Saya tidak mau ubah script wemos karena sudah terpasang jauhhhhh di tambak saya (berhayal dikit boleh kan), jadi saya kreasikan pada script python nya seperti berikut :



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('Book1.xlsx')
sht = wb.sheets['data']
row = 1 #global var buat awal row

broker = 'broker.hivemq.com'
port = 1883
topicsuhu = "/testyuk/suhu"
topichumi = "/testyuk/humi"
# random client
client_id = f'python-mqtt-{random.randint(0, 100)}'
username = ''
password = ''
#list isi data suhu dan kelembaban
datanya=[]

def to_excel(data):
print(data)
datae = data.split(",")
global row #kembali ke atas kalau sampai baris 51
if row == 51:
row = 2
else:
row = row + 1
    #menulis ke kolom excel
rowsuhu = 'A' + str(row)
rowhumi = 'B' + str(row)
sht.range(rowsuhu).value = float(datae[0])
sht.range(rowhumi).value = float(datae[1])
sht.range('C' + str(row)).value = datetime.now().strftime("%H:%M:%S")

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)
    #konek ke broker
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client


def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if msg.topic == topicsuhu:
datanya.append(msg.payload.decode()) #tambahkan suhu ke list
else :
datanya.append(msg.payload.decode()) #tambahkan humi ke list
#ini buat mengatasi data telat atau hanya 1 yg nyampe
if len(datanya) == 2 :
to_excel(','.join(datanya))
datanya.clear()

client.subscribe(topicsuhu)
client.subscribe(topichumi)
client.on_message = on_message


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


if __name__ == '__main__':
run()

Hasilnya jika disandingkan antara python dan excel sepertti ini :




Cara ini sangat primitive namun tepat guna, dapat memuaskan klien saya yg memang sudah berumur. Jadi kadang kita harus bisa menyesuaikan dengan berbagai kemungkinan walaupun terlihat sedikit mubazir karena pada python sudah ada fasilitas canggih untuk pengolahan data dan grafik. Namun ini adalah pilihan yg bisa dipakai solusi juga sekiranya anda masih bekerja sebagai "excel engineer" di kantor. Selamat mencoba...

Mau lanjut ke kesimpulan akhir praktek wemos? Lanjut klik disini ya...
Share:

Jumat, 20 Agustus 2021

Wemos ESP8266 - Part 5 - MQTT ke Aplikasi Smartphone

 



Setelah berhasil memahami konsep PubSub melalui protokol MQTT, maka kini saatnya mengolah datanya menjadi tampilan yg lebih menarik dan dipahami oleh orang awam. Tentu saja keajaiban smartphone membuat IOT terasa lebih menarik karena gawai smartphone yg hampir 24 jam orang pegang, dapat dimanfaatkan melakukan kontrol se-isi rumah dari jauh melalui internet. 

Lalu apa bedanya dengan Wemos yg sudah kita bahas sebelumnya kan sudah bisa digunakan sebagai webserver dan bisa diakses dari luar rumah ? Ada sesuatu yg kurang dari HTTP sebagai metode komunikasi  IOT dibandingkan dengan MQTT.

MQTT adalah data-sentris sedangkan HTTP adalah dokumen-sentris. HTTP adalah protokol Request-response yg dikatakan "connectionless" untuk komputasi server-klien dan tidak selalu dioptimalkan untuk perangkat seluler. Keuntungan utama MQTT dalam sistem IOT ini adalah ringan (MQTT mentransfer data sebagai array byte) dan model Pub/Sub, yang membuatnya sempurna untuk perangkat dengan sumber daya terbatas dan membantu menghemat baterai.

Selain itu, model Pub/Sub menyediakan klien dengan keberadaan independen satu sama lain dan meningkatkan keandalan keseluruhan sistem. Ketika satu klien rusak, seluruh sistem dapat terus bekerja dengan baik. Menurut pengukuran di jaringan 3G, throughput MQTT 93 kali lebih cepat daripada HTTP.

Itulah sedikit cuap-cuap hasil googling mengenai perbedaan HTTP vs MQTT yg sekiranya mudah dipahami. Kini bagian yg mungkin sulit dipahami, jadi butuh kembali membaca pembahasan sebelumnya dari Part 1 - 4, dimana MQTT dalam platform arduino sudah dimudahkan dengan Library PubSubClient yang memudahkan penerjemahan text ke dalam byte array dan kemudian dikirimkan secara TCP ke MQTT broker.




Saya anggap pembaca sudah paham sampai praktek kirim data DHT 11 dan kontrol LED di Part 3 sehingga kelanjutannya kali ini saya tinggal membahas script Pub-Sub pada library pubsubclient. Scriptnya seperti dibawah ini :


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


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 SUHUTOPIC "/testyuk/suhu"
#define HUMITOPIC "/testyuk/humi"
#define LEDTOPIC "/testyuk/led"

//IO pin
const int dhtPin = 13; //pin DHT di wemos(I/O marking bawah)
#define LED_SCK 14  //LED SCK
#define LED_ESP 2   //LED ESP


#define DHTTYPE DHT11  //Sensor DHT11
DHT dht(dhtPin, DHTTYPE); 

//Timer
unsigned long previousMillis = 0;
const long interval = 10000;   // interval pengambilan dht 11
                               // broker gratis jangan cepet2

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

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

  digitalWrite(LED_ESP,HIGH);
  digitalWrite(LED_SCK,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();
  dht.begin();
}

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(LEDTOPIC);
      client.subscribe(LEDTOPIC); //subscribe ke topic LED on off
    }
  
}



// Non-Blocking delay agar gak ganggu proses utama
void SendTempHumid(){
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis >= interval) {
    // cek interval  
    previousMillis = currentMillis;   
 
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");
    }

    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" °C ");
    

    String pubStringt = String(t);
    String pubStringh = String(h);

    //yg dibawah ini metode pengiriman PUB ke TOPIC
    //dikirim perbyte message + header nya
    //sudah dimudahkan oleh library pubsub

    Serial.println("publish to topic: " );
    Serial.print(SUHUTOPIC);
    Serial.print(" : ");
    Serial.println(pubStringt);
    char message_bufft[pubStringt.length() + 1];
    pubStringt.toCharArray(message_bufft, pubStringt.length() + 1);
    client.publish(SUHUTOPIC,message_bufft );

    Serial.println("publish to topic: " );
    Serial.print(HUMITOPIC);
    Serial.print(" : ");
    Serial.println(pubStringh);
    char message_buffh[pubStringh.length() + 1];
    pubStringh.toCharArray(message_buffh, pubStringh.length() + 1);
    client.publish(HUMITOPIC,message_buffh );

  }

}


//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);
  if(message == "sckOn") {digitalWrite(LED_SCK,HIGH);}   //LED SCK on  
  if (message == "sckOff") {digitalWrite(LED_SCK,LOW);}   //LED SCK off 
  if (message == "espOn") {digitalWrite(LED_ESP,LOW);}   //LED ESP on
  if (message == "espOff") {digitalWrite(LED_ESP,HIGH);}   //LED ESP off   
    
  Serial.println();
  Serial.println("-----------------------");  


}




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

Singkat bukan ? Cukup baca examples yg diberikan oleh librarynya atau githubnya maka sudah cukup jelas konsep nya. Mari kita bahas perbagian, dimana bagian PUB dan SUB nya .



PUB :


String pubStringt = String(t);
char message_bufft[pubStringt.length() + 1];
pubStringt.toCharArray(message_bufft, pubStringt.length() + 1);
client.publish(SUHUTOPIC,message_bufft );

Terlihat pada scipt diatas hasil pembacaan suhu  t (float) diubah menjadi string lalu di arraykan satu persatu sebelum di Publish ke topic yg telah ditentukan sebelumnya.
 

SUB :




 client.setCallback(mqtt_callback);    //Di function Setup
 
 =======================
 
 if (client.connected()){
  client.subscribe(LEDTOPIC); //di function reconnect
    }
    
 ========================
 
 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);
  if(message == "sckOn") {digitalWrite(LED_SCK,HIGH);}   //LED SCK on  
  if (message == "sckOff") {digitalWrite(LED_SCK,LOW);}   //LED SCK off 
  if (message == "espOn") {digitalWrite(LED_ESP,LOW);}   //LED ESP on
  if (message == "espOff") {digitalWrite(LED_ESP,HIGH);}  //LED ESP off   
    
  Serial.println();
  Serial.println("-----------------------");  


}

    
    


Sedangkan hasil dari serial monitor sebagai berikut :





Bagaimana dengan aplikasi IOT MQTT Panel pada smartphone kamu ? jangan lupa untuk memahaminya terlebih dahulu pada praktek sebelumnya disini. Sehingga jika setting topiknya benar, bisa membuat tampilan keren seperti gambar dibawah ini :



*)Sesuaikan nama topic yg di script arduino, usahakan unik agar gak nabrak 


Bermacam-macam GUI Panel bisa di kostumisasi untuk tampilan yang lebih menarik seperti contoh yg saya buat 2 tahun yg lalu.







Kekurangannya hanya pada bagian data Loggernya sehingga belum dapat disimpan untuk keperluan pelaporan dengan jarak waktu lebih panjang. Hal ini akan dibahas pada bagian selanjutnya dan akan memanfaatkan script python pada PC cloud atau aplikasi database lainnya. Bagian selanjutnya dapat dibaca disini.
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