ブログ
ESP32 + LoRa:長距離ワイヤレスセンサーノードを構築(最大8km)
問題
WiFi は優秀です — 200m 離れた庭にセンサーを置きたくなるまでは。あるいは谷の向こうの農場。あるいは金属倉庫の中。WiFi は50m で死にます。Bluetooth は10m です。
LoRa がすべてを変えます。 E32 LoRa モジュール(915MHz、1W)を使えば、センサーデータを8kmまで送れます — 携帯基地局も、WiFi も、月額料金も一切なし。
作るもの
バッテリー駆動の LoRa センサーノード:
- 温度と湿度を読み取る
- LoRa で受信機にデータを送信する
- 測定の合間に10分間ディープスリープ(バッテリーは数ヶ月持ちます)
難易度: 初心者 | 所要時間: 45分 | 費用: 部品代 約$40
必要なハードウェア(部品リスト)
| 部品 | 型番 | 数量 | 価格 | 購入 |
|---|---|---|---|---|
| マイコントローラー(送信側) | ESP32 DevKitC V4 | 1 | $13.49 | 製品を見る |
| マイコントローラー(受信側) | ESP32-C3 SuperMini | 1 | $7.49 | 製品を見る |
| LoRa モジュール | E32-915T30D(915MHz) | 2 | $11.99/個 | 製品を見る |
| 温湿度センサー | DHT22 | 1 | $5.24 | 製品を見る |
| バッテリー電源 | 18650 Battery Shield | 1 | $11.99 | 製品を見る |
| ブレッドボード | 830点 | 1 | $4.49 | 製品を見る |
| ジャンパーワイヤー | M-M 40本 | 1 | $2.99 | 製品を見る |
周波数に関する警告: E32 モジュールには433MHz、868MHz、915MHz 版があります。互いに通信することはできません。2つのモジュールを同じ周波数にしてください。米国では915MHz です。
ステップ1:配線(送信ノード)
E32 LoRa モジュールは UART シリアルを使用します — SPI ベースの LoRa モジュールよりずっと簡単です。複雑なライブラリは不要です!
| E32 LoRa ピン | ESP32 ピン | 備考 |
|---|---|---|
| VCC | 5V | 電源(モジュールの仕様を確認) |
| GND | GND | 接地 |
| RXD | GPIO 17 (TX2) | E32 RX ← ESP32 TX |
| TXD | GPIO 16 (RX2) | E32 TX → ESP32 RX |
| M0 | GND | 送信モードに設定 |
| M1 | GND | 送信モードに設定 |
| DHT22 DATA | GPIO 13 | センサーデータ |
TX↔RX の交差: UART は電話と同じ — 自分の口(TX)は相手の耳(RX)に繋ぎます。必ず交差接続:モジュール TXD → ESP32 RX2、モジュール RXD → ESP32 TX2。
ステップ2:送信側コード
送信側の ESP32(DHT22 センサーを繋いだ方)にこれをアップロードします:
#include <HardwareSerial.h>
#include "DHT.h"
HardwareSerial LoRaSerial(2); // ESP32 Serial2 (GPIO 16, 17)
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Deep sleep: 10 minutes between readings
#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP 600
void setup() {
Serial.begin(115200);
Serial.println("sensbench LoRa Sensor Node");
LoRaSerial.begin(9600);
dht.begin();
delay(2000);
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Sensor read failed!");
} else {
String data = "T:" + String(t, 1) + "C H:" + String(h, 1) + "%";
Serial.println("Sending: " + data);
LoRaSerial.println(data);
}
Serial.println("Deep sleeping for 10 minutes...");
Serial.flush();
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
void loop() {
// Not reached after deep sleep
}
ステップ3:受信側コード
受信側の ESP32(コンピューターに接続する方)にこれをアップロードします:
#include <HardwareSerial.h>
HardwareSerial LoRaSerial(2);
void setup() {
Serial.begin(115200);
Serial.println("sensbench LoRa Receiver");
LoRaSerial.begin(9600);
}
void loop() {
if (LoRaSerial.available()) {
String data = LoRaSerial.readString();
Serial.print("Received: ");
Serial.println(data);
}
}
ステップ4:テストする
- 送信ノードを18650 バッテリーシールドで給電
- 受信機をコンピューターに接続してシリアルモニターを開く(115200 baud)
- 10分ごとに、最大8km 先から温度と湿度が届くのを確認できる
なぜこれがうまくいくのか
- ディープスリープ: ESP32 はディープスリープ中わずか10µA しか消費しません。2000mAh の18650 バッテリーなら、センサーノードは3ヶ月以上1回の充電で動きます。
- UART LoRa: SPI ベースの LoRa(SX1276)と違い、E32 モジュールは単純なシリアル通信を使います。複雑なライブラリも、SPI 配線の煩雑さも、設定レジスタも不要です。
- 1W 出力(30dBm): E32-915T30D は高出力版です。標準モジュールは20dBm(100mW)。これは30dBm(1000mW)— 出力10倍、到達距離3倍。
さらに進めるには
- センサーノードを増やす: 各ノードが異なるスケジュールで送信すれば衝突を回避できます
- クラウドへ転送: 受信側 ESP32 を WiFi に接続し、LoRa データを MQTT に転送
- 太陽光発電: 18650 バッテリーシールドに小型ソーラーパネルを追加して常設化
- メッシュを構築: 複数の受信ノードがデータを中継すれば、さらに長距離化できます