đź’¤Utiliser la veille et le wdt sur arduino nano

Hellooo comme beaucoup je me suis lancé dans la création d'une porte auto de poulailler. Tout fonctionne comme prévu, mais le problème est l'autonomie la batterie 12v tient 1jour... J'ai réalisé que la consommation est trop importante, alors j'aimerai utiliser le mode veille pour reduire la consommation entre les changements d'état jour/nuit qui durent 8h15minimum...

J'aimerai donc utiliser le mode veille mais je n'arrive pas à l'utilier, j'ai suivi beaucoups de tuto mais rien n'y fait... J'ai entendu parlé du chien de garde WDT mais tout cela me reste très flou... Sauriez vous me guider ? Merci par avances

voici mon code fonctionnel :

/* Capteur de luminosité */
#include <avr/sleep.h>


void setup() {
   pinMode(4, INPUT);  // Capteur de luminosité
   pinMode(2, OUTPUT); //moteur Gnd ou 5v
   pinMode(3, OUTPUT); //moteur Gnd ou 5v

   
   pinMode(6, INPUT_PULLUP);//Capteur porrte fermé
   pinMode(7, OUTPUT); digitalWrite(7, LOW); //Gnd
   pinMode(8, INPUT); digitalWrite(8, LOW); //5v 

   pinMode(9, INPUT_PULLUP);//Capteur porrte fermé
   pinMode(10, OUTPUT); digitalWrite(10, LOW); //Gnd
   pinMode(11, INPUT); digitalWrite(11, LOW); //5v 



   
   digitalWrite(2, LOW); //eteindre le moteur
   digitalWrite(3, LOW); //eteindre le moteur

   

   Serial.begin(9600);
   Serial.println("- INITIALISATION -");
   Serial.println("- FINISH 29/10/2023 -");
   Serial.println("- LAST LOADING 8:37 -");
   Serial.println("- GARANCED 24 MONTH -");
}

void loop() {
 

  if (digitalRead(4) == LOW) {
    Serial.println("Signal - DAY");
    while (digitalRead(4) == LOW) {
        Serial.println("WAITING NIGHT");
        delay(5000);
        
    }
    
    Serial.println("DOOR CLOSING");
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);


    digitalWrite(8, HIGH); 
    while (digitalRead(6) == HIGH) {
      delay(1000);
    }
    digitalWrite(8, LOW); //5v 
    
    
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);

    Serial.println("DOOR CLOSED");
    delay(3000);
  }





  if (digitalRead(4) == HIGH) {
    Serial.println("Signal - NIGHT");
    while (digitalRead(4) == HIGH) {
        Serial.println("WAITING DAY");
        delay(5000);
    }
   
    Serial.println("DOOR OPENING");
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);

    digitalWrite(11, HIGH); 
    while (digitalRead(9) == HIGH) {
      delay(1000);
    }
    digitalWrite(11, LOW); //5v 

    
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);

    Serial.println("DOOR OPENED");
    delay(3000);
  }
}

Pour faire court mon programme regarde si c'est le jour ou la nuit. Si c'est le jour, il attend en boucle 5secondes et regarde si son état à changé. Cette période peut durer 8h15minimum donc je voudrais mettre la veille ici... Par exemple repeter 8 fois attendre 1h en veille maximal et ensuite toute les 5-10 minutes afin d'être plus précis... Comment utiliser le Wdt et le sleep mode maximal ?

Merciiiii

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

Aie merci

Salut.
La consommation d'une NANO est de 32mA. En mode veille elle passe Ă  12.5mA.
L'autonomie passera donc Ă  3 jours.
Mais cela dépend de ton hardware. Si tu utilises un pont en H, comme un L293D par exemple, celui-ci peut être responsable d'une partie de la consommation.

J'ai moi même développé un automatisme de porte de poulailler, mais sur une PRO MINI.
Une PRO MINI légèrement modifiée serait certainement préférable (ma PRO MINI 16MHz consomme 3µA), mais cela peut ne pas suffire, un pont en H avec mode veille serait un plus.

Oubliez le WDt, c'est trop lourd Ă  utiliser, lisez un peu plus sur le mode veille, c'est facile,
Votre code pourrait ressembler Ă  ceci :

/* Capteur de luminosité */
#include <LowPower.h>

//Routine ISR qui sera appelée lorsqu'une interruption se produit
// dans ce cas, il n'est pas nécessaire de faire quoi que ce soit
void reveillez () {
  // Il ne fait rien}
}

void setup() {
  pinMode(2, INPUT);  // Capteur de luminosité
  pinMode(4, OUTPUT); //moteur Gnd ou 5v
  pinMode(3, OUTPUT); //moteur Gnd ou 5v

  pinMode(6, INPUT_PULLUP);//Capteur porrte fermé
  pinMode(7, OUTPUT); digitalWrite(7, LOW); //Gnd
  pinMode(8, INPUT); digitalWrite(8, LOW); //5v

  pinMode(9, INPUT_PULLUP);//Capteur porrte fermé
  pinMode(10, OUTPUT); digitalWrite(10, LOW); //Gnd
  pinMode(11, INPUT); digitalWrite(11, LOW); //5v

  digitalWrite(4, LOW); //eteindre le moteur
  digitalWrite(3, LOW); //eteindre le moteur

  Serial.begin(9600);
  Serial.println("- INITIALISATION -");
  Serial.println("- FINISH 29/10/2023 -");
  Serial.println("- LAST LOADING 8:37 -");
  Serial.println("- GARANCED 24 MONTH -");

  // Initialise la porte jour/nuit
  // il faut placer la porte Ă  la main en condition jour/nuit
  //à l'opposé de là où nous sommes, ou ajouter un commutateur pour indiquer
  // dans quel état nous nous trouvons avant d'allumer le système.
  if (digitalRead(2) == LOW) {
    ouvrir();
  }
  else {
    fermer();
  }

  // Définit l'interruption qui réveillera le MCU, sur la broche 2.
  // Seules les broches 2 et 3 autorisent les interruptions
  // Cela m'oblige à switcher les fonctionnalités des broches 2 et 4
  // Il réveillera le MCU et appellera le reveillez isr, qui ne fait rien,
  // quand la broche 2 change d'Ă©tat
  attachInterrupt(digitalPinToInterrupt(2), reveillez, CHANGE);
}

void loop() {

  if (digitalRead(2) == LOW) {
    Serial.println("Signal - DAY");
    Serial.println("WAITING NIGHT");

    // Mettre le MCU en veille = Ă©conomie d'Ă©nergie
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

    fermer();
  }

  if (digitalRead(2) == HIGH) {
    Serial.println("Signal - NIGHT");
    Serial.println("WAITING DAY");

    // Mettre le MCU en veille = Ă©conomie d'Ă©nergie    ouvrir();
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

    ouvrir();
  }
}

void fermer() {
  Serial.println("DOOR CLOSING");
  digitalWrite(4, LOW);
  digitalWrite(3, HIGH);

  digitalWrite(8, HIGH);
  while (digitalRead(6) == HIGH) {
    delay(1000);
  }
  digitalWrite(8, LOW); //5v


  digitalWrite(4, LOW);
  digitalWrite(3, LOW);

  Serial.println("DOOR CLOSED");
  delay(3000);
}

void ouvrir() {
  Serial.println("DOOR OPENING");
  digitalWrite(4, HIGH);
  digitalWrite(3, LOW);

  digitalWrite(11, HIGH);
  while (digitalRead(9) == HIGH) {
    delay(1000);
  }
  digitalWrite(11, LOW); //5v

  digitalWrite(4, LOW);
  digitalWrite(3, LOW);

  Serial.println("DOOR OPENED");
  delay(3000);
}

C'est commenté demandez ce que vous voulez. Il serait très pratique que vous indiquiez le matériel que vous utilisez avec des données de consommation exhaustives, il me semble très peu une seule journée d'autonomie.

Je me pose une question : quel capteur de luminosité peut donner une valeur LOW ou HIGH. Peut être une LDR avec une résistance bien calibrée ?

Effectivement, la solution peut convenir, mais avec une NANO, cela divise la conso seulement par 3. Mais si cela convient, pourquoi pas ?
L'OP ne dit pas d'ailleurs avec quoi il recharge sa batterie.

merci de ta réponse !!

Oui le pont en h que j'utilise c'est un l298n, mais je pourrais ajouter un relai pour couper l'alimentation... le problème c'est que l'arduino est branché en VIN sur le pont en H donc si je coupe le pont en H j'ai plus d'alimentation pour l'arduino... a voir... :slight_smile:

Je crois que la nano peut accepter jusqu'a 12v, ça irai de mettre directement l'arduino sur la batterie ?

( ooohhhhhh din djarin x'D j'ai print en 3D le casque du mandalorian j'adore)

merciiii le code fonctionne déjà ? Je vais l'essayer et hâte de comprendre comment cela fonctionne ! En tout cas c'est très propre :slight_smile:

c'est un capteur arduino du genre https://www.amazon.fr/DollaTek-numérique-dintensité-Lumineuse-Photorésistance/dp/B07DJ4C2SN/ref=sr_1_5?keywords=capteur+luminosité+arduino&qid=1698681979&sr=8-5

avec le potentiomètre on définit la limite jour/nuit

Ma batterie c'est une 12.6v XD 3S2P que j'ai monté a partir d'une 7s1P de skate elec, donc je la recharge avec le chargeur 29.4v abaissé à 12.54v oui j'ai mis un bms je veux pas que ça explose :innocent:

Si tes batteries font 2000mAH chacune, ce qui semble ĂŞtre un minimum, tu as donc 4000mAH.
Avec une batterie de cette capacité tu devrais avoir une autonomie bien supérieure.
Si l'on ajoute les 4mA du L298 au repos, cela donne 32+4 = 36mA.
Il reste le module capteur, équipé d'un LM393 : 1mA à tout casser.
4000mAH / 37mA = 100 heures
A moins que tes batteries soient complètement mortes, je ne vois pas ...
Poste une photo de tes batteries, qu'on voie le modèle exact.

Et tes poules sont Ă  l'heure pour la fermeture ?
Mon poulailler se ferme à l'heure officielle de coucher du soleil. J'ai ajouté une demi-heure car les poules n'étaient pas toutes rentrées à l'heure voulue, surtout en été quand il fait beau, car elles passent le maximum de temps dehors.

yep elle ont bien vécu, elles sont pas neuve ahah mais je pensais que ça faisait le taff :smiling_face_with_tear:
de base je voulait mettre des piles 9v

oui c'est vrai ! J'y ai pensé mais j'ai oublié de le mettre dans le programme, oui faudrait rajouter 30min/45min de plus a la fermeture et peut être ouvrir plus tôt aussi

J'ai reussi, le code du mandalorian fonctionne à merveille ! Reste à voir si la conso à diminué, j'ai pas d'usb qui me donne la conso, faut que je fasse au multimètre

Hmm... Environ 3,5 ou 4 jours compte tenu de la consommation du moteur. Il semble que le temps entre les recharges soit court. @try3000_off Y a-t-il une prise de lumière dans le poulailler ?

oui ! Pour mettre un panneau solaire ?

Non, alimentez l'appareil à partir du réseau électrique et laissez les batteries en cas de panne de courant.

je vois, mais le poulailler est à l'exterieur (poule élevé en plein air ahah)

donc si il pleut, neige, je sais pas ce que ça peut donner... mais si ça marche, oui autant mettre une ralonge solide et bien protéger le chargeur

déjà je viens de virer l'abaisseur de tension parce que convertir du 12.6v vers du 12v c'est inutile ça consomme juste trop...

Un schéma simple serait :


Le protecteur/chargeur pourrait ĂŞtre celui-ci :
BMS Module de Protection Carte PCB pour Batterie au Lithium Panneau de Protection de Charge à Récupération Automatique pour Cellules LiPo 18650 3S 12.6V 20A : Amazon.fr: High-Tech