It also happens to me that after a few days the CubeCell node stops transmitting.
I connected sensors via Vext.
The code I use is the following:`
#include “LoRaWan_APP.h”
#include “Arduino.h”
/*
- set LoraWan_RGB to Active,the RGB active in loraWan
- RGB red means sending;
- RGB purple means joined done;
- RGB blue means RxWindow1;
- RGB yellow means RxWindow2;
- RGB green means received done;
*/
/* ABP para Cavit_01*/
uint8_t devEui[] = { };;
uint8_t appEui[] = { };;
uint32_t devAddr = ( uint32_t )0x???;
uint8_t appKey[] = { };
uint8_t appSKey[] = { };
uint8_t nwkSKey[] = { };
/LoraWan channelsmask, default channels 0-7/
uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };
/LoraWan region, select in arduino IDE tools/
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION;
/LoraWan Class, Class A and Class C are supported/
DeviceClass_t loraWanClass = LORAWAN_CLASS;
/the application data transmission duty cycle. value in [ms]./
uint32_t appTxDutyCycle = 15000;
/OTAA or ABP/
bool overTheAirActivation = LORAWAN_NETMODE;
/ADR enable/
bool loraWanAdr = LORAWAN_ADR;
/* set LORAWAN_Net_Reserve ON, the node could save the network info to flash, when node reset not need to join again */
bool keepNet = LORAWAN_NET_RESERVE;
/* Indicates if the node is sending confirmed or unconfirmed messages */
bool isTxConfirmed = LORAWAN_UPLINKMODE;
/* Application port */
uint8_t appPort = 58;
uint16_t sensor_1 = 0;
uint16_t sensor_2 = 0;
/*!
- Number of trials to transmit the frame, if the LoRaMAC layer did not
- receive an acknowledgment. The MAC performs a datarate adaptation,
- according to the LoRaWAN Specification V1.0.2, chapter 18.4, according
- to the following table:
-
- Transmission nb | Data Rate
- ----------------|-----------
- 1 (first) | DR
- 2 | DR
- 3 | max(DR-1,0)
- 4 | max(DR-1,0)
- 5 | max(DR-2,0)
- 6 | max(DR-2,0)
- 7 | max(DR-3,0)
- 8 | max(DR-3,0)
-
- Note, that if NbTrials is set to 1 or 2, the MAC will not decrease
- the datarate, in case the LoRaMAC layer did not receive an acknowledgment
*/
uint8_t confirmedNbTrials = 4;
/* Prepares the payload of the frame */
static void prepareTxFrame( uint8_t port )
{
/*appData size is LORAWAN_APP_DATA_MAX_SIZE which is defined in “commissioning.h”.
*appDataSize max value is LORAWAN_APP_DATA_MAX_SIZE.
*if enabled AT, don’t modify LORAWAN_APP_DATA_MAX_SIZE, it may cause system hanging or failure.
*if disabled AT, LORAWAN_APP_DATA_MAX_SIZE can be modified, the max value is reference to lorawan region and SF.
*for example, if use REGION_CN470,
*the max value for different DR can be found in MaxPayloadOfDatarateCN470 refer to DataratesCN470 and BandwidthsCN470 in “RegionCN470.h”.
*/
appDataSize = 9;
// abilito l'alimentazione esterna
Serial.println("Misuro la il valore del sensore analogico");
digitalWrite(Vext,LOW);
delay(40);
///leggo il valore del sensore analogico
sensor_1 = analogRead(ADC2); //return the voltage in mV, max value can be read is 2400mV
//Aspetto un attimo per leggerte il secondo sensore
delay(50);
///leggo il valore del secondo sensore analogico
sensor_2 = analogRead(ADC3); //return the voltage in mV, max value can be read is 2400mV
delay(40);
digitalWrite(Vext,HIGH);
//Serial.print(millis());
Serial.print("Valore della batteria");
uint16_t BatteryVoltage = getBatteryVoltage();
Serial.println(BatteryVoltage);
appData[0] = 0x01;
appData[1] = (uint8_t)(BatteryVoltage >> 8);
appData[2] = (uint8_t)BatteryVoltage;
appData[3] = 0x02;
appData[4] = (uint8_t)(sensor_1 >> 8);
appData[5] = (uint8_t)sensor_1;
appData[6] = 0x03;
appData[7] = (uint8_t)(sensor_2 >> 8);
appData[8] = (uint8_t)sensor_2;
}
void app(uint8_t port, const uint8_t const data)
{
// lora_printf(“data:%d\r\n”,data);
switch (port)
{
case 6:
{
if (data != 0 )
{
Serial.println(" ---------- Imposto il nuovo tempo di trasmissione in secondi ---------------- “);
Serial.print(” tempo di trasmissione: “);
int intervallo = (data[0] & 0b11111111) << 8;
intervallo |= (data[1] & 0b11111111);
Serial.print (intervallo);
Serial.println(” secondi");
int tempo = intervallo1000;
delay(200);
Serial.println(tempo);
appTxDutyCycle = tempo;
}
delay(1000);
break;
}
case 20:
{
Serial.println(" reset board ");
delay(200);
HW_Reset(0);
Serial.println(" resetted board ");
break;
}
case 51:
{
Serial.println(" ---------------- 51 ---------------- ");
break;
}
default:
{
Serial.print("data: ");
Serial.println(data[0]);
Serial.println(" ---------------- NN ---------------- ");
break;
}
}
}
//downlink data handle function example
void downLinkDataHandle(McpsIndication_t *mcpsIndication)
{
Serial.printf("+REV DATA:%s,RXSIZE %d,PORT %d\r\n",mcpsIndication->RxSlot?“RXWIN2”:“RXWIN1”,mcpsIndication->BufferSize,mcpsIndication->Port);
Serial.print("+REV DATA:");
app(mcpsIndication->Port, mcpsIndication->Buffer);
for(uint8_t i=0;iBufferSize;i++)
{
Serial.printf("%02X",mcpsIndication->Buffer[i]);
}
Serial.println();
uint32_t color=mcpsIndication->Buffer[0]<<16|mcpsIndication->Buffer[1]<<8|mcpsIndication->Buffer[2];
#if(LoraWan_RGB==1)
turnOnRGB(color,5000);
turnOffRGB();
#endif
}
void setup() {
boardInitMcu();
Serial.begin(115200);
#if(AT_SUPPORT)
enableAt();
#endif
deviceState = DEVICE_STATE_INIT;
LoRaWAN.ifskipjoin();
//digitalWrite(Vext,LOW);
}
void loop()
{
switch( deviceState )
{
case DEVICE_STATE_INIT:
{
#if(AT_SUPPORT)
getDevParam();
#endif
printDevParam();
LoRaWAN.init(loraWanClass,loraWanRegion);
deviceState = DEVICE_STATE_JOIN;
break;
}
case DEVICE_STATE_JOIN:
{
LoRaWAN.join();
break;
}
case DEVICE_STATE_SEND:
{
prepareTxFrame( appPort );
LoRaWAN.send();
deviceState = DEVICE_STATE_CYCLE;
break;
}
case DEVICE_STATE_CYCLE:
{
// Schedule next packet transmission
txDutyCycleTime = appTxDutyCycle + randr( 0, APP_TX_DUTYCYCLE_RND );
LoRaWAN.cycle(txDutyCycleTime);
deviceState = DEVICE_STATE_SLEEP;
break;
}
case DEVICE_STATE_SLEEP:
{
//Serial.print(“I’m going to sleep…”);
LoRaWAN.sleep();
break;
}
default:
{
deviceState = DEVICE_STATE_INIT;
break;
}
}
}`