Простой проект беспроводного выходного дня с LORAWAN

Я всегда любил возиться с радиосвязью. Возможность передавать данные на большие расстояния без использования модуля gprs или модуля WiFi дает настоящее чувство свободы. Проблема с неиспользованием установленной беспроводной инфраструктуры, такой как Wi-Fi или сеть GSM, заключается в том, что вам нужно погрузиться в темную магию радиосвязи, по крайней мере, так было до тех пор, пока я не обнаружил LORAWAN

ЛОРАВАН

LoRaWAN - протокол управления доступом к среде (MAC) для глобальных сетей. Он разработан, чтобы устройства с низким энергопотреблением могли обмениваться данными с подключенными к Интернету приложениями по беспроводным соединениям на большие расстояния. Хотя связь на большие расстояния может быть достигнута при малой мощности, компромисс обычно заключается в низкой скорости передачи данных.

История скорости передачи данных

Вы можете повернуть три ручки: мощность передачи, пропускную способность и коэффициент распространения. Если вы уменьшите мощность tx, вы сэкономите батарею, но диапазон сигнала, очевидно, будет меньше. Две другие ручки вместе формируют скорость передачи данных. Это определяет, насколько быстро передаются байты. Если вы увеличиваете скорость передачи данных (расширяете полосу пропускания или уменьшаете коэффициент расширения), вы можете передавать эти байты за более короткое время. Для них расчет примерно таков: увеличение полосы пропускания в 2 раза (от BW125 до BW250) позволяет отправлять в 2 раза больше байтов за то же время. Уменьшение коэффициента расширения на 1 шаг (от SF10 до SF9) позволяет отправлять в 2 раза больше байтов за то же время. Снижение коэффициента расширения затрудняет прием передачи шлюзом, так как он будет более чувствителен к шуму. Вы можете сравнить это с двумя людьми, которые сидят в шумном месте (например, в баре). Если вы находитесь далеко друг от друга, вам нужно говорить медленно (SF10), но если вы близко, вы можете говорить быстрее (SF7)

Достаточно о протоколе LORAWAN, давайте перейдем к примеру.

Простой беспроводной проект.

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

Давайте начнем

Для нашей сборки нам понадобится следующее:

  1. Arduino IDE
  2. Модуль ESP32 Dev - два из них (один модуль отправит, а другой модуль получит), модуль содержит микросхему LORA SX1278 и может быть найден по адресу ALIBABA или Amazon
  3. Драйвер экрана OLED
  4. Библиотека Лоры

Загрузите и установите Arduino IDE

Сначала загрузите IDE с сайта arduino (доступна версия для Linux). После загрузки извлеките пакет и запустите установочный файл.

После установки IDE нам нужно будет добавить определение платы для модуля ESP32 Dev.

  1. Откройте окно настроек в среде Arduino IDE. Перейти к файлу ›Настройки

2. Введите https://dl.espressif.com/dl/package_esp32_index.json в поле Дополнительные URL-адреса Board Manager, как показано на рисунке ниже. Затем нажмите кнопку ОК.

3. Менеджер открытых досок. Откройте Инструменты ›Доска› Менеджер досок…

4. Найдите ESP32 и нажмите кнопку установки для «ESP32 от Espressif Systems».

5. Выберите модуль ESP32 dev в меню плат.

IDE Arduino почти готова для кода нашего модуля, последний набор будет включать драйвер OLED Даниэля Эйхорна и Фабриса Вайнберга.

и драйвер LORA от Сандипа Мистри.

Чтобы включить драйверы, выполните следующие действия.

  1. Нажмите «Эскиз», затем «Добавить библиотеку…» или «Управление библиотекой» в более новых версиях.

2. Введите слово «Lora» в строку поиска и установите библиотеку от Sandeep Mistry.

3. Выполните те же действия, что и выше, за исключением поиска слов ESP8266.

Теперь IDE Arduino готова к разработке.

Модуль ESP32 Dev

В нашем примере мы собираемся использовать два модуля разработки ESP32. ESP32, новая фантастическая плата для разработчиков для Интернета вещей. Устройство можно запрограммировать с помощью Arduino IDE, которую мы установили на предыдущем шаге. Устройство можно найти на сайте Alibaba, однако есть и другие аналогичные варианты, которые можно приобрести в другом месте.

Чтобы упростить поиск соответствующих контактов, особенно для сенсорного датчика на GPIO2, вот схема устройства.

Подключите устройство, которое будет нашим отправителем, к USB-порту с помощью кабеля micro USB. IDE Arduino должна обнаруживать устройство и позволять программировать устройство через порт ttyUSB0 (или что-то подобное в Linux).

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

#include <SPI.h>
#include <LoRa.h>
#include <Wire.h> 
#include <SSD1306.h> 
#include “images.h”
#define SCK 5 // GPIO5 — SX1278’s SCK
#define MISO 19 // GPIO19 — SX1278’s MISO
#define MOSI 27 // GPIO27 — SX1278’s MOSI
#define SS 18 // GPIO18 — SX1278’s CS
#define RST 14 // GPIO14 — SX1278’s RESET
#define DI0 26 // GPIO26 — SX1278’s IRQ(Interrupt Request)
#define BAND 433E6
#define TOUTCH_PIN T2 // ESP32 Pin D2
int touch_value = 0;
unsigned int counter = 0;
SSD1306 display(0x3c, 4, 15);
String rssi = “RSSI — “;
String packSize = “ — “;
String packet ;
String sendMessage = “”;
void setup() {
pinMode(16,OUTPUT);
pinMode(2,OUTPUT);
digitalWrite(16, LOW); // set GPIO16 low to reset OLED
delay(50);
digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high
Serial.begin(9600);
while (!Serial);
Serial.println();
Serial.println(“LoRa Sender Test”);
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI0);
if (!LoRa.begin(433E6)) {
Serial.println(“Starting LoRa failed!”);
while (1);
}
Serial.println(“init ok”);
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
delay(1500);
}

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

ESP32 имеет 10 внутренних емкостных сенсорных датчиков. Вы можете использовать его, например, как кнопки.

Эти датчики связаны с несколькими GPIO:

T0: GPIO 4
T1: GPIO 0
T2: GPIO 2
T3: GPIO 15
T4: GPIO 13
T5: GPIO 12
T6: GPIO 14
T7: GPIO 27
T8: GPIO 33
T9: GPIO 32

Для их чтения необходимо использовать функцию: touchRead (Touch Pin #);

Например, чтобы прочитать Touch Sensor 0 (T0), вы должны сделать что-то вроде

touch_value = touchRead(TOUTCH_PIN);

Отправитель

Первая часть метода определяет, был ли нажат емкостный сенсорный переключатель, если да, он изменяет отправляемое сообщение на «Touch», иначе отправленное сообщение будет «No Touch»

void loop() {
 touch_value = touchRead(TOUTCH_PIN);
 if (touch_value > 0)
 {
 sendMessage = “Touch “;
 counter++;
 }
 else
 {
 // send packet
 sendMessage = “No Touch “;
 }
 display.clear();
 display.setTextAlignment(TEXT_ALIGN_LEFT);
 display.setFont(ArialMT_Plain_10);
 
 display.drawString(0, 0, “Sending packet: “);
 display.drawString(90, 0, String(touch_value));
 display.display();
 // send packet
 LoRa.beginPacket();
 LoRa.print(sendMessage);
 LoRa.print(“ “);
 LoRa.print(counter);
 LoRa.endPacket();
 digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
 delay(500); // wait for a second
 digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
 delay(500); 
 
}

Важной частью является фактическая отправка с использованием библиотеки LORA:

// send packet
 LoRa.beginPacket();
 LoRa.print(sendMessage);
 LoRa.print(“ “);
 LoRa.print(counter);
 LoRa.endPacket();

Вот и все, что теперь у вас есть модуль отправителя, готовый к программированию, просто нажмите кнопку загрузки в верхней части IDE Arduino, и код будет отправлен на ваш модуль ESP32 отправителя.

Получатель

Модуль приема получит пакет LORA, отправленный от нашего отправителя, и отобразит некоторую информацию о пакете, такую ​​как размер, а также содержимое пакета, которое будет примерно таким: «Touch 1» или «No Touch 1», 1 - это просто счетчик для количество нажатий на устройство.

Опять же, у приемника есть некоторая инициализация для экрана и драйвера LORA.

#include <SPI.h>
#include <LoRa.h>
#include <Wire.h> 
#include “SSD1306.h” 
#include “images.h”
#define SCK 5 // GPIO5 — SX1278’s SCK
#define MISO 19 // GPIO19 — SX1278’s MISO
#define MOSI 27 // GPIO27 — SX1278’s MOSI
#define SS 18 // GPIO18 — SX1278’s CS
#define RST 14 // GPIO14 — SX1278’s RESET
#define DI0 26 // GPIO26 — SX1278’s IRQ(Interrupt Request)
#define BAND 868E6
SSD1306 display(0x3c, 21, 22);
String rssi = “RSSI — “;
String packSize = “ — “;
String packet ;

void loraData(){
 display.clear();
 display.setTextAlignment(TEXT_ALIGN_LEFT);
 display.setFont(ArialMT_Plain_10);
 display.drawString(0 , 15 , “Received “+ packSize + “ bytes”);
 display.drawStringMaxWidth(0 , 26 , 128, packet);
 display.drawString(0, 0, rssi); 
 display.display();
 Serial.println(rssi);
}
void cbk(int packetSize) {
 packet =””;
 packSize = String(packetSize,DEC);
 for (int i = 0; i < packetSize; i++) { packet += (char) LoRa.read(); }
 rssi = “RSSI “ + String(LoRa.packetRssi(), DEC) ;
 loraData();
}
void setup() {
 pinMode(16,OUTPUT);
 digitalWrite(16, LOW); // set GPIO16 low to reset OLED
 delay(50); 
 digitalWrite(16, HIGH); // while OLED is running, must set GPIO16 in high、
 
 Serial.begin(115200);
 while (!Serial);
 Serial.println();
 Serial.println(“LoRa Receiver Callback”);
 SPI.begin(SCK,MISO,MOSI,SS);
 LoRa.setPins(SS,RST,DI0); 
 if (!LoRa.begin(868E6)) {
 Serial.println(“Starting LoRa failed!”);
 while (1);
 }
 //LoRa.onReceive(cbk);
 LoRa.receive();
 Serial.println(“init ok”);
 display.init();
 display.flipScreenVertically(); 
 display.setFont(ArialMT_Plain_10);
 
 delay(1500);
}
void loop() {
 int packetSize = LoRa.parsePacket();
 if (packetSize) { cbk(packetSize); }
 delay(10);
}

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

Единственный способ передать пакет от датчика - активировать емкостной переключатель, который в нашем случае представляет собой просто провод, подключенный к GPIO2. При прикосновении к концу проводки будет отправлено сообщение.

Вот и все для вашего простого проекта Wireless Weekend.