Sending soundlevel on interrupt only works at first interrupt event

If connected a sound-level module to my AB01 Cubecell board.

I’ve connected the out pin to GPIO0. I want it so send me a lorawan message by interrupt, every moment it detects a bang, preferably with the level measured by the ADC. I’ve used this sketch to start with:

With the modification a made it sends a message only at the first time it detects a bang. Below here is my current (platformio) sketch. I hope someone can point me in the right direction for the cause of my problem.

#include “LoRaWan_APP.h”
#include “Arduino.h”

/* OTAA para*/
uint8_t devEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t appEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t appKey[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

/* ABP para*/
uint8_t nwkSKey[] = { 0x15, 0xb1, 0xd0, 0xef, 0xa4, 0x63, 0xdf, 0xbe, 0x3d, 0x11, 0x18, 0x1e, 0x1e, 0xc7, 0xda,0x85 };
uint8_t appSKey[] = { 0xd7, 0x2c, 0x78, 0x75, 0x8c, 0xdc, 0xca, 0xbf, 0x55, 0xee, 0x4a, 0x77, 0x8d, 0x16, 0xef,0x67 };
uint32_t devAddr = ( uint32_t )0x007e6ae1;

/LoraWan channelsmask, default channels 0-7/
uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };

// The interrupt pin is attached to GPIO0
#define INT_PIN GPIO0 //interuptpin for soundsensormodule

// battery voltage
uint16_t vbat;

// measurured SoundLevel value from ADC
int soundlevel;

/* Application port */
#define DEVPORT 2
#define APPPORT 1

bool accelWoke = false;

/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]./
/*For this example, this is the frequency of the device status packets */
uint32_t appTxDutyCycle = (24 * 60 * 60 * 1000); // 24h;

/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 = DEVPORT;
/
!

  • 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 bool prepareTxFrame( uint8_t port )
{
int head;
appPort = port;
switch (port) {
case APPPORT: // woke up from interrupt
Serial.println(“Sending data packet”);
soundlevel = analogRead(INT_PIN); //Read the ADC value from the soundsensor
Serial.print(“soundlevel:”);
Serial.println(soundlevel);
appDataSize = 2;//AppDataSize max value is 64
//appData[0] = 0xFF; // set to something useful
appData[0] = highByte(soundlevel);
appData[1] = lowByte(soundlevel);
break;
case DEVPORT: // daily wake up
Serial.println(“Sending dev status packet”);
vbat = getBatteryVoltage();
appDataSize = 2;//AppDataSize max value is 64
//appData[0] = 0xA0; // set to something else useful
appData[0] = highByte(vbat);
appData[1] = lowByte(vbat);
break;
}
return true;
}

void accelWakeup()
{
delay(10);
if(digitalRead(INT_PIN)==HIGH)
{
accelWoke = true;
}
}

void setup() {
boardInitMcu();
Serial.begin(115200);
#if(AT_SUPPORT)
enableAt();
#endif
deviceState = DEVICE_STATE_INIT;
LoRaWAN.ifskipjoin();

//Vext ON
pinMode(Vext,OUTPUT);
digitalWrite(Vext,LOW);
delay(500);

accelWoke = false;
pinMode(INT_PIN,INPUT_PULLUP);
attachInterrupt(INT_PIN, accelWakeup, RISING);
Serial.println(“Interrupts attached”);
}

void loop()
{
if (accelWoke) {
uint32_t now = TimerGetCurrentTime();
Serial.print(now); Serial.println(“accel woke”);
}

switch( deviceState )
{
case DEVICE_STATE_INIT:
{
#if(LORAWAN_DEVEUI_AUTO)
LoRaWAN.generateDeveuiByChipID();
#endif
#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( DEVPORT );
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:
{
if (accelWoke) {
if (IsLoRaMacNetworkJoined) {
if(prepareTxFrame(APPPORT)) {
LoRaWAN.send();
}
}
accelWoke = false;
Serial.println(“accel woke false”);
}
LoRaWAN.sleep();
break;
}
default:
{
deviceState = DEVICE_STATE_INIT;
break;
}
}
}