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