LILYGO TTGO LoRa32 board with integrated OLED display and whip antenna mounted outdoors on a fence post

ระดับกลาง

สร้าง LoRa Sensor Node

ไร้สายIoTเซ็นเซอร์

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

รวมชิ้นส่วนจริง 4 รายการ

ราคารวมชุดนี้: 1,521.00 ฿

ยังไม่รวมส่วนลดคำสั่งซื้อที่คุณอาจได้รับตอนชำระเงิน

สิ่งที่คุณต้องใช้

เป้าหมายของโครงการ

โครงการนี้ทำให้คุณมีวิทยุระยะไกลของแท้: โหนด LoRa ที่สามารถส่งและรับข้อมูลได้ในระยะทางหลายกิโลเมตร แทนที่จะเป็นเมตร โดยไม่ต้องพึ่งพา Wi-Fi, ซิมมือถือ หรือค่าบริการข้อมูลรายเดือน โปรดทำความเข้าใจขอบเขตให้ชัดเจนตั้งแต่แรก: ชุดนี้เป็นโหนดเดียว การเชื่อมโยง LoRa ต้องการปลายทางสองด้านเพื่อแสดงการสื่อสารจริง — ไม่ว่าจะเป็นบอร์ด LoRa ตัวที่สอง (LILYGO TTGO LoRa32 ตัวที่สอง หรือวิทยุ LoRa ที่เข้ากันได้) หรือเกตเวย์ LoRaWAN ที่ปลายทางรับ การสร้างนี้จะทำให้โหนดที่ทำงานได้อย่างสมบูรณ์ สามารถส่งและรับได้พร้อมสำหรับการพูดคุย การจับคู่กับโหนดตัวที่สองคือสิ่งที่ทำให้การเชื่อมโยงสมบูรณ์

สิ่งที่คอนโทรลเลอร์ทำ

LILYGO TTGO TZGO LoRa32 รวมไมโครคอนโทรลเลอร์ ESP32, วิทยุ LoRa ตระกูล SX127x และจอแสดงผล OLED ขนาดเล็กบนบอร์ดเดียว ESP32 รันโปรแกรมของคุณ ส่งข้อมูลไปยังวิทยุ LoRa เพื่อส่ง และอ่านข้อมูลที่วิทยุได้รับกลับมา — ในขณะที่ OLED ให้มุมมองสด ไม่ต้องใช้คอมพิวเตอร์ ว่าวิทยุกำลังทำอะไรอยู่

สิ่งที่วิทยุ LoRa ทำ

ต่างจาก Wi-Fi หรือ Bluetooth วิทยุ LoRa ในตัวใช้การมอดูเลตแบบ Chirp Spread Spectrum (CSS) — มันกระจายข้อมูลแต่ละบิตไปทั่วความถี่ chirp ที่กว้างและกวาดช้าๆ แทนที่จะเป็นการส่งข้อมูลสั้นๆ ที่มีความหนาแน่นสูง การแลกเปลี่ยนนี้คือสิ่งที่ทำให้ LoRa มีข้อได้เปรียบด้านระยะทาง: มันยอมเสียแบนด์วิดท์ (LoRa ช้า โดยทั่วไปต่ำกว่าไม่กี่กิโลบิตต่อวินาที) เพื่อแลกกับการเชื่อมโยงวิทยุที่ยังคงสามารถถอดรหัสได้ที่ระดับพลังงานและระยะทางที่ Wi-Fi หยุดทำงานไปนานแล้ว

สิ่งที่จอแสดงผล OLED ทำ

จอแสดงผลในตัวมีไว้เพื่อให้คุณเห็นสถานะของวิทยุโดยไม่ต้องเสียบ Serial Monitor — สถานะการเชื่อมต่อ, แพ็กเก็ตล่าสุดที่ส่งหรือรับ, ความแรงของสัญญาณ (RSSI) และอัตราส่วนสัญญาณต่อสัญญาณรบกวน (SNR) ล้วนมีประโยชน์ที่จะแสดงโดยตรงบนบอร์ดเอง โดยเฉพาะเมื่อคุณนำโหนดออกจากโต๊ะทำงานเพื่อทดสอบระยะทางในโลกจริง

แถบความถี่และข้อบังคับระดับภูมิภาค

วิทยุ LoRa ผลิตขึ้นสำหรับแถบความถี่เฉพาะ – โดยทั่วไปคือ 433MHz, 868MHz หรือ 915MHz ขึ้นอยู่กับภูมิภาค – และการเลือกนั้นไม่ใช่การสุ่ม: มันเป็นไปตามข้อบังคับสเปกตรัมวิทยุของแต่ละภูมิภาคสำหรับอุปกรณ์พลังงานต่ำที่ไม่มีใบอนุญาต ยืนยันว่าบอร์ดรุ่นเฉพาะของคุณครอบคลุมแถบความถี่ใด และตรวจสอบให้แน่ใจว่าตรงกับกฎของภูมิภาคของคุณ สิ่งนี้มีความสำคัญอีกครั้งในขณะที่คุณเพิ่มโหนดที่สอง: ปลายทั้งสองของการเชื่อมโยงต้องทำงานบนแถบความถี่เดียวกันจึงจะสามารถพูดคุยกันได้

แนวคิดซอฟต์แวร์และไลบรารี

ความสามารถในการส่ง/รับข้อมูลดิบของวิทยุ LoRa เป็นเพียง Physical Layer — มันเคลื่อนย้ายไบต์ผ่านอากาศเท่านั้น ไม่มีอะไรมากไปกว่านั้น หากต้องการสร้างสิ่งที่มีประโยชน์ คุณยังคงต้องมีโปรโตคอลข้อมูลอยู่ด้านบน: อาจจะง่ายๆ อย่างรูปแบบแพ็กเก็ตที่กำหนดเองพร้อมรหัสผู้ส่งและเพย์โหลด หรือเฟรมเวิร์กเต็มรูปแบบอย่าง LoRaWAN หากคุณต้องการการระบุที่อยู่ในตัว การรับรอง และ (สำหรับการตั้งค่าที่ใช้เกตเวย์) การรวมเข้ากับโครงสร้างพื้นฐานเครือข่าย LoRaWAN ที่มีอยู่ ไลบรารีของชุมชนสำหรับตระกูลวิทยุ SX127x จะจัดการการกำหนดค่าวิทยุระดับต่ำ โค้ดของคุณเองจะกำหนดความหมายของไบต์ที่คุณส่งและรับจริงๆ

การทดสอบและการแก้ไขปัญหา

  • ไม่มีสัญญาณใดๆ ได้รับระหว่างสองโหนดเลย — ขั้นแรก ให้ยืนยันว่าบอร์ดทั้งสองถูกกำหนดค่าสำหรับแถบความถี่เดียวกัน โหนด 915MHz และโหนด 868MHz ไม่สามารถได้ยินกันได้ไม่ว่าทุกสิ่งทุกอย่างจะถูกเชื่อมต่อหรือเข้ารหัสได้ดีแค่ไหนก็ตาม
  • ระยะทางดูน่าผิดหวังเมื่อทดสอบภายในอาคาร — นี่เป็นสิ่งที่คาดหวัง ไม่ใช่ข้อผิดพลาด ข้อได้เปรียบด้านระยะทางที่แท้จริงของ LoRa จะปรากฏขึ้นเมื่ออยู่กลางแจ้งโดยมีแนวสายตาที่ชัดเจน ผนัง พื้น และวัสดุก่อสร้างจะลดทอนสัญญาณอย่างมาก ดังนั้นอย่าตัดสินระยะทางจากการทดสอบภายในอาคารสั้นๆ
  • แพ็กเก็ตมาไม่สม่ำเสมอหรือหายไปแบบสุ่ม — ตรวจสอบให้แน่ใจว่าขั้วต่อ SMA ของเสาอากาศเสียบแน่นดีแล้วบนบอร์ดทั้งสอง การเชื่อมต่อเสาอากาศที่ไม่แน่นหนาเป็นสาเหตุที่พบบ่อยที่สุดประการหนึ่งของประสิทธิภาพ LoRa ที่ไม่เสถียรในโลกจริง
  • บอร์ดหนึ่งดูเหมือนจะส่งสัญญาณแต่ไม่เคยได้รับอะไรกลับมาเลย — ตรวจสอบว่าคุณมีโหนดที่สองทำงานและกำลังรับฟังอยู่จริง บอร์ดเดียวที่ไม่มีอะไรอีกฝั่งหนึ่งจะไม่แสดงแพ็กเก็ตที่เข้ามา โดยการออกแบบ

การอัปเกรดในอนาคต (ทางเลือก): การรวมเกตเวย์ LoRaWAN

เมื่อคุณมีสองโหนดที่พูดคุยกันโดยตรงด้วยรูปแบบแพ็กเก็ตที่กำหนดเองอย่างง่าย ขั้นตอนต่อไปคือการลงทะเบียนโหนดกับเกตเวย์ LoRaWAN และเซิร์ฟเวอร์เครือข่ายแทน ซึ่งจะเพิ่มการระบุที่อยู่ที่เป็นมาตรฐาน การเข้ารหัส และความสามารถในการส่งต่อข้อมูลเซ็นเซอร์ของคุณไปยังเครือข่ายที่กว้างขึ้น แทนที่จะส่งไปยังบอร์ดที่สองที่อยู่ข้างๆ

การเดินสาย

  • การเชื่อมต่อทั้งหมดได้รับการเดินสายไว้ล่วงหน้าบนบอร์ด LILYGO TTGO LoRa32 V1 — ไม่ต้องใช้การเดินสายบนแผงวงจรสำหรับโครงการนี้ วิทยุ LoRa (SCK=GPIO5, MISO=GPIO19, MOSI=GPIO27, CS/SS=GPIO18, RST=GPIO14, DIO0=GPIO26) และ OLED (SDA=GPIO4, SCL=GPIO15, RST=GPIO16, ที่อยู่ I2C 0x3C) เป็นการเชื่อมต่อแบบตายตัวบนบอร์ด
  • สาย USB-C → PC/แหล่งจ่ายไฟเท่านั้น สำหรับการเขียนโปรแกรมและการจ่ายไฟ

พินเอาต์นี้ใช้สำหรับบอร์ด TTGO LoRa32 V1 ทั่วไป — รุ่น V2/V2.1 จะต่อสาย OLED และโมดูล LoRa แตกต่างกันเล็กน้อย ดังนั้นให้ยืนยันกับเอกสารประกอบหรือสกรีนของบอร์ดเฉพาะของคุณ หากคุณมีรุ่นอื่น ก่อนที่จะสันนิษฐานว่าใช้พินเหล่านี้ คุณต้องตั้งค่า `LORA_FREQUENCY` ให้ตรงกับภูมิภาคของคุณและความถี่ที่โมดูล LoRa ทางกายภาพของคุณถูกสร้างขึ้นมา (เช่น 915MHz สหรัฐอเมริกา, 868MHz สหภาพยุโรป, 433MHz เอเชีย) — การส่งสัญญาณในย่านความถี่ที่ไม่ถูกต้องอาจผิดกฎหมายและแน่นอนว่าจะไม่ถูกรับฟังโดยฮาร์ดแวร์อื่น หากต้องการใช้ประโยชน์จากสิ่งนี้ ให้แฟลชบอร์ด LoRa32 ตัวที่สองด้วยโค้ดรับสัญญาณที่ตรงกัน (`LoRa.parsePacket()`/`LoRa.read()`) หรือจับคู่กับโครงการ "Solar-Powered Remote Sensor Node" ซึ่งเป็นคู่หูทางฝั่งรับสัญญาณตามธรรมชาติ

โค้ดเริ่มต้น

#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// TTGO LoRa32 V1 onboard pinout - fixed on this board. V2/V2.1 boards wire
// these differently - check your specific board's docs/silkscreen if unsure.
#define LORA_SCK  5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_SS   18
#define LORA_RST  14
#define LORA_DIO0 26

#define OLED_SDA 4
#define OLED_SCL 15
#define OLED_RST 16
#define OLED_ADDRESS 0x3C

// Set this to match your LoRa module's region/frequency band, e.g.
// 915E6 (US), 868E6 (EU), 433E6 (Asia) - the wrong band can be illegal
// in your region and won't talk to other hardware correctly.
#define LORA_FREQUENCY 915E6

Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);

uint32_t packetCounter = 0;
unsigned long lastSend = 0;
const unsigned long SEND_INTERVAL_MS = 5000;

void setup() {
  Serial.begin(115200);

  // The onboard OLED needs a manual reset pulse before Wire/display init
  pinMode(OLED_RST, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
  digitalWrite(OLED_RST, HIGH);

  Wire.begin(OLED_SDA, OLED_SCL);
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDRESS)) {
    Serial.println("SSD1306 init failed");
    while (true) delay(1000);
  }
  display.setTextColor(SSD1306_WHITE);

  SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_SS);
  LoRa.setPins(LORA_SS, LORA_RST, LORA_DIO0);

  if (!LoRa.begin(LORA_FREQUENCY)) {
    Serial.println("LoRa init failed - check wiring/frequency");
    while (true) delay(1000);
  }

  Serial.println("LoRa Sensor Node ready");
}

void loop() {
  if (millis() - lastSend < SEND_INTERVAL_MS) return;
  lastSend = millis();

  unsigned long uptime = millis() / 1000;

  char packet[48];
  snprintf(packet, sizeof(packet), "count=%lu,uptime=%lus", packetCounter, uptime);

  LoRa.beginPacket();
  LoRa.print(packet);
  LoRa.endPacket();

  Serial.printf("Sent packet #%lu, uptime %lus\n", packetCounter, uptime);

  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(0, 0);
  display.println("LoRa TX");
  display.setTextSize(1);
  display.setCursor(0, 24);
  display.printf("Packet: %lu\n", packetCounter);
  display.printf("Uptime: %lus\n", uptime);
  display.display();

  packetCounter++;
}

ไม่แน่ใจขั้นตอนไหน? ถามเรา