Оглавление:

Беспроводная связь LoRa от 3 до 8 км с недорогим устройством E32 (sx1278 / sx1276) для Arduino, Esp8266 или Esp32: 15 шагов
Беспроводная связь LoRa от 3 до 8 км с недорогим устройством E32 (sx1278 / sx1276) для Arduino, Esp8266 или Esp32: 15 шагов

Видео: Беспроводная связь LoRa от 3 до 8 км с недорогим устройством E32 (sx1278 / sx1276) для Arduino, Esp8266 или Esp32: 15 шагов

Видео: Беспроводная связь LoRa от 3 до 8 км с недорогим устройством E32 (sx1278 / sx1276) для Arduino, Esp8266 или Esp32: 15 шагов
Видео: Радиомодули EBYTE E22 LoRa 433мГц, обзор и тест дальности 2024, Июль
Anonim
Беспроводная связь LoRa от 3 до 8 км с недорогим устройством E32 (sx1278 / sx1276) для Arduino, Esp8266 или Esp32
Беспроводная связь LoRa от 3 до 8 км с недорогим устройством E32 (sx1278 / sx1276) для Arduino, Esp8266 или Esp32

Я создаю библиотеку для управления EBYTE E32 на базе устройства LoRa серии Semtech, очень мощного, простого и дешевого устройства.

Вы можете найти версию для 3 км здесь, версию для 8 км здесь

Они могут работать на расстоянии от 3000 до 8000 м, и у них есть множество функций и параметров. Поэтому я создаю эту библиотеку, чтобы упростить использование.

Это решение для получения данных с городских датчиков или для управления дроном.

Запасы

Arduino UNO

Wemos D1 mini

LoRa E32 TTL 100 3 км версия

LoRa E32 TTL 1 Вт 8 км версия

Шаг 1. Библиотека

Библиотека
Библиотека

Вы можете найти мою библиотеку здесь.

Скачать.

Нажмите кнопку СКАЧАТЬ в правом верхнем углу, переименуйте несжатую папку в LoRa_E32.

Убедитесь, что папка LoRa_E32 содержит файлы LoRa_E32.cpp и LoRa_E32.h.

Поместите папку библиотеки LoRa_E32 в вашу папку / libraries /. Вам может потребоваться создать подпапку библиотек, если это ваша первая библиотека.

Перезагрузите IDE.

Шаг 2: распиновка

Распиновка
Распиновка
Распиновка
Распиновка
Распиновка
Распиновка

Как видите, вы можете устанавливать различные режимы с помощью контактов M0 и M1.

Есть несколько контактов, которые можно использовать статическим образом, но если вы подключите их к микроконтроллеру и настроите их в библиотеке, вы повысите производительность, и вы сможете управлять всеми режимами через программное обеспечение, но мы собираемся объяснить лучше дальше.

Шаг 3: вывод AUX

Вывод AUX
Вывод AUX
Вывод AUX
Вывод AUX
Вывод AUX
Вывод AUX

Как я уже сказал, не важно подключать все контакты к выходу микроконтроллера, вы можете установить контакты M0 и M1 в положение HIGH или LOW, чтобы получить желаемую конфигурацию, и если вы не подключаете AUX, библиотека устанавливает разумную задержку, чтобы быть уверенным. что операция завершена.

Контакт AUX

При передаче данных может использоваться для пробуждения внешнего MCU и возврата HIGH по окончании передачи данных.

При получении AUX идет LOW и возвращается HIGH, когда буфер пуст.

Он также используется для самопроверки для восстановления нормальной работы (при включении питания и в спящем / программном режиме).

Шаг 4: Полностью подключенная схема Esp8266

Полностью подключенная схема Esp8266
Полностью подключенная схема Esp8266
Полностью подключенная схема Esp8266
Полностью подключенная схема Esp8266

Схема подключения esp8266 более простая, т.к. работает при том же напряжении логической связи (3,3 В).

Важно добавить подтягивающий резистор (4,7 кОм) для обеспечения хорошей стабильности.

Шаг 5: полностью подключенная схема Arduino

Полностью подключенная схема Arduino
Полностью подключенная схема Arduino
Полностью подключенная схема Arduino
Полностью подключенная схема Arduino

Рабочее напряжение Arduino составляет 5 В, поэтому нам нужно добавить делитель напряжения на выводы RX M0 и M1 модуля LoRa, чтобы предотвратить повреждение, вы можете получить дополнительную информацию здесь. Делитель напряжения: калькулятор и приложение.

Вы можете использовать резистор 2 кОм для заземления и 1 кОм от сигнала, чем соединить на RX.

Шаг 6: Библиотека: конструктор

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

LoRa_E32 (байт rxPin, байт txPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (байт rxPin, байт txPin, байт auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600); LoRa_E32 (байт rxPin, байт txPin, байт auxPin, байт m0Pin, байт m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Первый набор конструкторов создается для делегирования библиотеке управления последовательными и другими выводами.

rxPin и txPin - это контакты для подключения к UART, и они являются обязательными.

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

m0pin и m1Pin - это контакты для изменения РЕЖИМА работы (см. таблицу вверху), я думаю, что эти контакты в «производстве» будут подключаться напрямую HIGH или LOW, но для тестирования ими полезно управлять библиотекой.

bpsRate - это скорость передачи данных SoftwareSerial, обычно равная 9600 (единственная скорость передачи данных в режиме программирования / сна).

Простой пример:

# включить "LoRa_E32.h" LoRa_E32 e32ttl100 (2, 3); // RX, TX // LoRa_E32 e32ttl100 (2, 3, 5, 6, 7); // RX, TX

Мы можем использовать SoftwareSerial напрямую с другим конструктором

LoRa_E32 (HardwareSerial * серийный номер, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial * серийный номер, байтовый auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (HardwareSerial * серийный номер, байт auxPin, байт m0Pin, байт m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Пример сверху с этим конструктором может быть таким.

#include #include "LoRa_E32.h"

SoftwareSerial mySerial (2, 3); // RX, TX

LoRa_E32 e32ttl100 (& mySerial);

// LoRa_E32 e32ttl100 (& mySerial, 5, 7, 6);

Последний набор конструкторов позволяет использовать HardwareSerial вместо SoftwareSerial.

LoRa_E32 (SoftwareSerial * серийный номер, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial * серийный номер, байтовый auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

LoRa_E32 (SoftwareSerial * серийный номер, байт auxPin, байт m0Pin, байт m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);

Шаг 7: начать

Команда begin используется для запуска последовательного порта и контактов в режиме ввода и вывода.

void begin ();

в исполнении

// Запускаем все контакты и UART

e32ttl100.begin ();

Шаг 8: Конфигурация и информационный метод

Есть набор методов для управления конфигурацией и получения информации об устройстве.

ResponseStructContainer getConfiguration ();

ResponseStatus setConfiguration (конфигурация конфигурации, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

ResponseStructContainer getModuleInformation ();

void printParameters (конфигурация структуры структуры);

ResponseStatus resetModule ();

Шаг 9: Контейнер ответа

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

ResponseStatus

Это контейнер состояния и имеет 2 простые точки входа, с помощью которых вы можете получить код состояния и описание кода состояния.

Serial.println (c.getResponseDescription ()); // Описание кода

Serial.println (c.code); // 1 в случае успеха

Код

УСПЕХ = 1, ERR_UNKNOWN, ERR_NOT_SUPPORT, ERR_NOT_IMPLEMENT, ERR_NOT_INITIAL, ERR_INVALID_PARAM, ERR_DATA_SIZE_NOT_MATCH, ERR_BUF_TOO_SMALL, ERR_TIMEOUT, ERR_HARDWARE, ERR_HEAD_NOT_RECOGNIZED

ResponseContainer

Этот контейнер создан для управления строковым ответом и имеет 2 точки входа.

data со строкой, возвращенной из сообщения, и статусом экземпляра RepsonseStatus.

ResponseContainer rs = e32ttl.receiveMessage ();

Строковое сообщение = rs.data;

Serial.println (rs.status.getResponseDescription ());

Serial.println (сообщение);

ResponseStructContainer

Это более «сложный» контейнер, я использую его для управления структурой. Он имеет ту же точку входа, что и ResponseContainer, но данные являются пустым указателем для управления сложной структурой.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Важно получить указатель конфигурации перед всеми остальными операциями

Конфигурация конфигурации = * (Конфигурация *) c.data;

Serial.println (c.status.getResponseDescription ());

Serial.println (c.status.code);

getConfiguration и setConfiguration

Первый метод - getConfiguration, вы можете использовать его для извлечения всех данных, хранящихся на устройстве.

ResponseStructContainer getConfiguration ();

Вот пример использования.

ResponseStructContainer c;

c = e32ttl100.getConfiguration (); // Важно получить указатель конфигурации перед всеми остальными операциями

Конфигурация конфигурации = * (Конфигурация *) c.data;

Serial.println (c.status.getResponseDescription ());

Serial.println (c.status.code);

Serial.println (configuration. SPED.getUARTBaudRate ());

В структуре конфигурации есть все данные о настройках, и я добавляю серию функций, чтобы получить все описание отдельных данных.

configuration. ADDL = 0x0; // Первая часть конфигурации адреса. ADDH = 0x1; // Вторая часть конфигурации адреса. CHAN = 0x19; // Конфигурация канала. OPTION.fec = FEC_0_OFF; // Конфигурация переключателя прямого исправления ошибок. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Конфигурация режима передачи. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Конфигурация управления вытягиванием. OPTION.transmissionPower = POWER_17; // Конфигурация мощности передачи дБм. OPTION.wirelessWakeupTime = WAKE_UP_1250; // Время ожидания конфигурации пробуждения. SPED.airDataRate = AIR_DATA_RATE_011_48; // Конфигурация скорости передачи данных по эфиру. SPED.uartBaudRate = UART_BPS_115200; // Конфигурация скорости передачи данных. SPED.uartParity = MODE_00_8N1; // Бит четности

У вас есть эквивалентная функция для всех атрибутов, чтобы получить все описание:

Serial.print (F ("Чан:")); Serial.print (config. CHAN, DEC); Serial.print ("->"); Serial.println (конфигурация.getChannelDescription ()); Serial.println (F ("")); Serial.print (F ("SpeedParityBit:")); Serial.print (конфигурация. SPED.uartParity, BIN); Serial.print ("->"); Serial.println (configuration. SPED.getUARTParityDescription ()); Serial.print (F ("SpeedUARTDatte:")); Serial.print (конфигурация. SPED.uartBaudRate, BIN); Serial.print ("->"); Serial.println (configuration. SPED.getUARTBaudRate ()); Serial.print (F ("SpeedAirDataRate:")); Serial.print (конфигурация. SPED.airDataRate, BIN); Serial.print ("->"); Serial.println (configuration. SPED.getAirDataRate ()); Serial.print (F ("OptionTrans:")); Serial.print (конфигурация. OPTION.fixedTransmission, BIN); Serial.print ("->"); Serial.println (configuration. OPTION.getFixedTransmissionDescription ()); Serial.print (F ("OptionPullup:")); Serial.print (конфигурация. OPTION.ioDriveMode, BIN); Serial.print ("->"); Serial.println (configuration. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (конфигурация. OPTION.wirelessWakeupTime, BIN); Serial.print ("->"); Serial.println (configuration. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (конфигурация. OPTION.fec, BIN); Serial.print ("->"); Serial.println (configuration. OPTION.getFECDescription ()); Serial.print (F ("OptionPower:")); Serial.print (конфигурация. OPTION.transmissionPower, BIN); Serial.print ("->"); Serial.println (конфигурация. OPTION.getTransmissionPowerDescription ());

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

ResponseStatus setConfiguration (конфигурация конфигурации, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);

Конфигурация - это предварительно отображаемая структура, saveType позволяет вам выбрать, если изменение станет постоянным только для текущего сеанса.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Перед всеми остальными операциями важно получить указатель конфигурации Configuration configuration = * (Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (конфигурация); configuration. ADDL = 0x0; конфигурация. ADDH = 0x1; configuration. CHAN = 0x19; configuration. OPTION.fec = FEC_0_OFF; configuration. OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; configuration. OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; configuration. OPTION.transmissionPower = POWER_17; configuration. OPTION.wirelessWakeupTime = WAKE_UP_1250; configuration. SPED.airDataRate = AIR_DATA_RATE_011_48; configuration. SPED.uartBaudRate = UART_BPS_115200; configuration. SPED.uartParity = MODE_00_8N1; // Устанавливаем измененную конфигурацию и не сохраняем конфигурацию ResponseStatus rs = e32ttl100.setConfiguration (configuration, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (конфигурация);

Все параметры управляются как постоянные:

Шаг 10: вариант базовой конфигурации

Вариант базовой конфигурации
Вариант базовой конфигурации

Шаг 11: отправьте полученное сообщение

Сначала мы должны ввести простой, но полезный метод проверки, есть ли что-то в приемном буфере.

доступное int ();

Он просто возвращает количество байтов в текущем потоке.

Шаг 12: Нормальный режим передачи

Нормальный режим передачи
Нормальный режим передачи

Обычный / прозрачный режим передачи используется для отправки сообщений на все устройства с одним и тем же адресом и каналом.

Есть много способов отправки / получения сообщения, мы подробно объясним:

ResponseStatus sendMessage (сообщение const String);

ResponseContainer receiveMessage ();

Первый метод - sendMessage, он используется для отправки строки на устройство в нормальном режиме.

ResponseStatus rs = e32ttl.sendMessage ("Prova"); Serial.println (rs.getResponseDescription ());

Другое устройство просто на петле

если (e32ttl.available ()> 1) {ResponseContainer rs = e32ttl.receiveMessage (); Строковое сообщение = rs.data; // Сначала получаем данные Serial.println (rs.status.getResponseDescription ()); Serial.println (сообщение); }

Шаг 13: Управление структурой

Если вы хотите отправить сложную структуру, вы можете использовать этот метод

ResponseStatus sendMessage (const void * message, const uint8_t size); ResponseStructContainer receiveMessage (const uint8_t size);

Он используется для отправки структуры, например:

struct Messaggione {тип символа [5]; char сообщение [8]; bool mitico; }; struct Messaggione messaggione = {"TEMP", "Peple", true}; ResponseStatus rs = e32ttl.sendMessage (& messaggione, sizeof (Messaggione)); Serial.println (rs.getResponseDescription ());

а с другой стороны вы можете получить сообщение, чтобы

ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = * (Сообщение *) rsc.data; Serial.println (messaggione.message); Serial.println (messaggione.mitico);

Читать частичную структуру

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

ResponseContainer receiveInitialMessage (const uint8_t size);

Я создаю его, чтобы получить строку с типом или другим, чтобы определить структуру для загрузки.

struct Messaggione {// Частичная структура без typechar message [8]; bool mitico; }; тип символа [5]; // первая часть структуры ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Помещаем строку в массив символов (не требуется) memcpy (type, rs.data.c_str (), sizeof (type)); Serial.println ("ТИП ЧТЕНИЯ:"); Serial.println (rs.status.getResponseDescription ()); Serial.println (тип); // Прочитать остальную часть структуры ResponseStructContainer rsc = e32ttl.receiveMessage (sizeof (Messaggione)); struct Messaggione messaggione = * (Сообщение *) rsc.data;

Шаг 14: фиксированный режим вместо нормального режима

Таким же образом я создаю набор методов для использования с фиксированной передачей

Фиксированная трансмиссия

Вам нужно изменить только метод отправки, потому что устройство назначения не получает преамбулу с адресом и каналом в фиксированном режиме.

Итак, для сообщения String у вас есть

ResponseStatus sendFixedMessage (байт ADDL, байт ADDH, байт CHAN, сообщение const String); ResponseStatus sendBroadcastFixedMessage (байт CHAN, сообщение const String);

а для структуры у вас есть

ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const void * message, const uint8_t size); ResponseStatus sendBroadcastFixedMessage (byte CHAN, const void * message, const uint8_t size);

Вот простой пример

ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, & messaggione, sizeof (Messaggione)); // ResponseStatus rs = e32ttl.sendFixedMessage (0, 0, 0x17, "Ciao");

Фиксированная передача имеет больше сценариев

Если вы отправляете на определенное устройство (второй сценарий фиксированной передачи), вы должны добавить ADDL, ADDH и CHAN, чтобы идентифицировать его напрямую.

ResponseStatus rs = e32ttl.sendFixedMessage (2, 2, 0x17, «Сообщение на устройство»);

Если вы хотите отправить сообщение на все устройства в указанном канале, вы можете использовать этот метод.

ResponseStatus rs = e32ttl.sendBroadcastFixedMessage (0x17, «Сообщение устройствам канала»);

Если вы хотите получать все широковещательные сообщения в сети, вы должны установить ADDH и ADDL с помощью BROADCAST_ADDRESS.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Перед всеми остальными операциями важно получить указатель конфигурации Configuration configuration = * (Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (конфигурация); конфигурация. ADDL = BROADCAST_ADDRESS; configuration. ADDH = АДРЕС ПЕРЕДАЧИ; // Устанавливаем измененную конфигурацию и не сохраняем конфигурацию ResponseStatus rs = e32ttl100.setConfiguration (configuration, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (конфигурация);

Шаг 15: Спасибо

Теперь у вас есть вся информация для работы, но я думаю, что важно показать несколько реалистичных примеров, чтобы лучше понять все возможности.

  1. Устройство LoRa E32 для Arduino, esp32 или esp8266: настройки и базовое использование
  2. Устройство LoRa E32 для Arduino, esp32 или esp8266: библиотека
  3. Устройство LoRa E32 для Arduino, esp32 или esp8266: конфигурация
  4. Устройство LoRa E32 для Arduino, esp32 или esp8266: фиксированная передача
  5. Устройство LoRa E32 для Arduino, esp32 или esp8266: энергосбережение и отправка структурированных данных

Рекомендуемые: