ใช้บอร์ด NB-IoT extension ดึงค่าจากเซ็นเซอร์โดย Modbus RTU แล้วส่งข้อมูลขึ้น Cloud ด้วย MQTT

ลงไม้ลงมือ : “เชื่อมต่อด้วยพอร์ต RS485 ดึงข้อมูลจาก Sensor โดย Modbus RTU”
บทความ โดย… วิสิทธิ์ เวียงนาค

บอร์ด DEVIO NB-DEVKIT I ของ AIS เป็นบอร์ดที่น่าใช้บอร์ดหนึ่งเพราะใช้หน่วยประมวลผลเป็น ESP32 ที่ทำงานได้อย่างรวดเร็ว และมีโมดูล SIMCOM 7020E ที่รองรับโปรโตลคอล TCP/MQTT ทำให้ใช้งานง่าย เหมาะสำหรับผู้ที่เร่ิมต้นและผู้ที่ต้องการนำไปประยุกต์ใช้งาน

แต่ปัญหาคือ ถ้าจะนำบอร์ด DEVIO NB-DEVKIT I ไปใช้งานจริง มันจะเชื่อมต่อสายไฟ สายสัญญาณได้อย่างไร เพราะตัวบอร์ดเองเป็น dev board คือมี PIN ให้เชื่อมต่อกับบอร์ดทดลองเท่านั้น ดังน้ันมันจึงเหมาะสำหรับงานทดลองเท่านั้น ไม่เหมาะนำไปลงสนามใช้งานจริง

ดังนั้นผู้เขียนจึงได้ออกแบบบอร์ดเสริมขึ้นมา เรียกชื่อว่า “SaiJai NB-IoT extension board” สามารถนำบอร์ด DEVIO NB-DEVKIT I มาสวมบนบอร์ดได้เลย มันจะแปลงร่างเป็น Super Board กลายเป็นบอร์ดที่ติดอาวุธ พร้อมลงสนามจริงใช้งานได้ทันที

ทำความรู้จัก SaiJai NB-IoT extension บอร์ด

รูปแสดง SaiJai NB-IoT Extension Board

ฟังก์ชันของบอร์ด

  • PCB ออกแบบมาเป็นแบบ 2 Layers
  • รองรับทำงานร่วมกับบอร์ด AIS DEVIO NB-DEVKIT I ได้
  • รองรับจ่ายไฟเข้า 12 Vdc และ 24 Vdc
  • มีหัวคอนเนกเตอร์ รองรับการจ่ายไฟเข้าด้วย AC adaptor ทั่วไปได้
  • มี ISOLATED Relay (10A AC/DC) อยู่บนบอร์ดจำนวน 2 ตัว พร้อมชุดคอนเนกเตอร์เชื่อมต่อ NO/NC
  • มี BUZZER อยู่บนบอร์ด สามารถเขียนโปรแกรมควบคุมได้
  • มี USER SWITCH อยู่บนบอร์ด สามารถเขียนโปรแกรมควบคุมได้

พอร์ตใช้งาน

  • พอร์ต RS485 จำนวน 1 ชุดพร้อมคอนเนกเตอร์เชื่อมต่อ
  • พอร์ต I2C จำนวน 1 ชุดพร้อมคอนเนกเตอร์เชื่อมต่อ
  • พอร์ตอนาลอก หรือ GPIO จำนวน 3 ชุดพร้อมคอนเนกเตอร์เชื่อมต่อ
  • พอร์ต UART จำนวน 1 ชุดพร้อมคอนเนกเตอร์เชื่อมต่อ
  • พอร์ต I2C extension พร้อมไฟ 12/24Vdc และ 5Vdc สำหรับเชื่อมต่อไปยังบอร์ดเสริมตัวต่อไป

ความสามารถทั่วไปของบอร์ด

  • สามารถเลือกจ่ายไฟ 5Vdc หรือ 12/24Vdc ให้กับพอร์ต RS485 ได้
  • สามารถเลือกจ่ายไฟ 5Vdc หรือ 12/24Vdc ให้กับพอร์ต I2C ได้
  • สามารถเลือกจ่ายไฟ 5Vdc หรือ 12/24Vdc ให้กับพอร์ตอนาลอก หรือ GPIO ได้
  • ออกแบบให้บอร์ดติดตั้งบนเคส DIN Rail แบบ PLC ได้
  • มีคอนเนกเตอร์สำหรับเสาอากาศภายนอกแบบ SMA บนบอร์ด
  • มีคอนเนกเตอร์แบบ U.FL/IPX to SMA รองรับเชื่อมต่อกับเสาอากาศจากโมดูล SIM7020E บนบอร์ด AIS DEVIO NB-DEVKIT I
รูปแสดง Pin Out ของบอร์ด SaiJai NB-IoT Extension

บอร์ด SaiJai NB-IoT extension ถูกออกแบบมาเป็นอย่างดี นำไปประยุกต์ใช้งานได้อย่างหลากหลาย สามารถนำไปลงสนามใช้งานจริงๆ ได้

รูปแสดงกล่อง DIN RAIL ที่รองรับบอร์ด SaiJai NB-IoT Extension

การเชื่อมต่อสายสัญญาณจากเซ็นเซอร์ ทำได้อย่างง่ายดาย เพราะบนบอร์ดได้จัดเตรียมชุดคอนเนกเตอร์มาให้แล้ว

สำหรับตัวรีเลย์เป็นแบบ ISOLATED Relay ทำให้มั่นใจได้ว่า ถ้านำไปใช้งานจริงว่าถ้าเกิดไฟย้อนกลับเข้ามายังตัวบอร์ด ยังมีตัวช่วยป้องกันด่านแรกให้

PCB สามารถติดตั้งบนกล่อง DIN RIAL PLC ได้ทันที

นอกจากนี้บอร์ดเสริม SaiJai NB-IoT extension ยังสามารถเชื่อมต่อไปยังบอร์ดเสริมตัวอื่นๆ ได้อีกด้วย ผ่านทางพอร์ต X23 ซึ่งบอร์ดเสริมตัวอื่นๆ ที่ออกแบบไว้ จะเปิดตัวให้ทดลองใช้งานในอีกไม่นานนี้ ได้แก่

  • บอร์ดเสริม SaiJai DIGITAL IO RELAY แบบ “ISOLATION” มีชุดขยาย I/O แบบ I2C มี RELAY อยู่ 8 channes ประกอบด้วย 6xRELAY 10A และ 2xRELAY 30A มีพอร์ต DCIN ที่สามารถเลือกไฟเข้าได้ 5Vdc, 12/24Vdc ส่วน DCOUT ก็เลือกไฟออกได้เช่นกัน 5Vdc, 12/24Vdc เชื่อมต่อกับบอร์ดหลัก (SaiJai Extension) ผ่านคอนเนกเตอร์พอร์ต I2C พร้อมจ่ายไฟ 12/24Vdc และ 5Vdc มีวงจร DC->DC และ ISOLATION มีพอร์ตเชื่อมต่อไปยังบอร์ด Extension ตัวต่อไปด้วย บอร์ดนี้เหมาะสำหรับนำไปประยุกต์ใช้งานเช่น SMART FARM ที่ต้องการใช้ RELAY ควบคุมปั๊มน้ำหรืออื่นๆ จำนวนมาก
  • บอร์ดเสริม SaiJai LIGHT CONTROL มีพอร์ต 0–10Vdc จำนวน 8-10 พอร์ต สำหรับสั่ง dimmer หลอดไฟ บอร์ดนี้เหมาะสำหรับงานปลูกพืชที่ต้องการใช้แสงเทียมจากหลอดไฟ LED สามารถสั่งผสมสีของแสงและปรับความเข้มของแสงได้
  • บอร์ดเสริม SaiJi MOTOR CONTROL มี output 4–8 channels สามารถดูกระแสใช้งาน ปรับความเร็วมอเตอร์ บอร์ดนี้สามารถประยุกต์ใช้ใน smart farm ควบคุมปั๊มน้ำต่างๆ ที่ไม่ใหญ่มากนัก เช่น ปั๊มดูดปุ๋ย A/B ปั๊มพ่นละอองน้ำ เป็นต้น
รูปแสดงการเชื่อมต่อระหว่างบอร์ด SaiJai NB-IoT extension กับ SaiJai DIGITAL IO RELAY

มาถึงตอนนี้ ท่านคงมองเห็นภาพแล้วว่าบอร์ดตระกูล SaiJai ออกแบบมาให้ประยุกต์ใช้งานได้อย่างหลากหลาย และสามารถใช้งานได้จริงๆ โดยเฉพาะงานเกี่ยวกับ Digital Farming ต่อไปจะเข้าสู่โหมดตัวอย่างการเขียนโค๊ดกัน

ตัวอย่างการใช้บอร์ด SaiJai NB-IoT extension อ่านค่าเซ็นเซอร์โดยโปรโตคอล Modbus RTU

รูปแสดงการเชื่อมต่อระหว่างบอร์ด SaiJai NB-IoT extension กับเซ็นเซอร์ผ่านพอร์ต RS485

ผู้เขียนจะข้ามขั้นตอนการติดตั้งโปรแกรม Arduino IDE และติดตั้งบอร์ด ESP32 ไป ถ้าใครยังไม่ได้ติดตั้ง ลองค้นหาใน google ใน internet ทั่วไปได้ ผู้เขียนจะเริ่มที่ขั้นตอนติดตั้งไลบรารี่เลย

ดาวน์โหลดไลบรารี่

ไลบรารี่ที่ใช้ในการทดลองครั้งนี้มีอยู่ด้วยกัน 2 ตัว ได้แก่ ModbusMaster และ ESP32_AnalogWrite สามารถ download ได้ตามลิงค์ข้างล่างนี้

คลิ๊กเพื่อดาวน์โหลดไลบรารี่

ผู้เขียนเลือกใช้เซ็นเซอร์วัดคุณภาพอากาศ PM2.5/PM10 อุณหภูมิและความชื้นสัมพัทธ์ของยี่ห้อ ACER มาทดลอง โดยการต่อสายต่างๆ ตามรูปด้านบน เซ็นเซอร์ตัวนี้มีพอร์ต RS485 และใช้ Modbus RTU ในการสื่อสารข้อมูล จ่ายไฟเลี้ยง 12Vdc ซึ่งสามารถต่อจากบอร์ด extension ได้เลย

รายละเอียดเซ็นเซอร์วัดคุณภาพอากาศของ ACER

ตารางแสดง รายละเอียดเซ็นเซอร์วัดคุณภาพอากาศของ ACER

ตาราง Modbus Table เซ็นเซอร์วัดคุณภาพอากาศของ ACER

Modbus Address ID = 0x1
Function code = 3 (Read Holding Register)
Register Address 0x0 = Air Temperature
Register Address 0x1 = Air Humidity
Register Address 0x2 = PM1.0
Register Address 0x3 = PM2.5
Register Address 0x4 = PM10

ตัวอย่างที่ 1
ผู้เขียนจะทดลองเขียนโค๊ดให้บอร์ด NB-IoT extension ดึงข้อมูลจากเซ็นเซอร์วัดคุณภาพอากาศโดยโปรโตคอล Modbus RTU มาแสดงผลใน Serial Monitor

#include <ModbusMaster.h>
#include <HardwareSerial.h>
HardwareSerial ModbusSerial(1);//modbus direction pin
#define MAX485_DE 25
uint32_t last1;
uint8_t result;
ModbusMaster node;
float t[2] = {};
int p[3] = {};
void setup() { Serial.begin(115200); //modbus direction
pinMode(MAX485_DE, OUTPUT);
//set postTransmission
digitalWrite(MAX485_DE, 0);
//create modbus serial
ModbusSerial.begin(9600 , SERIAL_8N1, 5, 18);
//read modbus slave id 1
node.begin(0x01, ModbusSerial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
//loop read modbus sensor every 5 secound
if (millis() - last1 >= 5000) {
last1 = millis();
result = node.readHoldingRegisters(0x00, 5);
if (result == node.ku8MBSuccess) {
//air temperature
t[0] = node.getResponseBuffer(0x0) / 10.0;
//air humidity
t[1] = node.getResponseBuffer(0x1) / 10.0;
//pm1
p[0] = node.getResponseBuffer(0x2);
//pm2.5
p[1] = node.getResponseBuffer(0x3);
//pm10
p[2] = node.getResponseBuffer(0x4);
//print result to serial monitor
Serial.println("Temperature = " + String(t[0],1) + " C");
Serial.println("Humidity = " + String(t[1],1) + " %");
Serial.println("pm1 = " + String(p[0]) + " ug/m3");
Serial.println("pm2.5 = " + String(p[1]) + " ug/m3");
Serial.println("pm10 = " + String(p[2]) + " ug/m3");
Serial.println();
}
}
}
//----------------------------
//modbus function pre and post
//----------------------------
void preTransmission()
{
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_DE, 0);
}
//----------------------------

อธิบายโค๊ดได้ดังนี้ เร่ิมจากเรียกไลบรารี่ ModbusMaster.h และ HardwareSerial.h เข้ามาใช้งาน สร้าง ModbusSerial ขึ้นมาชื่อว่า “ModbusSerial” แล้วกำหนดขา GPIO modbus direction เป็นขาที่ 25 ขานี้มีหน้าที่กำหนดโหมดการรับส่งข้อมูลว่าให้เป็นโหมดรับ (PRE — RX) หรือโหมดส่ง (POST — TX) สร้างตัวแปรขึ้นมาใช้งาน ได้แก่ last1 , result , node , t[2] (ตัวแปร array แบบมีจุดทศนิยม) , p[3] (ตัวแปร array แบบจำนวนเต็ม)

ที่ function setup() กำหนดให้ serial monitor ใช้ baud rate ที่ 115200 กำหนดให้ขา GPIO 25 (MAX485_DE) เป็นขา OUTPUT แล้วกำหนดสถานะเริ่มต้นเป็น LOW (postTransmission) หรือโหมดส่ง แล้วตั้งค่า ModbusSerial ให้ใช้ขา GPIO-5 (A) และ GPIO -18 (B) ที่ 9600 8N1 หมายถึงอัตราเร็วการถ่ายโอนข้อมูล 9600 บิตต่อวินาที ในเฟรมมีบิตข้อมูลจำนวน 8 บิต ไม่กำหนดบิตตรวจสอบข้อมูล และ บิตสิ้นสุดคือ 1 จากนั้นกำหนดให้อ่านค่า modbus slave id 1 ผ่านทาง ModbusSerial

ที่ function loop() ใช้ฟังก์ชัน millis() เพื่อลูปอ่านค่าจากเซ็นเซอร์ Modbus ทุกๆ 5 วินาที กำหนดให้ตัวแปร result อ่านค่า Modbus slave โดย function code 3 (readHoldingRegisters) เร่ิมจาก address ที่ 0x0 อ่านมา 5 address คือ 0x0 … 0x4 ถ้าอ่านค่าสำเร็จจะนำไปเก็บไว้ในตัวแปร ตามข้างล่างนี้

t[0] คือค่าอุณหภูมิ ให้หารด้วย 10.0 และเก็บตัวแปรเป็นเลขทศนิยม (float)
t[1] คือค่าความชื้นสัมพัทธ์ ให้หารด้วย 10.0 และเก็บตัวแปรเป็นเลขทศนิยม (float)
p[0] คือค่า PM1 และเก็บตัวแปรเป็นเลขจำนวนเต็ม (int)
p[1] คือค่า PM2.5 และเก็บตัวแปรเป็นเลขจำนวนเต็ม (int)
p[3] คือค่า PM10 และเก็บตัวแปรเป็นเลขจำนวนเต็ม (int)

นำค่าผลลัพธ์ที่ได้ มาแสดงใน Serial Monitor ด้วยฟังก์ชัน Serial.print() จะได้ผลลัพธ์ตามข้างล่างนี้

Temperature = 34.4 C
Humidity = 46.2 %
pm1 = 14 ug/m3
pm2.5 = 10 ug/m3
pm10 = 12 ug/m3
Temperature = 34.4 C
Humidity = 46.2 %
pm1 = 12 ug/m3
pm2.5 = 13 ug/m3
pm10 = 10 ug/m3

บอร์ด SaiJai NB-IoT extension สามารถอ่านค่าจากเซ็นเซอร์วัดคุณภาพอากาศผ่านทางพอร์ต RS485 โดย Modbus RTU ได้ ทำงานได้เป็นอย่างดี เขียนโค๊ดสั้นๆ ง่ายๆ แต่สามารถนำไปใช้งานได้จริง

ตัวอย่างที่ 2
ท่านสามารถนำตัวอย่างนี้ไปประยุกต์ใช้งานจริงได้เลย เพราะนอกจากอ่านค่าเซ็นเซอร์แบบ Modbus RTU แล้ว ยังกำหนดให้ส่ง uplink payload ไปยัง MQTT server ผ่านทางเครือข่าย NB-IoT อีกด้วย

ก่อนอื่นให้ท่านตั้งค่าใช้งานที่จำเป็นของ MQTT ก่อน จะอยู่แถวบริเวณ Comment
// PROGRAM SETUP !!

String mqtt_server_ip = “XXX.XXX.XXX.XXX”;
String mqtt_server_port = “8883”;
String mqtt_user = “mqtt”;
String mqtt_password = “mtywe112”;
String mqtt_client = “myclient12531”;
String mqtt_topic = “/nbiot_extension”;

นอกจากนี้ยังมีการเรียกใช้งาน BUZZER ที่อยู่บนบอร์ดให้ส่งเสียง beep หลังจากที่ส่ง uplink payload อีกด้วย เพื่อให้ท่านเข้าใจถึงการใช้ฟังก์ชัน AnalogWrite() บน ESP32 ร่วมกับ BUZZER

//********************************************************//
// NBIoT Dev Board + Extension board for PM2.5/PM10 sensor
// 10-Jun-2020, Rev.1
// By Mr.Visit W.
// SaiJai board
//********************************************************//
//include library
#include <ModbusMaster.h>
#include <HardwareSerial.h>
#include <Preferences.h>
#include <analogWrite.h>
//********************************************************//
// PROGRAM SETUP !!
String mqtt_server_ip = "XXX.XXX.XXX.XXX";
String mqtt_server_port = "8883";
String mqtt_user = "mqtt";
String mqtt_password = "XXXX";
String mqtt_client = "myclient12531";
String mqtt_topic = "/nbiot_extension";
int DELAY = 5; //minutes for uplink circle time
bool DEBUG = true; //setup false or true
bool BUZZER = true; //setup false or true
//********************************************************//
// NVS setup / modbus and hardware serial setup
Preferences preferences;HardwareSerial NBIOT_SERIAL(1);
HardwareSerial ModbusSerial(2);
#define MAX485_DE 25
ModbusMaster node;//********************************************************//uint32_t last1;
uint32_t counter;
uint8_t result;
String payload_counter;
String str;
String str2;
String mymqtt;
float t[2] = {};
int p[3] = {};
//********************************************************//void setup() { //Serial setup
Serial.begin(115200);
NBIOT_SERIAL.begin(9600, SERIAL_8N1, 16, 17);
ModbusSerial.begin(9600 , SERIAL_8N1, 5, 18);
//Setup NBIOT module
pinMode(26, OUTPUT); //pwkey
pinMode(27, OUTPUT); //reset
//NB-IoT power key
digitalWrite(26, LOW);
delay(800);
digitalWrite(26, HIGH);
//buzzer analog setu
analogWriteResolution(15, 12);
analogWriteFrequency(15, 3000);
//modbus direction
pinMode(MAX485_DE, OUTPUT);

//setup in receive mode
digitalWrite(MAX485_DE, 0);
//Modbus slave ID 1
node.begin(0x1, ModbusSerial);
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
if (DEBUG) {
Serial.println("WAKE UP! (Rev 1.0)");
Serial.println("SETP1 ---- SETUP OK.");
}
if (BUZZER)
beep2();
}
//********************************************************//void loop() { //set delay time
if (millis() - last1 >= DELAY * 60000) {
last1 = millis();
if (DEBUG)
Serial.println("SETP2 ---- TIMER.");
//start address = 0x00 , 5 address
result = node.readHoldingRegisters(0x00, 5);
if (result == node.ku8MBSuccess) {
if (DEBUG)
Serial.println("SETP3 ---- READ MODBUS OK.");
//Update payload counter
preferences.begin("pcounter", false);
counter = preferences.getUInt("counter", 1);
counter++;
preferences.putUInt("counter", counter);
preferences.end();
payload_counter = String(counter); //## Read modbus value ##// //air temperature
t[0] = node.getResponseBuffer(0x0) / 10.0;
//air humidity
t[1] = node.getResponseBuffer(0x1) / 10.0;
//pm1
p[0] = node.getResponseBuffer(0x2);
//pm2.5
p[1] = node.getResponseBuffer(0x3);
//pm10
p[2] = node.getResponseBuffer(0x4);
String rssi = GETRSSI("AT+CSQ");
delay(1000);
//Prepare sensor payload
str = "";
str += "{";
str += "\"a\":";
str += String(payload_counter);
str += ",";
str += "\"b\":";
str += String(t[0], 1);
str += ",";
str += "\"c\":";
str += String(t[1], 1);
str += ",";
str += "\"d\":";
str += String(p[1]);
str += ",";
str += "\"e\":";
str += String(p[2]);
str += ",";
str += "\"f\":";
str += String(rssi);
str += "}";
//convert str to hex format
if (DEBUG) {
Serial.print("Payload = ");
Serial.println(str);
}
str = STR_TO_HEX(str); //mqtt public command
//MQTT QoS 1
mymqtt = "AT+CMQPUB=0," + mqtt_topic + ",1,0,0,";
str2 = "";
str2 += mymqtt;
str2 += String(str.length());
str2 += ",";
str2 += str;
//Sent payload to MQTT
if (DEBUG)
Serial.println("SETP4 ---- UPLINK PAYLOAD.");
//create MQTT connection
mymqtt = "AT+CMQNEW=" + mqtt_server_ip + "," +
mqtt_server_port + "," + "12000,100";
ATCMD(mymqtt);
delay(1000);
//connect to MQTT server
mymqtt = "AT+CMQCON=0,3," + mqtt_client + ",600,1,0," +
mqtt_user + "," + mqtt_password;
ATCMD(mymqtt);
delay(1000);
//send uplink payload to MQTT server
ATCMD(str2);
delay(2000);
//disconnect MQTT connection
ATCMD("AT+CMQDISCON=0");
if (BUZZER)
beep();
}
}
}
//********************************************************//
// MODBUS setup
void preTransmission()
{
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_DE, 0);
}
//********************************************************//
// function at command
String ATCMD(String at) {
char r[100];
String txt = "";
NBIOT_SERIAL.println("AT");
delay(100);
NBIOT_SERIAL.println(at);
delay(1000);
int i = 0;
while (NBIOT_SERIAL.available()) {
r[i] = (char)NBIOT_SERIAL.read();
txt += r[i];
i++;
}
Serial.println(txt);
return txt;
}
//********************************************************//
// function get rssi value
String GETRSSI(String at) {
char r[100];
String txt = "";
NBIOT_SERIAL.println("AT");
delay(100);
NBIOT_SERIAL.println(at);
delay(1000);
int i = 0;
while (NBIOT_SERIAL.available()) {
r[i] = (char)NBIOT_SERIAL.read();
if (isDigit(r[i]))
txt += r[i];
if (r[i] == ',')
break;
i++;
}
return txt;
}
//********************************************************//
// function convert string to hex
String STR_TO_HEX(String t) {
char data[250];
int a = t.length();
String sText = "";
char tChar[a] = "";
t.toCharArray(tChar, a + 1);
for (int i = 0; i < sizeof(tChar); i++) {
sprintf(data, "%x", tChar[i]);
sText += data;
}
return sText;
}
//********************************************************//
// function beepm, analog write buzzer
void beep() {
analogWrite(15, 255);
delay(100);
analogWrite(15, 0);
delay(100);
}
//********************************************************//
// function beepm, analog write buzzer
void beep2() {
analogWrite(15, 255);
delay(1500);
analogWrite(15, 0);
delay(1500);
}

ข้อความที่แสดงใน Serial Monitor ระหว่างที่บอร์ด SaiJai NB-IoT extension ทำการเชื่อมต่อเครือข่าย NB-IoT และส่ง uplink payload ไปยัง MQTT server ตามข้างล่างนี้

WAKE UP! (Rev 1.0)
SETP1 ---- SETUP OK.
SETP2 ---- TIMER.
SETP3 ---- READ MODBUS OK.
Payload = {"a":1122,"b":34.2,"c":41.6,"d":12,"e":14,"f":27}
SETP4 ---- UPLINK PAYLOAD.
0
OK
AT
OK
AT+CMQNEW=XXX.XXX.XXX.XXX,8883,12000,100
+CMQNEW: 0
OK
AT
OK
AT+CMQCON=0,3,myclient12531,600,1,0,mqtt,XXXX
OK
AT
OK
AT+CMQPUB=0,/nbiot_extension,1,0,0,98,7b2261223a313132322c2262223a33342e322c2263223a34312e362c2264223a31322c2265223a31342c2266223a32377d
OK
AT
OK
AT+CMQDISCON=0
OK

ผู้เขียนยังได้ใช้โปรแกรม MQTT.fx ซึ่งเป็นโปรแกรม MQTT client ทำการเชื่อมต่อกับ MQTT server จากนั้น subscribe topic “/nbiot_extension” ซึ่งเป็น topic เดียวกันกับที่บอร์ด extension ส่ง uplink payload ทันทีที่มีการส่ง payload โปรแกรม MQTT.fx ก็จะแสดงข้อความที่ได้รับจากการ subscribe ในหน้าต่าง console ทันที ในรูปแบบของ JSON

รูปแสดง console ของโปรแกรม MQTT.fx

ผู้เขียนยังได้ทดลองสร้าง flow ในโปรแกรม Node-RED โดยกำหนดให้ node เชื่อมต่อไปยัง MQTT server แล้ว subcribe topic “/nbiot_extension” จากน้ันสร้าง node fuction เขียน Script เพื่อจัดเรียง format ของ payload ใหม่

รูปแสดง flow ในโปรแกรม Node-RED

Script ของ node “decode” มีดังนี้

var m = {};
var t = JSON.parse(msg.payload);
m.payload = {
counter: parseInt(t.a),
temperature: parseFloat(t.b),
humidity: parseFloat(t.c),
pm25: parseFloat(t.d),
pm10: parseFloat(t.e),
rssi: parseInt(t.f)
}
return m;

ทันทีที่ Node-RED ได้รับ payload จะทำการจัดเรียง format ใหม่ เพื่อนำไปใช้ต่อไปเช่น ส่งเข้าฐานข้อมูล Firebase , Influxdb หรืออื่นๆ

payload ที่ปรับแต่งจัด format แล้ว จะได้ผลลัพธ์แสดงตามข้างล่างนี้

รูปแสดง Payload ที่ได้รับการปรับแต่ง format ในโปรแกรม Node-RED แล้ว

มาถึงตอนนี้ท่านคงพอเห็นภาพ การใช้บอร์ด SaiJai NB-IoT extension ส่งข้อมูลผ่านเครือข่าย NB-IoT แล้ว การที่โมดูล SIMCOM 7020E รองรับ TCP และ MQTT ทำให้การเชื่อมต่อนำข้อมูลออกสู่ภายนอกเป็นไปอย่างง่ายดายและสะดวก ทำให้ท่านประยุกต์ใช้งานได้อย่างหลากหลาย

วันนี้บอร์ด DEVIO NB-DEVKIT I ของ AIS มีบอร์ด SaiJai NB-IoT extension มาช่วยเสริมทำงาน ทำให้กลายเป็นอีกหนึ่งโปรดักส์ ที่สามารภนำไปลงสนามใช้งานจริงได้ทันที

ผู้เขียนมีความตั้งใจที่จะนำเสนอการใช้ IoT-LoRaWAN-NBIOT สำหรับพัฒนา SMART CITY เพื่อให้ผู้ที่สนใจนำไปพัฒนาต่อยอดสร้างนวตกรรมใหม่ๆ ขอเป็นส่วนหนึ่งเล็กๆ น้อยๆ ช่วยผลักดันประเทศของเราให้เข้าสู่ยุคดิจิตอล Thailand 4.0 อย่างแท้จริง

ติดตามข่าวสารทาง facebook ได้ที่ลิงค์นี้
Facebook กลุ่ม IoT-SmartCity

--

--

Responses (1)