【ESP32 教學】打造 LoRa 超長距離無線感測器 (附完整程式碼)
您是否曾經想打造一個能覆蓋整座農場、整棟廠房,甚至穿越山谷的無線感測網絡,卻總是苦於市面上 Wi-Fi 或藍牙模組那短短數十公尺的「訊號距離」限制?
這篇文章,就是為了解決這個核心痛點而生。我們將帶您使用兩大神器——ESP32 開發板 的超低功耗模式,以及傳輸距離遠達 8 公里的 E32 系列 LoRa 無線模組,一步步打造一個真正能實現超長距離通訊的無線感測節點。
- 專案目標: 打造一個由電池供電的 LoRa 無線溫濕度感測器。
- 核心功能: 每 10 分鐘自動發送一次數據,然後進入深度睡眠以節省電力。
- 所需時間: 約 30 分鐘。
- 技術難度: ★★☆☆☆ (初學者友好)
一、為什麼選擇 ESP32 + E32 LoRa 模組?
- ESP32 的「深度睡眠 (Deep Sleep)」模式: 由 樂鑫科技 (Espressif) 開發,內建超低功耗模式,可將電池壽命延長數月甚至數年。
- E32 LoRa 模組的「超長距離」與「簡易 UART」特性: 這款 1W (30dBm) 高功率 LoRa 模組,採用 UART 串列埠通訊,接線和程式設計遠比傳統的 SPI 介面更簡單。
二、專案實作:從零件到成果的完整步驟
步驟一:硬體準備
- 主控板: Arduino Nano ESP32 開發板 x 1 (或其他您偏好的 ESP32 開發板)
- LoRa 模組: LoRa 無線傳輸模組 (1W 30dBm) x 2 (發送端與接收端各需一片)
- 感測器: DHT22 溫濕度感測器模組 x 1
- 電源: 3.7V 鋰聚合物電池 (LiPo) x 1 (選配)
- 其他: 杜邦線、麵包板。
關於電池供電的選擇
我們推薦的 Arduino Nano ESP32 是一塊功能強大且小巧的開發板,但請注意它沒有內建鋰電池充電接口。如果您希望打造一個可重複充電的裝置,建議您可以選擇帶有電池座或充電電路的 ESP32 開發板,或是額外搭配一片 TP4056 鋰電池充電模組 來使用。
步驟二:軟體與函式庫設定
請確保您的 Arduino IDE 已經安裝了 ESP32 的開發板支援。由於我們選用的 E32 LoRa 模組是透過 UART 通訊,我們不需要安裝任何複雜的第三方 LoRa 函式庫!您唯一需要安裝的,只有感測器的函式庫:
步驟三:硬體接線
由於採用 UART 介面,接線變得非常簡單!我們將使用 ESP32 的第二組硬體序列埠 (Serial2)。
| E32 LoRa 模組 | ESP32 開發板 | 說明 |
|---|---|---|
| VCC | 5V / 3V3 | 電源 (請參考模組規格) |
| GND | GND | 接地 |
| RXD | GPIO 17 (TX2) | 接收端 ↔️ ESP32 的發送端 |
| TXD | GPIO 16 (RX2) | 發送端 ↔️ ESP32 的接收端 |
| M0 | GND | 設為傳輸模式 (接地) |
| M1 | GND | 設為傳輸模式 (接地) |
| DHT22 DATA | GPIO 13 | DHT22 感測器數據線 |
【接線防呆提示】 UART 通訊就像兩個人說話,A 的嘴巴 (TX) 要對著 B 的耳朵 (RX),B 的嘴巴 (TX) 則要對著 A 的耳朵 (RX)。所以接線時,請務必將模組的 TXD 接到 ESP32 的 RX2,模組的 RXD 接到 ESP32 的 TX2,交叉連接!
⚠️ 【重要】請確認您的 LoRa 頻率!
這款模組提供 433MHz、868MHz、915MHz 等多種頻率版本,它們無法互相通訊!請務必確認您的「發送端」和「接收端」使用的是完全相同頻率的模組。
步驟四:上傳程式碼 (發送端)
將以下程式碼上傳到您的 ESP32 開發板。它會讀取 DHT22 數據,透過 LoRa 發送,然後讓 ESP32 進入深度睡眠 10 分鐘。
#include <HardwareSerial.h>
#include "DHT.h"
// --- E32 LoRa (UART) ---
HardwareSerial LoRaSerial(2); // 使用 ESP32 的 Serial2 (GPIO 16, 17)
// --- DHT22 設定 ---
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// --- Deep Sleep 設定 ---
#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP 600 // 睡眠 600 秒 (10 分鐘)
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("ESP32 LoRa Long-Range Sensor Node");
LoRaSerial.begin(9600);
dht.begin();
delay(1000); // 等待感測器穩定
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read from DHT sensor!");
} else {
String dataToSend = "Temperature: " + String(temperature, 2) + " C, Humidity: " + String(humidity, 2) + " %";
Serial.print("Sending data: ");
Serial.println(dataToSend);
LoRaSerial.println(dataToSend);
}
Serial.println("Going to sleep now for 10 minutes...");
Serial.flush();
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
void loop() {
// This part is not executed after deep sleep
}
步驟五:上傳程式碼 (接收端) 與最終測試
光有發送端還不夠,我們還需要一個接收端來驗證訊號是否成功發出。請將以下程式碼,上傳到您作為「接收端」的另一塊 ESP32 開發板上(接線方式與發送端相同,但可以不接 DHT22)。
#include <HardwareSerial.h>
HardwareSerial LoRaSerial(2);
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("ESP32 LoRa Receiver");
LoRaSerial.begin(9600);
}
void loop() {
if (LoRaSerial.available()) {
String receivedData = LoRaSerial.readString();
Serial.print("Received packet: '");
Serial.print(receivedData);
Serial.println("'");
}
}
完成後,為您的發送端接上電池,並將接收端連接到電腦。打開 Arduino IDE 的序列埠監控視窗,您應該就能每 10 分鐘看到一次從遠方傳來的溫濕度數據了!
透過本篇教學的實作,您會發現,使用 UART 介面的高功率 LoRa 模組,其價值不僅在於強大的傳輸距離,更在於它極大地簡化了開發流程。這意味著您可以從複雜的底層通訊中解放出來,更專注於應用本身的創新,將您的物聯網創意,真正部署到任何過去訊號無法到達的角落。
