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

Senin, 20 September 2021

Praktek Input/Output Led Matrix - Nostalgia Berbagi Ilmu 10 Tahun Yang Lalu

 


Sebelum negara api menyerang dan menjadi pusat produksi segala macam benda elektronika, Led Matrix yang disusun-susun dengan microcontroller sebagai otaknya, menjadi handalan banyak penggiat bisnis elektronika digital. Keleluasaan untuk mengkreasikan banyak karakter dan animasi menarik diatasnya membuat menjadi sasaran akhir mereka yang belajar microcontroler di era sebelum 2010. Namun ketika modul display led matrix siap pakai seperti : P10, P8 dan sebagainya, didukung dengan harga yang dibilang tak masuk akal murahnya, membuat para seniman teks digital menjadi dimanjakan. Cukup gunakan jari untuk mengimpor via smartphone, lalu plug and play saja.

Namun blog ini tetap bertujuan utama berbagi ilmu bagaimana cara kerja Led Matrix dan bagaimana menyusunnya menjadi display yang menarik. beberapa tulisan mengenai Led Matrix ada pada link berikut : 





Mengingat itu semua terutama video yg saya buat pada 2009 diatas membuat sedikit sentimentil dan emosional, karena banyaknya rekan mahasiswa bertanya ilmu Led Matrix yg saya bagi di forum kaskus (sebelum saya pindah ke blog ini). Ada yang dari jogja, semarang, bali, sampai aceh hingga gorontalo memesan komponennya ke saya dan berdiskusi mengenai cara membuat teks berjalan pada Led Matrix. Ini menjadi kebanggaan sendiri karena beberapa yg sukses belajar led matrix menjadikan tolak ukur keberhasilan telah dipahaminya  konsep dasar mikrokontroller dan siap untuk mendesain apapun setelahnya.

Kali ini saya akan menjelaskan kembali praktek lovehurt 2011 dengan sedikit penjelasan agar lebih mudah dimengerti, diawali dengan melihat bagaimana flowchart untuk menuliskan karakter pada sebuah Led Matrix.



Penjelasan :

Pada dasarnya Led Matrix adalah Led yang disusun berdasarkan konsep Row dan Column, dimana untuk menyalakan satu buah led diberikan tegangan 2.4 Volt pada R dan 0 Volt pada C. Jadi untuk menyalakan R5C3 harus terjadi forward voltage dari R5 ke C3 sehingga Led menyala.

Untuk membuat sebuah karakter misal huruf A, dapat menggunakan tools bantuan excel seperti dibawah ini :



File excel dapat diunduh disini.

Selanjutnya akan dilakukan proses scanning dari kolom C1 menuju C5 secara cepat, bergantian memberikan logic LOW pada 1 kolom dan Logic HIGH untuk kolom lainya, bersamaan juga merubah nilai PORT yang mewakilinya, seperti pada skematik praktek kita kali ini menggunakan PORT D sebagai Row dan PORT B sebagai Column nya.




Rangkaian diatas sudah disesuaikan dengan penomeran kaki Led Matrix  7x5 (warna merah)  ukuran 2 inch yang umum dipasaran. Bagaimana script untuk menampilkan huruf A seperti contoh excel diatas ?


#define F_CPU 1000000UL      // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay

char huruf[]=
{ 0b1111110,
0b0001001,
0b0001001,
0b0001001,
0b1111110 };


int main(void)
{
 DDRD = 0b1111111; // untuk baris
 DDRB = 0b11111;  // untuk kolom

 PORTD =0; // Set all pins low
 PORTB =0b11111; //matikan semua led
    
    
 uint8_t a;
 
 while(1)
 { 


  //proses Scan dan tampilkan huruf
   for(a=0 ; a<5 ; a++)    
     
  {

   PORTB = ~(1<<a) ; //scan kolom active LOW
   PORTD = huruf[a]; //Tampilkan baris sesuai nilai array[kolom]
   _delay_ms(2);
   
  }     
 }	
}		

Permaianan kombinasi loop FOR akan sangat berguna dalam membuat animasi geser kanan atau kiri, seperti yang sudah saya jelaskan pada tulisan sebelumnya disini : https://www.aisi555.com/2012/12/script-break-down-episode-love-hurt.html. Atau jika kamu menggunakan arduino uno atau micro, dapat mempelajari pembahasan saya menyeluruh di tulisan saya disini : https://www.aisi555.com/2020/05/praktek-love-hurt-2020-remake-pake.html.


Yah jadi nostalgia deh sedikit mengenang masa lalu...yang penting saya bangga dapat berbagi ilmu bersama kalian pembaca setia blog ini.
Share:

Minggu, 19 September 2021

Lanjutan Praktek Input Output - Jam 4 Digit Dengan Tombol Non Blocking

 



Apa gak bosen kali ya saya menulis tentang jam digital  ?  Kalu dipikir memang saya maniak per-jam-an digital, dari yg paling sederhana pake delay sampai yg murni tanpa microcontroller, FULL CMOS. Saya rangkum dulu deh isi blog ini yg membahas jam mana saja...



Wah masih banyak lagi yang tidak saya sebutkan karena panjang, cek aja sendiri pasti banyak ketemu pembahasan tentang jam yang keseluruhannya memanfaatkan register timer pada microcontroller sekelas AVR.  Kali ini saya akan melanjutkan praktek I/O pada microcontroller Attiny2313 dengan melengkapi 7 segmen agar lebih bermanfaat yaitu ketika digabung beberapa buah menjadi jam yg dapat digunakan. Rangkaiannya seperti berikut ini.




Metode yang sangat terkenal saat pin I/O terbatas adalah metode scanning cepat, dimana tiap display 7 segmen ditampilkan secara bergantian. Jadi ke 7 kaki segmen dari masing-masing display 7 segmen terhubung semuanya. Sedangkan untuk melakukan penyalaannya diberikan tegangan pada common anoda secara satu-persatu dengan kecepatan tinggi sehingga menipu mata kalau nyalanya bareng. Jadi logikanya sesuai flowchart berikut :



Proses scanning penjelasannya seperti berikut :


  • Bagi nilai jam dengan 10 untuk mendapatkan puluhan jam, kemudian aktifkan PB#0, sedangkan PB#1,2,3 OFF. Nilai 7 segmen adalah segmen[puluhan_jam]
  • Ambil sisa pembagian jam dengan 10, kemudian aktifkan PB#1, sedangkan PB#0,2,3 OFF. Nilai 7 segmen adalah segmen[satuan_jam]
  • Bagi nilai menit dengan 10 untuk mendapatkan puluhan menit, kemudian aktifkan PB#2, sedangkan PB#0,1,3 OFF. Nilai 7 segmen adalah segmen[puluhan_menit]
  • Ambil sisa pembagian menit dengan 10, kemudian aktifkan PB#3, sedangkan PB#0,1,2 OFF. Nilai 7 segmen adalah segmen[satuan_menit]

Scriptnya seperti berikut ini :


#define F_CPU 1000000UL      // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay
#include <avr/interrupt.h>
#include <stdlib.h>

int jam=23, menit=59, detik=50; //variable global untuk menyimpan data2 waktu


//susunan segmen dari portD = GFEDCBA
//7 segmen common ANODA


uint8_t segmen[11]= 
	{0b1000000, // 0
	0b1111001, // 1
	0b0100100, // 2
	0b0110000, // 3
	0b0011001, // 4
	0b0010010, // 5
	0b0000010, // 6
	0b1111000, // 7
	0b0000000, // 8
	0b0010000, //9
	0b1111111}; // 10 / blank



ISR(TIMER1_COMPA_vect)  // 1 detik
{

	detik ++;

	if ( detik == 60)
	{       detik=0;
		menit++;
	}

	if ( menit == 60)
	{       menit = 0;
		jam++ ;
	}
	
	if (jam >23) jam=0;
}

int main(void)
{
    DDRD |= (1<<PD6) |(1<<PD5) |(1<<PD4) |(1<<PD3) |(1<<PD2) |(1<<PD1) | (1<<PD0) ; //segmen
    DDRB |= (1<<PB0) | (1<<PB1) |(1<<PB2) |(1<<PB3) | (1<<PB6) ; //Scan 7 segmen
    DDRB &= ~(1<<PB4) & ~(1<<PB5); // tombol tambah menit dan jam
    
    TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
    TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
    OCR1A  = 15625; //compare the CTC A for 1 second 
    TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64

	//untuk tombol anti blocking
	uint16_t waktu =0;  
	bool pencet = false;

	sei(); //start interrupt
   
		
   while (1) 
{ PORTD = segmen[10]; //blanking biar tidak membayang PORTB |=(1<<PB0); //nyalakan 7 segmen no 1 (puluhan jam) PORTB &= ~(1<<PB1) & ~(1<<PB2) & ~(1<<PB3) ; PORTD = segmen[jam / 10]; //ambil nilai puluhan jam _delay_ms(1); //delay disesuaikan terang tampilan 7 seg PORTD = segmen[10]; PORTB |=(1<<PB1); //nyalakan 7 segmen no 2 (satuan jam) PORTB &= ~(1<<PB0) & ~(1<<PB2) & ~(1<<PB3) ; PORTD = segmen[jam % 10]; //modulus atau sisa untuk satuan jam _delay_ms(1); PORTD = segmen[10]; PORTB |=(1<<PB2); //nyalakan 7 segmen no 3 (puluhan menit) PORTB &= ~(1<<PB0) & ~(1<<PB1) & ~(1<<PB3) ; PORTD = segmen[menit / 10]; //ambil nilai puluham menit _delay_ms(1); PORTD = segmen[10]; PORTB |=(1<<PB3); //nyalakan 7 segmen no 4 (satuan menit) PORTB &= ~(1<<PB0) & ~(1<<PB1) & ~(1<<PB2) ; PORTD = segmen[menit% 10]; //modulus atau sisa untuk satuan jam _delay_ms(1); //Tombol if (bit_is_set(PINB, PINB5)) { if(pencet == false) { jam++; if(jam==24) jam =0; } pencet=true; waktu=TCNT1; } if (bit_is_set(PINB, PINB4)) { if(pencet == false) { menit++; if(menit==60) menit=0; } pencet=true; waktu=TCNT1; } if(abs(waktu - TCNT1) > 4000) { //non blocking delay tombol waktu=0; pencet = false; } //blink Led Pemisah Jam : menit if(TCNT1 <7500) PORTB |=(1<<PB6); else PORTB &= ~(1<<PB6); } }

*) catatan :

  • clock yg digunakan adalah RC oscillator  internal pada attiny2313 yg sangat tidak akurat, untuk itu jika menggunakan nilai yg akurat bisa menggunakan xtal oscillator seperti praktek jam lainnya dan jangan lupa merubah fusebit seperti penjelsan disini  dan jika menggunakan USBASP maka butuh batuan fusebit calculator disini .
  • Jika menggunakan clock 4 MHZ maka nilai fusebitnya :


  • Sedangkan perubahan untuk menyesuaikan clock dilakukan pada script dibagian ini :

#define F_CPU 4000000UL
==========================================
			
	TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
	TIMSK |= (1 << OCIE1A); // Enable CTC interrupt
	OCR1A  = 62499; //compare the CTC A (clock 4 Mhz)
	TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64

	
  • Non blocking delay pada tombol akan berpengaruh pada tampilan yang tidak terlihat kedip saat tombol dipencet, seperti animasi paling atas dimana saya menggunakan  _delay_ms(300); setelah penekanan tombol.

Share:

Jumat, 17 September 2021

Penjelasan Proses Input Output Dan Register I/O Pada Microcontroller AVR

 



Proses Input dan Output pada sebuah microcontroller dapat dipastikan melibatkan perubahan dan akses pembacaan dari REGISTER I/O . Ini tentu saja bertujuan untuk memudahkan pengaksesan dari semua Port atau Pin I/O pada microcontroller,  dengan cara menautkannya secara hardware pada sebuah alamat memory tertentu. Inilah memory khusus yang dinamakan Register I/O. Perhatikan datasheet dari IC kesayangan saya dibawah ini ATTiny 2313 dimana saya mencuplik Register I/O untuk Port B.




  • PORTB (0x18) : Merupakan Register untuk merubah nilai dari port B ketika berfungsi sebagai output
  • DDRB (0x17) : Merupakan Register untuk merubah arah data tiap Pin pada Port B apakah akan menjadi input atau output
  • PINB (0x19) : Merupakan Register untuk membaca (walau menulis bisa namun jarang) data yg didapatkan pada tiap tiap Pin B apakah bernilai 1 (5Volt) atau 0


Jadi ke 8 buah kaki yang diberi nama PORTB pada microcontroller ATTiny 2313 secara hardware terkoneksi pada 3 buah Register input output seperti gambar diatas. Perhatikan gambar rangkaian berikut ini dimana saya akan menempatkan sebuah LED pada Port B#0 dan sebuah Switch / Tombol (kalau beli di online namanya Tactile Switch)  pada  Port B#1







Penjelasan Rangkaian : 

  1. Vcc terhubung ke tegangan catuan 5 Volt, untuk ATTiny 2313 bisa menggunakan catuan baterai 3 volt atau menggunakan tegangan 5volt yg didapatkan dari downloader USB ASP.
  2. R1 mutlak diperlukan sebagai pengaman LED, nilai berkisar 100 s/d 470 ohm.
  3. Switch diberikan Resistor Pull Down 10Kohm agar mendapatkan default tegangan 0 volt atau Logic LOW saat tidak ada penekanan tombol, dan ketika terjadi penekanan tombol maka PIN microcontroller yg terhubung akan tersambung dengan VCC (5 volt) dan berarti mendapatkan logic HIGH.
  4. AVRISP merupakan header standar menuju programmer ISP seperti yg saya jelaskan sebelumnya disini : https://www.aisi555.com/2021/08/usb-asp-isp-programmer-untuk-avr.html


Bagaimana Flow Chart untuk menghidupkan dan mematikan ( Led Kedip)  LED di PortB#0 ?


Catatan :

Delay merupakan fungsi / routine khusus yg pada compiler atau IDE programming microcontroller yg sudah tersedia dan siap pakai. Pada intinya delay merupakan timer yg BLOCKING yang artinya menghentikan semua proses dan menunggu sampai counternya selesai sesuai nilai waktu yg diberikan. Jadi ingat delay ini sangat tidak disarankan untuk proses yang kompleks karena akan mengehentikan semua proses pada microcontroller.


Scriptnya seperti ini : 


#define F_CPU 1000000UL // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{



	DDRB=0b00000001 ; // Inisialisasi bahwa port B#0 Output
    


	while(1)

	{

		PORTB=0b1; //port B#0 = 1 atau nyala

		_delay_ms(1000); //delay 1 detik
			

		PORTB=0b0; //port B#0 = 0 atau mati

		_delay_ms(1000); //delay 1 detik


	}
	
}

Penjelasan :

  • Langkah pertama adalah menentukan arah data dari PORT B#0 menjadi output dengan perintah DDRB=0b00000001. Ini oleh compiler GCC akan diterjemahkan menjadi menuliskan ke alamat memory Register 0x17 dengan nilai berupa 0b00000001
  • Untuk menyalakan LED di PORT B#0 maka dilakukan penulisan di alamat register PORTB (0x16)  dengan nilai 0b00000001. Agar lebih menyingkat dan lebih bergaya bahasa C yg benar dapat ditulis sebagai :  PORTB = 0x1.
  • Untuk mematikan LED cukup memberikan nilai 0 pada PORTB .


Lalu bagaimana jika Output LED saya tempatkan pada port 5 dan 6 ? Sebaiknya harus membaca penjelasan operasi geser byte disini : https://www.aisi555.com/2012/06/operasi-geser-byte-pada-win-avr-gcc.html. Jadi untuk melakukan blink atau kedip bergantian pada 2 buah LED secara simplenya scriptnya seperti berikut:



#define F_CPU 1000000UL // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{

        // Inisialisasi bahwa port B#5, B#6 Output
DDRB |= (1<<PB5) | (1<<PB6) ; while(1) { PORTB |=(1 << PB5) ; //port B#5 nyala                 PORTB &=~(1 << PB6); //Port B#6 Mati         _delay_ms(1000); //delay 1 detik
		PORTB |=(1 << PB6) ; //port B#6 nyala
                PORTB &=~(1 << PB5); //Port B#5 Mati
        	_delay_ms(1000); //delay 1 detik
} }


Penjelasan :

  • Untuk melakukan SET BIT pada bit tertentu pada sebuat BYTE, maka bisa melakukan operasi geser Byte seperti contoh diatas   DDRB |= (1<<PB5) | (1<<PB6) dimana nilai yg dirubah pada bit ke 5 dan ke 6 saja dengan nilai bit = 1.
  • Jika susah untuk memahami, cukup dengan mengikuti polanya saja, dimana ketika ingin meng "CLEAR" ataui memberikan nilai 0 pada bit tertentu bisa menggunakan pola penulisan        PORTB &= ~(1<<PB5) & ~(1<<PB6) , dimana artinya Port B#5 dan Port B#6 diberikan nilai 0 pada masing-masing bit, tanpa merubah nilai bit disebelahnya yang tidak ikut dalam proses.


 
Bagaimana Flow Chart untuk menerima input pada PIN B#1 dan berinteraksi dengan LED di PORT B#0 ?




Scriptnya sederhana saja seperti berikut :


#define F_CPU 1000000UL // frekuensi clock internal 1Mhz
#include <avr/io.h> // definisi library standar IO port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{
        DDRB |= (1<<PB0) ;   //Port B#0 Output
        DDRB &= ~(1<<PB1) ;  //Pin B#1 Input
while(1)      { if (PINB & (1 << PINB1)) PORTB |=(1 << PB0); // PB#0 Nyala else PORTB &= ~(1 << PB0); //Port B#0 Mati     }  
             }


Penjelasan :

  • if (PINB & (1 << PINB1))  , script ini berarti melihat apakah PIN pada microcontroller diberikan nilai 1 atau SETBIT. Ini merupakan macro standar pada basa GCC - Winavr, yang kemudian disempurnakan lagi menjadi  :  bit_is_set(PINB, PINB1) untuk nilai logic 1 dan bit_is_clear(PINB, PINB1) untuk nilai logic 0. 
  • Kita tidak perlu dipusingkan dengan proses pembacaan pada Register dengan alamat 0x16, ini sudah dipermudah dengan bahasa GCC-Winavr yg sudah menterjemahkan semua nama Mnemonic menjadi alamat registernya.
  • Ingat pada bahasa GCC WINAVR , istilah PORT untuk output, sedangkan PIN untuk input 


Untuk berikutnya silahkan dicoba menjalankan script berikut dan perhatikan apa yg terjadi :



#define F_CPU 1000000UL // frekuensi clock internal
#include <avr/io.h> // definisi standar io port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{


    DDRB |= (1<<PB0) ;   //Port B#0 Output
    DDRB &= ~(1<<PB1) ; //Pin B#1 Input bool nyala= false; while(1) { if (bit_is_set(PINB,PINB1)) {      if (!nyala) nyala = true; else nyala = false;        _delay_ms(200); } if (nyala) PORTB |=(1<<PB0); //port B0 = 1 nyala else PORTB &= ~(1<<PB0); //port B0 = 0 mati } }

Script diatas memerlukan bantuan variable  bool nyala= false; , padahal ada cara yg lebih singkat dengan menggunakan TOOGLE bit. Silahkan cari di google atau di blog ini pun sudah dibahas bagaimana cara men - "toogle" atau merubah kondisi dari state BIT sebelumnya.  


Selamat Mencoba !
Share:

Senin, 13 September 2021

ESP8266 - @Telegram_Bot - Part 3 : Python Matplotlib Graph DHT11

 



Python sebagai bahasa pemrograman yang dikhususkan buat pecinta data science memiliki berbagai fasilitas dan module untuk visualisasi data. Saking banyaknya sampai tiap coder memiliki stylenya masing-masing tergantung yg disukainya. Namun yg paling umum dipakai adalah Matplotlib.


Matplotlib adalah library python yang cukup lengkap untuk membuat visualisasi statis, animasi, dan interaktif . Matplotlib membuat hal-hal mudah menjadi mudah dan hal-hal sulit menjadi mungkin. seperti :


Membuat

  • Kembangkan plot kualitas bagus hanya dengan beberapa baris kode
  • Gunakan figur interaktif yang dapat memperbesar, menggeser, memperbarui...


Sesuaikan

  • Kendalikan penuh gaya garis, properti font, properti sumbu...
  • Ekspor dan sematkan ke sejumlah format file dan lingkungan interaktif


Extended

  • Jelajahi fungsionalitas yang disesuaikan yang disediakan oleh paket pihak ketiga
  • Pelajari lebih lanjut tentang Matplotlib melalui banyak sumber belajar eksternal 

Tanpa berpanjang lebar lagi, saya akan lanjutkan pembahasan sebelumnya yaitu menulis data DHT11 - MQTT ke database SQLite ( disini ) , dan selanjutnya melalui matplotlib akan di ubah menjadi visualisasi grafis yang menarik. Script lengkapnya sebagai berikut :


import sqlite3
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
from matplotlib import style


def graph_data():
# Connect to database
sqlite_file = 'humitemp.db' #sesuaikan nama db
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
style.use('seaborn-bright')

c.execute('SELECT * FROM dht11 ORDER BY date DESC LIMIT 50')
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("Data Lingkungan Kamar")

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

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

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

# 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.show()
c.close()
conn.close()

if __name__ == '__main__':
graph_data()



Penjelasannya seperti berikut , modul python yg digunakan  :


import sqlite3
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser
from matplotlib import style


Untuk koneksi ke database, pastikan data sudah tersedia  dari praktek sebelumnya dan saya menggunakan 50 data terakhir pada database.


def graph_data():
# Connect to database
sqlite_file = 'humitemp.db' #sesuaikan nama db
conn = sqlite3.connect(sqlite_file)
c = conn.cursor()
style.use('seaborn-bright')

c.execute('SELECT * FROM dht11 ORDER BY date DESC LIMIT 50')
data = c.fetchall()


Setelah itu data dari database saya buatkan list, kemudian saya masukkan satu persatu dan tambahkan Xaxis berupa data waktu. 


    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("Data Lingkungan Kamar")


Berikut ini plotingnya berdasarkan time series, dan saya tambahkan Yaxis kedua (twinx) agar grafiknya lebih simple.


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

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

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


Dan kemudian saya tampilkan grafiknya beserta legenda dan label-labelnya.


    # 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.show()
c.close()
conn.close()



Hasilnya seperti berikut :



Pada tulisan berikutnya akan saya kasi tahu cara menggabungkan kesemuanya, sehingga bot telegram dapat menampilkan data berupa grafik secara real time.
Share:

Minggu, 22 Agustus 2021

Wemos ESP8266 - Part 6 - Visualisasi Data Ke Excel

 


Bagian terpenting dan paling diminta oleh para pengguna IOT (yang kebanyakan males 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 akan menyebabkan invoice turun 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 berakirlah 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

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:

Wemos ESP8266 - Part 4 - PubSub MQTT : Hello World !

Untuk memulai topik kali ini, sebaiknya kita pahami istilah Pub/Sub yg merupakan istilah kirim terima pesan / data dimana dimungkinkan berkomunikasi secara asinkronous, dengan latensi pada orde 100 milidetik.




Pub/Sub pada skala lebih besar di environment cloud semacam youtube digunakan untuk analitik streaming dan jalur integrasi data untuk menyerap dan mendistribusikan data. Ini sama efektifnya dengan middleware berorientasi pesan untuk integrasi layanan atau sebagai jalur antrian untuk memparalelkan tugas.

Pub/Sub memungkinkan membuat sistem "event" atau kejadian antara "Produsen"  dan "Konsumen", yang disebut Publisher dan Subscriber. Publisher berkomunikasi dengan Subscriber secara asinkron dengan mem-"broadcast" pesan dari suatu kejadian /event, bukan dengan pesan remote antar satu persatu bagian atau synchronous remote procedure calls (RPCs).




Publisher mengirim pesan kejadian/event ke layanan Pub/Sub, tanpa memperhatikan bagaimana atau kapan event ini akan diproses. Pub/Sub kemudian mengirimkan event ke semua Subscriber yang perlu bereaksi terhadapnya. Dibandingkan dengan sistem yang berkomunikasi melalui RPC, di mana penerbit harus menunggu pelanggan menerima data, integrasi asinkron semacam ini meningkatkan fleksibilitas dan ketahanan sistem secara keseluruhan.

Dalam  Pengiriman pesan diperlukan TOPIK sebagai tujuan dimana publisher mengirim pesan, secara asinkron topik ini juga di "subscribe / langganan" oleh pengguna datanya. Mirip seperti chatting melalui IRC atau group email millist jaman dulu dan memang benar, salah satu ide PUB/SUB memang dari aktivitas chatting melalui protokol XMPP. Ini berarti diperlukan suatu "Broker" sebagai pengatur jalannya pesan dan relay storage sementara yg berada diposisi layaknya Cloud. Salah satu protokol pesan PUB/SUB paling ramai digunakan saat ini adalah MQTT.




Protokol MQTT adalah standar de-facto untuk pesan IoT. Distandarisasi oleh OASIS dan ISO, protokol publish/subscribe MQTT menyediakan cara yang terukur dan andal untuk menghubungkan perangkat melalui Internet. Saat ini, MQTT digunakan oleh banyak perusahaan untuk menghubungkan jutaan perangkat ke Internet.

Klien MQTT memublikasikan pesan ke broker MQTT dan klien MQTT lainnya berlangganan pesan yang ingin mereka terima. Implementasi klien MQTT biasanya memerlukan footprint minimal sehingga sangat cocok untuk diterapkan pada perangkat kecil yang dibatasi dan sangat efisien dalam kebutuhan bandwidth mereka.

Broker MQTT menerima pesan yang dipublikasikan dan mengirimkan pesan ke klien MQTT yang berlangganan. Pesan MQTT berisi topik pesan yang menjadi langganan klien MQTT dan pialang MQTT menggunakan daftar langganan ini untuk menentukan klien MQTT untuk menerima pesan.





Kali ini kita gunakan broker HiveMQ yg menawarkan broker MQTT komersial dan open source. Karena kemudahannya maka menjadi rujukan umum bagi merkea yg belajar perpesanan IOT. Kalui ini kita akan mencoba PUB SUB pesan melalui broker ini menggunakan applikasi di PC yaitu : MQTT Explorer ( https://mqtt-explorer.com/ ) dan aplikasi di HP android : IOTMQTTPanel.



Kita akan terhubung dengan broker gratis dari HiveMq dengan alamat broker :


  • Adress : broker.hivemq.com
  • port : 1883

 

Kosongkan semua credensial username dan password bahkan certificate pun tidak diperlukan. Kali ini kita akan PUB ke topik : /e38/hello dan SUB ke topik :/e38/halo , untuk itu kita SUB dulu pada MQTTExplorer pada menu advance.




Pada sisi Smartphone Android / Iphone bisa gunakan MQTT browser lainnya, namun untuk kelanjutan project IOT maka diharapkan menginstall IOTMQTTPanel yg lumayan lengkap fasilitasnya. Setting koneksinya seperti berikut :



Lalu kita akan menambahkan 2 text panel, satunya LOG untuk menerima SUB pesan dari broker dan Text Input untuk menerima inputan text dan selanjutnya dikirim secara PUB ke broker.






Hasil dari chatting antara PC dan HP melalui broker HiveMQ dengan protokol MQTT sebagai berikut :






Dengan memahami proses diatas, maka diharapkan ada sedikit gamaran mengenai konsep PUB SUB melalui protokol MQTT, dan selanjutnya bisa kirim terima data sensor ke smartphone


MQTT menerapkan 3 tingkat kualitas layanan untuk kesepakatan antara pengirim dan penerima: 1) Paling banyak satu kali (0), 2) Setidaknya satu kali (1), dan 3) Tepat sekali (2). Level QoS ini memungkinkan aplikasi IoT yang lebih andal karena infrastruktur perpesanan yang mendasarinya dan beradaptasi dengan kondisi jaringan yang (mungkin) tidak dapat diandalkan.


MQTT memungkinkan sesi persisten antara klien dan broker. Ini memungkinkan sesi tetap ada meskipun jaringan terputus. Setelah jaringan terhubung kembali, informasi untuk menghubungkan kembali klien ke broker masih ada. Ini adalah salah satu fitur utama yang membuat protokol MQTT lebih efisien daripada HTTP untuk digunakan melalui jaringan seluler yang (mungkin) tidak dapat diandalkan.


Klien MQTT yang Subscribe topik baru tidak memiliki wawasan tentang kapan harus mengharapkan pesan pertama yang akan mereka terima. Namun, broker MQTT dapat menyimpan pesan yang disimpan yang dapat segera dikirim setelah berlangganan MQTT baru. Dalam hal ini, klien MQTT akan menerima setidaknya satu pesan setelah  Subscribe topik.


Klien MQTT dapat menentukan pesan kepada broker MQTT, yang disebut wasiat terakhir, yang akan dikirim jika klien MQTT terputus secara tidak wajar. Hal ini memungkinkan untuk pemberitahuan seluruh sistem yang lebih anggun bahwa klien telah terputus.

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