PlatformIO Community

Integrate CCS811 in LoRaWAN using cubecells capsule sensor

Hello, I’m trying to send the data from a CCS811 sensor in my cubecell capsule. Testing CCS811 using the base code that comes in the arduinoasrmicro650x framework proves that my sensor works, now I want to send that data via LoRaWAN. The problem is, that CCS811 doesn’t work properly or doesn’t integrate well with the LoRaWAN code.

This is my code:

#include "LoRaWan_APP.h"

#include "Arduino.h"

#include <CCS811.h>

CCS811 ccs;

/*

 * 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;

 */

/* OTAA para*/

uint8_t devEui[] = { 0x22, 0x32, 0x33, 0x00, 0x00, 0x88, 0x88, 0x02 };

uint8_t appEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };

uint8_t appKey[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x66, 0x01 };

/* ABP para*/

uint8_t nwkSKey[] = {FILL};

uint8_t appSKey[] = {FILL};

uint32_t devAddr = (uint32_t)FILL;

/*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 = false;

/*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 = 2;

/*!

* 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 )

{

  digitalWrite(GPIO0,LOW);

  if(ccs.available()){

    if(!ccs.readData()){

      Serial.print("CO2: ");

      Serial.print(ccs.geteCO2());

      Serial.println(" ppm");

      Serial.print("TVOC:");

      Serial.print(ccs.getTVOC());

      Serial.println(" ppb");

      Serial.print("millis:");

      Serial.println(millis());

    }

    else{

      Serial.println("ERROR!");

    }

  }

  digitalWrite(GPIO0,HIGH);

  /*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 = 4;

    appData[0] = 0x00;

    appData[1] = 0x01;

    appData[2] = 0x02;

    appData[3] = 0x03;

}

void setup() {

  boardInitMcu();

  pinMode(Vext,OUTPUT);

  digitalWrite(Vext,LOW);

  pinMode(GPIO0,OUTPUT);

  digitalWrite(GPIO0,LOW);

  Serial.begin(115200);

#if(AT_SUPPORT)

  enableAt();

#endif

  deviceState = DEVICE_STATE_INIT;

  LoRaWAN.ifskipjoin();

    if(!ccs.begin()){

    Serial.println("Failed to start sensor! Please check your wiring.");

    while(1);

  }

  // Wait for the sensor to be ready

  while(!ccs.available());

}

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:

    {

      LoRaWAN.sleep();

      break;

    }

    default:

    {

      deviceState = DEVICE_STATE_INIT;

      break;

    }

  }

}

Note: I still didn’t code the data in order to send to the server because the problem is in this part:

digitalWrite(GPIO0,LOW);

      if(ccs.available()){

        if(!ccs.readData()){

          Serial.print("CO2: ");

          Serial.print(ccs.geteCO2());

          Serial.println(" ppm");

          Serial.print("TVOC:");

          Serial.print(ccs.getTVOC());

          Serial.println(" ppb");

          Serial.print("millis:");

          Serial.println(millis());

        }

        else{

          Serial.println("ERROR!");

        }

      }

When it comes to the function ccs.readData() it works the first time, then it will always provide ERROR! Any idea why this occurs?