Dalam sebuah piramida Internet Of Things, bagi developer kelas rumahan seperti penulis yang tukang solder ini, ruang geraknya terbatas pada 2 tingkat yaitu piramida paling bawah pembacaan sensor via microcontroller dan piramida paling atas pada tampilan hasil IOT melalui grafik web dan apps smartphone. Level priramida "connectivity" umumnya merupakan posisi yang hanya bisa dikerjakan oleh dunia telekomunikasi sedangkan level "platforms" merupakan ranah para raksasa IT.
Standar komunikasi MODBUS bisa digambarkan berada pada perbatasan piramida 1 dan 2 dimana para pengembang modbus mulai mengeluarkan standar modbus TCP untuk meng-akomodir standar jaman now yang serba IP. Lalu alat berbasis modbus yang masih menggunakan standar serial com membutuhkan sebuah bridge IOT yang akan membuat loncatan dari piramida 1 ke piramida 3. Tulisan saya serial pembahasan modbus yang ke-3 dan selanjutnya akan membahas perancangan dan praktek arduino sebagai bridge MQTT sederhana yang akan menghubungkan modbus ke dalam piramida IOT.
Jika anda memerlukan sensor suhu kelembaban standar modbus untuk industri yang harganya terjangkau maka gambar diatas merupakan salah satu pilihan. Diperlukan pembacaan datasheet atau manual yang didapat dari produsennya yang merupakan ciri khas dari alat ber-Protokol modbus. Tiap desainer alat menggunakan alamat register bebas dimanapun sesuai pemahaman mereka begitu juga pemetaan data yang dikirim seperti apa prosedurnya dilakukan tanpa pola yang seragam antar alat yang berbeda. Seperti biasa saya lebih suka menjelaskan dengan praktek langsung dimana kali ini saya berusaha menduplikasi alat SHT20 modbus diatas dengan menggunakan sensor sejuta umat DHT11.
Langkah awal yang perlu diperhatikan adalah mengukur kemampuan microcontoller arduino sebagai bridge IOT dengan memposisikannya sebagai modbus master dan hasilnya penulis beberapa kali kesulitan untuk memperoleh library modbus master yang sesuai dengan keinginan. Ini dikarenakan ternyata akibat saking banyaknya standar yang harus diakomodir maka lebih mudah untuk membuat bridge sesuai dengan karakteristik dari masing-masing alat modbus. Pada penjelasan part1 dan part2 yang saya tulis sebelumnya, alat modbus yang saya buat memiliki deretan perintah dan respon serial sebagai berikut:
0x05 0x05 0x00 0x00 0xFF 0x00 0x8D 0xBE ==> Ngidupin LED
0x05 0x05 0x00 0x00 0x00 0x00 0xCC 0x4E ==> Matikan LED
0x05 0x02 0x00 0x00 0x00 0x01 0xB8 0x4E ==> Baca TOMBOL
----Reply Tombol---
05 02 01 00 A0 B8 ==> LOW
05 02 01 01 61 78 ==> HIGH
0x05 0x04 0x00 0x00 0x00 0x03 0xB1 0x8F ==> Baca DHT11
---Reply DHT11----
05 04 06 00 1D 00 4F 00 5F CF BE
0x05 0x03 0x00 0x00 0x00 0x0F 0x04 0x4A ==> Baca REGISTER
---Reply----
05 03 1E 00 77 00 77 00 77 00 2E 00 61 00 69 00 73 00 69 00 35 00 35 00
35 00 2E 00 63 00 6F 00 6D 0B ED
Untuk perintah mode function 5 force coil / menghidupkan LED maka yang dikirim akan sama dengan apa yang di reply oleh alat modbus, sedangkan function lainnya memiliki karakteristik yang selalu sama. Sehingga jika kita ingin membuat master modbus pada arduino cukup mengirim 5 jenis perintah serial seperti pada array berikut :
byte ledOn[] = {0x05, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x8D, 0xBE};//ngidupin Led byte ledOff[] = {0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0xCC, 0x4E};//matikan Led byte tombol[] = {0x05, 0x02, 0x00, 0x00, 0x00, 0x01, 0xB8, 0x4E};//baca tombol byte humitemp[] = {0x05, 0x04, 0x00, 0x00, 0x00, 0x03, 0xB1, 0x8F};//baca dht11 byte Hregister[] = {0x05, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x04, 0x4A};//baca hold reg
Sedangkan untuk reply responnya kita cukup membandingkan dengan pola seragam yang akan muncul.
byte tombolL[] = {0x05, 0x02, 0x01, 0x00, 0xa0, 0xB8}; // tombol Low byte tombolH[] = {0x05, 0x02, 0x01, 0x01, 0x61, 0x78}; // tombol High byte dhtOK[] = {0x05, 0x04, 0x06} ; //reply DHT11 byte aisiOK[] = {0x5, 0x03, 0x1E}; //reply Hold register //simpan pada pada pointer byte bufferDataModbus[50]; byte *ptr;
Perhatikan reply dari pembacaan DHT 11 seperti berikut :
05 04 06 00 1D 00 4F 00 5F CF BE
05 = Alamat device id slave
04 = Perintah baca input analog/ function 04
06 = 6 byte data berikut akan muncul (format 2 byte per data)
00 1D = 2 byte pertama adalah 001D = 29
00 4F = 2 byte kedua adalah 004F = 79
00 5F = 2 byte ketiga adalah 005F = 95
CF BE = Checksum / CRC 16 modbus
Jadi butuh parsing pada byte ke-4 dan ke-6 untuk mendapatkan pembacaan suhu dan parsing byte ke-8 untuk mendapatkan kelembaban. Checksum tidak begitu critical sehingga mungkin untuk diabaikan, dan urutan script pembacaan DHT 11 yang kemudian akan dilempar ke serial monitor adalah seperti berikut ini :
void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= 5000) { // timer baca dht11 tiap 5 detik previousMillis = currentMillis; //kirim perintah ke modbus baca dht 11 mod.write(humitemp, sizeof(humitemp)); } //check modbus timeout long millisResponModbus = millis() + 1000; while (!mod.available()) { if (millisResponModbus < millis()) { break;//timeout } } // baca data serial yang masuk dari modbus lalu simpan pada pointer while (mod.available()) { byte b = mod.read(); *ptr++ = b; Serial.print("0x"); Serial.print(String(b, HEX)); Serial.print(" "); delay(2); } //proses komparasi data yg masuk (DHT11) dengan array jawaban lalu parsing if (memcmp(bufferDataModbus, dhtOK, sizeof(dhtOK)) == 0) { ptr = bufferDataModbus; Serial.println(""); Serial.print(F("SUHU :")); Serial.print(ptr[4]); //alamat byte ke 4 Serial.print(F(",")); Serial.print(ptr[6]); //alamat byte ke 6 Serial.print(F(" C HUMI :")); Serial.print(ptr[8]); //alamat byte ke 8 Serial.println(" %"); memset(bufferDataModbus, 0x00, sizeof(bufferDataModbus)); } }
Jadi jika ingin melihat visualisasinya anda bisa menontonnya pada video berikut ini :
0 komentar:
Posting Komentar