Probleme Attiny84 analogRead

Bonjour je bloque sur un problème depuis hier soir sur un Attiny84 avec la fonction analogRead.

Si la tension au borne de la pin 7 est en dessous de 0.900V (900mV) la fonction analogRead renvoi 0 et peut importe la pin ADC du µC.

Je doit récupérer la valeur d'un capteur LM35.

J'ai mis à la place du capteur un potentiomètre et fait une condition (pour connaitre se que la fonction analogRead retourne car pas de moniteur série) :

  int mesure = 0;
  
  mesure = analogRead(7);
  if (mesure == 0 ) { chenillard(); }

Je vérifie la tension avec un multimètre sur cette pin et dès que je suis en dessous de +/- 0.900V la condition se réalise alors que je devrais avoir une valeur de +/- 180.....

Sans la condition sur mon afficheur 7segments ça m'affiche bien 0 donc ça retourne bien 0.....

Et mon capteur doit me retourner une tension d'environ 0.200V.

Vous avez une piste ?

Bonjour,

Je viens d'essayer en affichant la mesure sur un afficheur 7 segments (avec tm1637) et ça fonctionne sans problème.

En faite j'ai un conflit avec un CD4017.... Je m'en sert comme driver pour mon afficheur. Je laisse tombé.

Bonjour , je reviens sur le sujet car je me suis procuré des modules tm1637. J'ai encore des soucis avec analogRead d'un atTiny84.

En effet un analogRead sur un LM35 me retourne des valeurs entre 15 degrée et 30 degrée (se qui n'est évidement pas possible).

J'ai donc décidé d'afficher la valeur en mV sur l'afficheur et de la comparée avec mon multimètre branché en parallèle.
Mon multimètre affiche bien la bonne valeur mais l'afficheur saute entre 150mV et 30mV de temps en temps.

J'ai encore passé des heures et je ne trouve pas pourquoi.... J'ai changer d'afficheur, l'attiny84 le LM35 même essayé plusieurs bibliothèque du TM1637 mais toujours pareil.

J'ai bien mis un condensateur de découplage aux borne du LM35 comme conseillé.

Pourquoi l'analogRead ne m'indique pas la bonne valeur et ne se stabilise pas (car 70% du temps la bonne valeur est affiché) comme si c'était "parasité" ?

#include <TM1637.h>

TM1637 tm(9,10); // CLK DIO
const int LM35 = 1;
int mesure = 0;

void setup() { 
  tm.init();
  tm.set(4);
}

void loop() { 
 mesure = analogRead(LM35);  
 mesure = (mesure * 50000) / 1024;

 tm.display(0, mesure / 1000 %10);
 tm.display(1, mesure / 100 %10);
 tm.display(2, mesure / 10 %10);
 tm.display(3, mesure %10);

 delay(100);
  
}


EDIT : je viens de remplacer l'attiny84 par un arduino uno (avec le même cablage et le même code) et ça fonctionne très bien.... Problème seulement avec les attiny apparemment, mais pourquoi ?........

Bon j'ai trouvé un compromis.... J'ai remarqué que avec la fonction clearDisplay() il y avais moins de problème. J'ai donc alimenté le +5V du module avec une sortie de l'attiny afin de pouvoir contrôler l’alimentation de celui-ci. Avant de faire un analogRead(); je met a l'état bas la sortie afin de couper l'alimentation du module et ça fonctionne....

J'ai aussi du doublé les display car allez savoir pourquoi 1 fois sur 5 ça n'affiche pas ou ne supprime pas la valeur voulu....

Le seul inconvénient c'est le léger clignotement visible lors du rallumage. Si ça peut servir à quelqu' un :

#include <TM1637.h>

TM1637 tm(9,10); // CLK DIO

const int LDR = 2;
const int LM35 = 1;
const int tm1637 = 6;

int mesure = 0;

void setup() { 
  pinMode(LM35, INPUT);
  pinMode(LDR, INPUT);
  pinMode(tm1637, OUTPUT);
  
  tm.init();
  tm.set(4);
  tm.clearDisplay();
  
}

void loop() {
  digitalWrite(tm1637, LOW);
  delay(1);
  
  int lec1 = analogRead(LDR);
  int lec2 = analogRead(LM35);
  
  digitalWrite(tm1637, HIGH);


  if (lec1 < 20) {  tm.set(2);  }
  else if (lec1 > 20 && lec1 < 100) { tm.set(4); }
  else if (lec1 > 100) {tm.set(7); }  

    
  lec2 = (lec2 * 500) / 1024;

  if (mesure != lec2) {
    mesure = lec2;
    affichage_Anim();
  }
  
  affichage_Temp();
  
  delay(10000);  
}


void affichage_Temp() {  
  tm.display(0, mesure / 10);
  tm.display(0, mesure / 10);
  delay(100);
  
  tm.display(1, mesure % 10);
  tm.display(1, mesure % 10);
  delay(100);   
  
  tm.display(2, 16);
  tm.display(2, 16);
  delay(100);
  
  tm.display(3, 12);
  tm.display(3, 12);
}


void affichage_Anim() {  

  tm.display(3, 0x7f);
  tm.display(3, 0x7f);
  delay(100);

  tm.display(2, 0x7f);
  tm.display(2, 0x7f);
  delay(100); 

  tm.display(1, 0x7f);
  tm.display(1, 0x7f);
  delay(100);

  tm.display(0, 0x7f);
  tm.display(0, 0x7f);
  delay(100);

  tm.clearDisplay();
}


Il y a un zéro de trop. De plus pour éviter les débordements il faut faire le calcul en long.
mesure = (mesure * 5000L) / 1024;

Non il n'y a pas de zéro en trop.
44 x 50 000 / 1024 = 2148 (affichage sur 4 digite volontairement).

De toute façon ce code été simplement pour mettre en évidence le problème.

On voudrait que 44*50000 donne 2200000, mais les calculs sont fait avec des entiers et cela donne -28224 car l'opération déborde. Alors tout ce qui suit est faux.

Si tu veux vraiment faire

il faut faire

Petit test; écrire
Serial.println((44 * 50000) / 1024);