Basics TTGO LoRa32 SX1278 433MHz (Lab4)
การทดลองที่ 4 จะเป็นการสื่อสารระหว่าง TTGO LoRa32 SX1278 ด้วยกันเพิ่มขึ้นเป็น 3 บอร์ด ทั้งนี้สำหรับเป็นแนวทางเบื้องต้น ของการสร้างเครือข่ายให้กับระบบเรากันต่อ ทั้งนี้การติดต่อสื่อสารนั้น เป็นไปได้อย่างมากที่จะต้องมีการแลกเปลี่ยนข้อมูลที่มาก 2 จุดขึ้นไป เพื่อให้รูปแบบของการสื่อสารมีความยืดหยุ่นเพิ่มมากขึ้น รวมทั้งความน่าเชื่อถือการทำงานของระบบต่างๆ ที่มีความซับซ้อนของข้อมูลมากๆ
สำหรับแนวความคิดของการทดลองที่ 4 นี้จะแสดงดังรูปข้างล่างซึ่งจะเห็นว่าจะมีบอร์ด Tx1 และ Tx2 จำนวน 2 บอร์ด โดยจะใช้บอร์ด Rx เพียงบอร์ดเดียว เพื่อเป็นการทดลองเบื้องต้น ซึ่งในที่นี้จะหมายความว่าบอร์ด Rx จะสามารถเลือกรับหรือส่งข้อมูลจากบอร์ด Tx ใดก็ได้ หรือต้องการติดต่อการสื่อสารกับบอร์ดใด ซึ่งจะหมายถึงบอร์ด Tx ทั้งสองบอร์ดจะมีเลขรหัส ID ประจำตัว เพื่อให้บอร์ด Rx ระบุความต้องการเพื่อติดต่อสื่อสารนั้นเอง
สำหรับโปรแกรมข้างล่างนี้ (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
- 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