Съдържание:
- Консумативи
- Стъпка 1: Библиотека
- Стъпка 2: Pinout
- Стъпка 3: AUX Pin
- Стъпка 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 07:50
Създавам библиотека за управление на 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
Както можете да видите, можете да зададете различни режими чрез щифтове M0 и M1.
Има някои щифтове, които могат да се използват по статичен начин, но ако го свържете към микроконтролера и ги конфигурирате в библиотеката, ще спечелите производителност и можете да контролирате целия режим чрез софтуер, но по -нататък ще обясним по -добре.
Стъпка 3: AUX Pin
Както вече казах Не е важно да свържете всички щифтове към изхода на микроконтролера, можете да поставите пиновете M0 и M1 на HIGH или LOW, за да получите желаната конфигурация, а ако не свържете AUX, библиотеката задайте разумно забавяне, за да сте сигурни че операцията е завършена.
AUX щифт
При предаване на данни може да се използва за събуждане на външен MCU и връщане на HIGH при приключване на трансфера на данни.
При получаване на AUX става LOW и се връща HIGH, когато буферът е празен.
Използва се и за самопроверка за възстановяване на нормалната работа (при включване и режим на заспиване/програмиране).
Стъпка 4: Напълно свързана схема Esp8266
Схемата за свързване на esp8266 е по -проста, защото работи при същото напрежение на логическите комуникации (3.3v).
Важно е да добавите издърпващ резистор (4, 7Kohm), за да получите добра стабилност.
Стъпка 5: Напълно свързана схема 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: Благодаря
Сега имате цялата информация, за да вършите работата си, но мисля, че е важно да покажете някои реалистични примери, за да разберете по -добре всички възможности.
- Устройство 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: пестене на енергия и изпращане на структурирани данни
Препоръчано:
Как да изградите ЕКГ устройство с ниска цена: 26 стъпки
Как да изградим ЕКГ устройство на ниска цена: Здравейте всички! Казвам се Мариано и съм биомедицински инженер. Прекарах няколко уикенда, за да проектирам и реализирам прототип на ЕКГ устройство на ниска цена на базата на Arduino платка, свързана чрез Bluetooth към устройство с Android (смартфон или таблет). Бих
GPSDO YT, Дисциплиниран осцилатор 10Mhz Референтна честота. Ниска цена. Точно .: 3 стъпки
GPSDO YT, Дисциплиниран осцилатор 10Mhz Референтна честота. Ниска цена. Точно .: *********************************************** ******************************** STOP STOP STOP STOP STOP STOP STOP STOP STOP STOP STOP Това е остарял проект. Вместо това проверете моя нова версия на 2x16 LCD дисплей, достъпна тук: https: //www.instructables.com/id
Демо на ниска цена MR игра: 9 стъпки
Демо на ниска цена MR игра: http://www.bilibili.com/video/av7937721/ (видео url в китайския континент) Over View: Задайте картина с маркировка върху държач на две оси , Потребителят го погледнете от картон , можете да видите чудовище покрито на маркирайте, те се стрелят помежду си в света на игрите. Използвайте AR, за да разберете ъгъла на залог
Как правилно да измерваме консумацията на енергия на модулите за безжична комуникация в епохата на ниска консумация на енергия?: 6 стъпки
Как правилно да измерваме консумацията на енергия на безжичните комуникационни модули в епохата на ниска консумация на енергия?: Ниската консумация на енергия е изключително важно понятие в Интернет на нещата. Повечето IoT възли трябва да се захранват от батерии. Само чрез правилно измерване на консумацията на енергия на безжичния модул можем да преценим точно колко батерия съм
UDuino: Много ниска цена Arduino съвместим съвет за разработка: 7 стъпки (със снимки)
UDuino: Много ниска цена Arduino съвместим съвет за разработка: Arduino дъските са чудесни за прототипиране. Те обаче стават доста скъпи, когато имате няколко едновременни проекта или се нуждаете от много контролни платки за по -голям проект. Има някои страхотни, по -евтини алтернативи (Boarduino, Freeduino), но