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:
.png)
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:
- int in[8] = { A0, A1, A2, A3, 2, 3, 4, 5 };
- int read[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
- int read1[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
- int out[8] = { 13, 12, 11, 6, 7, 8, 9, 10 };
- char p[][3] = { "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8" };
- void setup() {
- Serial.begin(9600);
- for (int i = 0; i < 8; i++) {
- pinMode(in[i], INPUT_PULLUP);
- pinMode(out[i], OUTPUT);
- }
- }
- void loop() {
- if (Serial.available() > 0) {
- byte data = Serial.read();
- switch (data) {
- case 0x30:
- digitalWrite(out[0], HIGH);
- break;
- case 0x04:
- digitalWrite(out[0], LOW);
- break;
- case 0x32:
- digitalWrite(out[1], HIGH);
- break;
- case 0x20:
- digitalWrite(out[1], LOW);
- break;
- case 0x34:
- digitalWrite(out[2], HIGH);
- break;
- case 0x45:
- digitalWrite(out[2], LOW);
- break;
- case 0x36:
- digitalWrite(out[3], HIGH);
- break;
- case 0x60:
- digitalWrite(out[3], LOW);
- break;
- case 0x38:
- digitalWrite(out[4], HIGH);
- break;
- case 0x84:
- digitalWrite(out[4], LOW);
- break;
- case 0x41:
- digitalWrite(out[5], HIGH);
- break;
- case 0xA0:
- digitalWrite(out[5], LOW);
- break;
- case 0x43:
- digitalWrite(out[6], HIGH);
- break;
- case 0xC5:
- digitalWrite(out[6], LOW);
- break;
- case 0x44:
- digitalWrite(out[7], HIGH);
- break;
- case 0xD0:
- digitalWrite(out[7], LOW);
- break;
- }
- }
- for (int i = 0; i < 8; i++) {
- read[i] = !digitalRead(in[i]);
- if (read[i] != read1[i]) {
- sendPictureData(p[i], read[i] + 1);
- read1[i] = read[i];
- }
- delay(10);
- }
- }
- void sendPictureData(const char* componentName, int value) {
- Serial.print(componentName);
- Serial.print(".pic=");
- Serial.print(value);
- sendTermination();
- }
- void sendTermination() {
- Serial.write(0xFF);
- Serial.write(0xFF);
- Serial.write(0xFF);
- }
========================================================================================
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.
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:
- #include <ModbusRTU.h>
- #include <SoftwareSerial.h>
- SoftwareSerial mySerial(2, 3); // RX, TX
- ModbusRTU mb;
- uint8_t slave_id = 1;
- bool coils[10];
- bool coils1[10];
- char p[][3] = { "p1", "p2", "p3", "p4", "p5", "p6", "p7", "p8" };
- unsigned long skr = 0;
- void setup() {
- Serial.begin(9600);
- mySerial.begin(9600);
- mb.begin(&mySerial);
- mb.setBaudrate(9600);
- mb.master();
- }
- void loop() {
- if (millis() - skr > 100) {
- skr = millis();
- readDataCoil();
- }
- if (Serial.available()) {
- byte data = Serial.read();
- switch (data) {
- case 0x30:
- writeDataCoil(136, true);
- break;
- case 0x04:
- writeDataCoil(136, false);
- break;
- case 0x32:
- writeDataCoil(137, true);
- break;
- case 0x20:
- writeDataCoil(137, false);
- break;
- case 0x34:
- writeDataCoil(138, true);
- break;
- case 0x45:
- writeDataCoil(138, false);
- break;
- case 0x36:
- writeDataCoil(139, true);
- break;
- case 0x60:
- writeDataCoil(139, false);
- break;
- case 0x38:
- writeDataCoil(140, true);
- break;
- case 0x84:
- writeDataCoil(140, false);
- break;
- case 0x41:
- writeDataCoil(141, true);
- break;
- case 0xA0:
- writeDataCoil(141, false);
- break;
- case 0x43:
- writeDataCoil(142, true);
- break;
- case 0xC5:
- writeDataCoil(142, false);
- break;
- case 0x44:
- writeDataCoil(143, true);
- break;
- case 0xD0:
- writeDataCoil(143, false);
- break;
- }
- }
- }
- void sendPictureData(const char* componentName, int value) {
- Serial.print(componentName);
- Serial.print(".pic=");
- Serial.print(value);
- sendTermination();
- }
- void sendTermination() {
- Serial.write(0xFF);
- Serial.write(0xFF);
- Serial.write(0xFF);
- }
- void writeDataCoil(uint16_t offset, bool value) {
- if (!mb.slave()) {
- mb.writeCoil(slave_id, offset, value);
- while (mb.slave()) {
- mb.task();
- delay(10);
- }
- }
- }
- void readDataCoil() {
- if (!mb.slave()) {
- mb.readCoil(slave_id, 128, coils, 8);
- while (mb.slave()) {
- mb.task();
- delay(10);
- }
- for (int i = 0; i < 8; i++) {
- if (coils[i] != coils1[i]) {
- sendPictureData(p[i], coils[i] ? 2 : 1);
- coils1[i] = coils[i];
- }
- }
- }
- }
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:
No comments:
Post a Comment