Начало работы с LoRaWAN на прототипе датчика SenseCAP K1100 (часть 1)

Сегодня в обзоре будем рассмотрен комплект прототипов датчиков SenseCAP K1100 и руководство по началу работы. В первой части этого руководства описывается комплект и показано, как запрограммировать его с помощью Arduino для передачи данных датчика на шлюз LoRAWAN и отображения их на терминале Wio перед обработкой данных в частной сети LoRaWAN с использованием инструментов с открытым исходным кодом, таких как Grafana. Вторая часть, которая будет опубликована позже, продемонстрирует возможности комплекта для искусственного интеллекта.

В цифровую эпоху, когда IoT и большие данные более распространены, требуется собирать большой объем данных с помощью датчиков. Чтобы обеспечить цифровую трансформацию, SenseCAP K1100 от SeeedStudio поставляется со всеми необходимыми датчиками и оборудованием, включая терминал Wio, датчик AI Vision и модуль LoRaWAN. С помощью этой платформы plug-and-play производители могут легко создавать датчики для сбора данных и решать реальные задачи.

Давайте сначала определим некоторые термины:

IoT — означает «Интернет вещей» и относится к сети устройств, подключенных к Интернету. Позволяет нам контролировать использование различных устройств через Интернет, таких как включение и выключение устройств, электроприборов, автомобилей, мобильных телефонов, средств связи, сельскохозяйственной техники, зданий, домов и даже бытовой техники, которую мы используем ежедневно.

LoRaWAN — это аббревиатура от «Long Range Wide Area Network», технологии радиосвязи, основанной на протоколе LoRa, предназначенной для связи на большие расстояния со сверхнизким энергопотреблением. Становится все более популярным среди разработчиков IoT, например, для подключения интеллектуальных устройств.

SenseCAP K1100 — разработанный Seeed Studio, это компактный набор прототипов датчиков с LoRaWAN и AI, призванный помочь разработчикам и производителям создавать прототипы IoT. Терминал Wio поддерживает только беспроводную связь Wi-Fi и Bluetooth, но подключение LoRaWAN можно добавить с помощью модуля Grove LoRa-E5, входящего в этот комплект. В этом обзоре мы сосредоточимся на сборе данных датчиков через частную сеть LoRaWAN.

Содержимое комплекта SenseCAP K1100

Wio Terminal, совместимый с Arduino HMI-контроллер с Wi-Fi и Bluetooth.

Терминал Wio, подключенный к датчику почвы и модулю LoRaWAN

Технические характеристики терминала Wio:

  • MCU — Microchip ATSAMD51P19 Arm Cortex-M4F, работающий на частоте 120 МГц
  • Wi-Fi и Bluetooth — микроконтроллер Realtek RTL8720DN Arm Cortex-M4 с двухдиапазонным (2,4 ГГц и 5 ГГц) WiFi.
  • GPIO — 40 контактов, то же положение контактов, что и у Raspberry Pi
  • Встроенные датчики и функции
    • Встроенный 3-осевой цифровой акселерометр (LIS3DHTR)
    • Световой датчик
    • Микрофон и зуммер
    • ИК-излучатель
  • 2,4-дюймовый ЖК-экран
  • Поддержка TinyML (ИИ и машинное обучение)

Модули входящие в комплект:

  • модуль LoRa-E5 LoRaWAN на базе микроконтроллера STM32WLE5JC; RF-мощность: +20,8 дБм, поддерживает диапазоны частот EU868/US915/AU915/AS923/KR920.
  • Модуль датчика температуры и влажности SHT40
  • Модуль SGP30, действующий как датчик качества воздуха (датчик VOC и eCO2)
  • Модуль влажности почвы
  • Модуль Vision AI с камерой

Принцип работы датчиков SenseCAP K1100

Датчик света использует фотоэлектрический элемент в качестве чувствительного элемента. Он преобразует изменения измеряемого света в электрический сигнал.

Датчик температуры основан на методе термопары. Он состоит из 2х металлических проводов, образующих электрическое соединение. Термопара создает зависящее от температуры напряжение в результате эффекта Зеебека, и это напряжение можно интерпретировать как измерение температуры.

Датчик относительной влажности измеряет влажность через полиаминовую пленку или ацетатный полимер. Когда пленка поглощает или теряет воду, диэлектрическая проницаемость между двумя электродами изменяется, а емкость может быть записана и преобразована в электрические сигналы.

Начало работы с SenseCAP K1100

Требования

Нам потребуется следующее, чтобы измерить данные об окружающей среде и отправить их в нашу частную сеть LoRaWAN:

  • Wio-терминал
  • Кабель USB Type-C
  • Модуль LoRa-E5
  • Модуль SHT40
  • Главный компьютер
  • Шлюз LoRaWAN
  • Облачная платформа LoRaWAN

Аппаратное соединение

Попробуем использовать SenseCAP K1100, подключив модуль датчика SHT40 для измерения температуры и относительной влажности воздуха, а также световых и звуковых значений от встроенного в Wio Terminal датчика и микрофона, затем подключив плату к LoRaWAN-шлюзу с помощью модуля LoRa-Е5.

Мы также будем использовать многоканальный шлюз LoRaWAN Dragino LG308 -AS923-TH-EC25 с интернет-соединением 4G LTE.

Установка программного обеспечения и инструкции

Вот шаг, который нужно выполнить для части программного обеспечения

  1. Установите среду разработки Arduino.
  2. Добавьте файл платы, необходимый для Wio Terminal. В верхнем меню Arduino выберите  File -> Preferences и скопируйте/вставьте https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json в поле URL-адреса менеджера дополнительных плат:

3. Нажмите Tools -> Board -> Board Manager и найдите Wio Terminal.

4. Теперь перейдите в Tools -> Board и выберите плату Seeeduino Wio Terminal.

5. Добавьте библиотеку Arduino для датчика температуры и влажности SHT40. Загрузите файл arduino-i2c-sht4x.zip, затем перейдите в Sketch -> Include Library -> Add .ZIP Library и выберите arduino-i2c-sht4x.

6. Таким же образом добавьте библиотеку LoRa-E5 Arduino после загрузки Disk91_LoRaE5.zip.

7. Добавьте библиотеку Seeed Arduino LCD в Seeed_Arduino_LCD.zip.

8. Затем мы изменили код образца LoRa-SHT40-TFT.ino, чтобы адаптировать его к нашей среде и отобразить информацию на дисплее терминала Wio:

// LoRaWAN + SHT40 + Light + Microphone + TFT LCD
// by.. Ninephon kongangkab <ninephon9@gmail.com>
 
#include <SoftwareSerial.h>
#include <Arduino.h>
#include <SensirionI2CSht4x.h>   //SHT40 library
#include <Wire.h>
#include "TFT_eSPI.h"  //TFT LCD library
 
TFT_eSPI tft;  //Initializing TFT LCD
TFT_eSprite spr = TFT_eSprite(&tft);  //Initializing buffer
 
SoftwareSerial mySerial(A0, A1); // RX, TX
 
SensirionI2CSht4x sht4x;
 
static char recv_buf[512];
static bool is_exist = false;
static bool is_join = false;
 
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);
  mySerial.printf(p_cmd, args);
  Serial.printf(p_cmd, args);
  va_end(args);
  delay(200);
  startMillis = millis();
 
  if (p_ack == NULL)
  {
    return 0;
  }
 
  do
  {
    while (mySerial.available() > 0)
    {
      ch = mySerial.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);
  }
 
  p_start = strstr(p_msg, "RSSI");
  if (p_start && (1 == sscanf(p_start, "RSSI %d,", &rssi)))
  {
    Serial.println(rssi);
  }
 
  p_start = strstr(p_msg, "SNR");
  if (p_start && (1 == sscanf(p_start, "SNR %d", &snr)))
  {
    Serial.println(snr);
  }
}
 
void setup(void)
{
  Serial.begin(115200);
  mySerial.begin(9600);
 
  Wire.begin();
 
  tft.begin();  //Start TFT LCD
  tft.setRotation(3);  //Set TFT LCD rotation
  spr.createSprite(TFT_HEIGHT, TFT_WIDTH); //Create buffer
 
  pinMode(WIO_LIGHT, INPUT);  //Set light sensor pin as INPUT
  pinMode(WIO_MIC, INPUT);  //Set Microphone sensor pin as INPUT
 
  uint16_t error;
  char errorMessage[256];
 
  sht4x.begin(Wire);
 
  uint32_t serialNumber;
  error = sht4x.serialNumber(serialNumber);
  delay(5000);
  if (error) {
    Serial.print("Error trying to execute serialNumber(): ");
    errorToString(error, errorMessage, 256);
    Serial.println(errorMessage);
  } else {
    Serial.print("Serial Number: ");
    Serial.println(serialNumber);
  }
 
  Serial.print("E5 LORAWAN TEST\r\n");
 
  if (at_send_check_response("+AT: OK", 100, "AT\r\n"))
  {
    is_exist = true;
    at_send_check_response("+ID: DevEui", 1000, "AT+ID=DevEui,\"xxxxxxxxxxxxxxxx\"\r\n");
    at_send_check_response("+ID: AppEui", 1000, "AT+ID=AppEui,\"xxxxxxxxxxxxxxxx\"\r\n");
    at_send_check_response("+MODE: LWOTAA", 1000, "AT+MODE=LWOTAA\r\n");
    at_send_check_response("+DR: AS923", 1000, "AT+DR=AS923\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,\"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\r\n");
    at_send_check_response("+CLASS: A", 1000, "AT+CLASS=A\r\n");
    at_send_check_response("+PORT: 8", 1000, "AT+PORT=8\r\n");
    delay(200);
    is_join = true;
  }
  else
  {
    is_exist = false;
    Serial.print("No E5 module found.\r\n");
  }
}
 
void loop(void) {
  uint16_t error;
  float temperature, humidity;
  int int_temp, int_humi;
  error = sht4x.measureHighPrecision(temperature, humidity);
  int_temp = temperature * 100;
  int_humi = humidity * 100;
  int light = analogRead(WIO_LIGHT);   //Assign variable to store light sensor values
  int mic = (analogRead(WIO_MIC))/10;   //Assign variable to store microphone sensor values
 
  //Setting the title header
  spr.fillSprite(TFT_WHITE);  //Fill background with white color
  spr.fillRect(0, 0, 320, 50, TFT_DARKGREEN); //Rectangle fill with dark green
  spr.setTextColor(TFT_WHITE);  //Setting text color
  spr.setTextSize(3);  //Setting text size
  spr.drawString("CNX Software", 50, 15); //Drawing a text string
  spr.drawFastVLine(150, 50, 190, TFT_DARKGREEN); //Drawing verticle line
  spr.drawFastHLine(0, 140, 320, TFT_DARKGREEN); //Drawing horizontal line
 
  //Setting Temperature
  spr.setTextColor(TFT_BLACK);
  spr.setTextSize(2);
  spr.drawString("Temperature", 10, 65);
  spr.setTextSize(3);
  spr.drawNumber(temperature, 50, 95); //Display Temperature values
  spr.drawString("C", 90, 95);
 
  //Setting Humidity
  spr.setTextSize(2);
  spr.drawString("Humidity", 25, 160);
  spr.setTextSize(3);
  spr.drawNumber(humidity, 30, 190); //Display Humidity values
  spr.drawString("%RH", 70, 190);
 
  //Setting Microphone
  spr.setTextSize(2);
  spr.drawString("Microphone", 180, 65);
  spr.setTextSize(3);
  spr.drawNumber(mic, 205, 95); //Display microphone values
  spr.drawString("dB", 245, 95);
 
  //Setting light
  spr.setTextSize(2);
  spr.drawString("Light", 200, 160);
  spr.setTextSize(3);
  light = map(light, 0, 1023, 0, 100); //Map sensor values
  spr.drawNumber(light, 205, 190); //Display sensor values as percentage
  spr.drawString("%", 245, 190);
 
  spr.pushSprite(0, 0); //Push to LCD
 
  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 {
        Serial.println("");
        Serial.print("JOIN failed!\r\n\r\n");
        delay(5000);
      }
    }
    else {
      char cmd[128];
      sprintf(cmd, "AT+CMSGHEX=\"%04X %04X %04X %04X\"\r\n", int_temp, int_humi, light, mic);
      ret = at_send_check_response("Done", 10000, cmd);
      if (ret) {
        Serial.print("Temperature: ");  Serial.print(temperature);
        Serial.println();
        Serial.print("Humidity: ");  Serial.println(humidity);
        Serial.print("Light: "); Serial.println(light);
        Serial.print("Microphone: "); Serial.println(mic);
        recv_prase(recv_buf);
      }
      else {
        Serial.print("Send failed!\r\n\r\n");
      }
      delay(5000);
    }
  }
  else
  {
    delay(1000);
  }
}

9. Вам также потребуется отредактировать программу, чтобы установить необходимую информацию для платы LoRaWAN следующим образом:

  • Номер DevEUI (8 байт)
  • Номер AppEUI (8 байт)
  • Номер APPKEY (16 байт)
  • Настроить OTAA-соединение
  • Укажите рабочую полосу частот. Например, это AS923, в Таиланде это AS923.

10. Загрузите программу на плату Wio Terminal. Одним из преимуществ этой платы является то, что она автоматически переходит в режим загрузчика, и нам не нужно нажимать какие-либо кнопки.

11. Откройте Serial Monitor, чтобы проверить вывод программы. Если все работает должным образом, он покажет, где соединение LoRaWAN успешно, и значения с датчиков, например: Температура = 25,46 градуса, Влажность = 58,39%, Освещенность = 7% и Микрофон = 55 дБ .

12. Мы также можем проверить данные датчика, отображаемые на контроллере терминала Wio.

После того, как плата терминала Wio считывает значение с датчика, оно повторно кодируется в формате AES-128 (расширенный стандарт шифрования) и передается по беспроводной сети через модуль LoRa-E5. Если он находится в пределах досягаемости шлюза LoRaWAN, данные будут перенаправлены в сеть LoRaWAN, и мы вскоре рассмотрим это. А пока вот короткая демонстрационная видеозапись обновления данных на дисплее.

Небольшая заминка при программировании Wio Terminal

В какой-то момент у нас возникла проблема во время обзора, когда мы пытались прошить программу на Wio Terminal через Arduino IDE. Часть загрузки застряла бы навсегда…

… потому что компьютер не распознал терминал Wio с ошибкой «неизвестное USB-устройство (сбой запроса дескриптора устройства)», как показано на рисунке ниже.

Несмотря на то, что мы много раз пытались перезагрузить плату и войти в загрузчик вручную, нам не удалось попробовать метод, показанный на иллюстрации ниже.

Поэтому мы решили связаться с Seeed Studio, чтобы компания помогла нам с проблемой, но их техподдержка просто дала тот же ответ. Оказывается, ключевые слова «дважды очень быстро», и изначально мы дважды нажимали кнопку, относительно быстро, но недостаточно. Сдвинув переключатель несколько раз, мы снова смогли использовать терминал Wio. (Мы не смогли сосчитать, сколько раз мы пытались!). Это означает, что компьютер снова видит USB-порт, и мы можем продолжить обзор, пока все работает нормально. Важным выводом является то, что если плата зависает, вам нужно войти в режим Bootloader вручную.

Частная локальная платформа LoRaWAN IoT

Теперь, когда мы получили данные из комплекта SenseCAP K1100, отправленные на наш шлюз, мы обработаем их через частную платформу LoRaWAN IoT, которую мы установили для личного использования. Он основан на различных компонентах программного обеспечения с открытым исходным кодом, как описано ниже:

  • Сеть LoRaWAN с открытым исходным кодом и сервер приложений ChirpStack, который регистрирует номер устройства LoRaWAN IoT и расшифровывает полученные данные в формате AES128 через брокера MQTT (транспорт телеметрии очереди сообщений), выступающего в качестве отправителя (публикации).
  • Потоковый инструмент разработки Node-RED для программирования. Является получателем (подписчиком) от ChirpStack по протоколу MQTT и берет данные из полезной нагрузки и декодирует их по формату BASE64. Он будет хранить данные датчиков в базе данных InfluxDB, а также проверять и настраивать параметры уведомлений в приложении LINE Notify.
  • InfluxDB — это база данных временных рядов с открытым исходным кодом, которая хранит данные датчиков и шлюза LoRaWAN и автоматически сортирует их по временным рядам, что позволяет нам анализировать данные за любой период времени.
  • Мы также используем панель инструментов Grafana в реальном времени для визуализации данных из базы данных InfluxDB.
  • LINE Notify: Когда датчик выше или ниже указанного значения, приложение обмена сообщениями LINE уведомит нас через LINE Notify API только один раз, то есть не будет уведомления о повторяющихся значениях.

Заключительные слова: для кого подходит SenseCAP K1100?

Набор прототипов датчиков SenseCAP K1100 подходит для школьников, студентов и экспериментаторов (создателей), которые хотят создавать прототипы с различными датчиками, писать код (Arduino) и тестировать подтверждение концепции (PoC) с использованием беспроводного соединения LoRaWAN. Однако для более практических применений более подходящими и надежными являются датчики промышленного класса. Они также доступны от Seeed Studio и других поставщиков.

Нам хотелось бы поблагодарить Seeed Studio за отправку набора прототипов датчика SenseCAP K1100 для этого обзора. Он доступен за 99,00 $ плюс доставка. Во второй части обзора мы будем использовать модуль Grove Vision AI для обучения моделей распознаванию лиц.

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

5 1 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments