Aplikasi#3. Outseal IoT

Daftar Isi:

=========================================================================================



Bagi rekan-rekan yang belum mengetahui Outseal, silahkan bisa berkunjung di web resminya: https://www.outseal.com/site/index.html. Menurut saya, Outseal tidak hanya membanggakan, (saya đź’–produk Indonesia), tetapi juga melalui Outseal, saya belajar banyak tentang komunikasi Modbus, yang dihadirkan dalam bentuk hardware yang sederhana dan praktis. Pemrogramannya dibuat mudah, mengikuti Ladder Diagram PLC, jadi sangat cocok bagi para penyuka PLC. Pokoknya mantapssss.

Baiklah, langsung saja, jadi dari melihat banyaknya posting di grup facebook Outseal PLC Indonesia ... bagi rekan-rekan yang belum bergabung dengan grup ini, saya sarankan silahkan bergabung agar lebih asyik, karena banyak ide dan inspirasi yang bisa diperoleh dari grup ini -- itu sebabnya, melalui aplikasi ini saya terdorong untuk ikut meramekan juga, biar lebih banyak posting, hahaha, semoga bermanfaat.

Jadi ide aplikasi di sini sangatlah sederhana, yaitu bagaimana membuat Outseal PLC bisa terhubung dengan Arduino IoT Cloud, hanya itu saja. Lalu apa manfaatnya? Saya tanya ke ChatGPT, hahaha, ternyata sangat menarik sekali jawabannya, berikut ini saya kutip dari ChatGPT:
  1. Aksesibilitas: Arduino IoT Cloud memungkinkan akses ke Outseal dari berbagai perangkat, seperti smartphone, tablet, atau komputer. Ini memberikan kemudahan dan kenyamanan dalam mengakses data Outseal.
  2. Pemantauan dan kontrol jarak jauh: Arduino IoT Cloud memungkinkan kita untuk memantau dan mengontrol Outseal dari jarak jauh, dari mana saja dan kapan saja, asalkan terhubung ke internet. Ini memberikan fleksibilitas dalam mengelola sistem dengan Outseal di dalamnya.
  3. Integrasi dengan berbagai perangkat: Arduino IoT Cloud dapat diintegrasikan dengan berbagai perangkat, seperti sensor dan perangkat lainnya. Ini dapat membantu kita dalam membuat sistem yang lebih terintegrasi dan efektif.
  4. Biaya yang gratis untuk banyak perangkat: Arduino IoT Cloud versi gratis bisa digunakan untuk memantau dan mengontrol banyak Outseal PLC, karena semua Outseal bisa terhubung dengan protokol Modbus RTU (secara riil bisa 30 Outseal). 
  5. Mudah digunakan: Arduino IoT Cloud memiliki antarmuka yang mudah digunakan, sehingga memudahkan penggunaan dan mengurangi waktu yang dibutuhkan untuk mempelajari kode program.
Wow, keren kan jawabannya, hahaha, upsss. jadi tampak lebih pintar saya, hahaha, thankss ChatGPT. Ok, kembali ke ide semula, bagaimana menghubungkan Outseal dengan Arduino IoT Cloud. Tentu harus ada penghubungnya ..... dan saya memilih NodeMCU sebagai penghubungnya. Mengapa NodeMCU??? Karena harganya muuurah rekan-rekan, jauh lebih murah dari Arduno Nano, dengan fitur yang sudah memadai, ada Wi-Fi dan fasilitas "mewah" lainnya. Ok, supaya rekan-rekan lebih jelas, berikut ini gambaran ide saya.

Gambar 1. Outseal PLC terhubung ke Arduino IoT Cloud melalui NodeMCU

Gambar 1 di atas menunjukkan koneksi sekaligus pembagian peran antara Outseal PLC dengan NodeMCU. Jadi Outseal PLC bertugas di area "arus kuat", sedangkan NodeMCU bertugas di area "arus lemah". Istilah "arus kuat" mengacu ke alat-alat listrik yang dialiri arus besar, seperti alat atau mesin listrik yang banyak digunakan di industri, termasuk panel listriknya. Sedangkan istilah "arus lemah" untuk menggambarkan alat-alat elektronik yang dialiri arus yang kecil, yang berhubungan dengan sinyal data/informasi, termasuk Sensor, Penampil, dan IoT Cloud. Kemudian antara Outseal PLC dengan NodeMCU, keduanya berkomunikasi dengan protokol Modbus RTU. Untuk membuat protokol Modbus di NodeMCU, kita dapat menggunakan library modbus-esp8266, yang dapat diunduh di sini:

Baiklah, lalu bagaimana caranya? Agar memudahkan rekan-rekan, saya membagi langkah-langkah pembuatannya menjadi 4 tahapan berikut ini:
  1. Pemrograman Outseal sebagai Modbus Slave
  2. Pembuatan Variabel Cloud di Arduino IoT Cloud dan Pemrograman NodeMCU
  3. Pembuatan Dashboard di Arduino IoT Cloud
  4. Pembuatan rangkaian Outseal Nano dengan NodeMCU
Oya, perlu diketahui, dalam aplikasi ini, Outseal akan diprogram menjadi Modbus Slave RTU, sedangkan NodeMCU akan diprogram menjadi Modbus Master RTU yang terhubung dengan Variabel Cloud. Berikut ini uraian masing-masing tahapan.


=========================================================================================


1. Pemrograman Outseal Nano sebagai Modbus Slave

Bagi rekan-rekan yang belum memiliki software pemrograman Outseal (Outseal Studio), silahkan bisa mengunduh secara gratis di web resminya, di link ini: 

Pilih versi yang terakhir, agar mendapat versi yang terupdate. Unduh software tersebut, kemudian instal. Setelah terinstal, lakukan langkah-langkah berikut ini:
1. Buka software Outseal Studio, klik pada tombol Setting di pojok kiri atas. 
2. Di jendela Settings, pilih Hardware = Nano V5, dan isi Alamat Modbus = 1.

Gambar 2. Buka Settings, pilih Hardware = Nano V5 dan alamat Modbus = 1

3. Untuk mengetahui posisi kaki Input S.1 - S.8 dan kaki Output R.1 - R.8 serta kaki input analog A.1 dan A.2 pada Outseal Nano, klik Arduino Pinout. 

Gambar 3. Kaki Input Output Outseal Nano

4. Tutup jendela Arduino Pinout dan jendela Settings. Buat program Ladder Diagram seperti berikut ini:

Gambar 4. Ladder Diagram Outseal Nano 

Program Ladder Diagram di atas dapat diunduh pada file terlampir di baris terakhir dari tulisan ini, dengan nama link Program, Library & Simulasi.

Keterangan program Ladder Diagram di atas:
Program di atas menggunakan keempat jenis tipe data Modbus, yaitu Coil, Input Diskrit, Input Register dan Holding Register. Lebih jelas rekan-rekan dapat melihat tabel yang saya kutip dari buku Panduan Dasar Outseal:

  • Untuk tipe Coil, program Ladder Diagram pada Gambar 4 di atas menggunakan 8 buah variabel Relay (R.1 - R.8) dan 16 buah variabel Binary (B.1 - B.16). Tipe variabel Relay dimulai dari alamat 0, sedangkan variabel Binary dimulai dari alamat 128.
  • Untuk tipe Input Diskrit, program Ladder Diagram pada Gambar 4 di atas menggunakan 8 buah variabel Switch (S.1 - S.8).
  • Untuk tipe Input Register, program Ladder Diagram pada Gambar 4 di atas, menggunakan 2 buah variabel Analog (A.1 dan A.2).
  • Untuk tipe Holding Register, program Ladder Diagram pada Gambar 4 di atas menggunakan 4 buah variabel Integer (I.1 - I.4).
  • Variabel tipe Switch (S.1 - S.8) adalah kaki Input Digital Outseal Nano. Variabel ini hanya bisa dibaca (Read Only).
  • Variabel tipe Relay (R.1 - R.8) adalah kaki Output Digital Outseal Nano. Variabel ini hanya bisa dibaca (Read Only).
  • Variabel tipe Analog (A.1 - A.2) adalah kaki Input Analog Outseal Nano. Variabel ini hanya bisa dibaca (Read Only).
  • Variabel tipe Binary merupakan memori internal 1 bit Outseal Nano. Variabel ini bisa dibaca dan ditulis (Read & Write).
  • Variabel tipe Integer merupakan memori internal 16 bit Outseal Nano. Variabel ini bisa dibaca dan ditulis (Read & Write).
5. Setelah program Ladder Diagram pada Gambar 4 di atas selesai dibuat, klik tombol Test untuk kompilasi program. Apabila muncul pesan "Tidak terdapat kesalahan", maka lanjutkan dengan menekan tombol PC => PLC Kirim untuk meng-upload program ke hardware Outseal Nano.  

Gambar 5. Tekan Test, bila muncul pesan Tidak terdapat kesalahan, maka program siap diupload

6. Namun sebelum menekan tombol tersebut, pastikan teman-teman memilih port COM yang digunakan oleh Outseal Nano. Di samping itu, pastikan juga teman-teman sudah meng-upload Bootloader yang baru untuk Arduino Nano. Untuk meng-upload Bootloader yang baru ke Arduino Nano, teman-teman bisa mengikuti langkah-langkah di link ini: https://support.arduino.cc/hc/en-us/articles/4841602539164-Burn-the-bootloader-on-UNO-Mega-and-classic-Nano-using-another-Arduino

7. Setelah Bootloader yang baru berhasil diupload, maka seharusnya program Ladder Diagram Outseal dapat diupload ke Outseal Nano. Tekan tombol PC->PLC Kirim. Apabila upload berhasil, maka muncul pesan "Upload berhasil".

Gambar 6. Tekan PC->PLC Kirim, bila muncul pesan Upload berhasil, maka Outseal telah terprogram

7. Sampai di sini tahap pertama (pemrograman Outseal Nano) telah selesai.


=========================================================================================


2. Pembuatan Variabel Cloud dan Pemrograman NodeMCU

Untuk pembuatan variabel Cloud di Arduino IoT Cloud, berikut ini langkah-langkahnya:
1. Mula-mula buka Arduino IoT Cloud, login dan buat sebuah Thing, beri nama Outseal.
2. Di halaman Things, Add atau tambahkan 5 buah variabel seperti tabel berikut:

Thing: Outseal

Variable

Tipe Variable

Permission

Update

data1

int (Basic | Integer Number)

Read & Write

On Change

data2

int (Basic | Integer Number)

Read & Write

On Change

data3

int (Basic | Integer Number)

Read & Write

On Change

kirim

bool (Basic | Boolean)

Read & Write

On Change

out1

String (Basic | Character String)

Read & Write

On Change


Gambar 7. Pembuatan variabel Cloud: int data1, int data2, int data3, bool kirim, dan String out1

Keterangan: 
Sebelum melanjutkan ke langkah berikutnya, rekan-rekan perlu mengetahui dulu, apa fungsi dari kelima variabel yang ditambahkan tersebut. Berikut ini penjelasan singkat fungsi masing-masing variabel tersebut: 

Tabel Keterangan Fungsi Variabel

Variable

Digunakan untuk

data1

Variabel data1 ini bertipe Integer. Karena jumlah widget yang diperbolehkan untuk versi gratis hanya 5, maka terpaksa dilakukan penggabungan. Jadi variabel data1 ini digunakan untuk menampung 2 buah data, yaitu no. ID Slave dan kode fungsi. No ID Slave ini mengikuti Alamat Modbus (slave address) yang diisikan di jendela Settings di Outseal Studio. Untuk Kode fungsi, rekan-rekan bisa melihat pada tabel di bawah ini.

data2

Variabel data2 ini bertipe Integer, digunakan untuk menampung alamat awal yang akan dibaca/ditulis

data3

Variabel data3 ini bertipe Integer, digunakan untuk menampung 1 dari 2 jenis data, mengikuti kode fungsi. Apabila kode fungsinya baca (1-4), maka data3 ini berisi jumlah data yang akan dibaca. Apabila kode fungsinya tulis (5-6), maka data3 ini berisi nilai yang akan ditulis.

kirim

Variabel kirim ini bertipe Boolean, digunakan untuk mengirimkan data ke Outseal.

out1

Variabel out1 ini bertipe String. Dengan tipe String, banyak data bisa di-inputkan, dan juga ditampilkan. Variabel out1 ini bisa digunakan untuk menampung dan memasukkan data1, data2, data3, sekaligus mengirimkannya ke Outseal. Di samping itu, variabel out1 ini juga bisa digunakan untuk menampilkan data yang diterima dari Outseal. 

Tabel Kode Fungsi

Kode

Digunakan untuk

Data yang diperlukan

1

Baca Coil (bisa lebih dari 1)

Alamat awal dan banyaknya data yang dibaca

2

Baca Input Diskrit (bisa lebih dari 1)

Alamat awal dan banyaknya data yang dibaca

3

Baca Holding Register (bisa lebih dari 1)

Alamat awal dan banyaknya data yang dibaca

4

Baca Input Register (bisa lebih dari 1)

Alamat awal dan banyaknya data yang dibaca

5

Tulis/ubah data 1 Coil

Alamat dan nilai yang akan dituliskan

6

Tulis/ubah data 1 Holding Register

Alamat dan nilai yang akan dituliskan

15

Tulis/ubah data banyak Coil

Alamat awal dan nilai-nilai yang dituliskan

16

Tulis/ubah data banyak Holding Register

Alamat awal dan nilai-nilai yang dituliskan


Catatan: untuk kode fungsi 15 dan 16, penulisan data ke banyak Coil dan banyak Holding Register, untuk saat ini, belum diimplementasikan. Dalam waktu ke depan, semoga bisa diimplementasikan.

Dari kedua tabel di atas, sebagai contoh pertama, anggap bahwa kita ingin membaca data Coil dari Slave no. 1, dengan alamat Coil dimulai dari 0, sebanyak 8 buah data, maka isi data1, data2, dan data3 secara berturut-turut adalah:
  • data1 = 11 (menggabungkan no ID Slave 1 dengan kode fungsi 1)
  • data2 = 0
  • data3 = 8
Contoh kedua, diinginkan membaca data Input Diskrit dari Slave no. 2, dengan alamat Input Diskrit dimulai dari 0, sebanyak 8 buah data, maka isi data1, data2, dan data3 secara berturut-turut adalah:
  • data1 = 22 (menggabungkan no ID Slave 2 dengan kode fungsi 2)
  • data2 = 0
  • data3 = 8 
Contoh ketiga, diinginkan membaca data Holding Register dari Slave no. 1, dengan alamat Input Diskrit dimulai dari 0, sebanyak 4 buah data, maka isi data1, data2, dan data3 secara berturut-turut adalah:
  • data1 = 13 (menggabungkan no ID Slave 1 dengan kode fungsi 3)
  • data2 = 0
  • data3 = 4
Contoh keempat, diinginkan membaca data Input Register dari Slave no. 2, dengan alamat Input Register dimulai dari 0, sebanyak 2 buah data, maka isi data1, data2, dan data3 secara berturut-turut adalah:
  • data1 = 24 (menggabungkan no ID Slave 2 dengan kode fungsi 4)
  • data2 = 0
  • data3 = 2 
Contoh kelima, diinginkan menulis data di Coil dari Slave no. 1, dengan alamat Coil = 136, dengan nilai = 1, maka isi data1, data2, dan data3 secara berturut-turut adalah:
  • data1 = 15 (menggabungkan no ID Slave 1 dengan kode fungsi 5)
  • data2 = 136
  • data3 = 1
Contoh keenam, diinginkan menulis data di Holding Register dari Slave no. 2, dengan alamat Holding Register = 1, dengan nilai = 123, maka isi data1, data2, dan data3 secara berturut-turut adalah:
  • data1 = 26 (menggabungkan no ID Slave 2 dengan kode fungsi 6)
  • data2 = 1
  • data3 = 123
===============================================

Sebagai alternatif, selain menggunakan data1, data2 dan data3, hasil yang sama untuk keenam contoh di atas dapat dilakukan dengan menggunakan variabel String out1, yang dituliskan sebagai berikut:

Contoh pertama, membaca data Coil dari Slave no. 1, dengan alamat Coil dimulai dari 0, sebanyak 8 buah data:
  • out1 = 1,1,0,8
Contoh kedua, membaca data Input Diskrit dari Slave no. 2, dengan alamat Input Diskrit dimulai dari 0, sebanyak 8 buah data:
  • out1 = 2,2,0,8 
Contoh ketiga, membaca data Holding Register dari Slave no. 1, dengan alamat Input Diskrit dimulai dari 0, sebanyak 4 buah data:
  • out1 = 1,3,0,4
Contoh keempat, membaca data Input Register dari Slave no. 2, dengan alamat Input Register dimulai dari 0, sebanyak 2 buah data:
  • out1 = 2,4,0,2 
Contoh kelima, menulis data di Coil dari Slave no. 1, dengan alamat Coil = 136, dengan nilai = 1:
  • out1 = 1,5,136,1
Contoh keenam, menulis data di Holding Register dari Slave no. 2, dengan alamat Holding Register = 1, dengan nilai = 123:
  • out1 = 2,6,1,123

3. Setelah kelima variabel tersebut selesai ditambahkan, berikutnya tekan tombol Select Device (di Associated Device). Di jendela yang muncul, pilih Set Up New Device, pilih Set up a 3rd Party device, pilih ESP8266 dan pilih model: NodeMCU 1.0 (ESP-12E Module). Jangan lupa untuk menyimpan kode Device ID dan Secret Key (gunakan download the pdf). Tidak perlu mengisi Network di kedua Thing, karena Sketch nantinya akan di-download dari Web Editor dan kemudian di-upload menggunakan software Arduino IDE. 

4. Berikutnya, klik pada Tab Sketch, tekan tombol Open Full Editor, untuk membuka Web Editor. Di halaman Web Editor, download Sketch Outseal. Setelah Sketch tersebut terdownload, ekstrak file. Di Sketch Outseal, klik 2 kali pada file program ino. Setelah software Arduino IDE terbuka, di Tab program ino, hapus seluruh isinya, dan ganti dengan program berikut ini: 
  1. #include "arduino_secrets.h"
  2. #include "thingProperties.h"
  3. #include <ModbusRTU.h>
  4. #include <SoftwareSerial.h>
  5. SoftwareSerial S(D1, D2);
  6. ModbusRTU mb;
  7. String out2 = "";
  8. String inputString = "";
  9. bool stringComplete = false;
  10. bool case1 = false;
  11. bool case2 = false;
  12. bool case3 = false;
  13. bool case4 = false;
  14. bool coil[20];
  15. bool idis[20];
  16. uint16_t hreg[10];
  17. uint16_t ireg[10];
  18. void setup() {
  19.   Serial.begin(9600);
  20.   S.begin(9600, SWSERIAL_8N1);
  21.   mb.begin(&S);
  22.   mb.master();
  23.   delay(1500);
  24.   initProperties();
  25.   ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  26.   setDebugMessageLevel(2);
  27.   ArduinoCloud.printDebugInfo();
  28. }
  29. void loop() {
  30.   ArduinoCloud.update();
  31.   if (stringComplete) {
  32.     String d1 = getValue(inputString, ',', 0);
  33.     String d2 = getValue(inputString, ',', 1);
  34.     String d3 = getValue(inputString, ',', 2);
  35.     String d4 = getValue(inputString, ',', 3);
  36.     uint8_t id = d1.toInt();
  37.     uint8_t kode = d2.toInt();
  38.     uint16_t alamat = d3.toInt();
  39.     uint16_t nilai = d4.toInt();
  40.     switch (kode) {
  41.       case 1:
  42.         mb.readCoil(id, alamat, coil, nilai);
  43.         case1 = true;
  44.         break;
  45.       case 2:
  46.         mb.readIsts(id, alamat, idis, nilai);
  47.         case2 = true;
  48.         break;
  49.       case 3:
  50.         mb.readHreg(id, alamat, hreg, nilai);
  51.         case3 = true;
  52.         break;
  53.       case 4:
  54.         mb.readIreg(id, alamat, ireg, nilai);
  55.         case4 = true;
  56.         break;
  57.       case 5:
  58.         mb.writeCoil(id, alamat, nilai > 0);
  59.         break;
  60.       case 6:
  61.         mb.writeHreg(id, alamat, nilai);
  62.         break;
  63.     }
  64.     while (mb.slave()) {
  65.       mb.task();
  66.       delay(10);
  67.     }
  68.     if (case1) {
  69.       Serial.print("= ");
  70.       for (int i = 0; i < nilai; i++) {
  71.         Serial.print(coil[i]);
  72.         out2 = out2 + String(coil[i]);
  73.       }
  74.       Serial.println();
  75.       out1 = "= " + out2;
  76.       case1 = false;
  77.     }
  78.     if (case2) {
  79.       Serial.print("= ");
  80.       for (int i = 0; i < nilai; i++) {
  81.         Serial.print(idis[i]);
  82.         out2 = out2 + String(idis[i]);
  83.       }
  84.       Serial.println();
  85.       out1 = "= " + out2;
  86.       case2 = false;
  87.     }
  88.     if (case3) {
  89.       Serial.print("= ");
  90.       for (int i = 0; i < (nilai - 1); i++) {
  91.         Serial.print(hreg[i]);
  92.         Serial.print(',');
  93.         if (i == 0) out2 = String(hreg[i]);
  94.         else out2 = out2 + "," + String(hreg[i]);
  95.       }
  96.       Serial.println(hreg[nilai - 1]);
  97.       out1 = "= " + out2 + "," + String(hreg[nilai - 1]);
  98.       case3 = false;
  99.     }
  100.     if (case4) {
  101.       Serial.print("= ");
  102.       for (int i = 0; i < (nilai - 1); i++) {
  103.         Serial.print(ireg[i]);
  104.         Serial.print(',');
  105.         if (i == 0) out2 = String(ireg[i]);
  106.         else out2 = out2 + "," + String(ireg[i]);
  107.       }
  108.       Serial.println(ireg[nilai - 1]);
  109.       out1 = "= " + out2 + "," + String(ireg[nilai - 1]);
  110.       case4 = false;
  111.     }
  112.     out2 = "";
  113.     inputString = "";
  114.     stringComplete = false;
  115.   }
  116.   yield();
  117. }
  118. void onData1Change() {
  119. }
  120. void onData2Change() {
  121. }
  122. void onData3Change() {
  123. }
  124. void onKirimChange() {
  125.   if (kirim) {
  126.     inputString = String(data1 / 10) + "," + String(data1 % 10);
  127.     inputString = inputString + "," + String(data2) + "," + String(data3);
  128.     stringComplete = true;
  129.     out1 = "> " + inputString;
  130.   }
  131. }
  132. void onOut1Change() {
  133.   inputString = out1;
  134.   stringComplete = true;
  135. }
  136. void serialEvent() {
  137.   while (Serial.available()) {
  138.     char inChar = (char)Serial.read();
  139.     inputString += inChar;
  140.     if (inChar == 13) {
  141.       stringComplete = true;
  142.       Serial.print("> ");
  143.       Serial.println(inputString);
  144.     }
  145.   }
  146. }
  147. String getValue(String data, char separator, int index) {
  148.   int found = 0;
  149.   int strIndex[] = { 0, -1 };
  150.   int maxIndex = data.length() - 1;
  151.   for (int i = 0; i <= maxIndex && found <= index; i++) {
  152.     if (data.charAt(i) == separator || i == maxIndex) {
  153.       found++;
  154.       strIndex[0] = strIndex[1] + 1;
  155.       strIndex[1] = (i == maxIndex) ? i + 1 : i;
  156.     }
  157.   }
  158.   return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
  159. }

5. Berikutnya, sebelum meng-upload program tersebut ke NodeMCU, isi dulu nama Wi-Fi, password Wi-Fi dan Kode Secret Key di Tab program arduino_secrets.h, dan kode Device ID diisikan di Tab program thingProperties.h di Device_Login_Name (ini harusnya sudah terisi). Sketch di atas memerlukan 5 library berikut ini. Pastikan 5 library ini telah di-instal di software Arduino IDE, yaitu secara berturut-turut:
  • ArduinoIoTCloud (versi 1.8.0)
  • Arduino_ConnectionHandler (versi 0.7.1)
  • Arduino_DebugUtils-master
  • ArduinoMqttClient-master
  • modbus-esp8266
6. Rekan-rekan dapat mengunduh kode program pada langkah no. 4 di atas, dan kelima file library terebut di file terlampir di baris terakhir dari tulisan ini, dengan nama link Program, Library & Simulasi. Setelah kelima library di atas terinstal, berikutnya pilih Board dan Port. Gunakan Board NodeMCU 1.0, dan Port sesuai dengan yang digunakan. Upload program, dan tunggu hingga selesai. Setelah selesai, buka Serial Monitor. Apabila muncul tulisan "Connected to Arduino IoT Cloud", berarti Device NodeMCU sudah online, alias sudah terhubung dengan variabel di Cloud. 

7. Sampai di sini tahap kedua (pembuatan variabel Cloud dan pemrograman NodeMCU) telah selesai.


=========================================================================================


3. Pembuatan Dashboard

1. Berikutnya, buka Dashboard, klik tombol Add, pilih Things, pilih Outseal. Kemudian pilih kelima variabel, klik Create Widgets, maka akan muncul 5 buah widget yang terdiri dari sebuah widget Messenger, 3 buah widget Value dan sebuah widget Switch.

Gambar 8. Klik Add, pilih Things, pilih Outseal, kemudian klik Create Widgets

2. Beri nama Dashboard: Kontrol & Monitor Outseal. 

Gambar 9. Beri nama Dashboard: Kontrol & Monitor Outseal

3. Agar widget Kirim hanya bekerja sesaat, tidak mengunci, maka ganti widget Switch (saklar) dengan widget Push Button (tombol). Arahkan kursor di pojok kanan atas widget Switch hingga muncul titik 3x. Klik tombol menu titik 3x tersebut, kemudian pilih Delete. Apabila tombol menu titik 3x tersebut tidak muncul, kemungkinan mode yang sedang aktif adalah mode View (gambar mata). Untuk itu, ubah mode View menjadi mode Edit (gambar pensil).

Gambar 10. Ganti widget Switch (saklar) menjadi widget Push Button (tombol)

4. Setelah widget Switch berhasil dihapus, klik Add, pilih Widgets, pilih Push Button.

Gambar 11. Klik Add, pilih Widgets, pilih Push Button untuk menambahkan widget Push Button

5. Berikutnya, hubungkan widget Push Button ini dengan variabel kirim. Untuk itu, klik tombol menu titik 3x di widget Push Button, pilih Edit Settings. Di halaman Widget Settings, klik Link Variable. Di halaman Link Variable to Push Button, pilih Things: Outseal, pilih Variables: kirim. Klik tombol Link Variable, dan kemudian klik Done.

Gambar 12. Hubungkan (link variable) widget Push Button dengan variabel kirim

6. Berikutnya, klik Tool Arrange widgets. Kemudian atur ukuran dan posisi kelima widget hingga seperti gambar berikut ini.

Gambar 13. Atur ukuran dan posisi kelima widget dengan Tool Arrange widgets

7. Atur juga ukuran dan posisi kelima widget di layout HP. Klik pada tombol bergambar HP, kemudian atur posisi dan ukuran seperti gambar berikut.

Gambar 14. Atur ukuran dan posisi widget tidak hanya di tampilan web, tetapi juga di HP

8. Sampai di sini tahap ketiga (pembuatan Dashboard) telah selesai.


=========================================================================================


4. Pembuatan Rangkaian Outseal Nano dengan NodeMCU

1. Setelah Outseal Nano berhasil diprogram sebagai Modbus Slave RTU di tahap pertama, dilanjutkan pembuatan Variabel Cloud dan pemrograman NodeMCU di tahap kedua, sehingga NodeMCU menjadi Modbus Master RTU, dan berhasil Online, alias terhubung dengan variabel Cloud, dan kemudian dilanjutkan dengan pembuatan Dashboard di tahap ketiga, maka tahap terakhir adalah membuat rangkaian yang menghubungkan rangkaian Outseal dengan NodeMCU. Berikut gambar skematik rangkaian Outseal dengan NodeMCU yang terhubung secara serial:

Gambar 15. Arduino Nano dengan NodeMCU, terhubung secara serial TX1 => RX2, TX2 => RX1

Catatan: karena untuk kesederhanaan, maka gambar skematik rangkaian di atas menggunakan Arduino Nano. Sambungan antara Arduino Nano dengan NodeMCU menggunakan sambungan serial TX/RX, yaitu TX Arduino Nano dihubungkan ke RX NodeMCU, sebaliknya TX NodeMCU dihubungkan ke RX Arduino Nano.

2. Berikut ini gambar pengawatan rangkaian Outseal, yang disimulasikan dengan Arduino Nano, terhubung dengan NodeMCU secara serial RX/TX. Sebagai alat input S.1 - S.8, disimulasikan dengan Dip Switch 8 jalur. Sedangkan sebagai alat output R.1 - R.8 disimulasikan dengan Modul Relay 8 channel. 

Gambar 16. Gambar pengawatan rangkaian Arduino Nano dengan NodeMCU melalui serial

Gambar 17. Foto pengawatan rangkaian Arduino Nano dengan NodeMCU 

3. Karena menggunakan protokol Modbus RTU, maka aplikasi IoT yang dibuat ini bisa digunakan untuk mengontrol dan memonitor lebih dari 1 Outseal (dari sumber di internet: secara teori hingga 247 slave, secara praktek hingga 32 buah termasuk Master). Berikut ini gambar skematik simulasi rangkaian 2 buah Outseal (disimulasikan dengan Arduino Nano) dengan NodeMCU menggunakan sambungan RS-485:
 
Gambar 18. Simulasi 2 buah Outseal terhubung dengan NodeMCU secara RS-485

Catatan: Rangkaian Proteus pada gambar 18 di atas dapat digunakan untuk mensimulasikan koneksi antara Arduino IoT Cloud dengan 2 buah Outseal Nano. Tiga buah komponen ATmega328 digunakan untuk mensimulasikan 2 buah Outseal (U1 dan U2) serta NodeMCU (U3). Di Proteus, koneksi Wi-Fi tidak bisa disimulasikan. Sementara untuk bisa terhubung dengan Arduino IoT Cloud, dibutuhkan koneksi Wi-Fi. Untungnya Proteus bisa terhubung dengan hardware port serial komputer. Dengan membuat koneksi Wi-Fi di jalankan oleh NodeMCU secara riil, dan komponen ATmega328 U3 di Proteus difungsikan untuk menjalankan program komunikasi Modbus Master RTU, dan menghubungkan data komunikasinya ke NodeMCU melalui port serial, maka akan dapat dihasilkan simulasi Arduino IoT Cloud yang dapat mengontrol dan memonitor 2 buah Outseal Nano. 

Rekan-rekan dapat mengunduh file gambar skematik Proteus, program untuk ketiga ATmega328, dan program untuk NodeMCU, yang digunakan untuk simulasi gambar 18 di atas, pada file terlampir di baris terakhir dari tulisan ini, dengan nama link Program, Library & Simulasi.


=========================================================================================


5. Hasil Penerapan

1. Setelah 4 tahapan di atas selesai dibuat, berikut ini gambar dan foto hasil penerapan aplikasi Outseal terhubung ke Arduino IoT Cloud melalui NodeMCU.

Gambar 19. Data1=15 (slave 1, kode fungsi 5 = tulis coil), data2=136, data3=0, karena Modul Relay Aktif Low, ketika diberi 0, Relay1 yg terhubung dengan B.9 (alamat 136) = ON

Gambar 20. Data1=15 (slave 1, kode fungsi 5 = tulis coil), data2=143, data3=0, karena Modul Relay Aktif Low, ketika diberi 0, Relay8 yang terhubung dengan B.16 (alamat 143) = ON

Gambar 21. Data1=11 (slave 1, kode fungsi 1 = baca coil), data2=0, data3=8, instruksi ini berarti baca nilai R.1 - R.8, yang hasilnya = 01111110

Gambar 22. Widget Messenger diisi dengan data = 1,2,0,8, instruksi ini berarti baca nilai S.1 - S.8, yang terhubung dengan Dip Switch 8 jalur, diperoleh hasilnya = 01110001

Gambar 23. Widget Messenger diisi berturut-turut dengan data = 1,6,0,1234 (= instruksi tulis Holding register di alamat 0 dengan angka 1234), dilanjutkan dengan data = 1,6,1,5678 (= instruksi tulis Holding Register di alamat 1 dengan angka 5678), dilanjutkan dengan 1,3,0,4 (= instruksi baca nilai di Holding Register, mulai dari 0 sebanyak 4 data), maka diperoleh hasilnya 1234,5678,1234,5678

Gambar 24. Widget Messenger diisi data = 1,4,0,4, yang merupakan instruksi baca Input Register dimulai dari alamat 0 sebanyak 4 data, maka hasilnya muncul 69,69,0,0

Gambar 25. Putar kedua potensio, kembali isi Widget Messenger dengan data = 1,4,0,4, maka hasilnya muncul 1020,123,0,0.

Gambar 26. Putar kedua potensio, kembali isi Widget Messenger dengan data = 1,4,0,4, maka hasilnya muncul 583,392,0,0.

Gambar 27. Isi Widget Messenger dengan data = 1,3,0,4, yang merupakan instruksi untuk membaca Holding Register, dimulai dari alamat 0 sebanyak 4 data, maka hasilnya muncul 1234,5678,1234,5678.

Gambar 28. Selain dari Widget Messenger, kode instruksi bisa juga diinputkan dari Serial Monitor. Di Serial Monitor, ketik data 1,2,0,8, yang merupakan instruksi untuk membaca Input Diskrit dari alamat 0 sebanyak 8 data, yaitu variabel S.1 - S.8, maka muncul hasilnya 01010101, di mana nilai ini sesuai dengan posisi ke-8 Switch. 

Gambar 29. Untuk menunjukkan bahwa kontrol dari Dashboard Arduino IoT Cloud tidak hanya untuk 1 Outseal, tetapi bisa lebih dari 1 Outseal, maka di sini disimulasikan dengan software Proteus. Ketika widget Messenger diisi dengan data 1,5,136,1, maka LED pertama di Slave1 menyala.

Gambar 30. Ketika Widget Messenger diisi data 1,5,140,1, maka LED kelima di Slave1 menyala.

Gambar 31. Ketika Widget Messenger diisi data 1,1,0,8, maka muncul hasil pembacaan status kedelapan LED (R.1 - R.8) di Widget Messenger = 10001000, dan Virtual Terminal juga menampilkan nilai 10001000

Gambar 32. Ketika Widget Messenger diisi data 1,2,0,8, maka muncul hasil pembacaan status kedelapan tombol (S.1 - S.8) di Widget Messenger = 11010111, dan Virtual Terminal juga menampilkan nilai 11010111

Gambar 33. Ketika Widget Messenger diisi data 2,5,141,1, maka LED keenam di Slave2 menyala.

Gambar 34. Ketika Widget Messenger diisi data 2,5,143,1, maka LED kedelapan di Slave2 menyala.

Gambar 35. Ketika Widget Messenger diisi data 2,1,0,8, maka muncul hasil pembacaan nilai kedelapan LED di Slave2 = 00000101, yang juga ditampilkan di Virtual Terminal

Gambar 36. Ketika Widget Messenger diisi data 2,2,0,8, maka muncul hasil pembacaan status kedelapan tombol di Slave2 = 10101011, yang juga ditampilkan di Virtual Terminal

Gambar 37. Ketika Widget Messenger diisi data 1,4,0,4, maka muncul hasil pembacaan 4 buah data Input Register (termasuk nilai kedua potensio) di Slave1 = 952,768,0,0, yang juga ditampilkan di Virtual Terminal

Gambar 38. Ketika Widget Messenger diisi data 2,4,0,4, maka muncul hasil pembacaan 4 buah data Input Register (termasuk nilai kedua potensio) di Slave2 = 748,758,0,0, yang juga ditampilkan di Virtual Terminal

Gambar 39. Secara berturut-turut, isi Widget Messenger dengan data 1,6,0,987, yang dilanjutkan dengan data 1,6,1,654, dan kemudian data 1,3,0,4, maka akan muncul hasil pembacaan 4 buah data di Holding Register Slave1, dengan data dimulai dari alamat 0, yaitu = 987,654,987,654, yang juga ditampilkan di Virtual Terminal.  

Gambar 40. Secara berturut-turut, isi Widget Messenger dengan data 2,6,0,123, yang dilanjutkan dengan data 2,6,1,567, dan kemudian data 2,3,0,4, maka akan muncul hasil pembacaan 4 buah data di Holding Register Slave2, dengan data dimulai dari alamat 0, yaitu = 123,567,123,567, yang juga ditampilkan di Virtual Terminal.  

2. Agar lebih jelas mengenai pembuatan aplikasi Outseal IoT ini, silahkan melihat video berikut ini:

Video pembuatan aplikasi Outseal IoT

3. Sampai di sini pembuatan aplikasi Outseal IoT. Untuk file program Outseal, program NodeMCU, Simulasi Proteus dan Library yang digunakan di bagian ini, silahkan bisa diunduh di bawah ini.

File Download: Outseal IoT

No comments:

Post a Comment