
Купить модули можно тут: 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. И используя этот пример мне будет не сложно все изменить.