Basics TTGO LoRa32 SX1278 433MHz (Lab4)

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

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

Basics TTGO LoRa32 SX1278 433MHz

สำหรับโปรแกรมข้างล่างนี้ (Rx) จะคล้ายกับโปรแกรมที่นำเสนอในการทดลองที่ 3 แต่จะมีบางส่วนเพิ่มเติมคือ คำสั่ง if (readingID.toInt() == 111) โดยคำสั่งส่วนนี้จะเป็นการระบุตัวเลขรหัสของบอร์ดรับและส่งข้อมูล (Tx) ที่ต้องการสื่อสาร ซึ่งเราสามารถเปลี่ยนตัวเลข 111 ให้เป็นเลขอื่นๆ ตามที่เรามีบอร์ดรับส่งข้อมูลได้ และในตัวอย่างนี้จะเป็นการสื่อสารกับบอร์ด Tx ตัวที่ 1 คือถ้าเป็นข้อมูลที่ได้รับจากบอร์ด Tx (1) นั้น บอร์ดรับ Rx จะแสดงข้อมูลที่ออกมาให้ทราบ แต่ถ้าไม่ใช่บอร์ด Rx จะไม่แสดงข้อมูลใดๆ ออกมานั้นเอง

(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());   
 //   readingID = readingID.toInt();
       Serial.println("  "); 
       Serial.println(readingID); 
 if (readingID.toInt() == 111) {   // ID Seting for Receive Data
       Serial.print(",  readingID Is OK!! ");      
   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());   
 }
 }
 

ในส่วนของโปรแกรม Tx (1) นี้จะถูกระบุเลขรหัส (ID) เท่ากับ 111 ที่คำสั่ง int readingID = 111; ซึ่งโปรแกรมของ Tx (1) จะส่งข้อมูล int readingID = 111; int tempC = 222; int batteryLevel = 333; int soilMoisture = 444; อยู่ทุกประมาณ 1-2 วินาที และจะรอรับข้อมูลอีกด้วย นั้นหมายความว่าบอร์ด Tx (1) พร้อมรอรับคำสั่งการติดต่อสื่อสารกับบอร์ด Rx ด้วยเช่นกัน

Tx (1) 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 =       0xCC; // Tx 
 byte destinationAddress = 0xDD; // Rx 
 long lastSendTime = 0;
 int interval = 2000;
 int count = 1000;
 int Var = 2000;

 int readingID = 111;
 int tempC = 222;
 int batteryLevel = 333;
 int soilMoisture = 444; 

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

เช่นเดียวกันกับในส่วนของโปรแกรม Tx (2) นี้จะถูกระบุเลขรหัส (ID) เท่ากับ 100 ที่คำสั่ง int readingID = 100; ซึ่งโปรแกรมของ Tx (2) จะส่งข้อมูล int readingID = 100; int tempC = 200; int batteryLevel = 300; int soilMoisture = 400; อยู่ทุกประมาณ 1-2 วินาที โดยข้อมูลจะต่างจาก Tx (1) เพื่อให้เราสามารถสังเกตความแตกต่างข้อมูลได้ง่าย รวมทั้งการรอรับข้อมูล ซึ่งบอร์ด Tx (2) พร้อมรอรับคำสั่งการติดต่อสื่อสารกับบอร์ด Rx ด้วยเช่นกัน

Tx (2) 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());   
 }
 }

สำหรับการทดลองที่ 4 นี้คงพอจะเป็นแนวทางเพื่อให้เห็นรูปแบบของการสื่อสาร ที่มากกว่า 2 ตัวขึ้นไปได้กันครับ ซึ่งในการทดลองนี้ยังคงเป็นแนวความคิดเบื้องต้นอยู่ โดยเราสามารถนำไปพัฒนาโปรแกรมได้เพิ่มขึ้น และสำหรับการทดลองต่อไปจะเป็นการใช้บอร์ด TTGO LoRa32 SX1278 เชื่อมต่อสัญญาณไวไฟ (Wi-Fi) กันต่อ เพื่อให้เราสามารถนำข้อมูลที่ได้จากการสื่อสารด้วยความถี่ 433MHz เข้าสู่โลกอินเตอร์เน็ตบ้างครับ.

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