• Post category:Nano
  • Commentaires de la publication :0 commentaire
  • Dernière modification de la publication :mars 12, 2022
  • Temps de lecture :11 min de lecture

Démo de la consommation des modes de veille de l’Arduino Nano *

 

 

    Prérequis :

Matériel :

  • 1 x Carte Arduino Nano
  • 1 x Led
  • 1 x Résistance 220 ohms
  • 1 x Multimètre
  • Fils de connexion
  • 1 x Ecran LCD 20×4
  • 1 x Module I2C
  • 1 x Breadboard
  • 1 x Alimentation 5V

Bibliothèque :

  • LiquidCrystal_I2C.h

 

 

Vidéo de démonstration :

 

Schéma de câblage :

 

Code :

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include "Arduino.h"
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>

#define LED_PIN (13) //Led rouge présente sur l'Arduino
#define LED_PINverte (4) //Led verte connectée sur PIN4

//On utilise une variable volatile car elle est modifiée à l'intérieur
//d'une fonction d'interruption
volatile int etat_wdt = 1;
int Modeveille;

// Service d'interruption de chien de garde. Ceci est exécuté lorsque le chien de garde a expiré.
ISR(WDT_vect) {
if (etat_wdt == 0) {
etat_wdt = 1;
}
}

// Met l'arduino en mode veille MODE IDLE. - le mode d'économie d'énergie le plus bas
void enterSleepMODE_IDLE(void)
{
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();

// Entrez maintenant en mode veille.
sleep_mode();

// Le programme continuera à partir d'ici après le délai d'attente WDT.

// La première chose à faire est de désactiver le sommeil.
sleep_disable();

// Réactiver les périphériques.
power_all_enable();
}

// Met l'arduino en mode veille MODE ADC.
void enterSleepMODE_ADC(void)
{
set_sleep_mode(SLEEP_MODE_ADC);
sleep_enable();

// Entrez maintenant en mode veille.
sleep_mode();

// Le programme continuera à partir d'ici après le délai d'attente WDT.

// La première chose à faire est de désactiver le sommeil.
sleep_disable();

// Réactiver les périphériques.
power_all_enable();
}

// Met l'arduino en mode veille MODE PWR SAVE.
void enterSleepMODE_PWR_SAVE(void)
{
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
sleep_enable();

// Entrez maintenant en mode veille.
sleep_mode();

// Le programme continuera à partir d'ici après le délai d'attente WDT.

// La première chose à faire est de désactiver le sommeil.
sleep_disable();

// Réactiver les périphériques.
power_all_enable();
}

// Met l'arduino en mode veille MODE STANDBY.
void enterSleepMODE_STANDBY(void)
{
set_sleep_mode(SLEEP_MODE_STANDBY);
sleep_enable();

// Entrez maintenant en mode veille.
sleep_mode();

// Le programme continuera à partir d'ici après le délai d'attente WDT.

// La première chose à faire est de désactiver le sommeil.
sleep_disable();

// Réactiver les périphériques.
power_all_enable();
}

// Met l'arduino en mode veille MODE PWR DOWN.
void enterSleepMODE_PWR_DOWN(void)
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();

// Entrez maintenant en mode veille.
sleep_mode();

// Le programme continuera à partir d'ici après le délai d'attente WDT.

// La première chose à faire est de désactiver le sommeil.
sleep_disable();

// Réactiver les périphériques.
power_all_enable();
}

// Configurer la minuterie Watch Dog (WDT)
void setupWatchDogTimer() {
// Le registre d'état du MCU (MCUSR) est utilisé pour faire la distinction de la cause de la dernier
// réinitialisation, telle que la réinitialisation des baisses de tension, la réinitialisation du chien de garde, etc.
// REMARQUE : pour des raisons de sécurité, il existe une séquence chronométrée pour effacer le
// WDE et modifier la configuration du délai d'attente. Si vous n'utilisez pas la
// séquence correctement, vous obtiendrez des résultats inattendus.

// Efface l'indicateur de réinitialisation sur le MCUSR, le bit WDRF (bit 3).
MCUSR &= ~(1 << WDRF);
//Désactiver les interruptions afin que nous ne soyons pas interrompus lors de la séquence chronométrée
cli();
// Configurer le registre de contrôle de la minuterie Watchdog (WDTCSR)
// Le WDTCSR est utilisé pour configurer le time-out, le mode de fonctionnement, etc.

// Afin de changer WDE ou le prescaler, nous devons définir WDCE (cela
// autorise les mises à jour pendant 4 cycles d'horloge).

// Réglez le bit WDCE (bit 4) et le bit WDE (bit 3) du WDTCSR. Le WDCE
// le bit doit être défini pour modifier WDE ou les prescalers de surveillance.
// La définition du bit WDCE permettra les mises à jour des prescalers et WDE pour 4
// cycles d'horloge, puis il sera réinitialisé par le matériel.
WDTCSR |= (1 << WDCE) | (1 << WDE);

/**
Réglage de la valeur de pré-scaler du chien de garde avec VCC = 5,0 V et 16 mHZ
WDP3 WDP2 WDP1 WDP0 | Nombre de WDT | Délai d'attente typique aux cycles d'oscillateur
0 0 0 0 | 2K cycles | 16 ms
0 0 0 1 | 4K cycles | 32 ms
0 0 1 0 | 8K cycles | 64 ms
0 0 1 1 | 16K cycles | 0.125 s
0 1 0 0 | 32K cycles | 0.25 s
0 1 0 1 | 64K cycles | 0.5 s
0 1 1 0 | 128K cycles | 1.0 s
0 1 1 1 | 256K cycles | 2.0 s
1 0 0 0 | 512K cycles | 4.0 s
1 0 0 1 | 1024K cycles | 8.0 s
*/
WDTCSR = (1 << WDP3) | (0 << WDP2) | (0 << WDP1) | (1 << WDP0);
//active les interruptions globales
sei();
// Active l'interruption WD (remarque : pas de réinitialisation).
WDTCSR |= _BV(WDIE);
}

// Configuration pour les communications série et les autres choses
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
Serial.println("Initialising..."); delay(100);
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PINverte, OUTPUT);
setupWatchDogTimer();
Serial.println("Initialisation complete."); delay(100);
}

void LED() {
delay(2000);
lcd.setCursor(6, 3);
lcd.print("-- 3 --");
delay(1000);
lcd.setCursor(6, 3);
lcd.print("-- 2 --");
delay(1000);
lcd.setCursor(6, 3);
lcd.print("-- 1 --");
delay(1000);
lcd.setCursor(6, 3);
lcd.print("ACTIVER");
// Allume la LED
digitalWrite(LED_PIN, 1);
digitalWrite(LED_PINverte, 1);
// Temporise 20 ms
delay(200);
// Eteint la LED
digitalWrite(LED_PIN, 0);
digitalWrite(LED_PINverte, 0);
etat_wdt = 0;
wdt_reset();
}

// Boucle principale
void loop() {
// Attend que le chien de garde ait déclenché un réveil.
if (etat_wdt != 1) {
return;
}
// Allume la LED
digitalWrite(LED_PIN, 1);
digitalWrite(LED_PINverte, 1);
// Temporise 20 ms
delay(200);
// Eteint la LED
digitalWrite(LED_PIN, 0);
digitalWrite(LED_PINverte, 0);
lcd.clear();
Modeveille++;
switch (Modeveille) {
case 0:
break;
case 1:
Serial.println("Mode Normal");
lcd.setCursor(3, 0);
lcd.print("Mode de veille");
lcd.setCursor(6, 2);
lcd.print("INACTIF");
delay(6000);
break;
case 2:
Serial.println("Mode IDLE");
lcd.setCursor(3, 0);
lcd.print("Mode de veille");
lcd.setCursor(2, 2);
lcd.print("SLEEP_MODE_IDLE");
LED();
enterSleepMODE_IDLE();
break;
case 3:
Serial.println("Mode ADC");
lcd.setCursor(3, 0);
lcd.print("Mode de veille");
lcd.setCursor(3, 2);
lcd.print("SLEEP_MODE_ADC");
LED();
enterSleepMODE_ADC();
break;
case 4:
Serial.println("Mode PWR SAVE");
lcd.setCursor(3, 0);
lcd.print("Mode de veille");
lcd.setCursor(0, 2);
lcd.print("SLEEP_MODE_PWR_SAVE");
LED();
enterSleepMODE_PWR_SAVE();
break;
case 5:
Serial.println("Mode STANDBY");
lcd.setCursor(3, 0);
lcd.print("Mode de veille");
lcd.setCursor(1, 2);
lcd.print("SLEEP_MODE_STANDBY");
LED();
enterSleepMODE_STANDBY();
break;
case 6:
Serial.println("Mode PWR DOWN");
lcd.setCursor(3, 0);
lcd.print("Mode de veille");
lcd.setCursor(0, 2);
lcd.print("SLEEP_MODE_PWR_DOWN");
LED();
enterSleepMODE_PWR_DOWN();
break;
case 7:
delay(3000);
Modeveille = 0;
break;
}
}

 


 

Laisser un commentaire