Basics TTGO LoRa32 SX1278 433MHz (Lab3)

การทดลองที่ 3 เราจะมาทดลองการ รับ/ส่ง ข้อมูลระหว่าง TTGO LoRa32 SX1278 ด้วยกัน 2 บอร์ด โดยใช้คำสั่งที่เราเรียนรู้จากการทดลองที่ 1 และ 2 มาประยุกต์ใช้งานกันต่อ ซึ่งจะหมายถึงการสื่อสารแบบ 2 ทางคือ ตัวรับ (Rx) และตัวส่ง (Tx) สามารถแลกเปลี่ยนข้อมูลระหว่างกันได้ (Transceiver) ซึ่งจะมีประโยชน์อย่างมากในเรื่องของความถูกต้องของการสื่อสาร

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

Basics TTGO LoRa32 SX1278 433MHz

โปรแกรมข้างล่างนี้จะเป็นการรับและส่งข้อมูล ซึ่งรวมไว้ในลูป void loop() ซึ่งบอร์ด TTGO LoRa32 SX1278 จะรอรับข้อมูล รวมทั้งส่งข้อมูลที่ตัวบอร์ดเองส่งออกไป โดยเราจะเห็นคอมเม้นกั้น (**** SendMessage Loop ****) และที่คอมเม้นการรับข้อมูล (*** ReceiveMessage Loop ***) ทั้งนี้ส่วนหนึ่งที่แตกต่างกันของโปรแกรมตัวอย่างทั้งให้กับ โมดูลทั้งสองบอร์ดนี้คือ ค่าตัวแปร int readingID = 100; int tempC = 200; int batteryLevel = 300; int soilMoisture = 400; ของบอร์ดส่ง (Tx) จะต่างจากบอร์ดรับ (Rx) ทั้งนี้เพื่อต้องการให้เกิดความแตกต่างระหว่างการส่งข้อมูลระหว่างกันทั้งสองบอร์ด

(Tx) Code for TTGO LoRa32 SX1278 433MHz

 #include  <SPI.h>
 #include  <LoRa.h>
 define SCK     5    // GPIO5  -- SX1278's SCK
 define MISO    19   // GPIO19 -- SX1278's MISnO
 define MOSI    27   // GPIO27 -- SX1278's MOSI
 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

 byte localAddress =       0xBB; // Tx 
 byte destinationAddress = 0xAA; // Rx 
 long lastSendTime = 0;
 int interval = 2000;
 int count = 1000;
 int Var = 2000;
 int readingID = 100;
 int tempC = 200;
 int batteryLevel = 300;
 int soilMoisture = 400; 

 void setup() {
   Serial.begin(115200);
   while (!Serial);
   Serial.println();
   Serial.println("LoRa Sender Test");
 SPI.begin(SCK,MISO,MOSI,SS);
   LoRa.setPins(SS,RST,DI0);
 if (!LoRa.begin(BAND)) {
     Serial.println("LoRa init failed. Check your connections.");
     while (true) {}
   }
 }

 void loop() {
 //**** SendMessage Loop ****
 if (millis() - lastSendTime > interval) {
   Serial.println("Sending, ");   Serial.println(readingID);    Serial.println(tempC);     Serial.println(soilMoisture);    Serial.println(batteryLevel);   LoRa.beginPacket();   LoRa.print(String(readingID)+"/"+String(tempC)+"&"+String(soilMoisture)+"#"+String(batteryLevel));   LoRa.endPacket();   lastSendTime = millis();   interval = random(2000) + 1000;
 }

 //*** ReceiveMessage 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());   
 }
 }

สำหรับการตรวจสอบการรับและส่งข้อมูลระหว่างกันทั้งสองบอร์ดนั้น เราสามารถดูข้อมูลผ่านโปรแกรม Arduino IDE ที่ช่อง COMx ได้ทั้งบอร์ด แต่ค่าแสดงข้อมูลของพอร์ต COMx จะต่างกัน ซึ่งเราสามารถปรับปรุง หรือพัฒนาโปรแกรมใหม่ตามที่เราต้องการได้ครับ นอกจากนี้ในตัวอย่างโปรแกรมที่นำมาแสดงนี้ อาจจะมีคำสั่งบางส่วนที่อาจจะยังไม่ใช้อยู่บาง ซึ่งเราสามารถนำมาใช้งานเพิ่มเติมได้ภายหลังและอยากให้เป็นไอเดียกับท่านในส่วนหนึ่ง

(Rx) Code for TTGO LoRa32 SX1278 433MHz

 #include  <SPI.h>
 #include  <LoRa.h>
 define SCK     5    // GPIO5  -- SX1278's SCK
 define MISO    19   // GPIO19 -- SX1278's MISnO
 define MOSI    27   // GPIO27 -- SX1278's MOSI
 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

 byte localAddress =       0xAA; // Tx 
 byte destinationAddress = 0xBB; // Rx 
 long lastSendTime = 0;
 int interval = 2000;
 int count = 1000;
 int Var = 2000;
 int readingID = 10;
 int tempC = 20;
 int batteryLevel = 30;
 int soilMoisture = 40; 

 void setup() {
   Serial.begin(115200);
   while (!Serial);
   Serial.println();
   Serial.println("LoRa Sender Test");
 SPI.begin(SCK,MISO,MOSI,SS);
   LoRa.setPins(SS,RST,DI0);
 if (!LoRa.begin(BAND)) {
     Serial.println("LoRa init failed. Check your connections.");
     while (true) {}
   }
 }

 void loop() {
 //**** SendMessage Loop ****
 if (millis() - lastSendTime > interval) {
   Serial.println("Sending, ");   Serial.println(readingID);    Serial.println(tempC);     Serial.println(soilMoisture);    Serial.println(batteryLevel);   LoRa.beginPacket();   LoRa.print(String(readingID)+"/"+String(tempC)+"&"+String(soilMoisture)+"#"+String(batteryLevel));   LoRa.endPacket();   lastSendTime = millis();   interval = random(2000) + 1000;
 }
 //** ReceiveMessage 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());   
 }
 }

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

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