В этой статье мы изучим взаимодействие модуля LoRa SX1278 Ra-02 с платой STM32 Blue Pill. Модуль Ra-02 использует микросхему SX1278 и работает на частоте 433 МГц. Используя скачкообразное изменение частоты, он обеспечивает сбалансированное качество передачи сигнала — охватывает диапазон 420–450 МГц. LoRa SX1278 работает с протоколом связи SPI, поэтому его можно использовать с любым микроконтроллером, поддерживающим протокол SPI. Модуль SX1278 можно легко подключить к чипу STM32F103 с помощью интерфейса SPI.
Статья состоит из двух примеров. В первом примере мы отправим простое сообщение «Hello World» от LoRa передатчика к LoRa приемнику. А во втором примере мы отправим данные датчика BME280 по беспроводной связи LoRa. Датчик барометрического давления BME280 предоставляет информацию о барометрическом давлении, температуре, влажности и приблизительной высоте.
Ранее на нашем сайте мы рассматривали подключение модуля LoRa SX1278 к следующим микроконтроллерам и платам:
Также можете прочитать про то, как работают технологии LoRa и LoRaWAN.
Необходимые компоненты
- Плата STM32F103C8 (STM32 Blue Pill) (купить на AliExpress).
- SX1278 433MHz LoRa Module (модуль LoRa на 433 МГц) – 2 шт. (купить на AliExpress).
- 433MHz LoRa antenna – 2 шт. (купить на AliExpress).
- Датчик BME280 (купить на AliExpress).
- Источник питания 5 В.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Предупреждение: всегда используйте модули LoRa SX1278 вместе с антеннами на 433 МГц, иначе модули могут повредиться во время работы.
Модуль LoRa SX1278
Микросхема SX1278 Ra-02 производится компанией Semtech. Радиочастотный модуль SX1278 в основном используется для широкополосной связи на большие расстояния. Он может выдерживать минимальное потребление тока и имеет высокую чувствительность -148 дБм при выходной мощности +20 дБм. Можно достичь большого расстояния передачи почти в 5 км с высокой надежностью. Таким образом, SX1278 отлично подходит для приложений IoT для отправки данных датчиков в облако на большие расстояния.
Этот модуль использует микросхему SX1278 от компании SEMTECH и работает на частоте 433 МГц. Скачкообразное изменение частоты, которое обеспечивает вам сбалансированное качество передачи сигнала, охватывает диапазон 420-450 МГц. Эта возможность беспроводной связи дальнего действия упакована в небольшой (17 x 16 мм) корпус и поставляется без антенны.
Распиновка SX1278
Контакт 1: ANT – предназначен для подключения антенны.
Контакты 2, 9, 16: GND – заземляющие контакты общего заземления с источником питания и контроллерами.
Контакт 3: 3,3 В — для подачи питания на устройство.
Контакт 4: RESET (СБРОС) – предназначен для сброса модуля посредством внешнего сигнала.
Контакты 5, 6, 7, 8, 10, 11: DIO0, DIO1, DIO2, DIO3, DIO4, DIO5 – для выполнения общей функции ввода-вывода через модуль помогут контакты DIO. Их можно настроить как контакты прерываний.
Контакт 12: SCK – предназначен для тактовых импульсов во время связи по SPI.
Контакт 13: MISO – MISO означает Master in и Slave out, он передает данные от модуля к контроллеру. Master (ведущий) – это контроллер, а SX1278 – это Slave (ведомый).
Контакт 14: MOSI – MOSI означает «Master Out/Slave In». Таким образом, этот контакт будет получать данные от контроллера.
Контакт 15: NSS – это контакт выбора/включения микросхемы, который поможет активировать ведомое устройство.
Распределение частот LoRa
Частоты, на которых работают типовые модули LoRa, не везде являются законными. Например, в Индии нелицензируемый диапазон частот составляет от 865 МГц до 867 МГц. Там разрешено использовать только этот диапазон частот. SX1278 имеет частоту 433 МГц, поэтому его в Индии не разрешено использовать в течение длительного времени, за исключением академических целей. Аналогично, проверьте разрешенные диапазоны в вашей стране на предмет того какие частоты LoRa вы можете использовать. Модули LoRa доступны в различных диапазонах частот, наиболее распространенными из которых являются 433 МГц, 915 МГц и 868 МГц.
Взаимодействие LoRa SX1278 с STM32
Теперь давайте соединим модуль LoRa SX1278 с платой STM32F103C и сделаем передатчик/приемник LoRa на их основе. Соединения между SX1278 и STM32F103 выглядят следующим образом:
Схема, реализующая эти соединения, приведена на следующем рисунке. Вы можете собрать пару таких схем на макетной плате. Одна из схем будет работать как передатчик (отправитель), а другая как приемник.
Собранная на двух макетных платах конструкция проекта показана на следующем рисунке.
Библиотека LoRa для STM32
Библиотека Arduino LoRa не поддерживается платой STM32F103. Поэтому для платы STM32F103 для Arduino IDE существует модифицированная библиотека. Библиотека STM32 LoRa используется для отправки и получения данных с использованием радиомодулей LoRa.
Эта библиотека напрямую раскрывает возможности радио LoRa и позволяет отправлять данные на любые радиостанции в радиусе действия с теми же параметрами радиосвязи. Все данные передаются в эфир, и адресация не требуется. Загрузить: библиотека STM32 LoRa
Исходные коды передатчика и приемника
Код передатчика
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 |
#include <SPI.h> #include <LoRa_STM32.h> #define SS PA4 #define RST PB0 #define DI0 PA1 #define TX_P 17 #define BAND 433E6 #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 433E6 #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()); } } |
Результат
Беспроводная отправка данных датчиков с использованием модуля LoRa
Давайте теперь рассмотрим второй пример. В этом примере мы будем подключать модуль SX1278 с датчиком BME280 к схеме передатчика. BME280 — это интегрированный датчик окружающей среды, разработанный специально для мобильных приложений, обладающий высокой линейностью и точностью для измерений давления, влажности и температуры. Проект метеостанции на основе данного датчика мы рассматривали в этой статье.
Датчик работает по протоколу I2C, поэтому его выводы I2C, т.е. SDA и SCL, подключены к контактам PB7 и PB6 платы STM32 соответственно. Мы будем отправлять показания датчика BME280 по беспроводной сети с передатчика STM32 LoRa на приемник STM32 LoRa.
Печатная плата для проекта
Если вы не хотите собирать схему на макетной плате и вам нужна печатная плата для проекта, то вот печатная плата для вас. Печатная плата для STM32 LoRa SX1278 Sender & Receiver разработана с использованием онлайн-инструмента проектирования схем и печатных плат EasyEDA. Изображение печатной платы передатчика приведено на следующем рисунке.
Аналогично ниже приведено изображение печатной платы приемника.
Файлы Gerber для этих печатных плат вы можете скачать по следующим ссылкам:
Исходный код программ для варианта с датчиком BME280
Код передатчика и приемника на основе LoRa SX1278 и STM32 приведен ниже. Код передатчика требует библиотеку BME280. Загрузите библиотеку BME280 по этой ссылке: Библиотека BME280
Код передатчика
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 |
#include <Wire.h> #include <SPI.h> #include <LoRa_STM32.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define NSS PA4 #define RST PB0 #define DI0 PA1 #define TX_P 17 #define BAND 433E6 #define ENCRYPT 0x78 int counter = 0; String LoRaMessage = ""; #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; 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); } if (!bme.begin(0x76)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } } void loop() { float temperature = bme.readTemperature(); float pressure = bme.readPressure() / 100.0F; float altitude = bme.readAltitude(SEALEVELPRESSURE_HPA); float humidity = bme.readHumidity(); Serial.print(F("Sending packet: ")); Serial.println(counter); Serial.print(F("Temperature = ")); Serial.print(temperature); Serial.println(F("*C")); Serial.print(F("Pressure = ")); Serial.print(pressure); Serial.println(F("hPa")); Serial.print(F("Approx. Altitude = ")); Serial.print(altitude); Serial.println(F("m")); Serial.print(F("Humidity = ")); Serial.print(humidity); Serial.println(F("%")); Serial.println(); LoRaMessage = String(counter) + "/" + String(temperature) + "&" + String(pressure) + "#" + String(altitude) + "@" + 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 |
#include <SPI.h> #include <LoRa_STM32.h> #define SS PA4 #define RST PB0 #define DI0 PA1 #define TX_P 17 #define BAND 433E6 #define ENCRYPT 0x78 String counter; String temperature; String pressure; String altitude; 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); } } void loop() { // try to parse packet int pos1,pos2,pos3,pos4; 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('&'); pos3 = LoRaData.indexOf('#'); pos4 = LoRaData.indexOf('@'); counter = LoRaData.substring(0, pos1); temperature = LoRaData.substring(pos1+1,pos2); pressure = LoRaData.substring(pos2+1,pos3); altitude = LoRaData.substring(pos3+1,pos4); humidity = LoRaData.substring(pos4+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("Pressure = ")); Serial.print(pressure); Serial.println(F("hPa")); Serial.print(F("Approx. Altitude = ")); Serial.print(altitude); Serial.println(F("m")); Serial.print(F("Humidity = ")); Serial.print(humidity); Serial.println(F("%")); Serial.println(); } } |