Basics TTGO LoRa32 SX1278 433MHz (Lab3)

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

โปรแกรมข้างล่างนี้จะเป็นการรับและส่งข้อมูล ซึ่งรวมไว้ในลูป 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
- 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