ESP32:Примеры/Прием и передача LoRa-данных при помощи ESP32

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Содержание

Прием и передача LoRa-данных при помощи ESP32

В этом примере мы запрограммируем две ESP32, чтобы они обменивались данными при помощи радиочастотных LoRa-сигналов. Мы также протестируем дальность действия LoRa-модулей.

Соответственно, для этого проекта над понадобятся две ESP32: одна будет отправлять сигналы, а другая – их получать. Кроме того, к ESP32, получающей данные, будет подключен OLED-дисплей, в котором она будет печатать присланные сообщения. Мы будем отправлять сообщение «hello» и то, сколько раз оно было отправлено. Это сообщение можно будет легко заменить на какие-то более полезные данные вроде уведомлений или данных, считанных с датчика.

Справочная информация

Использование LoRa с ESP32: введение

В этом Разделе мы изучим основные принципы работы технологии LoRa, а также рассмотрим, как ее можно использовать вместе с ESP32 для создания проектов в области интернета вещей. Стоит сразу сказать, что LoRa – это довольно большая тема со множеством функций и областей применения. Мы затронем лишь самые основы, чтобы вы могли использовать LoRa для работы с ESP32, не сильно углубляясь в теоретические дебри.

Что такое LoRa?

LoRa – это технология беспроводной передачи данных, использующая метод модуляции радиоволн, который может осуществляться чипами-трансиверами LoRa от компании Semtech.

LoRa introduction picture.png

Этот метод модуляции позволяет передавать маленькие порции данных (это значит, что у него небольшая пропускная способность) на большие расстояния. Кроме того, у него высокая стойкость к помехам и пониженное энергопотребление.

LoRa advantages.png

Частоты LoRa

LoRa использует нелицензированные частоты, доступные во всем мире. Вот чаще всего используемые частоты:

  • 868 МГц для Европы
  • 915 МГц для Северной Америки
  • 433 для Азии

Это нелицензированные частоты, поэтому ими может свободно пользоваться любой человек, ничего за это не платя и не покупая никакой лицензии. О том, какие частоты можно использовать для LoRa в вашей стране, можно узнать по этой ссылке.

Области применения LoRa

Большая дальность действия и энергоэффективность делают LoRa идеальной для работы с датчиками, питаемыми от батареи, и прочих ситуаций, требующих пониженного энергопотребления: интернет вещей (IoT), «умный дом», межмашинная коммуникация и пр.

LoRa applications.png

Таким образом, LoRa – это хороший выбор для систем датчиков, питаемых от батареек-таблеток или солнечной энергии, а также передающих маленькие порции данных.

LoRa – это плохой выбор для...

Имейте в виду, что LoRa не подходит для проектов, где...

  • Требуется высокая скорость передачи данных;
  • Требуется очень частая передача данных;
  • Имеют место сильно загруженные сети;

Сетевые топологии LoRa

Вы можете использовать LoRa для:

LoRa topologies.png
  • Коммуникации типа «точка-точка»
  • Создания LoRa-сети при помощи протокола LoRaWAN

Коммуникация «точка-точка»

При этом типе коммуникации друг с другом при помощи радиочастотных сигналов «общаются» только два LoRa-устройства.

LoRa point-to-point.png

К примеру, эта топология подходит для обмена данными между двумя ESP32-платами, которые находятся относительно далеко друг от друга или в месте, где нет WiFi-покрытия. Для LoRa-коммуникации эти ESP32 также нужно оснастить чипами-трансиверами LoRa (об этом ниже).

В отличие от WiFi- и Bluetooth-коммуникации, поддерживающих передачу данных только на короткие дистанции, два LoRa-устройства с хорошей антенной могут обмениваться данными на большие расстояния.

LoRa long distance.png

Плата ESP32, оснащенная LoRa-чипом, может осуществлять надежные получение/отправку данных на расстояние более 200 метров. Есть, впрочем, и LoRa-решения, у которых дальность действия составляет более 30 км.

LoRaWAN

Вы также можете создать LoRa-сеть при помощи протокола LoRaWAN.

Протокол LoRaWAN – это часть технологии LoRa, стандартизированная организацией LoRa Alliance под технологию LPWAN (англ. «low power wide area network», что можно перевести как «энергоэффективная сеть дальнего радиуса действия»).

Архитектура сети LoRaWAN

Типичная LoRa-сеть состоит из 4 частей:

  • Устройства
  • Шлюзы
  • Сетевой сервер
  • Приложения
LoRaWAN four parts.png

В LoRa-сети конечные устройства передают данные шлюзам. Шлюзы сканируют и ловят LoRa-пакеты. У конечных устройств нет привязки к конкретным шлюзам, и это значит, что сигнал будут получать все шлюзы, находящиеся в пределах дальности передачи данных устройства.

Затем шлюзы передают полученные данные сетевому серверу по TCP/IP, а он, в свою очередь, обрабатывает этот пакет. Затем приложение подключается к сетевому серверу, чтобы получить данные, присланные от конечного устройства.

LoRaWAN network.png

Виды LoRa-сети

В данный момент возможны два вида LoRa-сети:

  • Частная сеть
  • Публичная сеть

Вы можете создать собственную частную беспроводную сеть датчиков – для этого вам понадобится настроить собственные шлюз и сетевой сервер. Или вы можете воспользоваться уже готовой сторонней LoRaWAN-инфраструктурой, позволяющей пользоваться датчиками, не тратясь на покупку шлюза и сетевого сервера.

Публичные сети могут управляться телекоммуникационной компанией или сообществом людей. К примеру, вы можете создать, настроить и зарегистрировать собственный шлюз в IoT-сети The Things Network (TTN).

Вы можете разрешить другим людям использовать свой шлюз для передачи данных на дальние расстояния или можете воспользоваться общественными шлюзами. Чем больше людей будет делиться своими шлюзами, тем шире будет область LoRa-покрытия и следовательно – тем больше будет расстояние, на которое можно будет передавать LoRa-сообщения.

Как LoRa может пригодиться в проектах домашней автоматизации?

Давайте рассмотрим практическое применение технологии LoRa.

Допустим, вы фермер, и вам нужно измерить уровень влажности на вашем поле. Это поле недалеко от вашего дома, но WiFi до него не достает. Поэтому мы можем создать систему – состоящую из ESP32, датчика влажности и LoRa-чипа – и она будет дважды в день отправлять данные о влажности другой ESP32 с LoRa-чипом, находящейся у вас дома.

LoRa moisture monitoring.png

У «домашней» ESP32 есть доступ к WiFi, поэтому на ней можно настроить веб-сервер, передающий данные о влажности другим устройствам, подключенным к этой WiFi-сети.

LoRa web server moisture.png

Это просто пример, иллюстрирующий, как можно использовать LoRa для проектов на базе ESP32.

Итого

Итак:

LoRa advantages (full).png
  • LoRa – это технология модуляции радиоволн
  • LoRa позволяет передавать маленькие порции данных на большое расстояние и имеет низкие требования к электропитанию
  • Вы можете использовать LoRa для коммуникации типа «точка-точка» или в LoRaWAN-сети
  • LoRa может особенно пригодиться, если вам нужно отслеживать данные от датчиков, которые не находятся в зоне WiFi-покрытия

Дополнительно о LoRa

Как я уже говорил в начале Раздела, LoRa – это довольно большая (и сложная) тема, для полноценного раскрытия которой нужен отдельный курс. Поэтому, если вы хотите узнать о LoRa побольше, это можно сделать по ссылкам ниже:

Дополнительно о шлюзах LoRa

В этом Разделе мы более подробно расскажем о LoRa-шлюзах. Мы в этом курсе не будем объяснять, как собрать собственный LoRa/LoRaWAN шлюз, но предоставим дополнительные материалы для самостоятельного изучения этой темы.

Если вы хотите, чтобы у вас был собственный шлюз, которым можно было бы поделиться с сетью The Things Network, у вас есть несколько вариантов. Во-первых, его можно собрать самому, а во-вторых, можно купить более готовое коммерческое решение (это вариант подороже, но такую систему проще настроить). Ниже – об этих вариантах и руководствах по ним более подробно.

Шлюзы своими руками

Многие люди во всем мире делают собственные шлюзы при помощи недорогих компонентов:

Arduino LoRa-шлюз на базе ESP32

LoRa-шлюз на базе ESP32

LowCostLoRaGw 1.png

LoRa-шлюз можно собрать на базе ESP32 и трансивер-модуля RFM95, или на базе ESP32 со встроенным LoRa-модулем, а затем запрограммировать его при помощи кода из этого GitHub-репозитория.

Недорогой LoRa-шлюз на базе Raspberry Pi

Недорогой LoRa-шлюз на базе Raspberry Pi

A DIY low-cost LoRa gateway.JPG

В этом руководстве рассказывается, как собрать LoRa-шлюз на базе Raspberry Pi и недорогого трансивер-модуля LoRa вроде RFM95.

LoRa-шлюз при помощи платы IMST iC880a

LoRa-шлюз при помощи платы IMST iC880a

IMST iC880a 1.png

Это руководство называется «С нуля до LoRaWAN за неделю». В нем рассказывается, как создать шлюз при помощи платы IMST iC880a и Raspberry Pi. Плата IMST iC880a – это LoRaWAN-концентратор, работающий на частоте 868 МГц и способный получать пакеты от разных конечных устройств. Ее можно использовать вместе с Raspberry Pi, BeagleBone, Banana Pi и т.д., а ее стоимость составляет около 150 долларов.

LoRaWAN-шлюз при помощи модуля rak831 и Raspberry Pi

LoRaWAN-шлюз при помощи модуля rak831 и Raspberry Pi

Rak831 1.jpg

В этом руководстве рассказывается, как собрать LoRaWAN-шлюз при помощи модуля rak831 и платы Raspberry Pi. Комплект разработчика с модулем rak831 стоит около 150 долларов.

Коммерческие решения для шлюзов

Самый простой способ запустить и встроить в TTN-сеть собственный шлюз – это воспользоваться устройством Things Gateway, которое стоит 300 евро.

Кроме того, у The Things Network есть другие варианты для LoRa-шлюзов.

Что нужно сделать перед загрузкой кода

Трансивер-модули LoRa

Чтобы отправлять и получать LoRa-данные, помимо двух плат ESP32, нам также понадобятся два трансивер-модуля RFM95. Все LoRa-модули – это трансиверы, т.е. они могут и получать, и отправлять сообщения («transceiver» – это слово, объединяющее в себе слова «transmitter», т.е. «отправитель», и «receiver», т.е. «получатель»).

Rfm95-lora-module-868mhz-109990166-592.jpg

Вместо RFM95 можно использовать любой совместимый модуль вроде плат Semtech на базе SX1276/SX1277/SX1278/SX1279, включая RFM96W, RFM98W и т.д.

Также есть ESP32-платы, в которые уже встроены и LoRa-модуль, и OLED-дисплей – например, ESP32 Heltec WiFi Module или TTGO.

ESP32 Heltec WiFi Module.JPG


TTGO-LORA32-V2-0-433-868-915Mhz-ESP32-LoRa-OLED-0-96-Inch-SD-Card-Blue.jpg

Перед покупкой LoRa-трансивера обязательно узнайте, какие частоты можно использовать в вашей стране (например, на этой странице, где предоставлена информация о радиочастотных сигналах и законах, регулирующих эту область в разных странах). К примеру, в Португалии можно использовать частоты с 863 МГц по 870 МГц, а также 433 МГц. В нашем проекте мы воспользуемся модулем RFM95, работающем на частоте 868 МГц.

Rfm95 back plate 1.jpg

Частота этого LoRa-модуля RFM95 помечена на его задней стороне (см. фото выше). Убедитесь, что рабочая частота у покупаемого вами LoRa-модуля соответствует законам вашей страны.

Подготавливаем трансивер-модуль RFM95

Контактная макетная плата не подходит для использования с трансивером RFM95.

Кроме того, для него не подходит и стандартный гребешок с шагом между контактами 2.54 мм. Расстояние между контактами у RFM95 меньше, чем обычно.

Есть несколько способов, позволяющих получить доступ к контактам RFM95:

  • Провода можно припаять напрямую к контактам трансивера;
  • Можно согнуть штырьковые контакты и припаять каждый из них по отдельности;
  • Можно купить плату-переходник для подключения RFM95 к макетной плате;

Ниже – несколько вариантов плат-переходников для RFM95:

Rfm95w-breakout-v2 1-1200.jpg


T16-29-46.406Z-RFM95 breakout 1.jpg


Adapter board RFM65CW.jpg


Мы воспользуемся вторым способом – согнуть и припаять штырьковые гребешки к контактам RFM95 (см. фото ниже).

Handmade adapter for rfm95 1.PNG

После этого доступ к контактам RFM95 можно получить с помощью обычных проводов-перемычек. Кроме того, можно воспользоваться дополнительным двухсторонним гребешком контактов и с его помощью напрямую подключить RFM95 к макетной плате.

Handmade adapter for rfm95 2.PNG

Антенна

Трансивер-чипу RFM95 также нужна внешняя антенна, подключенная к контакту ANA.

Rfm95 antenna 1.PNG

Можно воспользоваться и «настоящей» антенной, и сделать ее самому при помощи токопроводящего провода (см. фото ниже). У некоторых плат-переходников есть специальный коннектор для подключения антенны.

Rfm95 antenna 2.PNG

Длина провода зависит от частоты:

  • 868 МГц – 86.3 мм (3.4 дюйма)
  • 915 МГц – 81.9 мм (3.22 дюйма)
  • 433 МГц – 173.1 мм (6.8 дюйма)

Для нашего модуля понадобится провод длиной 86.3 мм, припаянный напрямую к контакту ANA трансивера. Имейте в виду, что «настоящая» антенна позволит передавать данные на более длинную дистанцию.

Важно: Антенну НЕОБХОДИМО подключить к модулю.

Устанавливаем библиотеку LoRa

Перед загрузкой кода на ESP32 установите библиотеку для работы с LoRa. Есть несколько библиотек, упрощающих отправку и получение LoRa-пакетов при помощи ESP32. Мы будем использовать библиотеку «arduino-LoRa», разработанную пользователем sandeepmistry.

Откройте IDE Arduino, нажмите на «Скетч» > «Подключить библиотеку» > «Управлять библиотеками...» (Sketch > Include Library > Manage Libraries), а затем вбейте в поиске «lora». Найдите библиотеку «LoRa»(автор Sandeep Mistry) и установите ее.

Подробную документацию об этой библиотеке можно почитать в ее GitHub-репозитории.

Устанавливаем библиотеку «Adafruit SSD1306»

На LoRa-получателя, помимо библиотеки «arduino-LoRa», нужно установить библиотеку для печати данных на OLED-дисплей. Мы воспользуемся библиотекой «Adafruit SSD1306» (в абзаце ниже рассказывается, как ее установить, если она у вас еще не установлена):

Откройте IDE Arduino, кликните на «Скетч» > «Подключить библиотеку» > «Управлять библиотеками...» (Sketch > Include Library > Manage Libraries) и вбейте в поиске «oled». Найдите в поисковой выдаче библиотеку «Adafruit SSD1306» и установите ее.

Как работает код

LoRa-отправитель

Начинаем с подключения необходимых библиотек.

1 #include <SPI.h>
2 #include <LoRa.h>

Затем задаем контакты, к которым подключен модуль RFM95. Если вы подключили RFM95 согласно схеме, то в этом фрагменте можно оставить контакты, используемые по умолчанию. Если вы используете ESP32 со встроенным LoRa-модулем, вам нужно будет свериться с тем, какие контакты он использует и соответствующим образом поменять фрагмент ниже.

1 #define ss 5
2 #define rst 14
3 #define dio0 2

Далее инициализируем счетчик «counter», делая его начальным значением «0».

int counter = 0;

setup()

В блоке setup() инициализируем последовательную коммуникацию.

1 Serial.begin(115200);
2 while (!Serial);

С помощью метода setPins() задаем контакты для LoRa-модуля.

1 // настраиваем трансивер-модуль LoRa:
2 LoRa.setPins(ss, rst, dio0);
3 Инициализируем трансивер-модуль, указывая нужную частоту.
4 if (!LoRa.begin(866E6)) {
5     Serial.println("Starting LoRa failed!");
6                //  "Запуск LoRa не удался!"
7     while (1);
8   }

Вам, возможно, нужно будет поменять частоту в этом методе, чтобы она соответствовала частоте, используемой в вашем регионе. Выберите один из следующих вариантов:

  • 433E6
  • 866E6
  • 915E6

loop()

Затем в блоке loop() начинаем отправлять LoRa-пакеты. Инициализация пакета выполняется с помощью метода beginPacket().

LoRa.beginPacket();

Затем записываем данные в пакет при помощи метода print(). В двух строчках ниже мы отправляем сообщение «hello» и то, сколько раз оно было отправлено.

1 LoRa.print("hello ");  //  "привет"
2 LoRa.print(counter);

Затем закрываем пакет при помощи метода endPacket().

LoRa.endPacket();

После этого значение в переменной «counter» будет увеличено на «1». Это будет происходить с каждым новым циклом, который будет повторяться каждые 10 секунд.

1 counter++;
2 delay(10000);

Тестируем отправителя

Убедившись, что у вас выбраны правильные плата и COM-порт, загрузите этот код на ESP32.

После этого откройте монитор порта и нажмите на кнопку EN на ESP32. Если все настроено правильно, вы должны увидеть сообщение об успешной инициализации LoRa («LoRa Initializing OK!»). Кроме того, каждые 10 секунд счетчик (значение в переменной «counter») должен увеличиваться на «1».

LoRa-получатель

Начинаем с подключения библиотек, необходимых для LoRa-модуля и OLED-дисплея:

1 #include <SPI.h>
2 #include <LoRa.h>
3 #include <Wire.h>
4 #include <Adafruit_SSD1306.h>
5 #include <Adafruit_GFX.h>

Далее,задаем контакты, к которым подключен трансивер-модуль.

1 #define ss 5
2 #define rst 14
3 #define dio0 2

Также создаем объект для OLED-дисплея:

1 #define OLED_RESET 16
2 Adafruit_SSD1306 display(OLED_RESET);

setup()

В блоке setup() инициализируем дисплей и печатаем сообщение «LoRa-получатель».

1 Wire.begin();
2 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
3 display.clearDisplay();
4 display.setTextSize(1);
5 display.setTextColor(WHITE);
6 display.setCursor(0,0);
7 display.println("LoRa Receiver");  //  "LoRa-получатель"
8 display.display();

Далее инициализируем последовательную коммуникацию и печатаем сообщение «LoRa-получатель» в мониторе порта (в отладочных целях).

1 Serial.begin(115200);
2 while (!Serial);
3 Serial.println("LoRa Receiver");  //  "LoRa-получатель"

Присваиваем объекту LoRa-модуля контакты, к которым подключен LoRa-модуль.

LoRa.setPins(ss, rst, dio0);

Инициализируем трансивер и задаем сообщение на случай, если запуск LoRa не удастся:

1 if (!LoRa.begin(866E6)) {
2 Serial.println("Starting LoRa failed!");
3            //  "Запуск LoRa не удался!"
4 while (1);
5 }

Затем, как и в предыдущем скетче, меняем во фрагменте выше частоту на ту, что используется в вашем регионе:

  • 433E6
  • 866E6
  • 915E6

В случае, если инициализация LoRa-модуля прошла успешно, печатаем сообщение об этом:

1 Serial.println("LoRa Initializing OK!");
2            //  "Инициализация LoRa прошла успешно!"
3 display.setCursor(0,10);
4 display.println("LoRa Initializing OK!");
5            //  "Инициализация LoRa прошла успешно!"
6 display.display();

loop()

В блоке loop() получаем LoRa-пакеты и печатаем полученные сообщения.

Начинаем с проверки того, получен ли новый пакет – при помощи метода parsePacket().

int packetSize = LoRa.parsePacket();

В случае получения нового пакета показываем соответствующее сообщение («Received packet», т.е. «Пакет получен») на OLED-дисплее и в мониторе порта:

1 if (packetSize) {
2   // сообщаем о получении пакета:
3   Serial.print("Received packet ");  //  "Пакет получен "
4   display.clearDisplay();
5   display.setCursor(0,0);
6   display.print("Received packet ");  //  "Пакет получен "
7   display.display();

Для чтения присланных данных используем метод readString().

String LoRaData = LoRa.readString();

Присланные данные сохраняются в переменную «LoRaData», а печатаются на OLED-дисплей и в монитор порта:

1 Serial.print(LoRaData);
2 display.setCursor(0,10);
3 display.print(LoRaData);
4 display.display();

Наконец, при помощи фрагмента ниже печатаем RSSI присланного пакета в децибелах (дБ).

1 int rrsi = LoRa.packetRssi();
2 Serial.print(" with RSSI ");  // " с RSSI "
3 Serial.println(rrsi);
4 display.setCursor(0,20);
5 display.print("RSSI: ");  //  "RSSI: "
6 display.setCursor(30,20);
7 display.print(rrsi);
8 display.display();

Тестируем проект

Загрузите этот код на ESP32. И теперь давайте протестируем наш проект!

Подключите питание к обеим платам – и на ту, куда загружен скетч отправителя, и на ту, куда загружен скетч получателя. Спустя несколько секунд ESP32-получателю должны начать приходить сообщения от ESP32-отправителя.

Тестируем дальность коммуникации

Теперь давайте протестируем максимальную дальность передачи данных между двумя этими ESP32 с LoRa-модулями. Оставьте ESP32-отправителя дома, а ESP32-получателя (питаемого от портативной зарядки) возьмите с собой и выйдите из дома.

Итак, этот проект позволяет добиться стабильного сигнала на расстоянии до 250 метров. Эта цифра, впрочем, будет сильно варьироваться в зависимости от того, в какой местности вы находитесь – в городской и сельской – т.к. передаче сигнала может мешать обилие зданий и т.д.

Мы в этом проекте использовали для библиотеки «arduino-LoRa» настройки по умолчанию, но, если эти настройки нужным образом поменять, можно добиться увеличения дальности действия сигнала. Мы на этом заострять внимание не будем, но вы можете заглянуть в эту GitHub-дискуссию, где обсуждается, как настроить «arduino-LoRa», чтобы увеличить дальность действия LoRa-коммуникации.

Итого

Итак, в этом проекте мы научились отправлять сообщения при помощи LoRa между двумя ESP32-платами. Учтите, однако, что это очень простой пример, предназначенный лишь для тестирования LoRa-технологии на ESP32, и у него есть некоторые ограничения:

  • Пакет, отправляемый LoRa-отправителем, может быть получен любым LoRa-получателем, находящимся в диапазоне этой LoRa-коммуникации. И этот LoRa-получатель необязательно будет вашим.
  • Сообщения не зашифрованы, и это значит, что их может прочесть абсолютно любой
  • Отправитель не знает точно, получил ли получатель пакет или нет
  • Получатель ловит все LoRa-сообщения, рассылаемые в пределах его диапазона связи. Следовательно, если ваш сосед отправит LoRa-сообщение, ваш LoRa-получатель сможет его поймать. То есть вам нужно средство, позволяющее идентифицировать ваши собственные сообщения.

На этом пока все. Надеемся, этот проект помог вам разобраться, что такое LoRa, и вы теперь сможете использовать эту технологию в своих ESP32-проектах.

Необходимое оборудование

Схема

LoRa-отправитель

Оснастив RFM95 либо гребешком контактов, либо припаянными проводами, а также присоединив к нему антенну, подключите его к ESP32. Модуль будет «общаться» с ESP32 при помощи протокола SPI, поэтому мы будем использовать SPI-контакты ESP32. Подключите ESP32 к трансивер-модулю как показано на схеме ниже.

Esp32 lora sender 1.PNG

Схема выше, возможно, немного запутанная, поэтому, если вам что-то непонятно, можете дополнительно свериться с таблицей ниже:

Контакт модуля RFM95 Место присоединения Контакт модуля RFM95 Место присоединения
ANA Антенна GND -
GND GND на ESP32 DIO5 -
DIO3 - RESET GPIO14 на ESP32
DIO4 - NSS GPIO5
3.3V 3.3V на ESP32 SCK GPIO18 на ESP32
DIO0 GPIO2 на ESP32 MOSI GPIO23 на ESP32
DIO1 - MISO GPIO19 на ESP32
DIO2 - GND -

Примечание: У трансивер-модуля RFM95 три контакта GND. Какой из них использовать – неважно, но вы должны подключить к «земле» по крайней мере один из них.

LoRa-получатель

Подключите ко второй ESP32 трансивер-модуль RFM95 и OLED-дисплей согласно схеме ниже. OLED-дисплей использует протокол I2C, поэтому мы воспользуемся I2C-контактами ESP32: GPIO21 и GPIO22.

Esp32 lora reciever 1.PNG

В таблице ниже показано то, какие контакты нужно подключить между ESP32 и трансивер-модулем RFM95 (кроме контакта ANA на RFM95 – к нему подключается антенна):

Модуль RFM95 Место подключения Модуль RFM95 Место подключения
ANA Антенна GND -
GND GND на ESP32 DIO5 -
DIO3 - RESET GPIO14 на ESP32
DIO4 - NSS GPIO5 на ESP32
3.3V 3.3V на ESP32 SCK GPIO18 на ESP32
DIO0 GPIO2 на ESP32 MOSI GPIO23 на ESP32
DIO1 - MISO GPIO19 на ESP32
DIO2 - GND -

В таблице ниже показано то, какие контакты нужно подключить между ESP32 и OLED-дисплеем:

OLED-дисплей ESP32
GND GND
VCC 3.3V
SCK GPIO22
SDA GPIO21

Код

Скетч для отправителя

 1 /*********
 2   Руи Сантос
 3   Более подробно о проекте на: http://randomnerdtutorials.com  
 4 *********/
 5 
 6 #include <SPI.h>
 7 #include <LoRa.h>
 8 
 9 // задаем контакты, используемые модулем-трансивером:
10 #define ss 5
11 #define rst 14
12 #define dio0 2
13 
14 int counter = 0;
15 
16 void setup() {
17   // инициализируем последовательную коммуникацию:
18   Serial.begin(115200);
19   while (!Serial);
20   Serial.println("LoRa Sender");  // "LoRa-отправитель"
21 
22   // настраиваем трансивер-модуль LoRa:
23   LoRa.setPins(ss, rst, dio0);
24   
25   // замените параметр в методе LoRa.begin(---E-)
26   // на частоту, используемую в вашем регионе; 
27   // 433E6 – для Азии
28   // 866E6 – для Европы
29   // 915E6 – для Северной Америки
30   if (!LoRa.begin(866E6)) {
31     Serial.println("Starting LoRa failed!");
32                //  "Запуск LoRa не удался!"
33     while (1);
34   }
35   Serial.println("LoRa Initializing OK!");
36              //  "Инициализация LoRa прошла успешно!"
37 }
38 
39 void loop() {
40   Serial.print("Sending packet: ");  //  "Сколько раз отправлен пакет: "
41   Serial.println(counter);
42 
43   // отправляем LoRa-пакет получателю:
44   LoRa.beginPacket();
45   LoRa.print("hello ");  //  "привет"
46   LoRa.print(counter);
47   LoRa.endPacket();
48 
49   counter++;
50 
51   delay(10000);
52 }

Скетч для получателя

  1 /*********
  2   Руи Сантос
  3   Более подробно о проекте на: http://randomnerdtutorials.com  
  4 *********/
  5 
  6 #include <SPI.h>
  7 #include <LoRa.h>
  8 #include <Wire.h>
  9 #include <Adafruit_SSD1306.h>
 10 #include <Adafruit_GFX.h>
 11 
 12 // задаем контакты, используемые трансивер-модулем:
 13 #define ss 5
 14 #define rst 14
 15 #define dio0 2
 16 
 17 #define SCREEN_WIDTH 128 // ширина OLED-дисплея (в пикселях)
 18 #define SCREEN_HEIGHT 64 // высота OLED-дисплея (в пикселях)
 19 
 20 // объявляем SSD1306-дисплей, подключенный к I2C (контакты SDA, SCL):
 21 #define OLED_RESET     4  // контакт сброса, (или «-1», если это
 22                           // тот же контакт, что и у Arduino)
 23 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 24 
 25 void setup() { 
 26   // параметр «SSD1306_SWITCHCAPVCC» задает,
 27   // что напряжение от дисплея будет идти
 28   // от внутренней 3.3-вольтовой сети,
 29   // а параметр «0x3C» означает «128x32»:
 30   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
 31     Serial.println(F("SSD1306 allocation failed"));
 32                  //  "Инициализация SSD1306 не удалась"
 33     for(;;); // не продолжаем,
 34              // оставляем этот цикл работать вечно
 35   }
 36   
 37   display.clearDisplay();
 38   display.setTextSize(1);
 39   display.setTextColor(WHITE);
 40   display.setCursor(0,0);
 41   display.println("LoRa Receiver");  // "LoRa-получатель"
 42   display.display();
 43   
 44   Serial.begin(115200);
 45   while (!Serial);
 46   Serial.println("LoRa Receiver");  // "LoRa-получатель"
 47   
 48   // настраиваем трансивер-модуль LoRa:
 49   LoRa.setPins(ss, rst, dio0);
 50 
 51   // в параметре метода LoRa.begin(---E-) укажите частоту,
 52   // соответствующую региону вашего проживания; 
 53   // примечание: она должна соответствовать частоте отправителя;
 54   // 433E6 для Азии
 55   // 866E6 для Европы
 56   // 915E6 для Северной Америки
 57   if (!LoRa.begin(866E6)) {
 58     Serial.println("Starting LoRa failed!");
 59                //  "Запуск LoRa не удался!"
 60     while (1);
 61   }
 62   Serial.println("LoRa Initializing OK!");
 63              //  "Инициализация LoRa прошла успешно!"
 64   display.setCursor(0,10);
 65   display.println("LoRa Initializing OK!");
 66               //  "Инициализация LoRa прошла успешно!"
 67   display.display();
 68 }
 69 
 70 void loop() {
 71   // проверяем, был ли получен пакет:
 72   int packetSize = LoRa.parsePacket();
 73   if (packetSize) {
 74     // сообщаем, что пакет получен:
 75     Serial.print("Received packet ");  //  "Пакет получен "
 76     display.clearDisplay();
 77     display.setCursor(0,0);
 78     display.print("Received packet ");  //  "Пакет получен "
 79     display.display();
 80 
 81     // считываем пакет:
 82     while (LoRa.available()) {
 83       String LoRaData = LoRa.readString();
 84       Serial.print(LoRaData);
 85       display.setCursor(0,10);
 86       display.print(LoRaData);      
 87       display.display();
 88     }
 89 
 90     // печатаем RSSI пакета:
 91     int rrsi = LoRa.packetRssi();
 92     Serial.print(" with RSSI ");  //  " с RSSI"
 93     Serial.println(rrsi);
 94     display.setCursor(0,20);
 95     display.print("RSSI: ");  //  "RSSI: "
 96     display.setCursor(30,20);    
 97     display.print(rrsi);
 98     display.display();
 99   }
100 }

См.также

Внешние ссылки