Basics TTGO LoRa32 SX1278 433MHz (Lab2)

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

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

Basics TTGO LoRa32 SX1278 433MHz

สำหรับตัวอย่างโปรแกรมการส่งข้อมูล (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

  1. http://www.lilygo.cn/prod_view.aspx?TypeId=50003&Id=1133&FId=t3:50003:3
  2. https://randomnerdtutorials.com/ttgo-lora32-sx1276-arduino-ide/
  3. https://www.thethingsnetwork.org/forum/t/big-esp32-sx127x-topic-part-3/18436
  4. https://github.com/josephpal/esp32-LoraWAN/blob/master/ESP32-LoRa-Setup.md
  5. https://github.com/sandeepmistry/arduino-LoRa
  6. https://github.com/LilyGO/TTGO-LORA32
  7. https://www.instructables.com/Introduction-to-ESP32-WiFi-LoRa/
  8. https://learn.sparkfun.com/tutorials/esp32-lora-1-ch-gateway-lorawan-and-the-things-network/all
  9. https://cdn-shop.adafruit.com/product-files/3179/sx1276_77_78_79.pdf
  10. https://heltec.org/project/wifi-lora-32/
  11. https://github.com/HelTecAutomation/Heltec_ESP32
  12. https://heltec-automation-docs.readthedocs.io/en/latest/esp32/quick_start.html
  13. https://how2electronics.com/interfacing-sx1278-lora-module-with-arduino/
  14. https://how2electronics.com/esp32-lora-sensor-data-monitoring-web-server/
  15. https://resource.heltec.cn/download/WiFi_LoRa_32/WIFI_LoRa_32_V2.pdf