Semua Akan Digital Pada Akhirnya... Dari Audio, Video, TV, Kontrol, Keuangan, Kesehatan dan Sebagainya. Blog Ini Ditujukan Buat Kamu Yang Ingin Belajar Dasar Digital Dan Yang selalu Bertanya, Kenapa Bisa Begini Dan Harus Begitu ?

  • 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

  • Kontrol Perangkat Rumah Dari Internet

    Internet Of Things sudah menjadi istilah yang semakin dikenal orang. Mau tahu bagaimana konsep, cara pembuatan dan pemanfaatannya ?

  • 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 python. Tampilkan semua postingan
Tampilkan postingan dengan label python. Tampilkan semua postingan

Senin, 13 September 2021

ESP8266 - @Telegram_Bot - Part 4 : Kirim Grafik Real Time ke Bot

 


Seperti yang sudah kita praktekkan sebelumnya, Modul ESP8266 sekelas Wemos D1 memiliki kemampuan untuk berkomunikasi dengan API Telegram BOT secara pooling. Namun dikarenakan limitasi dari resource dan syarat dari API yang menggunakan SSL terenkripsi maka akan menyebabkan lambatnya respon yg didapat. Untuk itu butuh perantara di mesin yg lebih cepat seperti raspberry pi atau komputasi cloud yg dapat melayani kebutuhan kapan saja. 

Setelah berhasil menyimpan data dan menggambarkan grafiknya, kita sampai pada pembahasan terakhir yaitu mengirimkan grafik realtime melalui bot telegram. Secara garis besar alur cerita dari logika yg saya buat seperti berikut :


  • ESP8266 membaca sensor DHT 11 dan mengirimkan secara PUB ke MQTT Broker.
  • MQTT broker meneruskan data ke pihak yg melakukan SUB, dalam hal ini PC+python di rumah saya.
  • Python melakukan penyimpanan data suhu dan kelembaban ke SQLite secara berkala setiap ada pesan MQTT yg sampai ke PC.
  • Python mengontrol komunikasi ke API telegram bot dan kemudian mengirimkan grafik jika diminta.


Library atau modul python yg digunakan untuk mengotrol telegram bot adalah python-telegram-bot, jangan lupa untuk meginstalnya di komputer kamu.


$ pip install python-telegram-bot 


Sedangkan module lainnya sudah dibahas pada praktek sebelumnya, tanpa berpanjang lebar lagi, berikut ini script python sebagai jembatan ESP8266 dengan telegram bot


from telegram import Bot, ReplyKeyboardMarkup, ReplyKeyboardRemove
from telegram.ext import Updater, MessageHandler, Filters
import random, json, sqlite3, datetime, time
from paho.mqtt import client as mqtt_client
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
from matplotlib import style

# server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicdht= "/aisi555/dht" # sesuaikan topic di praktek sebelumnya


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

bot = Bot('XXXXXXXX:XXXXXXXXXXXXXXXXXX') #isi sesuai Token BOT anda


#Masukkan ke database dan tambahkan kolom date
def sql_insert(s,h):
db = sqlite3.connect("humitemp.db") #buat dulu databasenya
cursor = db.cursor()
now = int(time.time())
tgl = str(datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S'))
cursor.execute("insert into dht11(suhu, humi, date) values(?,?,?)",(s,h,tgl))
db.commit()
cursor.close()
db.close()

def graph_data(uid):
# Connect to database
sqlite_file = 'humitemp.db'
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
style.use('seaborn')
    #pilih 30 data terakhir
c.execute('SELECT * FROM dht11 ORDER BY date DESC LIMIT 30')
data = c.fetchall()

temperature = []
humidity = []
timenow = []

for row in data:
temperature.append(row[0])
humidity.append(row[1])
timenow.append(parser.parse(row[2]))

dates = [mdates.date2num(t) for t in timenow]

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Kondisi Lingkungan")

# Configure x-ticks
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m %H:%M'))

# Plot temperature data on left Y axis
ax1.set_ylabel("Suhu [°C]")
ax1.plot_date(dates, temperature, '-', label="Suhu", color='r')

# Plot humidity data on right Y axis
ax2 = ax1.twinx()
ax2.set_ylabel("Kelembaban [% RH]")
ax2.plot(dates, humidity, '-', label="Kelembaban", color='g')

# Format the x-axis for dates (label formatting, rotation)
fig.autofmt_xdate(rotation=60)
fig.tight_layout()

# Show grids and legends
ax1.grid(True)
ax1.legend(loc='center left', framealpha=0.5)
ax2.legend(loc='center right', framealpha=0.5)

plt.savefig("figure.png") #simpan dalam file gambar

c.close()
conn.close()
bot.send_photo(uid, photo=open('figure.png', 'rb')) #kirim ke bot telegram berupa gambar

def reply(uid, teks, tombolList): #biar tampil tombol bot keren
if len(tombolList) == 0:
tombol = ReplyKeyboardRemove()
else:
tombol = ReplyKeyboardMarkup([tombolList], resize_keyboard=True)
bot.send_message(uid, parse_mode="HTML", text='<b>' + teks + '</b>', reply_markup=tombol)


def respond(data, update): #membaca dan membalas respon dari pengguna bot
message = data.message
teks = message.text
uid = message.chat.id # user id

if teks == 'suhu':
bot.send_message(uid, parse_mode="HTML", text="<b>Suhu</b> : " + str(suhu) + " °C")
elif teks == 'humi':
bot.send_message(uid, parse_mode="HTML", text="<b>Kelembaban</b> : " + str(humi) + " % rH")
elif teks == 'grafik':
graph_data(uid) #kirim grafik

if teks.find('suhu') != -1 or teks.find('humi') != -1 or teks.find('/start') != -1:
reply(uid, "ESP8266 ULO by Aisi555.com", ["suhu", "humi", "grafik"])
else:
reply(uid, "Silahkan Pilih Tombol", ["suhu", "humi", "grafik"])
return "ok"


# koneksi Mqtt
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 topik mqtt broker
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
global suhu, humi, indeks
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if (msg.topic == topicdht):
data= json.loads(msg.payload.decode()) #parsing json
suhu = data["suhu"]
humi = data["humi"]
sql_insert(suhu,humi) #kirim ke SQLite
# daftar pada topic
client.subscribe(topicdht)
client.on_message = on_message


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


if __name__ == '__main__':
updater = Updater(bot=bot)
dispatcher = updater.dispatcher

dispatcher.add_handler(MessageHandler(Filters.text, respond))

print("@" + bot.username + " siap.")
updater.start_polling()
run()
updater.idle()


Berikut ini penjelasan secara detail, dimulai dari Module Python yg digunakan :


from telegram import Bot, ReplyKeyboardMarkup, ReplyKeyboardRemove
from telegram.ext import Updater, MessageHandler, Filters
import random, json, sqlite3, datetime, time
from paho.mqtt import client as mqtt_client
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
from matplotlib import style


Yang dibawah ini merupakan inilisalisasi broker MQTT dan token BOT Telegram.


# server/broker mqtt
broker = 'broker.hivemq.com'
port = 1883
topicdht= "/aisi555/dht" # sesuaikan topic di praktek sebelumnya


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

bot = Bot('XXXXXXXX:XXXXXXXXXXXXXXXXXX') #isi sesuai Token BOT anda


Selanjutnya routine / function untuk mengatur koneksi MQTT dan Subcribe topiknya. Setiap ada message yg masuk dari MQTT langsung disimpan pada database SQLite.


# koneksi Mqtt
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 topik mqtt broker
def subscribe(client: mqtt_client):
def on_message(client, userdata, msg):
global suhu, humi, indeks
print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
if (msg.topic == topicdht):
data= json.loads(msg.payload.decode()) #parsing json
suhu = data["suhu"]
humi = data["humi"]
sql_insert(suhu,humi) #kirim ke SQLite
# daftar pada topic
client.subscribe(topicdht)
client.on_message = on_message


Setelah data tersedia dari broker MQTT, maka dilakukan penyimpanan database oleh function berikut :


def sql_insert(s,h):
db = sqlite3.connect("humitemp.db") #buat dulu databasenya di SQLite
cursor = db.cursor()
now = int(time.time())
tgl = str(datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S'))
cursor.execute("insert into dht11(suhu, humi, date) values(?,?,?)",(s,h,tgl))
db.commit()
cursor.close()
db.close()


Respon dari Telegram Bot dilakukan di function berikut ini :


def respond(data, update): #membaca dan membalas respon dari pengguna bot
message = data.message
teks = message.text
uid = message.chat.id # user id

if teks == 'suhu':
bot.send_message(uid, parse_mode="HTML", text="<b>Suhu</b> : " + str(suhu) + " °C")
elif teks == 'humi':
bot.send_message(uid, parse_mode="HTML", text="<b>Kelembaban</b> : " + str(humi) + " % rH")
elif teks == 'grafik':
graph_data(uid) #kirim grafik

if teks.find('suhu') != -1 or teks.find('humi') != -1 or teks.find('/start') != -1:
reply(uid, "ESP8266 ULO by Aisi555.com", ["suhu", "humi", "grafik"])
else:
reply(uid, "Silahkan Pilih Tombol", ["suhu", "humi", "grafik"])
return "ok"


Biar tambah keren ditambahkan reply keyboard "markup" seperti berikut :


def reply(uid, teks, tombolList): #biar tampil tombol bot keren
if len(tombolList) == 0:
tombol = ReplyKeyboardRemove()
else:
tombol = ReplyKeyboardMarkup([tombolList], resize_keyboard=True)
bot.send_message(uid, parse_mode="HTML", text='<b>' + teks + '</b>', reply_markup=tombol)




Untuk menampilkan grafik digunakan module Matplotlib, persis dengan pembahasan sebelumnya.


def graph_data(uid):
# Connect to database
sqlite_file = 'humitemp.db'
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
style.use('seaborn')
    #pilih 30 data terakhir
c.execute('SELECT * FROM dht11 ORDER BY date DESC LIMIT 30')
data = c.fetchall()

temperature = []
humidity = []
timenow = []

for row in data:
temperature.append(row[0])
humidity.append(row[1])
timenow.append(parser.parse(row[2]))

dates = [mdates.date2num(t) for t in timenow]

fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.set_title("Kondisi Lingkungan")

# Configure x-ticks
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%d/%m %H:%M'))

# Plot temperature data on left Y axis
ax1.set_ylabel("Suhu [°C]")
ax1.plot_date(dates, temperature, '-', label="Suhu", color='r')

# Plot humidity data on right Y axis
ax2 = ax1.twinx()
ax2.set_ylabel("Kelembaban [% RH]")
ax2.plot(dates, humidity, '-', label="Kelembaban", color='g')

# Format the x-axis for dates (label formatting, rotation)
fig.autofmt_xdate(rotation=60)
fig.tight_layout()

# Show grids and legends
ax1.grid(True)
ax1.legend(loc='center left', framealpha=0.5)
ax2.legend(loc='center right', framealpha=0.5)

plt.savefig("figure.png") #simpan dalam file gambar

c.close()
conn.close()
bot.send_photo(uid, photo=open('figure.png', 'rb')) #kirim ke bot telegram berupa gambar


Hasil pada BOT Telegram seperti berikut ini :




Grafik lebih jelasnya seperti pada gambar berikut :




Keren bukan ? Selamat mencoba ! 

Share:

Rabu, 07 Juli 2021

Atlet dan Wartawan di Olimpiade Tokyo Akan di Lacak Melalui GPS - Bikin Sendiri Yuk Dari Barang Bekas !

(bisnis.com) Penyelenggara Olimpiade Tokyo akan memantau pergerakan atlet menggunakan GPS seperti yang dilakukan kepada media asing. CEO Komite Penyelenggara Tokyo 2020, Toshiro Muto, mengatakan mengatakan sistem pemantauan akan digunakan tidak untuk melacak setiap gerakan peserta Olimpiade tetapi untuk melacak mereka secara retroaktif jika muncul masalah. 




Tokyo akan menjadi tuan rumah Olimpiade Musim Panas 2020 yang telah satu tahun ditunda dan akan dimulai 23 Juli, di tengah kekhawatiran bahwa acara global itu akan menambah beban sistem medis yang telah terbebani akibat pandemi virus corona. Penyelenggara Tokyo 2020, Selasa, mengatakan jurnalis luar negeri yang meliput Olimpiade Tokyo akan dilacak pergerakannya dengan GPS, dan terancam tidak dapat meliput jika melanggar aturan.




Setahun lalu saya ingat pernah belajar Coding Python yang berhubungan GeoPy ( baca dulu disini ) dan pengolahan data lokasi, dan saya bahas mengenai Hardware GPS receiver yg umum ada pasaran elektronika di olshop. Dan saya buka kotak perkakas di gudang dan teringat nostalgia kembali ke 15 tahun yang lalu ketika saya bekerja di salah satu vendor perangkat telekomunukasi CDMA. Jadi saat itu salah satu cara membedakan BTS CDMA dengan GSM adalah mencari antena berbentuk setengah bola atau kerucut yg diletakkan tidak terlalu tinggi dekat dengan shelter BTS.




Terbayang masa-masa proyek memasang antena GPS di atas tower, dimana saat itu pekerjaan ini dihargai tinggi,bisa untuk beli HP baru lho ! Belum lagi sisa kabel yang panjang, kualitas jerman yg laku keras di loak...ahhhh sudahlahh...namun kini, yang menjadi warisan di saya hanya sebuah receiver GPS USB yang dulunya digunakan  untuk referensi lokasi saat melakukan drive test sinyal. Dan saat saya colokkan port USB nya ke komputer  terdeteksi sebagai Usb to serial converter. Wahh ini dalemannya pasti masih berupa UART dan bisa  di interfacing ke arduino !




Jadi makin semangat nih buat menyambungkannya ke Arduino. Tapi sebelumnya ada baiknya mencari referensi tentang data yg dikirim oleh si receiver. Sial nya si pembuat modul telah bangkrut dan sedikit yg bisa saya dapatkan digoogle tapi cukuplah informasi yg di dapat bahwa receiver ini berbasis NMEA yg masih umum digunakan. Dengan terminal putty dan serial baudrate 4800 layar menangkap seperti ini :


Buset dah..banyak amat tuh tulisan yg harus diparsing, dan dari yg saya baca di standar NMEA receiver ini lumayan lengkap karena bisa membaca berbagai standar GPS , jadi ada $GPRSV dan $GPRSA untuk melihat informasi satelit dan $GPGGA dan $GPRMC untuk membaca koordiat, waktu, kecepatan, ketinggian dsb. Wah saya mumet ini kalau membaca parsingan segitu banyak, dan pilihan tertuju ke google dan saya cari ada gak software gratis untuk membaca parsingan NMEA seperti diatas...dan ternyata banyak loo..ayo kita coba dan bawa keruangan terbuka agar sinyal satelitnya lebih bagus.




Pilihan saya tertuju ke software yg pertama dimana terpampang jelas parsingan NMEA nya sehingga dari data serial yg didapat seperti ini :


$GPRMC,040503.246,A,0719.6784,S,11243.4344,E,0.00,0.00,220520,,*1B


Artinya kira-kira :

040503.246       =  Jam 04 , Menit 05, Detik 03.246 (UTC)
A                             = Data Benar ( V jika datanya salah )
0719.6784,S     = Latitude 7' 19.6784 " South
11243.4344,E   = Longitude 112' 43.4344 " East
220520        = Tanggal 22 Bulan 05 Tahun 20

Nah sudah siap nih...ayo kita siapkan bahan-bahan dan mulai menyolder modul receiver GPSnya agar bisa dihubungkan ke Arduino.



Skematik tidak akan saya bahas karena sangat gampang dicari apalagi cara koneksi LCD ke Arduino seperti apa pasti para pembaca sudah tahu, dan kalau belum ya tinggal googling aja bagaimana cara menyambungkan LCD ke arduino. Microcontroller yg pas ada disaya adalah wemos d1 r1  yang memiliki wifi berbasis ESP8266 dan nantinya akan saya proogram untuk membaca GPS secara serial dan DHT11 sebagai tambahan sensor agar sedikit berbau IOT. Tujuan akhir dari praktek ini adalah mengirimkan data sensor suhu/kelembaban beserta dengan data GPS dan nama lokasi pembacaan yg akan dikolaborasikan dengan Mqtt serta Geopy phyton. Pada part 1 ini akan difokuskan pembahasan mengenai pembacaan GPS ke LCD.


Pertanyaan besarnya adalah bagaimana cara parsing text serial secara efektif? Apakah manual saja? Secara tukang solder ini memiliki pengalaman buruk dengan parsing serial ! Teringat bahwa modul GPS receiver banyak dijual sebagai interfacing Arduino dan pastinya ada Library jadinya, dan benar saja beberapa library terpampang di sketch dan stelah mencoba beberapa kali akhirnya diputuskan untuk menggunakan library TinyGps++ . Kenapa? Karena dengan script examplenya (ada di folder lib nya) alat saya  sukses membaca data GPS dengan bagus. Mari kita berkreasi dengan cara copy paste ala tukang solder ini.



#include <TinyGPS++.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>

static const int RXPin = 0, TXPin = 15; 
//pake RX aja hanya baca data !

static const uint32_t GPSBaud = 4800;



Seperti biasanya menggunakan board arduino versi kecil maka serial portnya harus dengan software serial. Baudrate disesuaikan yaitu 4800




// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

LiquidCrystal lcd(16, 5, 4, 14, 12, 13);



Inisialisai LCD seperti biasa simple aja dan harus diperhatikan Wemos D1 R1 memiliki GPIO yang agak loncat loncat, jadi sesuaikan penamaan portnya jangan sampe salah. Gunakan Google Search jika salah.



void setup()
  Serial.begin(9600);
  ss.begin(GPSBaud);
  lcd.begin(20, 4);

  Serial.println(F("Coba-Coba GPS"));
  Serial.println(F("Menggunakan  TinyGPS++ Dan GPS module"));
  Serial.print(F("Testing TinyGPS++ library v. ")); 
  Serial.println(TinyGPSPlus::libraryVersion());
  Serial.println(F("by ahocool with respect to Lib creator  Mikal Hart"));
  Serial.println();
}


Function setup menyatakan bahwa serial dari wemos akan digunakan sebagai console juga untuk melihat hasil pembacaan GPS selain di LCD. keuntungan lainnya adalah memudahkan untuk debugging.


void displayInfo()
{
  Serial.print(F("Location: ")); 
  if (gps.location.isValid())
  {
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
    lcd.setCursor(0,0);
    lcd.print(" ---- GPS VALID ----");
    lcd.setCursor(0,1);
    lcd.print("LAT :");
    lcd.print(gps.location.lat(), 6);
    lcd.setCursor(0,2);
    lcd.print("LONG:");
    lcd.print(gps.location.lng(), 6);    
  
  }
  else
  {
    Serial.print(F("INVALID"));
    lcd.setCursor(0,0);
    lcd.print(" ---GPS INVALID --- ");
  }

  Serial.print(F("  Date/Time: "));
  if (gps.date.isValid())
  {
    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.print(F(" "));
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) Serial.print(F("0"));
    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    if (gps.time.minute() < 10) Serial.print(F("0"));
    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    if (gps.time.second() < 10) Serial.print(F("0"));
    Serial.print(gps.time.second());
    Serial.print(F("."));
    if (gps.time.centisecond() < 10) Serial.print(F("0"));
    Serial.print(gps.time.centisecond());
  }
  else
  {
    Serial.print(F("INVALID"));
  }

  Serial.println();
  
}


Pada sript diatas berfungsi sebagai tampilan GPS ke Serial dan LCD, secara umumnya dapat dilihat class yg umum digunakan :


gps.location.isValid()
gps.location.lat()
gps.location.lng()
gps.date.isValid()
gps.time.hour()
gps.time.minute()
gps.time.second()
gps.time.second()


Untuk loop utama seperti dibawah ini :


void loop()
{
  // Data ditampilkan hanya setelah data selesai di olah 
  while (ss.available() > 0)
    if (gps.encode(ss.read()))
      displayInfo();

  if (millis() > 5000 && gps.charsProcessed() < 10)
  {
    Serial.println(F("GPSMU pedot brooo! cek kabelmu."));
    while(true);
  }


}


Hasilnya ketika saya jalankan diluar ruangan sangat akurat apalagi saat cuaca ternag dan LED dari GPS rceiver tidak berkedip yg artinya FULLY LOCKED TO 3 SATELLITES.






Tidak terlalu sulit jika kita sudah mengetahui langkah-langkah "googling" yang sesuai untuk meng "oprek" arduino. Untung saja saya punya receiver GPS jadul kalau tidak harus keluar duit 200rb an untuk membeli modul GPS Ublox Neo.

Untuk praktek keliling ke seputaran kompleks perumahan dan mengolah datanya ke database dapat dibaca disini :  https://www.aisi555.com/2020/05/praktek-iot-bermain-dengan-alat-gps.html
Share:

Kamis, 02 Juli 2020

[IOT Itu Gampang] Menggambar Grafik Data Arduino ke Excel



Sangat jarang saya menulis blog setelah youtube nya duluan saya upload, jadi mungkin terbawa perasaan kehilangan teman yang sering bikin vlog, jadi beberapa hari belakangan saya rajin mengunggah video tutorial. Bahasan yg di tampilkan adalah mengenai cara menulis data dan menampilkan grafik dari Arduino ke microsoft excel, walau diluaran sana sudah ada tools langsung jadi tapi kini saya bahas lebih mudah menggunakan bantuan python / xlwings. Jadi dengan tutorial kali ini maka tidak susah-susah lagi menggunakan mysql+php pada windows (xamp) cukup excel aja.




Sensor sejuta umat DHT11 mungkin paling sering dibahas dimana-mana termasuk pada blog ini dimana untuk DHT11 vs MQTT sudah pernah saya bahas di :http://www.aisi555.com/2019/10/iot-lebih-lanjut-dengan-mqtt.html , jadi kali ini saya anggap pembaca sudah paham cara mengirim data MQTT nya. Kita akan lebih ke library python nya yang saya gunakan yaitu XLWINGS.



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

Sangat jelas dan singkat script python diatas jadi tidak perlu dibahas lagi dan jika dijalankan hasilnya akan seperti berikut:


xlwings merupakan library paling bagus menurut saya kalau dilihat dari segi metode penulisannya yang langsung saat excel terbuka, jadi sangat cocok untuk menampilkan grafik realtime dari pengukuran DHT11. Script dari wemos-esp8266-wifi-mqtt yang saya gunakan seperti berikut :

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"

const char *ssid =  "myIOT";  //ubah sesuai wifi anda
const char *pass =  "selaluterhubung";  
//broker gratisan hivemq.com
const char *mqtt_server = "broker.hivemq.com";
const int mqtt_port = 1883;
const char *mqtt_user = "";
const char *mqtt_pass = "";
const char *mqtt_client_name = "ahocool445566"; 
//inisialisasi DHT
#define DHTPIN 5
#define DHTTYPE DHT11
  
DHT dht(DHTPIN, DHTTYPE); 

WiFiClient wclient;
PubSubClient client(wclient);

#define TOPIKDHT "/test/dht11" //topik yang digunakan


//koneksi wifi
void setupwifi()
{
   if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Connecting to Wifi:  ");
    Serial.print(ssid);
    Serial.println("...");
    WiFi.begin(ssid, pass);

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

void setup() {
Serial.begin(9600); //serial monitoring
setupwifi();
client.setServer(mqtt_server, mqtt_port); // server mqtt
dht.begin();  //mulai dht

}

void kirim(String kata) //publish ke topik
{

    Serial.println("publish to topic: " );
    Serial.print(TOPIKDHT);
    Serial.print(" : ");
    Serial.println(kata);
    char message_buff[kata.length() + 1];
    kata.toCharArray(message_buff, kata.length() + 1);
    client.publish(TOPIKDHT,message_buff);
  
}

void reconnectmqtt() //konek mqtt lagi jika putus
{

      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");   
      }
   
}


void loop() {

  if (!client.connected()) //cek koneksi mqtt
   {
    reconnectmqtt();
   }
 //baca suhu dan kelembaban
  float h = dht.readHumidity();
  float t = dht.readTemperature();
 
  // Cek jika pembacaan sensor benar lalu kirim
  if (isnan(h) || isnan(t)) {
      Serial.println(F("Failed to read from DHT sensor!"));
  }
  else{
    
  //kirim ke serial monitoring
      Serial.print(F("Humidity: "));
      Serial.print(h);
      Serial.print(F("%  Temperature: "));
      Serial.print(t);
      Serial.print(F("°C "));
  //kirim ke mqtt data "suhu,kelembaban"
      kirim( String(t) + ","+ String(h) );
    }

 delay(5000); //delay pengiriman mqtt
}

Sangat sederhana tujuan script diatas berupa pengiriman ke sebuah TOPIK MQTT yaitu : "/test/dht11" berupa data string "suhu , kelembaban" (contoh :  "30.5,70.00") lalu oleh python akan di subscribe dan jika ada data masuk akan ditulis oleh library python XLWINGS seperti script berikut:


import paho.mqtt.client as mqtt #library mqtt
import xlwings as xw #library menulis excel

wb = xw.Book('Book1.xlsx') #nama book/file excel
sht = wb.sheets['data'] #nama sheets
row = 1
########## menulis ke excel #########
def to_excel(data):
    print(data)
    datae = data.split(",") #bikin list delim koma
    global row  #ini reset row kembali ke 2
    if row == 51:
       row=2 
    else:
      row=row+1 #increment row tiap ada data masuk
    rowsuhu='A'+str(row) #kolom suhu
    rowhumi='B'+str(row) #kolom kelembaban
    sht.range(rowsuhu).value= float(datae[0]) #tulis suhu
    sht.range(rowhumi).value= float(datae[1]) #tulis kelembaban
############ call back pesan mqtt masuk ##########
def on_message(client, userdata, message):
    print("message received " ,str(message.payload.decode("utf-8")))
    print("message topic=",message.topic)
    print("message qos=",message.qos)
    print("message retain flag=",message.retain)
    to_excel(str(message.payload.decode("utf-8"))) #tulis ke excel  
########################################
broker_address="broker.hivemq.com" #broker mqtt
broker_port=1883
broker_user=""
broker_pass=""
print("creating new instance")
client = mqtt.Client("P1") #create new instance
client.on_message=on_message #attach function to callback
client.username_pw_set(broker_user,broker_pass)
print("connecting to broker")
client.connect(broker_address,broker_port) #connect to broker
 #start the loop
print("Subscribing to topic","/test/dht")
client.subscribe("/test/dht11")
client.loop_forever()
Jadi jika kita run script pythonnya dan data kemudian akan ditulis ke excel sehingga grafik terupdate.


Ini cocok digunakan untuk sensor yang jarak jauh dan ingin ditampilkan sebagai monitoring langsung dan karena excel  umum digunakan maka pengaturan tampilannya dapat disesuaikan dengan mudah. Jika alat yang dimonitoring letaknya dekat maka cukup menggunakan serial port dan akan dibahas pada tulisan selanjutnya.




#daring #daringadalah daring adalah mpls #sekolah #guru #google classroom google classroom sekolah online guru kelas zoom webcam 
Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (15) android (12) antares (3) arduino (21) artikel (11) attiny (3) attiny2313 (19) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (45) digital (1) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (44) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (16) komputer (3) komunikasi (1) kontrol (7) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroller (12) mikrotik (5) mqtt (1) ninmedia (3) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (78) pcb (2) power (1) praktek (2) project (33) proyek (1) python (3) 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 (145) television (28) transistor (2) troubleshoot (3) tulisan (83) tutorial (80) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika