Uncategorized

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:テストする

  1. 送信ノードを18650 バッテリーシールドで給電
  2. 受信機をコンピューターに接続してシリアルモニターを開く(115200 baud)
  3. 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 バッテリーシールドに小型ソーラーパネルを追加して常設化
  • メッシュを構築: 複数の受信ノードがデータを中継すれば、さらに長距離化できます

Leave a Reply

Your email address will not be published. Required fields are marked *