Exemple d utilisation watchdog declenchant avec entree analogique sur attiny85

Bonjour,
je travaille sur un attiny85 (sur une pile CR2032 3V) qui consomme 4.4uA au repos pendant 500ms avec "snore" mais un peu plus de 1mA au travail. Malgrès la période de travail très courte, la pile ne tient que quelques semaines.
Je cherche un exemple simple à comprendre pour utiliser le Watchdog, et reveiller le programme uniquement lorsqu'une valeur analogique est atteinte.
Voici mon programme (simplifié) : un relevé de valeur analogique, une comparaison, une condition d'action sur pin0 :

int valeurrelevee=0;       // valeur relevee dans la boucle. avec resistance de tirage 1k entre entree analog et GND
int valeurprecedente=0;       // valeur  Precedente
int differencevaleurs=0;           // difference entre 2 valeurs
#include "tinysnore.h"

void setup() { 
  pinMode(0,OUTPUT);pinMode(4,OUTPUT);
  digitalWrite(0,LOW);digitalWrite(1,LOW);digitalWrite(2,LOW);digitalWrite(3,LOW);digitalWrite(4,LOW);
  ADCSRA = 0; // ADC disabled
}
  
void loop() { 
  digitalWrite(4,LOW); // tire le A3 vers 0 avec une résistance de 1k entre A3 et pin4
  valeurrelevee=analogRead(3);
  digitalWrite(4,HIGH); // remonte le + vers le A3 pour annuler l'effet de consommation via la résistance
  differencevaleurs=(valeurrelevee-valeurprecedente);
  if(differencevaleurs>=20){digitalWrite(0,HIGH);snore(50);digitalWrite(0,LOW);snore(2000);valeurprecedente=valeurrelevee;return 18;}
  valeurprecedente=valeurrelevee;
  snore(500);  
}

Quelqu'un pourrait il me dire q'uil faut modifier pour faire fonctionner cela avec le watchdog et descendre ainsi la consommation tant que la valeur analogique de 20 n'est pas atteinte ?
(Tout les exemples que je trouve sur le net sont très compliqués et j'en perd mon latin ) :
Merci !

le watchdog ne sert généralement pas à cela (son rôle principal est de surveiller le fonctionnement du microcontrôleur et de le réinitialiser en cas de blocage ou de dysfonctionnement du programme) même si on peut l'utiliser pour sortir de deep sleep aussi (est-ce ce que vous voulez ?)

On dirait que vous voulez une interruption si la tension sur une pin d'entrée est supérieure à une certaine valeur. c'est possible avec le analog compare mais il faut mettre la tension de référence sur une pin

snore désactive l'ADC donc vous ne pourrez pas vous réveiller sur le dépassement de tension

pour le watchdog, cf https://www.instructables.com/ATtiny85-Watchdog-reboot-Together-With-SLEEP-Andor/

il faut le core Arduino de SpenceKonde

Le watchdog fait un reset il me semble.
La variable valeurprecedente sera perdue.

bonjour, merci pour votre réponse,
en fait ma recherche initiale est de diminuer la conso pendant la lecture analogique du tiny, sachant que je dois lire environ toutes les 500ms.
je pensait que l'on pouvait agir avec le watchdog mais peut etre n'est ce possible que pour une interruption digitale avec une entrée en 0/1 ?

OK donc vous voudriez utiliser le watchdog pour vous réveiller toutes les 500ms, lire l'entrée analogique et puis vous rendormir ?

sinon c'est quoi ce

la loop ne retourne rien

en effet , j'ai simplifié mont programme avant de poster , du coup le return va vers la ligne : "digitalWrite(4,LOW); // tire le A3 vers 0 avec une résistance de 1k entre A3 et pin4"

disons que si vous avez de la chance ça va sortir et relancer la loop

➜ retourner quelque chose alors que la fonction est déclarée void conduit à ce qu'on appelle sous le petit nom de "UB" (Undefined Behaviour)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.