Heltec CubeCell - part 1

Thank you for your good ideas!

After the Spring Festival holiday, we will gradually improve the document details

1 Like

Here is a sketch, mix of examples using CubeCell board.
Send data and sleep 20 Sec.
I accept suggestions.

#include "LoRaWan_APP.h"
#include "Arduino.h"


#define timetosleep 1000
#define timetowake 20000
static TimerEvent_t sleep;
static TimerEvent_t wakeup;
uint8_t lowpower=1;

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

/*LoraWan Class*/
DeviceClass_t  CLASS=LORAWAN_CLASS;
/*OTAA or ABP*/
bool OVER_THE_AIR_ACTIVATION = LORAWAN_NETMODE;
/*ADR enable*/
bool LORAWAN_ADR_ON = 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;
/*LoraWan REGION*/
LoRaMacRegion_t REGION = ACTIVE_REGION;

/* Indicates if the node is sending confirmed or unconfirmed messages */
bool IsTxConfirmed = false;
/*!
* 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 = 1;

/* Application port */
uint8_t AppPort = 2;

/*the application data transmission duty cycle.  value in [ms].*/
uint32_t APP_TX_DUTYCYCLE = 15000;

/* Prepares the payload of the frame */
static void PrepareTxFrame( uint8_t port )
{
    AppDataSize = 4;//AppDataSize max value is 64
    AppData[0] = 0x00;
    AppData[1] = 0x02;
    AppData[2] = 0x01;
    AppData[3] = 0x03;
}


void setup() {
    BoardInitMcu();
    Serial.begin(115200);
    #if(AT_SUPPORT)
    Enable_AT();
    #endif
    DeviceState = DEVICE_STATE_INIT;
    LoRaWAN.Ifskipjoin();
    Serial.println( "[stup] INIT");
    #if(AT_SUPPORT)
      getDevParam();
    #endif
    Serial.println ("");
    Serial.println("[pram] ***********************************");
    printDevParam();
    Serial.println("[pram] ***********************************");
    Serial.println ("");
    Serial.printf("[stup] LoRaWan Class%X  start! \r\n",CLASS+10);   
    LoRaWAN.Init(CLASS,REGION);
    Serial.println( "[stup] JOIN");
    LoRaWAN.Join();
    delay(1000);   

    TimerInit( &sleep, OnSleep );
    TimerInit( &wakeup, OnWakeup );
    OnSleep();
}

void loop()
{
  if(lowpower)
  {
  //note that LowPower_Handler() run six times the mcu into lowpower mode;
  LowPower_Handler();
  }					
}

void OnSleep()
{
  Serial.printf("[lowp] lowpower mode  %d ms\r\n",timetowake);
  Serial.println("---------------------------zzzzzzzz----------------------------");
  lowpower=1;
  //timetosleep ms later wake up;
  TimerSetValue( &wakeup, timetowake );
  TimerStart( &wakeup );
}
void OnWakeup()
{
  Serial.printf("[wkup] wake up, %d ms later into lowpower mode.\r\n",timetosleep);
  uint32_t currentTime=TimerGetCurrentTime()/1000;
  Serial.printf("[time] upTime: %d sec. \r\n",currentTime);   
  lowpower=0;
  //timetosleep ms later into lowpower mode;
  Serial.print( "[ttn ] ");//sending
  PrepareTxFrame( AppPort );
  LoRaWAN.Send();
  delay(1000); 
      
    /*
      Serial.println( "CYCLE");
      // Schedule next packet transmission
      TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( 0, APP_TX_DUTYCYCLE_RND );
      LoRaWAN.Cycle(TxDutyCycleTime);
    */  
    
  Serial.println("[ttn ] SEND");
  LoRaWAN.Sleep();
  
  TimerSetValue( &sleep, timetosleep );
  TimerStart( &sleep );
}

Iā€™m not sure for what reason you are posting this code here, examples are already included with the ASR650x Arduino Core.

At first look your code looks just like the standard LoRaWAN example.

Your ā€˜I accept suggestionsā€™ does not sound very inviting and makes little sense.

If you have any specific questions then you can ask them, but donā€™t just post code without any clear reason.

Hi bluejedi.
This example is a mix of LowPower_WakeUpByTimer and the LoRaWan, sending data to TTN.

There are to a counter of millis betwen sleeps, using TimerGetCurrentTime().

I post here because I used with TTN, and could help somebody.

Iā€™m not a good programmer, the sketch works, but probably you could propose some changes.

Regards.

Anybody trying to use a Cubecell with AU915 and TTN - have a look here for a solution to frequency issues

Many thanks to Bruce who found the solution

regards
Paul

1 Like

FYI: Topic title was updated.

Hi,
May I kindly ask regarding CubeCell module (meaning CubeCell chip, not developers board) - what is input voltage tolerance, Is it ok to powered it by 3,6V - LS14500STD 3,6V 2450mAh?? Or should I use regulator to convert it to 3.3V?
Ciao
Lukas

According to Heltecā€™s specifications max power supply voltage (VDD) is 3.5V.

See Tech Specs tab on the HTCC-AM01 product page.

An alternative is put a low forward voltage Schottky diode (e.g. 1N5817) in series with the (plus of) the battery. This will cause a voltage drop of around 0.3V to 0.5V and also provides reverse polarity protection.

Hi,
may I kindly ask a few questions. I tested your sketch but it really was not working based on my expectations. Using ABP I was able to send data. Using OTAA I always get response ā€œunable to joinā€ - I saw requests coming but no success.

Is it also possible to share sketch with download handling? Like ability to receive the response and parse data and apply it - like change wakeup time, or handle GPIO (low/high), or any other operation?

I would really appreciate any kind of support.
Maybe I am doing something totally wrong, but not sure
Ciao
Lukas

The standard LoRaWAN example already automatically enters deep sleep between upload cycles and automatically wakes up by timer.

I did a small test with the standard LoRaWAN.ino example.

When powered by LiPo battery via the battery connector the CubeCell board uses only 8.5 uA during deep sleep! :smiley: :+1:

When externally powered directly on the 3.3V pin, either by LiFePO4 (3.2V nominal) or by two Alkaline batteries (2 x 1.5V = 3.0V nominal) the CubeCell board uses only 3 to 3.5 uA in deep sleep.

2 Likes

Powering the CubeCell HTCC-AB01 board with batteries

Important: It is easy to connect batteries incorrectly and reverse their polarity (50% probability) which can permanently damage the board. Iā€™m not sure if there is reverse polarity protection when using the battery connector (often not) but there definitely is not when directly powering the Vin or 3.3V pins. Also take care that AA, AAA, 18650 model batteries can accidentally be inserted in reverse when using a battery holder.

Powering with a Li-ion or LiPo battery:

Li-ion and LiPo batteries must be connected via the battery connector.
The battery will be automatically charged when a (powered) USB cable is connected or when a solar panel is connected.

Important: To prevent damaging the board, first check the polarity of the battery cable before connecting the battery to the board. It is not uncommon that polarity (plus and minus) of separately bought cables is reversed to that of the board - which can permanently damage it.
Some of these batteries have built-in protection but Iā€™m not aware if that will also protect the board from damage if the battery is connected in reverse.

Powering with a LiFePO4 battery:

Connect the plus directly to the 3.3V pin and do not use the battery connector.
The battery connector only supports Li-ion and LiPo batteries. LiFePO4 battery have a lower output voltage and have different charging requirements. When using a LiFePO4 battery, it cannot be charged via the USB port.

Important: The board does not provide over-discharge protection for the battery. When using a battery holder it is possible to insert the battery reversed which can damage the board. Adding a reverse polarity protection with a MOSFET will protect against this.

Powering with regular Alkine batteries:

Note that directly powering the 3.3V pin with two regular Alkaline batteries is less suitable because the batteries provide only 3.0V nominal output which steadily decreases to below 2.0V during discharge, so it will not be possible to use their full capacity (maybe only half of it).

In case use of Alkaline batteries is preferred (e.g. because they are cheap and readily available) it will be better to use three Alkaline cells in series. In this case the plus must be connected via a Schottky diode in series to the Vin pin. Use a Schottky diode with low forward voltage (e.g. 1N5817).

Important: The Schottky series diode is required to protect the batteries. The diode prevents the batteries from being powered with Vin or Vusb (5V). This protection is important but is not provided on the board. The diode also provides reverse polarity protection.


Connecting a solar panel

The board can be connected to a 5V or 6V solar panel. The plus of solar panel must be connected via a Schottky diode in series to the VS pin. Use a Schottky diode with low forward voltage (e.g. 1N5817). The solar board will be used for charging the Li-ion or LiPo battery.

Important: The Schottky series diode is required to protect the solar panel. The diode prevents the solar panel from being powered with Vin or USB (5V). This protection is important but is not provided on the board.

2 Likes

This is so true about Alkaline batteries.

If you want to avoid rechargebles for whatever reason, a good alternative to Alkalines is the Lithium Energizers, almost the full 1.5V till exausted. Good down to circa -40C.

Not as cheap as Alkaline unfortunately.

https://data.energizer.com/pdfs/l91.pdf

1 Like

I didnā€™t know that 1.5V Lithium batteries exist.

Hi,
and may I asked for your recommendation regarding LS14500, which is 3.6V No-rechargeable lithium ion battery. Which way to connect to CubeCell board. Shall I use VIN pin and regulator? I would rather use it without regulator.

Have you used one to power a node before ?

Datasheet I have for a LS14500 suggests the output voltage is around 2.5V at 50mA current drain.

I am using LS14500 mainly to power esp8266 or esp32 for my nodes. I do not tested using cubecell yet, but I plan to test it soon. Looking for recommendation regarding proper setup/configuration/connecting to CubeCell. I am really satisfied with the battery performance with my existing projectsā€¦ Measured battery output is approx. 3.4V at 100mA.

Thanks for the update, interesting although not cheap.

I had looked at them for very low temperature use, thats where the voltage performance suffers.

@LoRaTracker - I am using it mainly nodes which are placed under the ground, so there is no such low temperature (-3 was the lowest temp, so I do not challenge such an issue).

That was exactly the reason why I did not include 3.6V Lithium Thionyl Chloride batteries in above overview (and I have no personal experience with these batteries).

A sufficiently large capacitor as buffer could help to stabilize input voltage for short periods between deep sleeps.

The next issue to solve would be to which power input pin to connect it.

When connecting directly to the 3.3V pin:

  • The 3.6V of the battery is too high for this (max supply voltage VDD of the CubeCell module is 3.5V). A series diode would probably cause a too high voltage drop (especially under load).

    Or just connect it without series diode but that would run the CubeCell module (and connected sensors) (a bit) out of spec. This could work fine but can also cause degrading issues on longer (or shorter) term.

When connecting to Vin:

  • Vin is parallel to Vusb (5V) which is error prone and may cause damage when a USB cable is connected. Using a series diode for protection is not an option here because it will cause a too large voltage drop. Vin is input to a 3.3V voltage regulator of which VDD 3.3V is the output so voltage would drop twice when using a series diode.

So what would be the best choice?