Aide mise en veille

Bonjour. Je n’ai pas trop compris le fonctionnement de la mise en veille.

Je compte faire une commande de porte via une photo résistance.

Mon code est ok, tout fonctionne. Maintenant pour une question d’économie d’énergie j’aimerais mettre l’arduino en veille, voir l’adafruit motor shield en veille aussi si c’est possible.

Le réveil devrait se faire si possible sur un changement état de l’entrée analogique 0 (mais je pense pas que ce soit faisable) sinon toutes les 30min.

Idéalement si la mise en veille pouvait attendre que le moteur arrête de tourner ça serait bien pratique.

(désolé pour le problème posé, je n’ai trouvé qu’un article en anglais sur le sujet et j’ai rien compris)

#include <AFMotor.h>

int photocellPin = 0; // Photoresistance sur a0
int photocellReading; // Lecture photoresistance
int haut = 13; //capteur haut
int bas = 2; //capteur bas

AF_DCMotor motor(1, MOTOR12_1KHZ);

void setup() {
  pinMode(haut, INPUT);
  pinMode(bas, INPUT);
  motor.setSpeed(200);
}

void loop() {
  photocellReading = analogRead(photocellPin);
  if (photocellReading > 500) {
    while (digitalRead(bas) == 0)
    {
      motor.run(FORWARD);
    }
  }
  motor.run(RELEASE);
  if (photocellReading < 500) {
    while (digitalRead(haut) == 0)
    {
      motor.run(BACKWARD);
    }
  }
  motor.run(RELEASE);
}

J’ai trouvé un début de répons en finalement, reste à comprendre pour l’adapter

Bon voila ma réponse :

#include <AFMotor.h>
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
volatile int f_wdt = 1;              
unsigned long tempo_desiree =900; // 15mn=900 secondes
unsigned long compteur_reveil = 0;
unsigned long compteur_travail=0;
unsigned long debut_travail=0;
unsigned long fin_travail =0;
unsigned long total_travail=0;
const int led = 13; // led du module nano
const int ldr = A7; // LDR sur broche A7
int photocellPin = 0; // Photoresistance sur a0
int photocellReading; // Lecture photoresistance
int haut = 13; //capteur haut
int bas = 2; //capteur bas

AF_DCMotor motor(1, MOTOR12_1KHZ);
unsigned long debut=0; // temps début de rotation

void setup() {
  pinMode(haut, INPUT);
  pinMode(bas, INPUT);
  motor.setSpeed(200);
 setup_watchdog(9);
 Serial.begin(9600);
}

void loop()
{
  if (f_wdt == 1)
  {
    compteur_reveil++;
       Serial.print("reveil pour la  ");
       Serial.print(compteur_reveil,DEC);
       if (compteur_reveil==1){Serial.println(" ere fois");}
       else {Serial.println(" eme fois");}
    if ((compteur_reveil*8)>= 1800)
    {
      compteur_travail++;
  delay(2000);
 photocellReading = analogRead(photocellPin);
  if (photocellReading > 500) {
    while (digitalRead(bas) == 0)
    {
      motor.run(FORWARD);
    }
  }
  motor.run(RELEASE);
  if (photocellReading < 500) {
    while (digitalRead(haut) == 0)
    {
      motor.run(BACKWARD);
    }
  }
  motor.run(RELEASE); 
       Serial.print("travail car il y a eu  ");
       Serial.print((compteur_reveil*8),DEC);
       Serial.println(" secondes de sommeil ");
       Serial.print("il y a ");
       Serial.print((compteur_travail*32),DEC);
       Serial.println(" secondes de fonctionnement ");
    compteur_reveil = 0;
 }
    delay(2000);
    f_wdt = 0;
    enterSleep();
 }
}
ISR(WDT_vect)
{
  if (f_wdt == 0)
  {
    f_wdt = 1; // flag global }
  }
}
// paramètre : 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 
//           : 5=500ms, 6=1 sec,7=2 sec, 8=4 sec, 9=8 sec
void setup_watchdog(int ii) {
  byte bb;
  int ww;
  if (ii > 9 ) ii = 9;   // pour 8 secondes
  bb = ii & 7;
  if (ii > 7) bb |= (1 << 5);
  bb |= (1 << WDCE);
  ww = bb;
  // Clear the reset flag
  MCUSR &= ~(1 << WDRF);
  // start timed sequence
  WDTCSR |= (1 << WDCE) | (1 << WDE);
  // set new watchdog timeout value
  WDTCSR = bb;
  WDTCSR |= _BV(WDIE);
}

void enterSleep(void) {
  Serial.print("sommeil  ");
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode(); //Entre dans le mode veille choisi
  //le micro passe en sommeil pour 8 secondes
  // Le programme va reprendre ici après le timeout du WDT
  sleep_disable(); // La 1ère chose à faire est de désactiver le mode veille
  Serial.println("..............fin sommeil ");
}

hello

et ça fonctionne, tu t'es auto répondu

Oui, ça fonctionne

Par contre j'ai pas compris tout le code que j'ai copié, mais c'est pas trop grave tant que ça marche.

Je sais pas si y'a un code meilleur avec une consommation moindre

tu veux endormir le µ pour 30mn soit 1800 secondes. mais le µ ne sait dormir que pour des périodes d'une durée maxi de 8 secondes

le µ va dormir environ 8 secondes puis se réveiller pour que le µ dorme 30mn, il faudra faire une loop de sommeil de 1800/8=225 après chacune des périodes de 8 secondes de sommeil au réveil: le programme regarde si le nombre de fois 8 secondes à été atteint (225): si la réponse est non, alors il se replonge dans une nouvelle période de sommeil si la réponse est oui, il exécute sa tache puis retourne dormir pour une nouvelle boucle de 225