
Купить модули можно тут: http://alii.pub/6ex227
DHT22: http://alii.pub/5yjvv7
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
Попали мне в руки вот эти модули. На самом деле они мне очень понравились.
Это модули ESP32 с большим количеством пинов свободных. Вы только посмотрите на распиновку:

И помимо всего этого, здесь установлен модуль LORA SX1276. Который впринципе можно купить отдельно: http://alii.pub/6ex2t8 или http://alii.pub/6ex2u0
Но тут он уже встроен и цена мне кажется выигрывает этих модулей, чем отдельно лора модуль и отдельно esp32.
Вариант у Lilygo есть либо на 868Mhz или на 915Mhz. Мой вариант на 915Mhz.
Ну а теперь давайте перейдем к программной части.
Существует страничка на Github для этих модулей. https://github.com/LilyGO/TTGO-LORA32/tree/LilyGO-868-V1.0
Там есть пример. Но пример очень примитивный и он на модули с дисплеем. Которые стоят дороже и я считаю что дисплей тут лишний. Вобщем пример так-себе и мы его рассматривать не будем.
Я на основ этих примеров (отправки и получения данных) сделал свой пример. Для работы нам понадобится библиотека LORA. Ее можно скачать из стандартных библиотек по слову “LORA” вот так это выглядит:

Остальное уже у Вас в Arduino IDE по умолчанию установлено.
Теперь давайте расскажу про мой вариант.
Я взял модуль температуры и влажности DHT 22 и отправляю по Lora значения температуры и влажности каждые 5 секунд. По мимо этого, на приемнике я записываю значения температуры и влажности в разные переменные. Чтоб потом их использовать в дальнейшем (эта тема для следующей статьи, мы там будем делать бюджетную метеостанцию).
Код передатчика можно скачать отсюда: https://disk.yandex.ru/d/RBDg0cZmo8q6mQ
И он выглядит так:
#include <SPI.h>
#include <LoRa.h>
#include <Wire.h>
#include "DHT.h"
#define DHTPIN 23
#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 915E6
unsigned int counter = 0;
DHT dht(DHTPIN, DHT22);
String LoRaMessage = "";
void setup() {
pinMode(2,OUTPUT);
Serial.begin(115200);
dht.begin();
while (!Serial);
Serial.println("LoRa Sender Test");
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI0);
while (!LoRa.begin(915E6)) //433E6 - Asia, 866E6 - Europe, 915E6 - North America
{
Serial.println(".");
delay(500);
}
//LoRa.onReceive(cbk);
// LoRa.receive();
Serial.println("init ok");
delay(1500);
}
void loop() {
Serial.print("Sending packet: ");
float h = dht.readHumidity(); //Измеряем влажность
float t = dht.readTemperature(); //Измеряем температуру
LoRaMessage = "$" + String(dht.readHumidity()) + "&" + String(dht.readTemperature());
// send packet
Serial.print(dht.readTemperature());
LoRa.beginPacket();
LoRa.print(LoRaMessage);
LoRa.endPacket();
counter++;
digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
delay(5000); // wait for a second
}
Из кода видно, что датчик DHT22 подключен к 23 пину модуля Lora ESP32.
В скетче присутствуют значения 915E6 – это частота на которой работает Lora. Этот параметр используется в нескольких местах скетча. Если у Вас частота 868 Mhz, то значения надо поставить 866E6.
Так-же обратите внимание на вот эту строчку:
LoRaMessage = “$” + String(dht.readHumidity()) + “&” + String(dht.readTemperature());
Здесь значения температуры и влажности которые отправляются одной строчкой и разделены двумя символами. Перед влажностью стоит символ $ и перед температурой символ &.
Это нужно как-раз для того, чтоб на приемнике по этим символам различать, где в полученной строчке температура, а где влажность.
С передатчиком вроде разобрались. Давайте теперь приступим к приёмнику.
Скачать скетч приемника можно тут: https://disk.yandex.ru/d/PfxuKS-_B1F1jg
Выглядит он так:
#include <SPI.h>
#include <LoRa.h>
#include <Wire.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 915E6
String temperature;
String humidity;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Receiver Callback");
SPI.begin(SCK,MISO,MOSI,SS);
LoRa.setPins(SS,RST,DI0);
while (!LoRa.begin(915E6)) //433E6 - Asia, 866E6 - Europe, 915E6 - North America
{
Serial.println(".");
delay(500);
}
//LoRa.onReceive(cbk);
LoRa.receive();
Serial.println("init ok");
delay(1500);
}
void loop() {
int packetSize = LoRa.parsePacket();
if (packetSize) { Serial.print("Received packet '");
while (LoRa.available()) // read packet
{
String LoRaData = LoRa.readString();
Serial.print(LoRaData);
int pos1 = LoRaData.indexOf('$');
int pos2 = LoRaData.indexOf('&');
humidity = LoRaData.substring(pos1+1, pos2);
temperature = LoRaData.substring(pos2+1, LoRaData.length());
}
Serial.print("' with RSSI "); // print RSSI of packet
Serial.println(LoRa.packetRssi());
Serial.println(temperature);
Serial.println(humidity);
}
}
Здесь точно так-же меняем значения 915E6 в зависимости от Вашей частоты.
Далее, вот эта часть кода отвечает за сортировку температуры и влажности:
int pos1 = LoRaData.indexOf(‘$’);
int pos2 = LoRaData.indexOf(‘&’);
humidity = LoRaData.substring(pos1+1, pos2);
temperature = LoRaData.substring(pos2+1, LoRaData.length());
А точнее первые две строчки определяют символы $ и &. Вторые две строчки записывают для переменной humidity значение после символа “$”. А для переменной temperature записывают значения после символа “&”.
Вот и все. Пример получился простой, но в то -же время полезный. Всетаки мы уже можем получать температуру и влажность по протоколу LORA на расстоянии до 15 КМ при полной видимости.
А так-же этот пример легко изменить под себя, собственно для этого я его и создавал.
В дальнейшем у меня есть мысль сделать метеостанцию из самых дешевых датчиков, поставить ее в кладовке где не добивает мой домашний wi-fi. И отправлять значения с этих датчиков по LORA, а полученные данные отправлять по mqtt на сервер Home Assistant. И используя этот пример мне будет не сложно все изменить.