[Résolu] Mise en sommeil = fonction loop continue ?

Bonjour,

dans le cadre d'un projet de boite à musique, je cherche à mettre l'Arduino en sommeil. J'ai donc utilisé la librairie sleep.h et la fonction habituelle que l'on trouve facilement internet :

// Enters the arduino into sleep mode.
void enterSleep(void)
{
  Serial.println(F("Mise en sommeil")); 
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();

  // Now enter sleep mode.
  sleep_mode();

  // The program will continue from here after the WDT timeout

  // First thing to do is disable sleep.
  sleep_disable();

  // Re-enable the peripherals.
  power_all_enable();
}

J'appelle la fonction à l'intérieur du loop, quand le module mp3 est inactif depuis un temps donné.

   else {
     // Si intervalle passé, on arrete
     if ( millis() - time >= arretMp3 ) {
       enterSleep();
       }
     }

Cela fonctionne. Mais ce que je comprends pas c'est que la fonction loop continue à tourner, et je vois défiler le Serial.println ("Mise en sommeil") sur le moniteur serie.
Je pensais que le programme était stoppé au niveau de l'instruction "sleep_mode" ??
Il y a t'il quelque chose que je ne comprends pas, et l'Arduino est-il en sommeil?
La seule chose qui diffère des exemples trouvés sur internet est que je ne prévois pas d'interruption pour réveil, je prévois que l'utilisateur coupe l'alim de l'Arduino et le remette en route.

Merci d'avance
OS : Debian Buster
IDE : 1.8.2
Carte Arduino UNO, module mp3 DFPlayer mini, tag RFID-RC522

Dans ton code, le µC se met en mode veille après l’instruction
sleep_mode();pendant un certain temps (comme le fût du canon) :
The program will continue from here after the WDT timeoutReste à connaitre la valeur de ce timout (WDT : WatchDog Timer) : s’il vaut 10 ms, c’est sûr que tu ne verras rien…

Il existe une instruction qui permet de le régler de 15ms à 8s (exemple ici)

wdt_enable(WDTO_4S);

Il est possible de choisir un réveil par interruption (openclassrooms) :

void wakeCallback() {
    /* rien */
}
 
void sleepPwrDown() {
 
    // Configuration du type de sleep
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
 
    // Autorisation du mode sleep
    sleep_enable();
     
    // Attachement d'une interruption sur front descendant de INT0
    attachInterrupt(0, wakeCallback, FALLING);
 
    // Activation du mode sleep
    sleep_mode();
     
    // CPU en mode sleep,
    // Attente de l'interruption INT0 qui réveillera le CPU
     
    // Désactivation du mode sleep
    sleep_disable();
     
}

On peut mettre en sommeil 8 sec (max), se réveiller très brièvement, vérifier que c'est encore l'heure de dormir et se rendormir pour faire des nuits plus longues par cycles de 8s.

Merci,

mais cela veut dire que le WDT fonctionne sans instruction, et sans bibliothèque ?
(la phrase dans la fonction sur le reveil par le WDT est le resultat de mon copié-collé, je n’ai rien dans mon programme le concernant)

#include <SPI.h>
#include <MFRC522.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <avr/sleep.h>
#include <avr/power.h>

Il faut ajouter:
#include <avr/wdt.h> Plus de détails ici.

Et en mettant la librairie en place, il ne vas plus se réveiller ?

Ce que je cherche, c'est de le mettre en sommeil définitivement, jusqu'à un reset manuel.

Pas de réveil par WDT ni par interruption.

Dans ce cas, il existe une fonction dans la bibliothèque LowPower :

LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

Merci,

je vais essayer.

non,

même résultat, je boucle sur ma fonction

// Enters the arduino into sleep mode.
void enterSleep(void)
{
  Serial.println(F("Mise en sommeil")); 
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}

Le loop continue et j’ai le message sur le moniteur série en boucle ??

J’ai bien sûr mis la librairie en place et aucun pb de compil.

#include <SPI.h>
#include <MFRC522.h>
#include <Arduino.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <LowPower.h>

[code]

C’est bizarre, essaye avec un code minimal, juste les bonnes bibliothèques et l’appel de ta fonction.

Oui,

je suis absent, je fais ça dimanche.

Merci

C'est juste une suggestion, je ne sais vraiment pas si ça va aider. Je pense que tu devrais tester les codes fournis dans les liens que je cite ou ceux que tu peux trouver toi même sur internet. Dès que tu réussis à trouver les instructions qui le mettent en sommeil, tu ajoutes le reste du code
Bon courage

Bonjour,

avant de simplifier le code, j'ai voulu faire un essai en débranchant les modules. J'ai donc débranché mon pin 5v, qui alimente le module mp3 et le module RFID, et là miracle, la mise en sommeil marche.
Le plus étonnant (pour moi), c'est que j'ai remis le 5v, et que la mise en sommeil marche toujours. J'ai fait plusieurs essais depuis ce matin, ça marche.... ?
Je vais mettre le sujet en résolu, mais si il y a une explication, je prends.

Merci en tout cas.