Ma fonction analogRead me rend fou !

Bonjour,

J'ai posé la question sur le forum en anglais, mais à part des critiques sur ma façon de présenter mon code, je n'ai pas eu beaucoup de réponses constructives... Je tente ma chance ici...

J'ai une fonction readBatterie() sur mon pro-mini qui mesure une tension de batterie au travers d'un diviseur de tension sur la pin A7 (analogue uiquement). L'entrée est donc bien chargée et ce n'est pas un problème de "hard".
Je fais 10 mesures puis la moyenne.

Ma boucle est appelée en début de loop et tout se passe bien. Si j'appelle la fonction plusieurs fois à la suite, les mesures sont bonnes et suivent bien la variation de la tension.

Mon programme passe ensuite en sommeil et est réveillé par une interruption d'une RTC. Je "detach" les interruptions, et je refais un appel à la fonction, et là, elle me donne EXACTEMENT les mêmes 10 valeurs que celles du 1er appel alors que la tension a bien varié.

Je remets pourtant bien à zéro les variables, (que j'ai affichées pour debug) mais rien n'y fait !
J'ai essayé en passant les variables en "volatile", sans succès.

J'avoue que je suis coincé...

Quelqu'un aurait-il une idée ?

float tensionBatterie;
const byte PIN_VOLTMETER = A7;
const float REFVOLTAGE = 3.281;    // exact voltage of Arduino supply measured on pin VCC
const float PONTDIVISEUR = 0.23295;   // measured voltage divider ratio  27000/8200 Ohm
const float SEUILBATTERIE = 11.0;  // low voltage alarm level


void readBatterie() {
       int analogBatt=0;
       tensionBatterie=0;

       analogRead(PIN_VOLTMETER);
       delay(750);  

       for (byte i=0; i < 10; i++) {
           analogBatt += analogRead(PIN_VOLTMETER);
           Serial.println(analogBatt);
       }

       analogBatt /= 10;
       // TEST
       Serial.println(analogBatt);
       
       tensionBatterie = analogBatt * (REFVOLTAGE / 1024);  
       tensionBatterie /= PONTDIVISEUR ;  
       
       #ifdef DEBUG
         Serial.print(F("Ubatt = "));
         Serial.println(tensionBatterie);
       #endif
       
       if ( tensionBatterie < SEUILBATTERIE ) {  
               alerteBatterie = 1;
               #ifdef DEBUG    
                     Serial.println(F("ALARME BATTERIE"));
               #endif      
       }
}

Tu ne donnes pas le code en entier, le problème doit venir de la mise en sommeil et du réveil puisque la fonction est correcte. As-tu lu ceci ?

lesept:
Tu ne donnes pas le code en entier, le problème doit venir de la mise en sommeil et du réveil puisque la fonction est correcte. As-tu lu ceci ?

Il y a notamment cette mention:
Important note! You must use the PRR after setting ADCSRA to zero, otherwise the ADC is "frozen" in an active state.

(pas vu tout votre code donc difficile à dire mais avec sleep les convertisseur ont aussi un peu de temps que tout revienne à la normale)

Avez vous essayé avec une autre PIN analogique ?

Bonjour,

Le coup du PRR est peut-être une piste car j'utilise bien ADCSRA = 0 en passant en veille...

Je vais creuser ça..

Merci,

Bonsoir,

J'ai trouvé mon problème qui était lié à la mise en veille des convertisseurs A/D.
Après vérification, le PRR n'est pas concerné car traité d'office par la mise en veille.

Avant de passer les ADC en veille, je stocke leur état dans une variable.

etat_ADCSRA = ADCSRA;
ADCSRA = 0;

En sortant de la veille, je fais l'inverse et les convertisseurs retrouvent leur état initial.

ADCSRA = etat_ADCSRA;

Et maintenant, tout va bien !

Merci pour m'avoir mis sur la piste.

Patrick

Super!