LoRaWan: Mise en veille avec RTC interne

La carte Seeeduino LoRaWan peut être mise en veille si nécessaire afin de réduire la consommation. Cela permet de l’exploiter sur plusieurs jours si nécessaire.

Matériel:

Seeeduino LoRaWan;

Codage:

Afin d’utiliser la mise en veille, il faut télécharger les librairies: « Energy Saving » et « RTC ».

Allez dans « croquis » -> « inclure une bibliothèque » -> « Gérer les bibliothèque » et recherchez « Energy Saving », elle se trouve facilement. Pour « RTC », il faut trouver celle intitulé: « RTC Built-in by arduino 1.0.0 ».

#include <EnergySaving.h>
#include <RTCInt.h>

EnergySaving nrgSave;
RTCInt rtc;

unsigned int i=0;

void setup()
{
  SerialUSB.begin(9600);   //serial settings
  
  pinMode(13,OUTPUT);  //led RX
  
  rtc.begin(TIME_H24);  //Début de l'horloge
  rtc.setTime(12,48,0,0);
  rtc.setDate(22,10,15);
  rtc.enableAlarm(SEC,ALARM_INTERRUPT,rest_alarm_int); //selection du mode de fonctionnement et lancement de l'alarme.
  /*
                     OFF                 alarm disable
                     SEC                 alarm match on seconds
                     MMSS                alarm match on minutes and seconds
                     HHMMSS              alarm match on hours, minute and seconds
                     DDHHMMSS            alarm match on day, hours, minutes and seconds
                     MMDDHHMMSS          alarm match on month, day hours, minutes and seconds
                     YYMMDDHHMMSS        alarm match on year, month, day, hours, minutes and seconds  
           unsigned int type:
                     ALARM_POLLED        alarm matching must be monitored from the code
                     ALARM_INTERRUPT     when alarm match occurs will be generated an interrupt
*/
  rtc.time.hour=12;
  rtc.time.minute=48;
  rtc.time.second=30;
  nrgSave.begin(WAKE_RTC_ALARM);  //standby setup for external interrupts
  rtc.setAlarm();
  SerialUSB.println("START");
}

void loop()
{
  for(i=0; i<20; i++)
  {
    digitalWrite(13,HIGH);
    delay(500);
    digitalWrite(13,LOW);
    delay(500);
  }

  digitalWrite(13,LOW);
  nrgSave.standby();  //now mcu go to standby
}

void rest_alarm_int(void)  //interrupt routine
{
  digitalWrite(13,HIGH);
  //SerialUSB.println("HELLO");
}

Lors de l’initialisation de l’horloge, il faut lui donner une valeur temporelle initiale (ex: 12h 48m 30s). L’alarme s’activera à chaque fois que cette valeur initiale sera atteinte. Un second paramètre est très important, il permet de commander la fréquence de répétition de l’alarme. Si on lui demande de se baser sur les secondes (SEC), elle s’activera à chaque fois qu’elle arrive à 30 secondes. Pour les minutes (MMSS), elle s’activera à chaque fois qu’elle arrive à 48 minutes et 30 secondes. Et pareillement pour les heures, le jour, le mois et l’année. Tous les paramètres sont précisé dans le code ci-dessus.

Le moment où la mise en veille s’active est déterminée avec cette fonction: « standby()« .

Lorsque l’alarme s’active, elle exécute les codes contenu dans une fonction associé (ici « rest-alarm-int ») et recommence l’exécution des codes après l’appel de « standby()« .

Optimisation:

Grâce à la mise en veille, on augmente grandement l’économie d’électricité, mais il est possible d’aller plus loin. On peut retirer les LEDs PWR et CHG qui consomment continuellement mais qui ne sont pas forcément utiles.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *