Съдържание:

Безжична комуникация 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 LoRa 2024, Юли
Anonim
Безжична комуникация LoRa от 3 до 8 км с ниска цена E32 (sx1278/sx1276) Устройство за Arduino, Esp8266 или Esp32
Безжична комуникация LoRa от 3 до 8 км с ниска цена E32 (sx1278/sx1276) Устройство за Arduino, Esp8266 или Esp32

Създавам библиотека за управление на EBYTE E32 въз основа на серия Semtech на устройство LoRa, много мощно, просто и евтино устройство.

Можете да намерите 3 км версия тук, 8 км версия тук

Те могат да работят на разстояние от 3000 м до 8000 м и имат много функции и параметри. Затова създавам тази библиотека, за да опростя използването.

Това е решение за извличане на данни от столични сензори или за управление на дрон.

Консумативи

Arduino UNO

Wemos D1 мини

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

LoRa E32 TTL 1W 8Km версия

Стъпка 1: Библиотека

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

Моята библиотека можете да намерите тук.

За изтегляне.

Щракнете върху бутона ИЗТЕГЛЯНЕ в горния десен ъгъл, преименувайте некомпресираната папка LoRa_E32.

Проверете дали папката LoRa_E32 съдържа LoRa_E32.cpp и LoRa_E32.h.

Поставете папката на библиотеката LoRa_E32 във вашата / библиотеки / папка. Може да се наложи да създадете подпапка библиотеки, ако това е първата ви библиотека.

Рестартирайте IDE.

Стъпка 2: Pinout

Pinout
Pinout
Pinout
Pinout
Pinout
Pinout

Както можете да видите, можете да зададете различни режими чрез щифтове M0 и M1.

Има някои щифтове, които могат да се използват по статичен начин, но ако го свържете към микроконтролера и ги конфигурирате в библиотеката, ще спечелите производителност и можете да контролирате целия режим чрез софтуер, но по -нататък ще обясним по -добре.

Стъпка 3: AUX Pin

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.3v).

Важно е да добавите издърпващ резистор (4, 7Kohm), за да получите добра стабилност.

Стъпка 5: Напълно свързана схема Arduino

Напълно свързана схема Arduino
Напълно свързана схема Arduino
Напълно свързана схема Arduino
Напълно свързана схема Arduino

Работното напрежение на Arduino е 5v, така че трябва да добавим делител на напрежение към RX щифт M0 и M1 на модула LoRa, за да предотвратим повреда, можете да получите повече информация тук Делител на напрежение: калкулатор и приложение.

Можете да използвате 2Kohm резистор към GND и 1Kohm от сигнала, отколкото заедно на 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 са щифтовете за промяна на режима на работа (вижте горната таблица), мисля, че тези щифтове в „производство“ще се свържат директно ВИСОКИ или НИСКИ, но за тест те са полезни за управление от библиотеката.

bpsRate е скоростта на SoftwareSerial обикновено е 9600 (единствената скорост на предаване в режим programmin/sleep mode)

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

#include "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 се използва за стартиране на Serial и пинове в режим на вход и изход.

void begin ();

в изпълнение е

// Стартиране на всички пинове и UART

e32ttl100.begin ();

Стъпка 8: Конфигурация и информационен метод

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

ResponseStructContainer getConfiguration ();

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

ResponseStructContainer getModuleInformation ();

void printParameters (конфигурация на struct Configuration);

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

Този контейнер е създаден, за да управлява String отговор и да има 2 входни точки.

данни с низ, върнат от съобщение и статус екземпляр на 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 ());

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

конфигурация. ADDL = 0x0; // Първа част от addressconfiguration. 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; // конфигурация на мощността на предаване dBm. 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 ("Chan:")); Serial.print (configuration. CHAN, DEC); Serial.print (" ->"); Serial.println (configuration.getChannelDescription ()); Serial.println (F ("")); Serial.print (F ("SpeedParityBit:")); Serial.print (configuration. SPED.uartParity, BIN); Serial.print (" ->"); Serial.println (configuration. SPED.getUARTParityDescription ()); Serial.print (F ("SpeedUARTDatte:")); Serial.print (configuration. SPED.uartBaudRate, BIN); Serial.print (" ->"); Serial.println (configuration. SPED.getUARTBaudRate ()); Serial.print (F ("SpeedAirDataRate:")); Serial.print (configuration. SPED.airDataRate, BIN); Serial.print (" ->"); Serial.println (configuration. SPED.getAirDataRate ()); Serial.print (F ("OptionTrans:")); Serial.print (configuration. OPTION.fixedTransmission, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getFixedTransmissionDescription ()); Serial.print (F ("OptionPullup:")); Serial.print (configuration. OPTION.ioDriveMode, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getIODroveModeDescription ()); Serial.print (F ("OptionWakeup:")); Serial.print (configuration. OPTION.wirelessWakeupTime, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getWirelessWakeUPTimeDescription ()); Serial.print (F ("OptionFEC:")); Serial.print (configuration. OPTION.fec, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getFECDescription ()); Serial.print (F ("OptionPower:")); Serial.print (configuration. OPTION.transmissionPower, BIN); Serial.print (" ->"); Serial.println (configuration. OPTION.getTransmissionPowerDescription ());

По същия начин setConfiguration иска конфигурационна структура, така че мисля, че по -добрият начин за управление на конфигурацията е да извлечете текущата, да приложите единствената необходима промяна и да я зададете отново.

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

конфигурацията е предварителното показване на strucutre, saveType ви позволява да избирате, ако промяната стане постоянно само за текущата сесия.

ResponseStructContainer c; c = e32ttl100.getConfiguration (); // Важно е да получите указател за конфигурация преди всички други операции Configuration configuration = *(Configuration *) c.data; Serial.println (c.status.getResponseDescription ()); Serial.println (c.status.code); printParameters (конфигурация); конфигурация. ADDL = 0x0; конфигурация. ADDH = 0x1; конфигурация. 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 (конфигурация, WRITE_CFG_PWR_DWN_LOSE); Serial.println (rs.getResponseDescription ()); Serial.println (rs.code); printParameters (конфигурация);

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

Стъпка 10: Опция за основна конфигурация

Опция за основна конфигурация
Опция за основна конфигурация

Стъпка 11: Изпратете съобщение за получаване

Първо трябва да въведем прост, но полезен метод за проверка дали нещо е в приемащия буфер

int available ();

Той просто връща колко байта имате в текущия поток.

Стъпка 12: Нормален режим на предаване

Нормален режим на предаване
Нормален режим на предаване

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

Има много методи за изпращане/получаване на съобщение, ние ще обясним подробно:

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

ResponseContainer receiveMessage ();

Първият метод е sendMessage и се използва за изпращане на низ към устройство в нормален режим.

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

Другото устройство просто прави в цикъла

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

Стъпка 13: Управление на структурата

Ако искате да изпратите сложна структура, можете да използвате този метод

ResponseStatus sendMessage (const void *съобщение, const uint8_t размер); ResponseStructContainer receiveMessage (const uint8_t размер);

Използва се за изпращане на strucutre, например:

struct Messaggione {char тип [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 = *(Messaggione *) rsc.data; Serial.println (messaggione.message); Serial.println (messaggione.mitico);

Прочетете частично strucure

Ако искате да прочетете първата част на съобщението, за да управлявате повече тип strucutre, можете да използвате този метод.

ResponseContainer receiveInitialMessage (const uint8_t размер);

Създавам го, за да получа низ с тип или друг, за да идентифицирам структурата за зареждане.

struct Messaggione {// Частична структура без съобщение за typechar [8]; bool mitico; }; тип char [5]; // първа част от структурата ResponseContainer rs = e32ttl.receiveInitialMessage (sizeof (type)); // Поставете низ в char масив (не е необходим) 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 = *(Messaggione *) rsc.data;

Стъпка 14: Фиксиран режим вместо нормален режим

По същия начин създавам набор от методи за използване с фиксирано предаване

Фиксирано предаване

Трябва да промените само метода на изпращане, тъй като целевото устройство не получава преамбюла с настройка за адрес и канал за фиксиран режим в фиксиран режим.

Така че за String съобщение имате

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

и за структура имате

ResponseStatus sendFixedMessage (байт ADDL, байт ADDH, байт CHAN, const void *съобщение, const uint8_t размер); ResponseStatus sendBroadcastFixedMessage (байт CHAN, const void *съобщение, const uint8_t размер);

Ето един прост пример

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; конфигурация. ADDH = BROADCAST_ADDRESS; // Задайте променена конфигурация и задайте да не държи конфигурацията ResponseStatus rs = e32ttl100.setConfiguration (конфигурация, 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: пестене на енергия и изпращане на структурирани данни

Препоръчано: