Оглавление:
- Запасы
- Шаг 1. Библиотека
- Шаг 2: распиновка
- Шаг 3: вывод AUX
- Шаг 4: Полностью подключенная схема Esp8266
- Шаг 5: полностью подключенная схема Arduino
- Шаг 6: Библиотека: конструктор
- Шаг 7: начать
- Шаг 8: Конфигурация и информационный метод
- Шаг 9: Контейнер ответа
- Шаг 10: вариант базовой конфигурации
- Шаг 11: отправьте полученное сообщение
- Шаг 12: Нормальный режим передачи
- Шаг 13: Управление структурой
- Шаг 14: фиксированный режим вместо нормального режима
- Шаг 15: Спасибо
Видео: Беспроводная связь LoRa от 3 до 8 км с недорогим устройством E32 (sx1278 / sx1276) для Arduino, Esp8266 или Esp32: 15 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:48
Я создаю библиотеку для управления 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
Как я уже сказал, не важно подключать все контакты к выходу микроконтроллера, вы можете установить контакты M0 и M1 в положение HIGH или LOW, чтобы получить желаемую конфигурацию, и если вы не подключаете AUX, библиотека устанавливает разумную задержку, чтобы быть уверенным. что операция завершена.
Контакт AUX
При передаче данных может использоваться для пробуждения внешнего MCU и возврата HIGH по окончании передачи данных.
При получении AUX идет LOW и возвращается HIGH, когда буфер пуст.
Он также используется для самопроверки для восстановления нормальной работы (при включении питания и в спящем / программном режиме).
Шаг 4: Полностью подключенная схема Esp8266
Схема подключения esp8266 более простая, т.к. работает при том же напряжении логической связи (3,3 В).
Важно добавить подтягивающий резистор (4,7 кОм) для обеспечения хорошей стабильности.
Шаг 5: полностью подключенная схема 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: Спасибо
Теперь у вас есть вся информация для работы, но я думаю, что важно показать несколько реалистичных примеров, чтобы лучше понять все возможности.
- Устройство LoRa E32 для Arduino, esp32 или esp8266: настройки и базовое использование
- Устройство LoRa E32 для Arduino, esp32 или esp8266: библиотека
- Устройство LoRa E32 для Arduino, esp32 или esp8266: конфигурация
- Устройство LoRa E32 для Arduino, esp32 или esp8266: фиксированная передача
- Устройство LoRa E32 для Arduino, esp32 или esp8266: энергосбережение и отправка структурированных данных
Рекомендуемые:
Беспроводная связь SmartHome: экстремальные основы MQTT: 3 шага
Беспроводная связь SmartHome: экстремальные основы MQTT: Основы MQTT: ** Я собираюсь сделать серию статей по домашней автоматизации, я буду повторять шаги, которые я предпринял, чтобы узнать все, что я делал в будущем. Эта инструкция является базой для настройки MQTT для использования в моих будущих инструкциях. Но
Большое расстояние, 1,8 км, беспроводная связь Arduino с Arduino с HC-12: 6 шагов (с изображениями)
Большая дальность, 1,8 км, беспроводная связь между Arduino и Arduino с HC-12: в этой инструкции вы узнаете, как общаться между Arduino на большом расстоянии до 1,8 км на открытом воздухе. HC-12 - это беспроводной последовательный порт. коммуникационный модуль, который очень полезен, чрезвычайно мощный и простой в использовании. Сначала вы уйдете
Беспроводная связь с использованием модуля приемопередатчика NRF24L01 для проектов на базе Arduino: 5 шагов (с изображениями)
Беспроводная связь с использованием модуля приемопередатчика NRF24L01 для проектов на базе Arduino: это мой второй поучительный учебник о роботах и микроконтроллерах. Это действительно потрясающе видеть вашего робота живым и работающим, как ожидалось, и поверьте мне, будет веселее, если вы будете управлять своим роботом или другими вещами по беспроводной сети с помощью быстрых и
E32-433T Учебное пособие по модулю LoRa - Коммутационная плата DIY для модуля E32: 6 шагов
E32-433T Учебное пособие по модулю LoRa | Самостоятельная коммутационная плата для модуля E32: Привет, ребята, как дела! Акарш из CETech. Этот мой проект представляет собой скорее кривую обучения, чтобы понять работу модуля E32 LoRa от eByte, который представляет собой модуль приемопередатчика мощностью 1 Вт. Как только мы разбираемся в работе, у меня есть дизайн
Удаленное выключение или перезагрузка компьютера с устройством ESP8266: 10 шагов (с изображениями)
Удаленное выключение или перезагрузка компьютера с устройством ESP8266: чтобы было ясно, мы выключаем ВАШ компьютер, а не чей-то другой. История выглядит так: мой друг на Facebook написал мне сообщение и сказал, что у него есть дюжина компьютеров, на которых работает куча математики, но каждое утро в 3 часа ночи их закрывают. S