Skip to main content

Grove - Wio-E5 Helium デモ

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

はじめに

Helium IoT ネットワークは LoRaWAN プロトコルを使用して「モノのインターネット」デバイスにインターネット接続を提供し、Helium エコシステム内の元のサブネットワークです。世界中の開発者や企業が Helium IoT ネットワークを接続に利用しています。

note

必ず Helium ネットワークのカバレッジ内にいることを確認してください。ネットワークカバレッジは explorer.helium.com で確認できます。

準備

ここでは、Grove - Wio-E5 モジュールを介して Helium IoT ネットワークと Seeeduino XIAO モジュールを接続する方法を示すデモを紹介します。これらのモジュールは環境から温度と湿度のパラメータを収集し、それらを TTN に送信することができます。Seeeduino Xiao の点滅する LED ライトは、TTN クラウドへの接続中の温度および湿度センサーの状態を示します。

caution

使用しているエンドノード、ゲートウェイ、および Helium 設定間で周波数帯域が一致していることを、この指示に従って確認してください。 このデモで使用される周波数プランは IN865 です。

必要なハードウェア

Seeeduino XIAOGrove - Wio-E5Seeeduino XIAO 拡張ボードGrove - 温度 & 湿度センサー (DHT11)

pir

pir

pir

pir

note

Seeeduino XIAO を初めて使用する場合は、Seeeduino XIAO の wiki を参照してください。 Arduino を初めて使用する場合は、Arduino のウェブサイト が Arduino の旅を始めるための素晴らしいリソースです。

ハードウェア接続

  • ステップ 1. Wio-E5 モジュールを "UART" スロットに直接接続します。

  • ステップ 2. DH11 を "A0/D0" ソケットに挿入します。

  • ステップ 3. コードをダウンロードします。ソフトウェア部分を参照してください。

Helium IoT コンソール準備

  • ステップ 1. Helium コンソール のウェブサイトにアクセスし、既存のアカウントでログインします。アカウントをお持ちでない場合は、Metroscientific などの他のパブリックコンソール LNS プロバイダーを使用する必要があります。

pir

  • ステップ 2. ログイン後、「Devices」をクリックしてデバイスを管理します。

pir

  • ステップ 3. 次に「Add New Device」をクリックします。

pir

  • ステップ 4. ここで、1) 新しいデバイスを追加2) Dev EUI をコピー3) App EUI をコピー4) App Key をコピー5) 最後に保存をクリックします。

pir

  • ステップ 5. これで「Devices」セクションにデバイスが表示されます。

pir

これで Helium コンソールのセットアップが完了しました。次にソフトウェア部分に進み、Helium LoRa ネットワークを介してデータを Helium コンソールにアップロードします。

ソフトウェア準備

note

Arduino を初めて使用する場合は、開始前に Arduino の使い方 をご覧になることを強くお勧めします。 Arduino ライブラリのインストール方法 の詳細については、こちらをクリックしてください。

ライブラリのダウンロード

ソフトウェアコード

例をダウンロードし、コードを Arduino IDE にコピーしてアップロードします。

/*
* Grove - Wio-E5 Helium デモ
* 日付: 2023/08/30
* 著者: Salman Faris (Seeed TTN スケッチを改変)
*/

#include <Arduino.h>
#include <U8x8lib.h>
#include "DHT.h"

//# define DHTPIN 0 // 接続されているピン

// 使用しているタイプをアンコメントしてください!
#define DHTTYPE DHT11 // DHT 11
// #define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/*reset=*/U8X8_PIN_NONE);
// U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/*clock=*/ SCL, /*data=*/ SDA, /*reset=*/ U8X8_PIN_NONE); // リセットなしの OLED ディスプレイ

static char recv_buf[512];
static bool is_exist = false;
static bool is_join = false;
static int led = 0;

static int at_send_check_response(char *p_ack, int timeout_ms, char *p_cmd, ...) {
int ch;
int num = 0;
int index = 0;
int startMillis = 0;
va_list args;
memset(recv_buf, 0, sizeof(recv_buf));
va_start(args, p_cmd);
Serial1.printf(p_cmd, args);
Serial.printf(p_cmd, args);
va_end(args);
delay(200);
startMillis = millis();

if (p_ack == NULL) {
return 0;
}

do {
while (Serial1.available() > 0) {
ch = Serial1.read();
recv_buf[index++] = ch;
Serial.print((char)ch);
delay(2);
}

if (strstr(recv_buf, p_ack) != NULL) {
return 1;
}

} while (millis() - startMillis < timeout_ms);
return 0;
}

static void recv_prase(char *p_msg) {
if (p_msg == NULL) {
return;
}
char *p_start = NULL;
int data = 0;
int rssi = 0;
int snr = 0;

p_start = strstr(p_msg, "RX");
if (p_start && (1 == sscanf(p_start, "RX: \"%d\"\r\n", &data))) {
Serial.println(data);
u8x8.setCursor(2, 4);
u8x8.print("led :");
led = !!data;
u8x8.print(led);
if (led) {
digitalWrite(LED_BUILTIN, LOW);
} else {
digitalWrite(LED_BUILTIN, HIGH);
}
}

p_start = strstr(p_msg, "RSSI");
if (p_start && (1 == sscanf(p_start, "RSSI %d,", &rssi))) {
u8x8.setCursor(0, 6);
u8x8.print(" ");
u8x8.setCursor(2, 6);
u8x8.print("rssi:");
u8x8.print(rssi);
}
p_start = strstr(p_msg, "SNR");
if (p_start && (1 == sscanf(p_start, "SNR %d", &snr))) {
u8x8.setCursor(0, 7);
u8x8.print(" ");
u8x8.setCursor(2, 7);
u8x8.print("snr :");
u8x8.print(snr);
}
}

void setup(void) {
u8x8.begin();
u8x8.setFlipMode(1);
u8x8.setFont(u8x8_font_chroma48medium8_r);

Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);

Serial1.begin(9600);
Serial.print("E5 LORAWAN TEST\r\n");
u8x8.setCursor(0, 0);

if (at_send_check_response("+AT: OK", 100, "AT\r\n")) {
is_exist = true;
at_send_check_response("+ID: DevEui", 1000, "AT+ID=DevEui,\"xxxxxxxxxxxxx\"\r\n"); // 'xxxxxxxxxxxxx' を DevEui に置き換え
at_send_check_response("+ID: AppEui", 1000, "AT+ID=AppEui,\"xxxxxxxxxxxxx\"\r\n"); // 'xxxxxxxxxxxxx' を AppEui に置き換え
at_send_check_response("+KEY: APPKEY", 1000, "AT+KEY=APPKEY,\"xxxxxxxxxxxxx\"\r\n"); // 'xxxxxxxxxxxxx' を AppKey に置き換え
at_send_check_response("+ID: DevAddr", 1000, "AT+ID=DevAddr\r\n");
at_send_check_response("+ID: AppEui", 1000, "AT+ID\r\n");
at_send_check_response("+MODE: LWOTAA", 1000, "AT+MODE=LWOTAA\r\n");
at_send_check_response("+DR: IN865", 1000, "AT+DR=IN865\r\n"); // 場所に応じて FREQ を変更
at_send_check_response("+CH: NUM", 1000, "AT+CH=NUM,0-2\r\n");
at_send_check_response("+CLASS: C", 1000, "AT+CLASS=A\r\n");
at_send_check_response("+PORT: 8", 1000, "AT+PORT=8\r\n");
delay(200);
u8x8.setCursor(5, 0);
u8x8.print("LoRaWAN");
is_join = true;
} else {
is_exist = false;
Serial.print("E5 モジュールが見つかりません。\r\n");
u8x8.setCursor(0, 1);
u8x8.print("E5 が見つかりません!");
}

dht.begin();

u8x8.setCursor(0, 2);
u8x8.setCursor(2, 2);
u8x8.print("temp:");

u8x8.setCursor(2, 3);
u8x8.print("humi:");

u8x8.setCursor(2, 4);
u8x8.print("led :");
u8x8.print(led);
}

void loop(void) {

temp = dht.readTemperature();
humi = dht.readHumidity();

Serial.print("湿度: ");
Serial.print(humi);
Serial.print(" %\t");
Serial.print("温度: ");
Serial.print(temp);
Serial.println(" *C");

u8x8.setCursor(0, 2);
u8x8.print(" ");
u8x8.setCursor(2, 2);
u8x8.print("temp:");
u8x8.print(temp);
u8x8.setCursor(2, 3);
u8x8.print("humi:");
u8x8.print(humi);

if (is_exist) {
int ret = 0;
if (is_join) {

ret = at_send_check_response("+JOIN: Network joined", 12000, "AT+JOIN\r\n");
if (ret) {
is_join = false;
} else {
at_send_check_response("+ID: AppEui", 1000, "AT+ID\r\n");
Serial.print("JOIN に失敗しました!\r\n\r\n");
delay(5000);
}
} else {
char cmd[128];
sprintf(cmd, "AT+CMSGHEX=\"%04X%04X\"\r\n", (int)temp, (int)humi);
ret = at_send_check_response("Done", 5000, cmd);
if (ret) {
recv_prase(recv_buf);
} else {
Serial.print("送信に失敗しました!\r\n\r\n");
}
delay(5000);
}
} else {
delay(1000);
}
}

DevEuiAppEui、および AppKey をコードをアップロードする前に必ず置き換えてください。

at_send_check_response("+ID: DevEui", 1000, "AT+ID=DevEui,\"xxxxxxxxxxxxx\"\r\n"); // 'xxxxxxxxxxxxx' をあなたの DevEui に置き換えてください
at_send_check_response("+ID: AppEui", 1000, "AT+ID=AppEui,\"xxxxxxxxxxxxx\"\r\n"); // 'xxxxxxxxxxxxx' をあなたの AppEui に置き換えてください
at_send_check_response("+KEY: APPKEY", 1000, "AT+KEY=APPKEY,\"xxxxxxxxxxxxx\"\r\n"); // 'xxxxxxxxxxxxx' をあなたの AppKey に置き換えてください
  • ステップ 8: 前述の手順に従って Arduino コードを Seeeduino XIAO にアップロードし、シリアルモニターを開いて以下の出力を確認してください。
+ID: DevAddr, 26:0B:20:25
+ID: DevEui, 60:81:F9:A4:84:XX:XX:XX
+ID: AppEui, 60:81:F9:A6:90:XX:XX:XX
AT+MODE=LWOTAA
+MODE: LWOTAA
AT+DR=IN865
+DR: IN865
AT+CH=NUM,0-2
+CH: NUM, 0-2
AT+CLASS=A
+CLASS: A
AT+PORT=8
+PORT: 8
Humidity: 43.00 % Temperature: 23.00 *C
AT+JOIN
+JOIN: Start
+JOIN: NORMAL
+JOIN: Network joined
+JOIN: NetID 326548 DevAddr 48:00:00:0E
+JOIN: Done
Humidity: 29.00 % Temperature: 32.00 *C
AT+CMSGHEX="0020001D"
+CMSGHEX: Start
+CMSGHEX: Wait ACK
+CMSGHEX: ACK Received
+CMSGHEX: RXWIN1, RSSI -30, SNR 6.0
+CMSGHEX: Done
Humidity: 8.00 % Temperature: 30.00 *C
AT+CMSGHEX="001E0008"
+CMSGHEX: Start

このようなメッセージ +JOIN: Network joined が表示されたら、"REAL TIME PACKETS" セクションを開き、アップリンク情報を確認してください。

pir

また、"Event Log" セクションでイベントログを確認することもできます。

pir

さらに、デバッグウィンドウを開くと、ライブデータペイロードやその他の情報を確認できます。

pir

リソース

データシート:

認証:

関連 SDK:

技術サポートと製品ディスカッション

弊社製品をお選びいただきありがとうございます!お客様が弊社製品をスムーズにご利用いただけるよう、さまざまなサポートをご提供しております。お客様のご希望やニーズに応じた複数のコミュニケーションチャネルをご用意しています。

Loading Comments...