В данной статье мы рассмотрим взаимодействие модуля LoRa LR1276/SX1276 с платой STM32F103C8 (Blue Pill). Модуль LR1276UA-A-915 использует микросхему SX1276 и работает на частоте 915 МГц. Используя скачкообразное изменение частоты, он обеспечивает сбалансированное качество передачи сигнала, охватывая диапазон 915 МГц. LoRa LR1276/SX1276 работает с протоколом связи SPI, поэтому его можно использовать с любым микроконтроллером, поддерживающим интерфейс SPI. Поэтому модуль SX1276 или LR1276 можно легко подключить к чипу STM32F103.
Статья состоит из двух примеров. В первом примере мы отправим простое сообщение «Hello World» от передатчика LoRa к приемнику. А во втором примере мы будем передавать данные датчика по беспроводной связи LoRa. Датчик влажности и температуры DHT11 лучше всего подходит для этого тестового примера.
Мы уже рассматривали на нашем сайте подключение модуля LoRa SX1278 к плате STM32 Blue Pill. Но Gplus-IoT LR1276 — это модуль SPI с лучшей производительностью чем модуль LoRa SX1278.
Ранее на нашем сайте мы рассматривали подключение различных модулей LoRa к следующим микроконтроллерам и платам:
Также вы можете прочитать про то, как работают технологии LoRa и LoRaWAN.
Необходимые компоненты
- Плата STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- Модуль LoRa LR1276/SX1276 – 2 шт.
- Датчик температуры и влажности DHT11 (купить на AliExpress).
- Литиевая батарея 3,7 В.
- Модуль OLED дисплея SSD1306 128×64 с диагональю 0.96 дюйма и интерфейсом I2C (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Модуль LoRa LR1276/SX1276
Модуль LR1276 разработан на основе SX1276. SX1276 включает в себя модем LoRa с расширенным спектром, который способен достигать значительно большего диапазона, чем существующие системы на основе модуляции FSK или OOK. При максимальных скоростях передачи данных LoRa чувствительность на 8 дБ лучше, чем FSK. Но использование недорогого списка материалов с 2Oppm XTAL LoRa может улучшить чувствительность приемника более чем на 20 дБ по сравнению с FSK.
LoRa также обеспечивает значительные преимущества в селективности и блокировке, что еще больше повышает надежность связи. Для максимальной гибкости пользователь может выбрать ширину полосы модуляции расширенного спектра (BW), коэффициент расширения (SF) и скорость исправления ошибок (CR). Еще одним преимуществом модуляции расширенного спектра является то, что каждый коэффициент расширения является ортогональным. Это означает, что несколько передаваемых сигналов могут занимать один и тот же канал без помех.
Это также позволяет простое сосуществование с существующими системами на основе FSK. Стандартная модуляция GFSK, FSK, 00K и GMSK также предоставляется для обеспечения совместимости с существующими системами или стандартами, такими как беспроводной MBUS и IEEE 802.15.4g.
Характеристики LR1276/SX1276
- Модем LoRa.
- Максимальный бюджет линии связи 168 дБ.
- +20 дБм – 100 мВт постоянная выходная мощность ВЧ в зависимости от напряжения питания.
- +14 дБм высокоэффективный усилитель мощности.
- Программируемая скорость передачи данных до 300 кбит/с.
- Высокая чувствительность: до -148 дБм.
- Пуленепробиваемый входной каскад: IIP3 = -11 дБм.
- Превосходный блокирующий иммунитет.
- Рабочее напряжение 1,8-3,7 В.
- Низкий ток приема 9,9 мА, сохранение регистра 200 нА.
- Полностью интегрированный синтезатор с разрешением 61 Гц.
- Модуляция FSK, GFSK, MSK, GMSK, LoRaTM и 00K.
- Встроенный битовый синхронизатор для восстановления тактовой частоты.
- Обнаружение преамбулы.
- Динамический диапазон RSSI 127 дБ.
- Автоматическое считывание радиочастот и САПР с ультрабыстрой АПЧ.
- Пакетный движок до 256 байт с CRC.
- Встроенный датчик температуры и индикатор низкого заряда батареи.
Приложения
- Автоматизированное считывание показаний счетчиков.
- Автоматизация домов и зданий.
- Беспроводные системы сигнализации и безопасности.
- Промышленный мониторинг и контроль.
- Система дальнего орошения.
Распиновка LR1276/SX1276
Модуль Gplus-IoT LoRa LR1276 имеет в общей сложности 18 контактов, функциональные возможности которых следующие:
Проектирование коммутационной платы LR1276
Чип Gplus-IoT LR1276 очень маленький по размеру, поэтому его очень сложно соединить с любым контроллером. Поэтому я разработал небольшую плату с помощью программного обеспечения EasyEDA и преобразовал ее в печатную плату. Схема печатной платы выглядит примерно так.
Файл Gerber для печатной платы приведен ниже. Вы можете просто скачать файл Gerber и заказать изготовление печатной платы в любом сервисе, в котором вы привыкли это делать.
Затем я впаял чип LR1276 в эту печатную плату. У чипа SX1276 очень маленький зазор между двумя последовательными штырьками. Поэтому для пайки компонентов требуются хорошие навыки пайки.
Библиотека LoRa для STM32
Библиотека Arduino LoRa не поддерживается платой STM32F103 . Поэтому для платы STM32F103 для Arduino IDE существует модифицированная библиотека. Библиотека STM32 LoRa используется для отправки и получения данных с использованием радиомодулей LoRa.
Эта библиотека напрямую раскрывает радио LoRa и позволяет отправлять данные на любые радиостанции в радиусе действия с теми же параметрами радиосвязи. Все данные передаются в эфир, и адресация не требуется.
Отправка текстового сообщения через радиосвязь LoRa
Схема проекта
Теперь давайте соединим модуль LoRa LR1276/SX1276 с платой STM32F103C и сделаем простое устройство STM32 LoRa отправитель/получатель. Соединения между SX1276 и STM32F103 выглядят следующим образом:
Вы можете собрать пару схем (с указанными соединениями) на макетной плате. Одна из схем будет работать как передатчик/отправитель, а другая как приемник.
Исходный код программ
Код передатчика
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <SPI.h> #include <LoRa_STM32.h> #define SS PA4 #define RST PB0 #define DI0 PA1 #define TX_P 17 #define BAND 915E6 #define ENCRYPT 0x78 int counter = 0; void setup() { Serial.begin(115200); while (!Serial); Serial.println("LoRa Sender"); LoRa.setTxPower(TX_P); LoRa.setSyncWord(ENCRYPT); LoRa.setPins(SS, RST, DI0); if (!LoRa.begin(BAND)) { Serial.println("Starting LoRa failed!"); while (1); } } void loop() { Serial.print("Sending packet: "); Serial.println(counter); // send packet LoRa.beginPacket(); LoRa.print("hello "); LoRa.print(counter); LoRa.endPacket(); counter++; delay(5000); } |
Код приемника
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <SPI.h> #include <LoRa_STM32.h> #define SS PA4 #define RST PB0 #define DI0 PA1 #define TX_P 17 #define BAND 915E6 #define ENCRYPT 0x78 void setup() { Serial.begin(115200); while (!Serial); Serial.println("LoRa Receiver"); LoRa.setTxPower(TX_P); LoRa.setSyncWord(ENCRYPT); LoRa.setPins(SS, RST, DI0); if (!LoRa.begin(BAND)) { Serial.println("Starting LoRa failed!"); while (1); } } void loop() { // try to parse packet int packetSize = LoRa.parsePacket(); if (packetSize) { // received a packet Serial.print("Received packet '"); // read packet while (LoRa.available()) { Serial.print((char)LoRa.read()); } // print RSSI of packet Serial.print("' with RSSI "); Serial.println(LoRa.packetRssi()); } } |
Тестирование и результаты
После загрузки кода в платы откройте Serial Monitor (окно монитора последовательной связи) для передатчика и приемника. Передатчик будет отправлять данные, а приемник будет их получать.
Беспроводная отправка данных датчиков с использованием модуля LoRa
Схема и подключение
Давайте теперь рассмотрим второй пример. В этом примере мы будем подключать модуль SX1276 с датчиком DHT11 к схеме передатчика. DHT11 — это базовый, сверхдешевый цифровой датчик температуры и влажности. Он использует емкостный датчик влажности и термистор для измерения окружающего воздуха и выдает цифровой сигнал на вывод данных.
Работа датчика не требует аналогового соединения, а если он подключен к цифровому выводу, то выдает выходной сигнал. Мы отправим показания датчика DHT11 по беспроводной сети с передатчика STM32 LoRa на приемник STM32 LoRa.
В части приемника мы добавили в схему 0,96-дюймовый I2C OLED-дисплей. Подключите контакты VCC и GND OLED дисплея к контактам STM32 3,3 В и GND соответственно. Затем подключите контакты SDA и SCL OLED дисплея к контактам PB7 и PB6 STM32 соответственно.
Исходный код программ
Код передатчика и приемника в этом случае требует ряда библиотек. Загрузите все эти библиотеки и добавьте их через менеджер библиотек.
1. Библиотека DHT11 : https://github.com/adafruit/DHT-sensor-library
2. Библиотека Adafruit GFX : https://github.com/adafruit/Adafruit-GFX-Library
3. Библиотека Adafruit SSD1306 : https://github.com/adafruit/Adafruit_SSD1306
Код отправителя
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#include <SPI.h> #include <LoRa_STM32.h> #include<DHT.h> //Library for using DHT sensor #define DHTPIN PA0 #define DHTTYPE DHT11 #define NSS PA4 #define RST PB0 #define DI0 PA1 #define TX_P 17 #define BAND 915E6 #define ENCRYPT 0x78 int counter = 0; String LoRaMessage = ""; DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(115200); while (!Serial); Serial.println(F("LoRa Sender")); //LoRa.setTxPower(TX_P); LoRa.setSyncWord(ENCRYPT); LoRa.setPins(NSS, RST, DI0); if (!LoRa.begin(BAND)) { Serial.println(F("Starting LoRa failed!")); while (1); } dht.begin(); } void loop() { float humidity = dht.readHumidity(); //Gets Humidity value float temperature = dht.readTemperature(); //Gets Temperature value Serial.print(F("Sending packet: ")); Serial.println(counter); Serial.print(F("Temperature: ")); Serial.print(temperature); Serial.println(F("*C")); Serial.print(F("Humidity: ")); Serial.print(humidity); Serial.println(F("%")); Serial.println(); LoRaMessage = String(counter) + "/" + String(temperature) + "&" + String(humidity); // send packet LoRa.beginPacket(); LoRa.print(LoRaMessage); LoRa.endPacket(); counter++; delay(3000); } |
Код приемника
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <LoRa_STM32.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); #define SS PA4 #define RST PB0 #define DI0 PA1 #define TX_P 17 #define BAND 915E6 #define ENCRYPT 0x78 String counter; String temperature; String humidity; void setup() { Serial.begin(115200); while (!Serial); Serial.println("LoRa Receiver"); //LoRa.setTxPower(TX_P); LoRa.setSyncWord(ENCRYPT); LoRa.setPins(SS, RST, DI0); if (!LoRa.begin(BAND)) { Serial.println("Starting LoRa failed!"); while (1); } if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } } void loop() { // try to parse packet int pos1, pos2; int packetSize = LoRa.parsePacket(); if (packetSize) { // received a packet Serial.print("Received packet: "); String LoRaData = LoRa.readString(); Serial.print(LoRaData); // read packet while (LoRa.available()) { Serial.print((char)LoRa.read()); } // print RSSI of packet Serial.print("' with RSSI "); Serial.println(LoRa.packetRssi()); pos1 = LoRaData.indexOf('/'); pos2 = LoRaData.indexOf('&'); counter = LoRaData.substring(0, pos1); temperature = LoRaData.substring(pos1 + 1, pos2); humidity = LoRaData.substring(pos2 + 1, LoRaData.length()); Serial.print(F("Packet No. = ")); Serial.println(counter); Serial.print(F("Temperature = ")); Serial.print(temperature); Serial.println(F("*C")); Serial.print(F("Humidity = ")); Serial.print(humidity); Serial.println(F("%")); Serial.println(); display.clearDisplay(); display.setTextColor(WHITE); display.setTextSize(2); display.setCursor(0, 10); display.print("T: "); display.print(temperature); display.print("*C"); display.setTextSize(2); display.setCursor(0, 40); display.print("H: "); display.print(humidity); display.print("%"); display.display(); delay(500); } } |
Тестирование и результаты
После загрузки кода на обе схемы (передатчика и приемника) запустится передатчик LoRa. Это означает, что код передатчика будет считывать данные о влажности и температуре с датчика DHT11 и отправлять их по беспроводной сети.
На другой стороне приемник LoRa будет получать данные по беспроводной связи. Полученные данные будут отображаться на OLED-дисплее. Значение температуры и влажности обновляется каждый раз, когда принимается пакет данных.
Подскажите пожалуйста, как в данном проекте применить датчик DHT22? Перепробовал кучу библиотек. Работает только с DHT11. Спасибо!
В этой статье есть свежий пример как работать с DHT22. Не уверен, правда, что эта библиотека работает с STM32 Blue Pill, но попробовать можно. Там нужно еще в начале программы define DHTTYPE DHT22, а не define DHTTYPE DHT11 прописывать чтобы работать именно с датчиком DHT22
Имя датчика я изменял. Но с STM32 номер не прошел. На NANO они меняются запросто. Поменял название и всё! Жалко если не получится, всё уже собрано капитально.
А вот эту статью вы смотрели? Если в ней имя датчика в программе поменять получается работать с DHT22 или нет?
Пробовал ради эксперимента. Но не получилось. Отображаются нули.