Basics TTGO LoRa32 SX1278 433MHz (Lab2)

การทดลองที่ 2 จะเป็นการทดลองส่งข้อมูลตัวแปรที่มากกว่า 1 ตัวขึ้นไป โดยเราสามารถใช้คำสั่งเพียงครั้งเดียว และเพื่อให้ง่ายต่อการจัดรูปแบบการส่งข้อมูล ทั้งนี้ค่าตัวแปรของตัวเซนเซอร์ หรืออุปกรณ์การตรวจจับสัญญาณต่างๆ ที่จะต่อเข้ากับบอร์ด LoRa32 SX1278 อาจจะมีหลายรูปแบบ ดังนั้นการทดลองที่ 2 จะช่วยให้เราเข้าใจวิธีการใช้คำสั่งในการส่งข้อมูล รวมทั้งการรับและการแยกข้อมูลนั้นออกมาใช้งานอีกครั้ง
ในรูปข้างล่างจะเป็นบล๊อกไดอะแกรมแสดงแนวความคิดของการทดลองครั้งที่ 2 โดยเราจะเห็นว่าในกรอบสีน้ำเงินจะเป็นข้อมูลตัวแปรต่างๆ ที่เราต้องการส่ง ซึ่งเราจะจัดข้อมูลเหล่านี้ให้เป็นชุดเดียวและส่งออกไปเพียง 1 ครั้งเช่นกัน

สำหรับตัวอย่างโปรแกรมการส่งข้อมูล (Tx) ข้างล่างนี้ จะเป็นการรวมค่าตัวแปรต่างๆ ที่เราต้องการส่งข้อมูลไปในครั้งเดียว โดยส่วนที่สำคัญอยู่่ที่คำสั่ง LoRa.Print(String()…. ซึ่งอยู่ใน void loop () ซึ่งเราจะสังเกตเห็นว่าค่าตัวแปรทั้งหมดจะมีอยู่ 4 ตัว (readingID, tempC, soilMoisture, batteryLevel) และแต่ละตัวจะถูกคั้นด้วยตัวอักษรสัญลักษณ์ที่ต่างกัน คือ / , &, #
(Tx) Code for TTGO LoRa32 SX1278 433MHz
#include <SPI.h>
#include <LoRa.h>
define SS 18 // GPIO18 -- SX1278's CS
define RST 14 // GPIO14 -- SX1278's RESET
define DI0 26 // GPIO26 -- SX1278's IRQ (Interrupt Request)
define BAND 433E6
int readingID = 100;
int tempC = 200;
int batteryLevel = 300;
int soilMoisture = 400;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Receiver");
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI0);
while (!LoRa.begin(BAND)) {
Serial.println(".");
delay(500);
}
LoRa.setSyncWord(0xAA);
Serial.println(" Tx LoRa init OK");
}
void loop() {
LoRa.beginPacket();
LoRa.print(String(readingID)+"/"+String(tempC)+"&"+String(soilMoisture)+"#"+String(batteryLevel));
LoRa.endPacket();
delay(1000);
}
ต่อมาในส่วนของตัวอย่างโปรแกรมการรับข้อมูล (Rx) ข้างล่างนี้ จะต้องสามารถแยกข้อมูลที่เราส่งมาเป็นชุดเดียวกัน (Packet) ออกมา โดยส่วนที่สำคัญของการรับและการแยกนั้น จะอยู่ที่การตั้งค่าดัชนีตัวสัญลักษณ์ให้กับโปรแกรมทราบ ที่คำสั่ง int pos1 = LoRaData.indexOf(“/”); และคำสั่งถัดลงมา pos2, pos3 จากนั้นก็จะเป็นคำสั่ง String readingID = LoRaData.substring(0, pos1); …. ตามลำดับ เมื่อเราได้ค่าตัวแปรที่สามารถแยกออกจากันได้แล้ว ค่าทั้งหมดยังเป็นข้อมูลแบบตัวหนังสืออยู่ (String) เราสามารถเปลี่ยนข้อมูลเหล่านั้นให้เป็นตัวเลข (int) ได้ด้วยคำสั่ง batteryLevel.toInt() นั้นเองครับ
(Rx) Code for TTGO LoRa32 SX1278 433MHz
#include <SPI.h>
#include <LoRa.h>
define SS 18 // GPIO18 -- SX1278's CS
define RST 14 // GPIO14 -- SX1278's RESET
define DI0 26 // GPIO26 -- SX1278's IRQ(Interrupt Request)
define BAND 433E6
int readingID =0;
int tempC = 0;
int batteryLevel =0;
int soilMoisture = 0;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Receiver");
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI0);
while (!LoRa.begin(BAND)) {
Serial.println(".");
delay(500);
}
LoRa.setSyncWord(0xAA);
Serial.println(" Rx LoRa init OK");
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) {
Serial.print("Received, ");
while (LoRa.available()) {
String LoRaData = LoRa.readString();
Serial.print(LoRaData);
int pos1 = LoRaData.indexOf("/");
int pos2 = LoRaData.indexOf("&");
int pos3 = LoRaData.indexOf("#");
String readingID = LoRaData.substring(0, pos1);
String temperature = LoRaData.substring(pos1 +1,pos2);
String soilMoisture = LoRaData.substring(pos2+1,pos3);
String batteryLevel = LoRaData.substring(pos3+1,LoRaData.length());
Serial.println(" ");
Serial.println(readingID);
Serial.println(temperature);
Serial.println(soilMoisture);
Serial.println(batteryLevel);
Serial.println(batteryLevel.toInt()+soilMoisture.toInt()); // Conver String to Integer
}
Serial.print(", with RSSI ");
Serial.println(LoRa.packetRssi());
}
}
สำหรับการทดทดลองครั้งที่ 2 นี้จะเป็นแนวความคิดหนึ่งของการส่งข้อมูลต่างๆ ที่มีหลายตัวแปรให้รวมกันเป็นคำสั่งเพียงครั้งเดียว ทั้งนี้ตัวบอร์ด LoRa32 SX1278 อาจจะต้องต่อร่วมกับอุปกรณ์เซนเซอร์หลายตัวในบางโอกาส หรือต้องนำค่าที่ได้จากการประมวลผลแล้วส่งข้อมูลไปในคราวเดียว ซึ่งการทดลองจะช่วยให้เราเข้าใจการใช้คำสั่งได้ง่าย และสามารถปรับหรือพัฒนาให้สามารถใช้ได้อย่างเหมาะสมครับ.
Reference
- http://www.lilygo.cn/prod_view.aspx?TypeId=50003&Id=1133&FId=t3:50003:3
- https://randomnerdtutorials.com/ttgo-lora32-sx1276-arduino-ide/
- https://www.thethingsnetwork.org/forum/t/big-esp32-sx127x-topic-part-3/18436
- https://github.com/josephpal/esp32-LoraWAN/blob/master/ESP32-LoRa-Setup.md
- https://github.com/sandeepmistry/arduino-LoRa
- https://github.com/LilyGO/TTGO-LORA32
- https://www.instructables.com/Introduction-to-ESP32-WiFi-LoRa/
- https://learn.sparkfun.com/tutorials/esp32-lora-1-ch-gateway-lorawan-and-the-things-network/all
- https://cdn-shop.adafruit.com/product-files/3179/sx1276_77_78_79.pdf
- https://heltec.org/project/wifi-lora-32/
- https://github.com/HelTecAutomation/Heltec_ESP32
- https://heltec-automation-docs.readthedocs.io/en/latest/esp32/quick_start.html
- https://how2electronics.com/interfacing-sx1278-lora-module-with-arduino/
- https://how2electronics.com/esp32-lora-sensor-data-monitoring-web-server/
- https://resource.heltec.cn/download/WiFi_LoRa_32/WIFI_LoRa_32_V2.pdf