Hello guys!
I’m showing all my actual Arduino code in hope to solve my actual problem.
I’m developing a project that includes the bme680 sensor that measures temperature, humidity and concentracion of gas in the surround environment.
This sensor is comunicating through i2c to a rak4630 chip and then the information goes to a lorawan gateway RAK7289v2.
My question is about the regions. I keep getting this error when i’m trying to compile the code and i’ve tried a lot of different things but all unsucessful.
My version of Arduino it’s up to date and i’ve changed/commented all the mentions to regions in Comissioning.h file and in Arduino code but the file doesn’t get compiled. Anyone of you knows how to solve this questions?
Error message:
In file included from c:\Users\jlpereira(…)\Arduino\libraries\SX126x-Arduino\src/mac/LoRaMacHelper.h:26,
from c:\Users\jlpereira(…)\Arduino\libraries\SX126x-Arduino\src/LoRaWan-Arduino.h:17,
from c:\Users\jlpereira(…)\Arduino\libraries\SX126x-Arduino\src/LoRaWan-RAK4630.h:4,
from C:\Users\jlpereira(…)\Arduino\bme_test_1\bme_test_1.ino:6:
c:\Users\jlpereira(…)\libraries\SX126x-Arduino\src/mac/Commissioning.h:42:2: error: #error “SX126x-Arduino V2.0 does support all LoRaWAN regions without definition of 'REGION_XXYYY.\n\n”
42 | #error “SX126x-Arduino V2.0 does support all LoRaWAN regions without definition of 'REGION_XXYYY.\n\nPlease read detailed information how to use it on SX126x-Arduino/README_V2.md at master · beegee-tokyo/SX126x-Arduino · GitHub”
| ^~~~~
exit status 1
Compilation error: exit status 1
All Arduino code:
#include <Wire.h> // I2C
//#include <Adafruit-Sensor.h>
#include <Adafruit_BME680.h> // Biblioteca para o BME680
//#include <LoRaWan-Arduino.h>
#include <SX126x-RAK4630.h>
#include <LoRaWan-RAK4630.h> // LoRaWAN
//#include <ArduinoLowPower.h> // Modo de baixo consumo
//#define ACTIVE_REG LORAMAC_REGION_EU868
// Configuração do BME680
#define I2C_ADDR 0x77 // Endereço default I2C do sensor
// Inicialização de uma estrutura para o sensor no endereço default para comunicar através de I2C
Adafruit_BME680 bme(I2C_ADDR);
// Configuração bateria 3,7V
// Tensão (mV) = leitura do ADC * fator de conversão do ADC
#define VBAT_PIN A0 //pin ADC p/leitura da bateria
uint32_t bateria = VBAT_PIN;
#define VBAT_MV_PER_LSB 0.73242188 //// Conversão do ADC: 3.0V ADC range / 4096 (12 bits)
#define VBAT_DIVIDER_COMP 1.73 // Fator de compensação do divisor resistivo
#define REAL_VBAT_MV_PER_LSB (VBAT_DIVIDER_COMP * VBAT_MV_PER_LSB)
/****** Dados LoRaWAN **********/
#define LORAWAN_APP_INTERVAL 5400000 // Intervalo de 1h30min (em ms) 1000(ms)*60(s)*90(min) = 5 400 000 ms
//seleção da região EU868 para a frequência usada pelo LoRa na Europa
//LoRaMacRegion_t g_CurrentRegion = LORAMAC_REGION_EU868;
// Dados necessários para o OTAA (keys) ; MSB
// Não vai existir configuração para OTAA ou APB, tendo em conta que por omissão ele já usa o OTAA
uint8_t nodeDeviceEUI[8] = {0xAC, 0x1F, 0x09, 0xFF, 0xFE, 0x05, 0x06, 0x8E};
uint8_t nodeAppEUI[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
uint8_t nodeAppKey[16] = {0x1F, 0xF2, 0xD9, 0xAD, 0x7C, 0xAF, 0xB7, 0xE5, 0x0E, 0xB0, 0x2A, 0xD0, 0x3E, 0x0C, 0x51, 0x6B};
// Estrutura de Callbacks
static lmh_callback_t g_lora_callbacks =
{
BoardGetBatteryLevel,
BoardGetUniqueId,
BoardGetRandomSeed,
lorawan_has_joined_handler,
lorawan_join_fail
};
lmh_param_t lora_param_init = {
.adr_enable = LORAWAN_ADR_ON,
.tx_power = TX_POWER_0,
.data_rate = DR_3,
.public_network = LORAWAN_PUBLIC_NETWORK,
.join_trials = 3,
.tx_interval = 0
};
lmh_error_status lmh_init(lmh_callback_t *g_lora_callbacks, lmh_param_t lora_param_init, bool otaa, eDeviceClass nodeClass = CLASS_A, LoRaMacRegion_t region = LORAMAC_REGION_EU868);
/*****************************************************\
Chamadas o protótipo das funções antes do setup e loop
Funções desenvolvidas depois do loop()
\*****************************************************/
float readVBAT();
uint8_t batteryPercentage(float voltage);
void lorawan_has_joined_handler(void);
void lorawan_join_fail(void); //qd dispositivo falha em conectar-se à rede
uint8_t BoardGetBatteryLevel(void);
void BoardGetUniqueId(uint8_t* id);
uint32_t BoardGetRandomSeed(void);
/*******SETUP********/
void setup()
{
Serial.begin(115200);
while (!Serial);
// Inicializar I2C e BME680
if (!bme.begin())
{
Serial.println("Erro ao inicializar o BME680!");
while (1);
}
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_4X);
bme.setGasHeater(320, 150); //320ºC em 150ms
// Inicializar LoRaWAN
lora_rak4630_init();
lmh_init(&g_lora_callbacks, g_lora_param_init, true,LORAMAC_REGION_EU868);
lmh_setDevEui(nodeDeviceEUI);
lmh_setAppEui(nodeAppEUI);
lmh_setAppKey(nodeAppKey);
lmh_join();
}
static int sensor_fail_count = 0;
void loop()
{
send_lora_frame();
enterLowPowerMode(LORAWAN_APP_INTERVAL);
//Deep Sleep
//LowPower.deepSleep(LORAWAN_APP_INTERVAL);
/*RTCWakeup(LORAWAN_APP_INTERVAL);
// Entrar no modo de baixo consumo
Serial.println("Entrando em modo de baixo consumo...");
//sd_power_system_off(); // Modo de baixo consumo total */
}
void enterLowPowerMode(uint32_t interval_ms)
{
// Configura o temporizador do sistema
NRF_TIMER2->TASKS_STOP = 1;
NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer;
NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit;
NRF_TIMER2->PRESCALER = 4; // Ajustar conforme necessário
NRF_TIMER2->CC[0] = interval_ms * 32.768; // Baseado no clock RTC
NRF_TIMER2->TASKS_START = 1;
// Entra no modo de baixo consumo
sd_power_system_off();
}
void send_lora_frame(void)
{
// Lê os dados do BME680
if (!bme.performReading())
{
sensor_fail_count++;
Serial.println("Erro ao realizar leitura no BME680!");
if(sensor_fail_count >=3)
{
Serial.println("Muitas falhas no sensor. A reiniciar...");
NVIC_SystemReset();
}
return;
}
sensor_fail_count = 0; //Reset em caso de sucesso
float temperature = bme.temperature; // Temperatura em °C
float humidity = bme.humidity; // Umidade em %
uint32_t gas_resistance = bme.gas_resistance; // Resistência do gás em Ohms
float voltage = readVBAT();
uint8_t battery = batteryPercentage(voltage);
//Enviar dados via LoRaWAN
uint8_t lora_payload[7];
lora_payload[0] = (int8_t)(temperature * 10); // Temperatura * 10 (1 byte)
lora_payload[1] = (uint8_t)(humidity * 10); // Humidade * 10 (1 byte)
lora_payload[2] = (gas_resistance >> 24) & 0xFF; // Resistência do gás (4 bytes)
lora_payload[3] = (gas_resistance >> 16) & 0xFF;
lora_payload[4] = (gas_resistance >> 8) & 0xFF;
lora_payload[5] = gas_resistance & 0xFF;
lora_payload[6] = battery;
lmh_app_data_t app_data = {lora_payload, sizeof(lora_payload), 1, 0, 0};
if (lmh_send(&app_data, LMH_UNCONFIRMED_MSG) == LMH_SUCCESS)
{
Serial.println("Dados enviados via LoRaWAN!");
} else
{
Serial.println("Erro ao enviar dados via LoRaWAN!");
}
}
//Evita que o dispositivo fique preso em loops ou estados não funcionais
void lorawan_joil_fail(void)
{
static int join_attempts = 0;
Serial.printIn("OTAA Join falhou!");
join_attempts++;
if (join_attempts >= 3)
{
Serial.println("Máximo de tentativas feitas. A reiniciar...");
NVIC_SystemReset(); //Reinicia o dispositivo
} else
{
Serial.println("Não deu join, vai tentar novamente");
lmh_join();
}
}
void lorawan_has_joined_handler(void)
{
Serial.println("OTAA Join bem-sucedido!");
// Inicia e configura um temporizador para enviar dados periodicamente
TimerSetValue(&appTimer, LORAWAN_APP_INTERVAL);
TimerStart(&appTimer);
}
float readVBAT()
{
analogReference(AR_INTERNAL_3_0);
analogReadResolution(12);
uint16_t adc_value = analogRead(VBAT_PIN);
return (adc_value * REAL_VBAT_MV_PER_LSB) / 1000.0; // Retorna tensão em volts
}
uint8_t batteryPercentage(float voltage)
{
if (voltage < 3.0) return 0; // Bateria vazia
if (voltage > 4.2) return 100; // Bateria cheia
return (uint8_t)((voltage - 3.0) / (4.2 - 3.0) * 100);
}