Grove - Wio-E5 TTN 演示
入门指南
The Things Network 提供了一个全球开放的 LoRaWAN 网络,配备一套开放工具,让您能够以低成本构建下一个物联网应用,具有最高安全性并可随时扩展。通过强大的端到端加密,构建了一个安全协作的物联网网络,覆盖全球多个国家。目前运营着数千个网关,为数百万人提供覆盖。
准备工作
这是一个演示,展示如何通过 Grove - Wio-E5 模块连接 TTN (The Things Network) 和 Seeeduino XIAO 模块。这些模块能够从环境中收集温度和湿度参数,并将其发送回 TTN。Seeeduino Xiao 上闪烁的 LED 灯指示温度和湿度传感器连接到 TTN 云的状态。
请按照此说明确保您使用的终端节点、网关和 TTN 配置之间频段的一致性。 此演示应用的频率计划适用于 EU868。
所需硬件
Seeeduino XIAO | Grove - Wio-E5 | Seeeduino XIAO Expansion Board | Grove - Temperature & Humidity Sensor (DHT11) |
---|---|---|---|
如果这是您第一次使用 Seeeduino XIAO,请参考 Seeeduino XIAO 的 wiki。 如果这是您第一次使用 Arduino,Arduino 官网 是您开始 Arduino 之旅的绝佳资源。
硬件连接
-
步骤 1. 将 Wio-E5 模块直接连接到 "UART" 插槽。
-
步骤 2. 将 DH11 插入 "A0/D0" 插座。
-
步骤 3. 下载代码,请参考软件部分。
软件准备
如果这是您第一次使用 Arduino,我们强烈建议您在开始之前查看 Arduino 入门指南。 点击了解 如何安装 Arduino 库 的详细信息
下载库文件
软件代码
下载示例;复制代码粘贴到 Arduino IDE 中,然后上传。
# include <Arduino.h>
# include <U8x8lib.h>
# include "DHT.h"
# define DHTPIN 0 // what pin we're connected to
// Uncomment whatever type you're using!
# 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); // OLEDs without Reset of the Display
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: AppEui", 1000, "AT+ID\r\n");
at_send_check_response("+MODE: LWOTAA", 1000, "AT+MODE=LWOTAA\r\n");
at_send_check_response("+DR: EU868", 1000, "AT+DR=EU868\r\n");
at_send_check_response("+CH: NUM", 1000, "AT+CH=NUM,0-2\r\n");
at_send_check_response("+KEY: APPKEY", 1000, "AT+KEY=APPKEY,\"2B7E151628AED2A6ABF7158809CF4F3C\"\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("No E5 module found.\r\n");
u8x8.setCursor(0, 1);
u8x8.print("unfound 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)
{
float temp = 0;
float humi = 0;
temp = dht.readTemperature();
humi = dht.readHumidity();
Serial.print("Humidity: ");
Serial.print(humi);
Serial.print(" %\t");
Serial.print("Temperature: ");
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 failed!\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("Send failed!\r\n\r\n");
}
delay(5000);
}
}
else
{
delay(1000);
}
}
TTN 控制台配置设置
-
步骤 1. 访问 The Things Network 网站并注册一个新账户
-
步骤 2. 登录后,点击您的个人资料并选择 Console
- 步骤 3. 选择一个集群开始添加设备和网关
- 步骤 4. 点击 Go to applications
- 步骤 5. 点击 + Add application
- 步骤 6. 填写 Application ID 并点击 Create application
注意: 这里 Application name 和 Description 不是必填字段。如果 Application name 留空,默认将使用与 Application ID 相同的名称
以下是新创建的应用程序
- 步骤 7:导航到
Payload formatters > Uplink
,选择 Formatter Type 为 Javascript 并填写 Formatter parameter 如下
function Decoder(bytes, port) {
var decoded = {};
if (port === 8) {
decoded.temp = bytes[0] <<8 | bytes[1];
decoded.humi = bytes[2] <<8 | bytes[3];
}
return decoded;
}
- 步骤 8:按照之前的说明将 Arduino 代码上传到 Seeeduino XIAO,并打开串口监视器查看以下输出
Humidity: 50% Temperature: 25.00 *C
AT+JOIN
+JOIN: Start
+JOIN: NORMAL
+JOIN: Join failed
+JOIN: Done
AT+ID
+ID: DevAddr, 24:40:00:7C
+ID: DevEui, 2C:F7:F1:20:24:90:03:63
+ID: AppEui, 80:00:00:00:00:00:00:07
+JOIN: Join failed
记下上面生成的 DevEui 和 AppEUi
- 步骤 9:返回到创建的应用程序的 Overview 页面并点击 + Add end device
- 步骤 10. 点击 Manually,手动输入注册凭据
- 步骤 11. 根据您的地区选择 Frequency plan。同时确保您使用与要连接此设备的网关相同的频率。选择 MAC V1.0.2 作为 LoRaWAN® version,选择 PHY V1.0.2 REV B 作为 Regional Parameters version。这些设置是根据 Wio-E5 的 LoraWAN® 协议栈配置的。
- 步骤 12. 将从 步骤 8 中获得的信息复制并粘贴到 DevEUI 和 AppEUI 字段中。当我们填写 DevEUI 时,End device ID 字段将自动填充。对于 AppKey 字段,使用:2B7E151628AED2A6ABF7158809CF4F3C。
最后点击 Register end device
- 步骤 13. 在 TTN 控制台注册您的 LoRaWAN® 网关。请参考这里显示的说明
如果在一切设置完成后,您在串口监视器上看到以下输出,这意味着 Seeeduino XIAO 已成功连接到 TTN 并正在发送温湿度传感器数据!
- 步骤 14. 返回应用程序页面并导航到 End devices,选择创建的设备并点击 Live data
在这里您将看到实时显示的温湿度传感器数据!
- 步骤 15. 导航到
Messaging > Downlink
,在 Payload 下输入 01 并点击 Schedule downlink 来打开 Seeeduino XIAO 上的内置黄色 LED。
- 步骤 16. 发送 Payload 为 00 来关闭****内置黄色 LED
资源
数据手册:
认证:
相关 SDK:
技术支持与产品讨论
感谢您选择我们的产品!我们在这里为您提供不同的支持,以确保您使用我们产品的体验尽可能顺畅。我们提供多种沟通渠道,以满足不同的偏好和需求。