

Arduino Uno Shield
Você pode pedir o PCB aqui
Vídeo de instrução e montagem em 6 parte do guia
Wemos D1 Shield
Você pode pedir o PCB aqui
ESP32 SHIELD
Você pode pedir o PCB aqui
Vídeo de instrução e montagem em 6 parte do guia
Crio uma biblioteca para gerenciar a série Ebyte E32 de dispositivo Lora, muito poderoso, dispositivo simples e barato.
Lora E32-TTL-100
Você pode encontrar aqui o aliexpress (dispositivo de 3 km) aliexpress (dispositivo de 8 km)
Eles podem trabalhar a uma distância de 3000m a 8000m e têm muitos recursos e parâmetro.
Então, crio esta biblioteca para simplificar o uso.
Consulte o meu artigo para obter o esquema atualizado
Você pode encontrar minha biblioteca aqui.
Para baixar.
Clique no botão de downloads no canto superior direito, renomeie a pasta não compactada lora_e32.
Verifique se a pasta LORA_E32 contém Lora_E32.CPP e LORA_E32.H.
Coloque a pasta Lora_E32 da biblioteca da sua pasta / Bibliotecas /.
Pode ser necessário criar a subpasta das bibliotecas se for sua primeira biblioteca.
Reinicie o IDE.
E32 TTL 100
Você pode comprar aqui aliexpress
| PIN No. | Item de pino | Direção do pino | Aplicação PIN |
|---|---|---|---|
| 1 | M0 | Entrada (Pull-up fraca) | Trabalhe com M1 e decida que os quatro modos de operação. O flutuação não é permitido, pode ser moído. |
| 2 | M1 | Entrada (Pull-up fraca) | Trabalhe com M0 e decida que os quatro modos de operação. O flutuação não é permitido, pode ser moído. |
| 3 | Rxd | Entrada | As entradas TTL UART, conectam -se a outputpin externo (MCU, PC). Pode ser configurado como entrada de drenagem aberta ou pull-up. |
| 4 | Txd | Saída | Saídas TTL UART, conecta -se ao RXD externo (MCU, PC) InputPin. Pode ser configurado como saída de drenagem aberta ou push-pull |
| 5 | Aux | Saída | Para indicar o status de funcionamento do módulo e acorda o MCU externo. Durante o procedimento de inicialização de auto-verificação, o pino produz baixo nível. Pode ser configurado como saída de saída de drenagem aberta ORPUSH-PULL (é permitido flutuante). |
| 6 | VCC | Fonte de alimentação 2.3V ~ 5,5V DC | |
| 7 | Gnd | Chão | Como você pode ver, pode definir vários modos via pinos M0 e M1. |
| Modo | M1 | M0 | Explicação |
|---|---|---|---|
| Normal | 0 | 0 | Canal uart e sem fio está pronto para ir |
| Wke-up | 0 | 1 | O mesmo que o normal, mas um código de preâmbulo é adicionado aos dados transmitidos para acordar o receptor. |
| Economia de energia | 1 | 0 | O UART é desativado e sem fio está no modo WOR (Wake on Radio), o que significa que o dispositivo será ativado quando houver dados a serem recebidos. A transmissão não é permitida. |
| Dormir | 1 | 1 | Usado nos parâmetros de configuração. Transmitindo e recebendo desativado. |
Como você pode ver, existem alguns pinos que podem ser usados de maneira estática, mas se você o conectar à biblioteca que você ganha no desempenho e poderá controlar todos os modos via software, mas vamos explicar melhor a seguir.
Como eu já digo que não é importante conectar todo o pino à saída do microcontrolador, você pode colocar os pinos M0 e M1 em alta ou baixa para obter configuração desidenciada e, se você não conectar aux ox, a biblioteca definir um atraso razoável para garantir que a operação esteja concluída .
Ao transmitir dados, pode ser usado para acordar o MCU externo e retornar alto no acabamento da transferência de dados.
Lora E32 Aux Pin na transmissão
Ao receber o aux de ficar baixo e retornar alto quando o buffer estiver vazio.
Lora E32 Aux Pin na recepção
Também é usado para verificação própria para restaurar a operação normal (no modo de energia e sono/programa).
Lora E32 Aux Pin na auto-verificação
O esquema de conexão ESP8266 é mais simples porque funciona na mesma tensão de comunicações lógicas (3.3V).
Lora e32 TTL 100 WEMOS D1 totalmente conectado
É importante adicionar resistor pull-up (4,7kohm) para obter uma boa estabilidade.
| M0 | D7 |
|---|---|
| M1 | D6 |
| Rx | Pino D2 (pullup 4,7kΩ) |
| Tx | Pino D3 (pullup 4,7kΩ) |
| Aux | D5 (entrada) |
| 3.3V | Gnd |
A tensão de trabalho do Arduino é 5V, por isso precisamos adicionar um divisor de tensão no pino RX M0 e M1 do módulo Lora para evitar danos, você pode obter mais informações aqui divisor de tensão: calculadora e aplicação.
Você pode usar um resistor de 2kohm para GND e 1kOhm do sinal do que montados no RX.
Lora e32 TTL 100 Arduino totalmente conectado
| M0 | 7 (divisor de tensão) |
|---|---|
| M1 | 6 (divisor de tensão) |
| Rx | PIN D2 (Pullup 4,7kΩ e divisor de tensão) |
| Tx | Pino D3 (pullup 4,7kΩ) |
| Aux | 5 (entrada) |
| VCC | 3.3V |
| Gnd | Gnd |
Fiz um conjunto de construtores bastante numerosos, porque podemos ter mais opções e situações para gerenciar.
LoRa_E32 (byte rxPin, byte txPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (byte rxPin, byte txPin, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (byte rxPin, byte txPin, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);O primeiro conjunto de construtores é criado para delegar o gerenciamento de pinos seriais e outros na biblioteca.
rxPin e txPin é o pino para se conectar ao UART e eles são obrigatórios .
auxPin é um pino que verifique a operação, a transmissão e o status de recebimento (vamos explicar melhor a seguir), esse pino não é obrigatório , se você não o definir, aplico um atraso para permitir que a operação se complete (com latência).
m0pin e m1Pin são os pinos para alterar o modo de operação (consulte a tabela superior), acho que esses pinos na “produção” se conectarão diretamente ou baixos , mas para o teste eles são usados para serem gerenciados pela biblioteca.
bpsRate é o boudrate do softwareserial normalmente é 9600 (a única taxa de transmissão no modo de programação/suspensão)
Um exemplo simples é
# include " LoRa_E32.h "
LoRa_E32 e32ttl100 ( 2 , 3 ); // RX, TX
// LoRa_E32 e32ttl100(2, 3, 5, 6, 7); // RX, TXPodemos usar diretamente um softwareserial com outro construtor
LoRa_E32 (HardwareSerial* serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial* serial, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (HardwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);O exemplo superior com este construtor pode ser assim.
# include < SoftwareSerial.h >
# include " LoRa_E32.h "
SoftwareSerial mySerial ( 2 , 3 ); // RX, TX
LoRa_E32 e32ttl100 (mySerial);
// LoRa_E32 e32ttl100(&mySerial, 5, 7, 6);O último conjunto de construtores é permitir usar um hardwareserial em vez de softwareserial.
LoRa_E32 (SoftwareSerial* serial, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial* serial, byte auxPin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);
LoRa_E32 (SoftwareSerial* serial, byte auxPin, byte m0Pin, byte m1Pin, UART_BPS_RATE bpsRate = UART_BPS_RATE_9600);O comando BEGIN é usado para inicializar serial e pinos no modo de entrada e saída.
void begin ();na execução é
// Startup all pins and UART
e32ttl100.begin();Há um conjunto de métodos para gerenciar a configuração e obter informações do dispositivo.
ResponseStructContainer getConfiguration ();
ResponseStatus setConfiguration (Configuration configuration, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE);
ResponseStructContainer getModuleInformation ();
void printParameters ( struct Configuration configuration);
ResponseStatus resetModule ();Para simplificar o gerenciamento da resposta, crio um conjunto de contêineres, para mim muito útil para gerenciar erros e retornar dados genéricos.
Este é um contêiner de status e tem 2 pontos de entrada simples, com isso você pode obter o código de status e a descrição do código de status
Serial.println(c.getResponseDescription()); // Description of code
Serial.println(c.code); // 1 if SuccessO código é
E32_SUCCESS = 1 ,
ERR_E32_UNKNOWN,
ERR_E32_NOT_SUPPORT,
ERR_E32_NOT_IMPLEMENT,
ERR_E32_NOT_INITIAL,
ERR_E32_INVALID_PARAM,
ERR_E32_DATA_SIZE_NOT_MATCH,
ERR_E32_BUF_TOO_SMALL,
ERR_E32_TIMEOUT,
ERR_E32_HARDWARE,
ERR_E32_HEAD_NOT_RECOGNIZEDEste contêiner é criado para gerenciar a resposta da string e ter 2 pontos de entrada.
data com a string retornados da mensagem e status Uma instância de RepsonseStatus .
ResponseContainer rs = e32ttl.receiveMessage();
String message = rs.data;
Serial.println(rs.status.getResponseDescription());
Serial.println(message);Este é o contêiner mais "complexo", eu uso isso para gerenciar a estrutura, ele possui o mesmo ponto de entrada do responseContainer, mas os dados são um ponteiro vazio para gerenciar a estrutura complexa.
ResponseStructContainer c;
c = e32ttl100.getConfiguration();
// It's important get configuration pointer before all other operation
Configuration configuration = *(Configuration*) c.data;
Serial.println(c.status.getResponseDescription());
Serial.println(c.status.code);O primeiro método é o GetConfiguration, você pode usá -lo para recuperar todos os dados armazenados no dispositivo.
ResponseStructContainer getConfiguration ();Aqui um exemplo de uso.
ResponseStructContainer c;
c = e32ttl100.getConfiguration();
// It's important get configuration pointer before all other operation
Configuration configuration = *(Configuration*) c.data;
Serial.println(c.status.getResponseDescription());
Serial.println(c.status.code);
Serial.println(configuration.SPED.getUARTBaudRate());A estrutura da configuração possui todos os dados das configurações e adiciono uma série de funções para obter toda a descrição dos dados únicos.
configuration.ADDL = 0x0 ; // First part of address
configuration.ADDH = 0x1 ; // Second part of address
configuration.CHAN = 0x19 ; // Channel
configuration.OPTION.fec = FEC_0_OFF; // Forward error correction switch
configuration.OPTION.fixedTransmission = FT_TRANSPARENT_TRANSMISSION; // Transmission mode
configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS; // Pull-up management
configuration.OPTION.transmissionPower = POWER_17; // dBm transmission power
configuration.OPTION.wirelessWakeupTime = WAKE_UP_1250; // Wait time for wake up
configuration.SPED.airDataRate = AIR_DATA_RATE_011_48; // Air data rate
configuration.SPED.uartBaudRate = UART_BPS_115200; // Communication baud rate
configuration.SPED.uartParity = MODE_00_8N1; // Parity bitVocê tem a função equivalente a obter toda a descrição:
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());Da mesma forma, o setConfiguration deseja um Strucutre de configuração, então acho que a melhor maneira de gerenciar a configuração é recuperar a atual, aplicar a única alteração necessária e defini -la novamente.
ResponseStatus setConfiguration (Configuration configuration, PROGRAM_COMMAND saveType = WRITE_CFG_PWR_DWN_LOSE); configuration é o Strucutre Previsiouly Show, saveType Licition para você escolher se a alteração se tornar permanentemente apenas para a sessão atual.
ResponseStructContainer c;
c = e32ttl100.getConfiguration();
// It's important get configuration pointer before all other operation
Configuration configuration = *(Configuration*) c.data;
Serial.println(c.status.getResponseDescription());
Serial.println(c.status.code);
printParameters (configuration);
configuration.ADDL = 0x0 ;
configuration.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;
// Set configuration changed and set to not hold the configuration
ResponseStatus rs = e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE);
Serial.println(rs.getResponseDescription());
Serial.println(rs.code);
printParameters (configuration);O parâmetro todos gerenciados como constantes:
| Addh | Byte de endereço alto do módulo (o padrão 00H) | 00H-FFH |
|---|---|---|
| Addl | Byte de endereço baixo do módulo (o padrão 00H) | 00H-FFH |
| Acelerou | Informações sobre a taxa de paridade da taxa de dados e taxa de dados aéreos | Chan |
| Canal de comunicação (410m + chan*1m), padrão 17h (433MHz), válido apenas para o dispositivo 433MHz | 00H-1FH |
|---|
OPÇÃO
Tipo de transmissão, configurações de pull-up, tempo de despertar, FEC, energia de transmissão
Bit de paridade UART: o modo _uart pode ser diferente entre as partes da comunicação
| 7 | 6 | Bit de paridade UART | Valor const | | --- | --- | --- | --- | --- | | 0 | 0 | 8n1 (padrão) | mode_00_8n1 | | 0 | 1 | 8O1 | mode_01_8o1 | | 1 | 0 | 8 e1 | mode_10_8e1 | | 1 | 1 | 8N1 (igual a 00) | mode_11_8n1 |
Taxa de transmissão UART: a taxa de transmissão UART pode ser diferente entre as partes da comunicação, a taxa de transmissão UART não tem nada a ver com parâmetros de transmissão sem fio e não afetará os recursos de transmissão / recebimento sem fio.
| 5 | 43 | TTL UART BAUD Taxa (BPS) | Valor constante |
|---|---|---|---|
| 0 | 0 | 0 | 1200 |
| 0 | 0 | 1 | 2400 |
| 0 | 1 | 0 | 4800 |
| 0 | 1 | 1 | 9600 (padrão) |
| 1 | 0 | 0 | 19200 |
| 1 | 0 | 1 | 38400 |
| 1 | 1 | 0 | 57600 |
| 1 | 1 | 1 | 115200 |
Taxa de dados do ar: quanto menor a taxa de dados do ar, maior a distância de transmissão, melhor desempenho anti-interferência e tempo de transmissão mais longo, a taxa de dados do ar deve manter o mesmo para ambas as partes da comunicação.
| 2 | 1 | 0 | Taxa de dados aéreos (BPS) | Valor constante |
|---|---|---|---|---|
| 0 | 0 | 0 | 0,3k | Air_data_rate_000_03 |
| 0 | 0 | 1 | 1.2k | AIR_DATA_RATE_001_12 |
| 0 | 1 | 0 | 2.4K (padrão) | AIR_DATA_RATE_010_24 |
| 0 | 1 | 1 | 4.8K | AIR_DATA_RATE_011_48 |
| 1 | 0 | 0 | 9.6k | AIR_DATA_RATE_100_96 |
| 1 | 0 | 1 | 19.2K | AIR_DATA_RATE_101_192 |
| 1 | 1 | 0 | 19.2K (o mesmo para 101) | AIR_DATA_RATE_110_192 |
| 1 | 1 | 1 | 19.2K (o mesmo para 101) | AIR_DATA_RATE_111_192 |
Modo de transmissão: no modo de transmissão fixo, os três primeiros bytes do quadro de dados de cada usuário podem ser usados como endereço e canal alto/baixo. O módulo altera seu endereço e canal ao transmitir. E ele reverterá para a configuração original após concluir o processo.
| 7 | Transmissão fixa que habilita o bit (semelhante ao Modbus) | Valor constante |
|---|---|---|
| 0 | Modo de transmissão transparente | Ft_transparent_transmission |
| 1 | Modo de transmissão fixo | Ft_fixed_transmission |
Modo de acionamento de IO: este bit é usado no módulo resistor interno de tração. Também aumenta a adaptabilidade do nível em caso de dreno aberto. Mas em alguns casos, pode precisar de pull-up externo
resistor.
| 6 | Modo de unidade de IO (padrão 1) | Valor constante |
|---|---|---|
| 1 | Saídas de push-pull txd e aux, entradas de pull-up rxd | Io_d_mode_push_pulls_pull_ups |
| 0 | Saídas de coletores abertos TXD 、 AUX, entradas de coletores abertos rxd | Io_d_mode_open_collector |
Tempo de despertar sem fio: o módulo de transmissão e recebimento trabalha no modo 0, cujo tempo de atraso é inválido e pode ser um valor arbitrário, o transmissor funciona no modo 1 pode transmitir o código do preâmbulo do tempo correspondente continuamente, quando o receptor funciona no modo 2, o tempo significa o tempo do monitor (despertar sem fio). Somente os dados do transmissor que funcionam no modo 1 podem ser
recebido.
| 5 | 4 | 3 | Tempo de despertar sem fio | Valor constante |
|---|---|---|---|---|
| 0 | 0 | 0 | 250ms (padrão) | Wake_up_250 |
| 0 | 0 | 1 | 500ms | Wake_up_500 |
| 0 | 1 | 0 | 750ms | Wake_up_750 |
| 0 | 1 | 1 | 1000ms | Wake_up_1000 |
| 1 | 0 | 0 | 1250ms | Wake_up_1250 |
| 1 | 0 | 1 | 1500ms | Wake_Up_1500 |
| 1 | 1 | 0 | 1750ms | Wake_up_1750 |
| 1 | 1 | 1 | 2000ms | Wake_up_2000 |
FEC: Após desligar o FEC, a taxa de transmissão de dados real aumenta enquanto a capacidade de anti-interferência diminui. Além disso, a distância da transmissão é relativamente curta, ambas as partes de comunicação devem manter as mesmas páginas sobre o ativação ou o FEC de ativação.
| 2 | Switch FEC | Valor constante |
|---|---|---|
| 0 | Desligue o FEC | FEC_0_OFF |
| 1 | Ligue o FEC (padrão) | FEC_1_ON |
Poder de transmissão
Você pode alterar esse conjunto de constantes, aplique uma definição como assim:
# define E32_TTL_100 // default value without set Aplicável para E32-TTL-100, E32-TTL-100S1, E32-T100S2.
A potência externa deve garantir a capacidade da saída de corrente mais de 250mA e garantir a ondulação da fonte de alimentação em 100 mV.
A transmissão de baixa potência não é recomendada devido à sua baixa fonte de alimentação
eficiência.
# define E32_TTL_100 // default value without set| 1 | 0 | Poder de transmissão (aproximação) | Valor constante |
|---|---|---|---|
| 0 | 0 | 20dbm (padrão) | Power_20 |
| 0 | 1 | 17DBM | Power_17 |
| 1 | 0 | 14DBM | Power_14 |
| 1 | 1 | 10dBM | Power_10 |
Aplicável para E32-TTL-500。
A energia externa deve garantir a capacidade da saída de corrente mais de 700mA e garantir a ondulação da fonte de alimentação em 100 mV.
A transmissão de baixa energia não é recomendada devido à sua baixa eficiência da fonte de alimentação.
# define E32_TTL_500| 1 | 0 | Poder de transmissão (aproximação) | Valor constante |
|---|---|---|---|
| 0 | 0 | 27DBM (padrão) | Power_27 |
| 0 | 1 | 24dBM | Power_24 |
| 1 | 0 | 21DBM | Power_21 |
| 1 | 1 | 18dbm | Power_18 |
Aplicável para E32-TTL-1W, E32 (433T30S), E32 (868T30s), E32 (915T30s)
A potência externa deve garantir a capacidade da saída de corrente mais de 1a e garantir a ondulação da fonte de alimentação em 100 mV.
A transmissão de baixa potência não é recomendada devido à sua baixa fonte de alimentação
eficiência.
# define E32_TTL_1W| 1 | 0 | Poder de transmissão (aproximação) | Valor constante |
|---|---|---|---|
| 0 | 0 | 30dbm (padrão) | Power_30 |
| 0 | 1 | 27DBM | Power_27 |
| 1 | 0 | 24dBM | Power_24 |
| 1 | 1 | 21DBM | Power_21 |
Você pode configurar a frequência do canal OLSO com isso Definir:
// One of
# define FREQUENCY_433
# define FREQUENCY_170
# define FREQUENCY_470
# define FREQUENCY_868
# define FREQUENCY_915Primeiro, devemos introduzir um método simples, mas útil, para verificar se algo está no buffer de recebimento
int available ();É simplesmente retornar quantos bytes você tem no fluxo atual.
O modo de transmissão normal/transparente é usado para enviar mensagens para todo o dispositivo com o mesmo endereço e canal.
Lora E32 Cenários de transmissão, linhas são canais
Há muito método para enviar/receber mensagem, explicaremos em detalhes:
ResponseStatus sendMessage ( const String message);ResponseContainer receiveMessage ();O primeiro método é o sendMessage e é usado para enviar uma string para um dispositivo no modo normal .
ResponseStatus rs = e32ttl.sendMessage( " Prova " );
Serial.println(rs.getResponseDescription());O outro dispositivo simplesmente faz no loop
if (e32ttl.available() > 1 ){
ResponseContainer rs = e32ttl. receiveMessage ();
String message = rs. data ;` ` // First ever get the data
Serial. println (rs. status . getResponseDescription ());
Serial. println (message);
}Se você deseja enviar uma estrutura complexa, você pode usar este método
ResponseStatus sendMessage ( const void *message, const uint8_t size);
ResponseStructContainer receiveMessage ( const uint8_t size);É usado para enviar Strucutre, por exemplo:
struct Messaggione {
char type[ 5 ];
char message[ 8 ];
bool mitico;
};
struct Messaggione messaggione = { " TEMP " , " Peple " , true };
ResponseStatus rs = e32ttl.sendMessage(&messaggione, sizeof (Messaggione));
Serial.println(rs.getResponseDescription());e o outro lado você pode receber a mensagem para
ResponseStructContainer rsc = e32ttl.receiveMessage( sizeof (Messaggione));
struct Messaggione messaggione = *(Messaggione*) rsc.data;
Serial.println(messaggione.message);
Serial.println(messaggione.mitico);Se você deseja ler a primeira parte da mensagem para gerenciar mais tipos de strucutre, você pode usar esse método.
ResponseContainer receiveInitialMessage ( const uint8_t size);Eu o crio para receber uma string com tipo ou outro para identificar a estrutura para carregar.
struct Messaggione { // Partial strucutre without type
char message[ 8 ];
bool mitico;
};
char type[ 5 ]; // first part of structure
ResponseContainer rs = e32ttl.receiveInitialMessage( sizeof (type));
// Put string in a char array (not needed)
memcpy ( type, rs.data.c_str(), sizeof(type) );
Serial.println( " READ TYPE: " );
Serial.println(rs.status.getResponseDescription());
Serial.println(type);
// Read the rest of structure
ResponseStructContainer rsc = e32ttl.receiveMessage( sizeof (Messaggione));
struct Messaggione messaggione = *(Messaggione*) rsc.data;Da mesma maneira, crio um conjunto de método para usar com transmissão fixa
Você precisa alterar apenas o método de envio, porque o dispositivo de destino não recebe o preâmbulo com endereço e canal.
Então, para a mensagem de string que você tem
ResponseStatus sendFixedMessage (byte ADDL, byte ADDH, byte CHAN, const String message);
ResponseStatus sendBroadcastFixedMessage (byte CHAN, const String message);e para a estrutura que você tem
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 );Aqui um exemplo simples
ResponseStatus rs = e32ttl.sendFixedMessage( 0 , 0 , 0x17 , &messaggione, sizeof (Messaggione));
// ResponseStatus rs = e32ttl.sendFixedMessage(0, 0, 0x17, "Ciao");A transmissão fixa tem mais cenários
Lora E32 Cenários de transmissão, linhas são canais
Se você enviar para um dispositivo específico (segundo cenário fixo), você deverá adicionar Addl, Addh e Chan para identificá -lo diretamente.
ResponseStatus rs = e32ttl.sendFixedMessage( 2 , 2 , 0x17 , " Message to a device " );Se você deseja enviar uma mensagem para todo o dispositivo em um canal especificado, você pode usar esse método.
ResponseStatus rs = e32ttl.sendBroadcastFixedMessage( 0x17 , " Message to a devices of a channel " ); Se você deseja receber toda a mensagem de transmissão na rede, você deve definir seu ADDH e ADDL com BROADCAST_ADDRESS .
ResponseStructContainer c;
c = e32ttl100.getConfiguration();
// It's important get configuration pointer before all other operation
Configuration configuration = *(Configuration*) c.data;
Serial.println(c.status.getResponseDescription());
Serial.println(c.status.code);
printParameters (configuration);
configuration.ADDL = BROADCAST_ADDRESS;
configuration.ADDH = BROADCAST_ADDRESS;
// Set configuration changed and set to not hold the configuration
ResponseStatus rs = e32ttl100.setConfiguration(configuration, WRITE_CFG_PWR_DWN_LOSE);
Serial.println(rs.getResponseDescription());
Serial.println(rs.code);
printParameters (configuration);