8. Outseal Nano & Nextion

Bagaimana menghubungkan Outseal Nano dengan Nextion?

Dari pertanyaan beberapa teman mengenai bagaimana menghubungkan Outseal dengan Nextion, berikut ini salah satu cara yang bisa dijadikan sebagai alternatif solusi. Seperti diketahui, Nextion menggunakan komunikasi serial dengan format data tertentu. Sementara Outseal menggunakan protokol Modbus RTU agar bisa berkomunikasi dengan alat yang lain. Untuk menghubungkan Outseal Nano dengan Nextion dengan demikian dibutuhkan sebuah perantara, atau gateway, yang bisa mengubah protokol Modbus RTU menjadi data serial dengan format yang sesuai dengan Nextion. Untuk lebih jelasnya, lihat gambar diagram berikut ini:


Gambar 1. Outseal Nano dihubungkan ke Nextion melalui Perantara (Arduino/ESP8266/ESP32)

Agar bisa menghubungkan Outseal Nano ke Nextion, sesuai diagram di atas, ditambahkan sebuah Arduino atau ESP8266, atau ESP32, yang bertindak sebagai pengubah protokol Modbus RTU ke serial dan sebaliknya. Dalam contoh di sini, cara di atas akan dibuat dalam 2 tahap, dan agar tidak perlu repot menyediakan alat, dalam contoh di sini digunakan simulasi Proteus, dengan komponen ATmega328 dan simulasi Nextion (Debug). Berikut ini gambaran singkat tahapannya:

Tahap 1. Menghubungkan Arduino ke Nextion untuk input output digital. Ada 8 buah objek Dual-state Button di Nextion yang dapat digunakan untuk mengontrol 8 buah LED yang terhubung dengan Arduino, dan ada 8 buah Switch di Arduino yang dapat mengubah 8 buah objek Picture di Nextion.

Tahap 2. Membuat Arduino menjadi Master, dan Outseal Nano menjadi Slave. Arduino akan membaca nilai kedelapan objek Button di Switch, dan menuliskan datanya ke Outseal Nano di alamat B.9 - B.16, yang nantinya dapat digunakan untuk menyalakan LED yang terhubung di kaki R.1 - R.8. Arduino juga membaca data Switch di kaki S.1 - S.8 Outseal Nano, dan mengirimkannya ke objek Picture di Nextion.

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

Tahap 1

1. Gambar-gambar di bawah ini berturut-turut menunjukkan langkah-langkah pembuatan Tahap 1:

Gambar 2. Buka software Nextion (download: https://nextion.tech/nextion-editor#section1), pilih File, pilih New

Gambar 3. Beri nama file, klik Save

Gambar 4. Pilih Device, dalam contoh di sini, dipilih model Enhanced dengan resolusi 240x320

Gambar 5. Pilih Display, dalam contoh di sini dipilih Horizontal

Gambar 6. Di halaman yang terbuka, pilih Picture, klik tombol +

Gambar 7. Download file gambar di link ini: unduh file gambar , setelah itu pilih ketiga file tersebut, klik Open

Gambar 8. Klik OK pada jendela yang muncul, maka di kolom Picture, akan terlihat 3 buah gambar dengan ID=0, ID=1 dan ID=2

Gambar 9. Berikutnya pilih menu Tools, pilih Font Generator, di jendela Font Creator, atur Height, isi nama font, kemudian klik tombol Generate font

Gambar 10. Simpan nama font, klik Save

Gambar 11. Klik OK

Gambar 12. Pilih Yes agar tipe font tersebut ditambahkan ke kolom font, terlihat muncul tipe font dengan ID:0 di kolom font

Gambar 13. Berikutnya klik pada objek Picture, secara otomatis objek tersebut diberi nama p0

Gambar 14. Klik isian di attribute pic, maka muncul daftar gambar, pilih gambar paling atas

Gambar 15. Maka picture p0 akan menampilkan gambar sesuai gambar yang dipilih

Gambar 16. Berikutnya tambahkan objek Picture lagi, di attribute pic objek picture yang baru, isi dengan gambar kedua (ID:1)

Gambar 17. Tempatkan objek picture p1 di dalam kotak seperti terlihat pada gambar di atas

Gambar 18. Duplikasi objek Picture p1 tersebut hingga menjadi 8 buah (p1 - p8), tempatkan di dalam kotak seperti gambar di atas

Gambar 19. Berikutnya tambahkan objek Dual-state button, maka otomatis muncul label bt0

Gambar 20. Perkecil ukuran objek bt0 tersebut menjadi w=40. h=30, kemudian duplikasi objek Picture bt0 tersebut hingga menjadi 8 buah (bt0 - bt7), tempatkan di dalam kotak seperti gambar di atas

Gambar 21. Isi Touch Press Event di objek bt0 dengan "printh 0"

Gambar 22. Isi Touch Press Event di objek bt1 dengan "printh 2"

2. Secara berturut-turut, mulai dari bt0 hingga bt7, isi Touch Press Event dengan kode printh 0 hingga printh D, seperti terlihat dalam tabel berikut ini. Angka setelah printh dibuat tidak berurutan, karena untuk menghindari kode yang sama saat ditekan dan dilepas.


Gambar 23. Setelah Touch Press Event pada semua objek Dual-state button telah terisi, klik tombol Save dan kemudian klik Compile

Gambar 24. Berikutnya klik Debug, maka muncul jendela Debug

Gambar 25. Perbesar jendela Debug, beri centang pada User MCU Input, kemudian pilih port COM yang berpasangan (lihat Device Manager), kemudian tekan tombol Start

Gambar 26. Buka software Proteus, buat rangkaian seperti gambar di atas (silahkan bisa mengunduh file Proteus di atas di link ini: unduh file Proteus)

Gambar 27. Klik 2 kali COMPIM, atur Physical port dengan COM yang berpasangan dengan COM yang digunakan di Nextion (buka Device Manager untuk melihat pasangan COM), dan atur baudrate, baik physical maupun virtual ke 9600

3. Berikutnya, buka software IDE Arduino, gunakan kode program di atas, atur Board = Arduino Uno, klik Verify untuk kompilasi, setelah kompilasi selesai, di kotak output, cari direktori untuk file hex, salin direktori tersebut dengan menekan Ctrl+C, kemudian tempelkan di kolom Program File di komponen ATmega328.

Berikut ini kode Program Arduino Tahap I:
  1. int in[8] = { A0, A1, A2, A3, 2, 3, 4, 5 };
  2. int read[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  3. int read1[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
  4. int out[8] = { 13, 12, 11, 6, 7, 8, 9, 10 };
  5. char p[][3] = { "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8" };
  6. void setup() {
  7.   Serial.begin(9600);
  8.   for (int i = 0; i < 8; i++) {
  9.     pinMode(in[i], INPUT_PULLUP);
  10.     pinMode(out[i], OUTPUT);
  11.   }
  12. }
  13. void loop() {
  14.   if (Serial.available() > 0) {
  15.     byte data = Serial.read();
  16.     switch (data) {
  17.       case 0x30:
  18.         digitalWrite(out[0], HIGH);
  19.         break;
  20.       case 0x04:
  21.         digitalWrite(out[0], LOW);
  22.         break;
  23.       case 0x32:
  24.         digitalWrite(out[1], HIGH);
  25.         break;
  26.       case 0x20:
  27.         digitalWrite(out[1], LOW);
  28.         break;
  29.       case 0x34:
  30.         digitalWrite(out[2], HIGH);
  31.         break;
  32.       case 0x45:
  33.         digitalWrite(out[2], LOW);
  34.         break;
  35.       case 0x36:
  36.         digitalWrite(out[3], HIGH);
  37.         break;
  38.       case 0x60:
  39.         digitalWrite(out[3], LOW);
  40.         break;
  41.       case 0x38:
  42.         digitalWrite(out[4], HIGH);
  43.         break;
  44.       case 0x84:
  45.         digitalWrite(out[4], LOW);
  46.         break;
  47.       case 0x41:
  48.         digitalWrite(out[5], HIGH);
  49.         break;
  50.       case 0xA0:
  51.         digitalWrite(out[5], LOW);
  52.         break;
  53.       case 0x43:
  54.         digitalWrite(out[6], HIGH);
  55.         break;
  56.       case 0xC5:
  57.         digitalWrite(out[6], LOW);
  58.         break;
  59.       case 0x44:
  60.         digitalWrite(out[7], HIGH);
  61.         break;
  62.       case 0xD0:
  63.         digitalWrite(out[7], LOW);
  64.         break;
  65.     }
  66.   }
  67.   for (int i = 0; i < 8; i++) {
  68.     read[i] = !digitalRead(in[i]);
  69.     if (read[i] != read1[i]) {
  70.       sendPictureData(p[i], read[i] + 1);
  71.       read1[i] = read[i];
  72.     }
  73.     delay(10);
  74.   }
  75. }
  76. void sendPictureData(const char* componentName, int value) {
  77.   Serial.print(componentName);
  78.   Serial.print(".pic=");
  79.   Serial.print(value);
  80.   sendTermination();
  81. }
  82. void sendTermination() {
  83.   Serial.write(0xFF);
  84.   Serial.write(0xFF);
  85.   Serial.write(0xFF);
  86. }
4. Kode program Arduino di atas dapat diunduh di link ini: unduh program Arduino 1

Gambar 28. Kompilasi kode program di atas, kemudian salin (Ctrl+C) direktori file Hex yang ada di kotak output

Gambar 29. Klik 2 kali komponen ATmega328, isi Program File dengan file Hex hasil kompilasi program (lihat program di atas), dan atur CLKDIV8 = Unprogrammed, CKSEL Fuses = Ext Clock, Clock Frequency = 16MHz

5. Jalankan simulasi Proteus dan Nextion, seperti terlihat pada Gambar 30 berikut ini.

Gambar 30. Jalankan Proteus, buat Proteus berdampingan dengan jendela Debug Nextion, perhatikan setiap kali sebuah tombol di Nextion ditekan, LED di Proteus akan menyala dan padam mengikuti kondisi tombol, begitu pula sebaliknya, setiap kali sebuah tombol di Proteus ditekan, indikator di jendela Debug Nextion akan menyala dan padam mengikuti kondisi tombol

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

Tahap 2

1. Pada Tahap 2 ini, dibutuhkan 2 buah Arduino (ATmega328). Arduino yang pertama digunakan sebagai penghubung, sedangkan Arduino yang kedua dijadikan sebagai Outseal Nano. Gambar 31 d bawah ini menunjukkan rangkaiannya.

Gambar 31. Rangkaian untuk Tahap 2; Arduino sebagai penghubung Nextion dengan Outseal, sedangkan 8 buah LED dan 8 buah tombol terhubung dengan Outseal (file Proteus di atas dapat diunduh di link ini: unduh file Proteus tahap 2)

2. Apabila pada Tahap 1, kode program Arduino hanya berisi komunikasi serial dengan Nextion, maka di Tahap 2 ini, kode program Arduino berisi kode program untuk menerjemahkan data modbus ke data serial Nextion dan sebaliknya. Berikut ini kode program Arduino Tahap 2 ini:

  1. #include <ModbusRTU.h>
  2. #include <SoftwareSerial.h>
  3. SoftwareSerial mySerial(2, 3);  // RX, TX
  4. ModbusRTU mb;
  5. uint8_t slave_id = 1;
  6. bool coils[10];
  7. bool coils1[10];
  8. char p[][3] = { "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8" };
  9. unsigned long skr = 0;
  10. void setup() {
  11.   Serial.begin(9600);
  12.   mySerial.begin(9600);
  13.   mb.begin(&mySerial);
  14.   mb.setBaudrate(9600);
  15.   mb.master();
  16. }
  17. void loop() {
  18.   if (millis() - skr > 100) {
  19.     skr = millis();
  20.     readDataCoil();
  21.   }
  22.   if (Serial.available()) {
  23.     byte data = Serial.read();
  24.     switch (data) {
  25.       case 0x30:
  26.         writeDataCoil(136, true);
  27.         break;
  28.       case 0x04:
  29.         writeDataCoil(136, false);
  30.         break;
  31.       case 0x32:
  32.         writeDataCoil(137, true);
  33.         break;
  34.       case 0x20:
  35.         writeDataCoil(137, false);
  36.         break;
  37.       case 0x34:
  38.         writeDataCoil(138, true);
  39.         break;
  40.       case 0x45:
  41.         writeDataCoil(138, false);
  42.         break;
  43.       case 0x36:
  44.         writeDataCoil(139, true);
  45.         break;
  46.       case 0x60:
  47.         writeDataCoil(139, false);
  48.         break;
  49.       case 0x38:
  50.         writeDataCoil(140, true);
  51.         break;
  52.       case 0x84:
  53.         writeDataCoil(140, false);
  54.         break;
  55.       case 0x41:
  56.         writeDataCoil(141, true);
  57.         break;
  58.       case 0xA0:
  59.         writeDataCoil(141, false);
  60.         break;
  61.       case 0x43:
  62.         writeDataCoil(142, true);
  63.         break;
  64.       case 0xC5:
  65.         writeDataCoil(142, false);
  66.         break;
  67.       case 0x44:
  68.         writeDataCoil(143, true);
  69.         break;
  70.       case 0xD0:
  71.         writeDataCoil(143, false);
  72.         break;
  73.     }
  74.   }
  75. }
  76. void sendPictureData(const char* componentName, int value) {
  77.   Serial.print(componentName);
  78.   Serial.print(".pic=");
  79.   Serial.print(value);
  80.   sendTermination();
  81. }
  82. void sendTermination() {
  83.   Serial.write(0xFF);
  84.   Serial.write(0xFF);
  85.   Serial.write(0xFF);
  86. }
  87. void writeDataCoil(uint16_t offset, bool value) {
  88.   if (!mb.slave()) {
  89.     mb.writeCoil(slave_id, offset, value);
  90.     while (mb.slave()) {
  91.       mb.task();
  92.       delay(10);
  93.     }
  94.   }
  95. }
  96. void readDataCoil() {
  97.   if (!mb.slave()) {
  98.     mb.readCoil(slave_id, 128, coils, 8);
  99.     while (mb.slave()) {
  100.       mb.task();
  101.       delay(10);
  102.     }
  103.     for (int i = 0; i < 8; i++) {
  104.       if (coils[i] != coils1[i]) {
  105.         sendPictureData(p[i], coils[i] ? 2 : 1);
  106.         coils1[i] = coils[i];
  107.       }
  108.     }
  109.   }
  110. }
3. Program di atas dapat diunduh di link ini: unduh program Arduino 2
Catatan: program di atas memerlukan library modbus-esp8266, yang dapat diunduh di link ini: https://github.com/emelianov/modbus-esp8266/archive/refs/heads/master.zip

4. Kompilasi kode program di atas dengan software IDE Arduino, dan copy direktori file Hex yang dihasilkan untuk diisikan di kolom Program File komponen Arduino (ATmega328 yang pertama). Atur CLKDIV8 = Unprogrammed, CKSEL Fuses = Ext. Clock, Clock Frequency = 16MHz, seperti ditunjukkan pada Gambar 32 berikut:

Gambar 32. Isi kolom Program File komponen Arduino dengan direktori file Hex hasil kompilasi program Arduino Tahap 2 di atas, atur juga CLKDIV8, CKSEL Fuses dan Clock Frequency

5. Untuk komponen Outseal, gunakan program Ladder Diagram berikut ini, buat Ladder Diagram tersebut dengan Outseal Studio dan lakukan kompilasi dengan menekan tombol Test. File hasil kompilasi akan selalu berada di lokasi C:\Users\xxxx\AppData\Local\Temp\Outseal\Hasil.hex, di mana xxxx = nama komputer pengguna.

Gambar 33. Ladder Diagram untuk Outseal Nano, unduh file di atas di link ini: unduh ladder diagram

Gambar 34. Buka Ladder Diagram di Outseal Studio, seting hardware = Outseal Nano, baudrate = 9600 dan Slave Address = 1

Gambar 35. Tekan tombol Test untuk kompilasi program, apabila tidak terdapat kesalahan, akan dihasilkan file Hasil.hex di C:\Users\xxxx\AppData\Local\Temp\Outseal\Hasil.hex

6. Klik 2 kali komponen Outseal (ATmega328 yang bawah) di Proteus, di kolom Program File, isi kolomnya dengan direktori Hasil.hex (C:\Users\xxxx\AppData\Local\Temp\Outseal\Hasil.hex). Isi juga CLKDIV8 = Unprogrammed, CKSEL Fuses = Ext. Clock, Clock Frequency = 16MHz.

7. Berikutnya klik 2 kali COMPIM, isi Physical port dengan COM yang berpasangan dengan COM di Nextion. Atur juga baudrate, baik physical maupun virtual ke 9600.

Gambar 36. Atur COMPIM seperti gambar di atas

8. Jalankan simulasi Proteus dan Nextion, seperti terlihat pada Gambar 37 berikut ini.

Gambar 37. Jalankan Proteus, buat Proteus berdampingan dengan jendela Debug Nextion, perhatikan setiap kali sebuah tombol di Nextion ditekan, LED di Proteus akan menyala dan padam mengikuti kondisi tombol, begitu pula sebaliknya, setiap kali sebuah tombol di Proteus ditekan, indikator di jendela Debug Nextion akan menyala dan padam mengikuti kondisi tombol






No comments:

Post a Comment