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