คู่มือเริ่มต้นใช้งาน ESP32 กับ LoRa (RFM95) สร้างเครือข่ายไร้สายระยะไกลด้วยตัวเอง

สมมติว่าคุณอยากทำระบบสมาร์ทฟาร์ม (Smart Farm) เพื่อวัดความชื้นในดินที่สวนหลังบ้าน แต่ปัญหาคือตรงนั้นดัน "ไม่มีสัญญาณ Wi-Fi" จะลากสายแลนไปก็ไกลเกิน... ปัญหานี้แก้ได้ด้วยเทคโนโลยีที่ชื่อว่า LoRa ครับ!

บทความนี้เราจะพาคุณมาทำความรู้จักกับ LoRa และสอนวิธีใช้บอร์ด ESP32 คู่กับโมดูล RFM95 Transceiver เพื่อสร้างระบบส่งและรับข้อมูลแบบไร้สายระยะไกล (LoRa Sender & Receiver) เขียนโค้ดง่ายๆ ผ่านโปรแกรม Arduino IDE ไปลุยกันเลย!


LoRa คืออะไร? (What is LoRa?)

LoRa (Long Range) คือเทคโนโลยีการสื่อสารไร้สายที่ใช้เทคนิคการมอดูเลตคลื่นวิทยุ (Radio Modulation) ซึ่งออกแบบมาเพื่อตอบโจทย์ 3 เรื่องหลักๆ คือ:

  • ส่งข้อมูลได้ไกลมาก (หลักร้อยเมตรจนถึงหลายสิบกิโลเมตร)
  • ทนทานต่อสัญญาณรบกวนได้ดี
  • ใช้พลังงานต่ำสุดๆ (Low Power) เหมาะกับการใช้แบตเตอรี่ก้อนเล็กๆ หรือโซลาร์เซลล์

ข้อแลกเปลี่ยนอย่างเดียวคือ มันเหมาะกับการส่งข้อมูลก้อนเล็กๆ (เช่น ค่าเซ็นเซอร์ หรือ ข้อความสั้นๆ) ไม่เหมาะกับการส่งข้อมูลใหญ่ๆ อย่างรูปภาพ วิดีโอ หรือการส่งข้อมูลถี่ๆ รัวๆ นะครับ

LoRa ใช้คลื่นความถี่สาธารณะ (Unlicensed frequencies) ที่ใช้ฟรีทั่วโลก โดยแต่ละโซนจะใช้ความถี่ต่างกัน เช่น เอเชียใช้ 433 MHz, ยุโรป 868 MHz และอเมริกา 915 MHz (ก่อนซื้อโมดูล อย่าลืมเช็กคลื่นให้ตรงกับประเทศของคุณด้วยนะ!)

LoRa Concept
คลิกเพื่อดูรูปภาพเปรียบเทียบระยะทางและระบบเครือข่ายเพิ่มเติม (View More)
Range Comparison
Low Power
LoRa Topologies

LoRaWAN Network

เตรียมอุปกรณ์และการต่อวงจร (Hardware & Wiring)

ในการทดสอบนี้ เราจะใช้โมดูล RFM95 LoRa Transceiver คู่กับบอร์ด ESP32 จำนวน 2 ชุด (ฝั่งส่ง 1 ชุด ฝั่งรับ 1 ชุด)

⚠️ ข้อควรระวังเรื่องเสาอากาศ (Antenna):

คุณ "ต้อง" ต่อเสาอากาศเข้ากับพิน ANA ของโมดูลเสมอ! ถ้าไม่มีเสาอากาศสำเร็จรูป ให้ใช้สายไฟทองแดงธรรมดาตัดให้ได้ความยาวตามคลื่นความถี่ (เช่น 433 MHz ตัดยาว 17.3 ซม. / 868 MHz ตัดยาว 8.6 ซม.) ถ้าไม่ใส่เสาอากาศ โมดูลอาจพังได้เลยครับ

การต่อสายไฟ (SPI Protocol):

  • 3.3V -> 3.3V
  • GND -> GND
  • NSS -> GPIO 5
  • MOSI -> GPIO 23
  • MISO -> GPIO 19
  • SCK -> GPIO 18
  • RESET -> GPIO 14
  • DIO0 -> GPIO 2
ESP32 LoRa Wiring Diagram

โค้ดฝั่งส่งข้อมูล (The LoRa Sender Sketch)

ก่อนเริ่ม ให้ไปที่ Arduino IDE เมนู Sketch > Include Library > Manage Libraries แล้วค้นหาคำว่า "LoRa" (ของ sandeep mistry) เพื่อติดตั้งให้เรียบร้อยก่อน จากนั้นคัดลอกโค้ดด้านล่างนี้ลงไปอัปโหลดใส่บอร์ดตัวแรก โค้ดนี้จะส่งข้อความคำว่า "hello" ตามด้วยตัวเลข (Counter) ออกไปทุกๆ 10 วินาที

คลิกเพื่อดูและคัดลอกโค้ด ฝั่งส่ง (Sender) (View More)
#include <SPI.h>
#include <LoRa.h>

// กำหนดพินสำหรับโมดูล
#define ss 5
#define rst 14
#define dio0 2

int counter = 0;

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("LoRa Sender");

  LoRa.setPins(ss, rst, dio0);
  
  // เปลี่ยนตัวเลขตรงนี้ให้ตรงกับคลื่นความถี่ของโมดูลคุณ (เช่น 433E6, 868E6, 915E6)
  while (!LoRa.begin(868E6)) {
    Serial.println(".");
    delay(500);
  }
  
  // ตั้งค่ารหัสผ่าน (Sync Word) เพื่อไม่ให้ชนกับระบบอื่น
  LoRa.setSyncWord(0xF3);
  Serial.println("LoRa Initializing OK!");
}

void loop() {
  Serial.print("Sending packet: ");
  Serial.println(counter);

  // เริ่มส่งข้อมูล
  LoRa.beginPacket();
  LoRa.print("hello ");
  LoRa.print(counter);
  LoRa.endPacket();

  counter++;
  delay(10000); // ส่งทุกๆ 10 วินาที
}

โค้ดฝั่งรับข้อมูล (The LoRa Receiver Sketch)

ส่วนบอร์ด ESP32 ตัวที่สอง ให้ก๊อปปี้โค้ดด้านล่างนี้ไปอัปโหลดครับ มันจะทำหน้าที่รอฟังข้อมูล (โดยเช็กจาก Sync Word ให้ตรงกัน) และเมื่อได้รับข้อความ มันจะปริ้นต์คำนั้นออกมาบนหน้าจอ Serial Monitor พร้อมกับค่า RSSI ซึ่งเป็นค่าที่บอกว่าความแรงของสัญญาณที่รับได้นั้นแรงแค่ไหน

คลิกเพื่อดูและคัดลอกโค้ด ฝั่งรับ (Receiver) (View More)
#include <SPI.h>
#include <LoRa.h>

#define ss 5
#define rst 14
#define dio0 2

void setup() {
  Serial.begin(115200);
  while (!Serial);
  Serial.println("LoRa Receiver");

  LoRa.setPins(ss, rst, dio0);
  
  // เปลี่ยนตัวเลขตรงนี้ให้ตรงกับคลื่นความถี่ของโมดูลคุณ
  while (!LoRa.begin(868E6)) {
    Serial.println(".");
    delay(500);
  }
  
  // ต้องตั้งค่า Sync Word ให้ตรงกับฝั่งส่ง
  LoRa.setSyncWord(0xF3);
  Serial.println("LoRa Initializing OK!");
}

void loop() {
  // ลองจับสัญญาณ
  int packetSize = LoRa.parsePacket();
  
  if (packetSize) {
    Serial.print("Received packet '");

    // อ่านข้อมูลในแพ็กเกจ
    while (LoRa.available()) {
      String LoRaData = LoRa.readString();
      Serial.print(LoRaData); 
    }

    // แสดงค่าความแรงสัญญาณ (ยิ่งติดลบน้อยยิ่งสัญญาณดี)
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }
}

ทดสอบการใช้งานจริง:

เมื่ออัปโหลดเสร็จ ลองเปิดบอร์ดทั้งคู่ขึ้นมาครับ คุณจะเห็นว่าฝั่งส่งพิมพ์คำว่า "Sending packet..." ออกมา และฝั่งรับก็โชว์ข้อความที่ได้รับเป๊ะๆ! หลังจากนี้คุณสามารถเปลี่ยนคำว่า "hello" เป็นค่าอุณหภูมิ ค่าความชื้น หรือข้อมูลเซ็นเซอร์อื่นๆ แล้วเอาบอร์ดไปวางไว้ในไร่ หรือสวนนอกบ้านได้เลยครับ


คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา

อ้างอิงและเรียบเรียงโดย: Globalbyteshop Blog

แหล่งที่มาหลัก:
- ESP32 with LoRa using Arduino IDE (Random Nerd Tutorials)

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี