Identification par tension

Bonjour,
Je suis en train de réaliser un projet qui consiste à identifier des “objets” selon leur résistance, et donc la tension qui en découle.
Si “l’objet” est dans le bon intervalle de valeurs, la LED correspondante s’allume.

Je vous joins le schéma ainsi que le code qui va avec :

int val_un, val_deux, val_trois, val_quatre, val_cinq, val_six;

float min_un = 0.20; float max_un = 0.25;
float min_deux = 0.40; float max_deux = 0.47;
float min_trois = 2.45; float max_trois = 2.55;
float min_quatre = 0.70; float max_quatre = 0.74;
float min_cinq = 0.75; float max_cinq = 0.79;
float min_six = 0.85; float max_six = 0.95;

int led_un = 7; int led_deux = 6; int led_trois = 5; int led_quatre = 4; int led_cinq = 3; int led_six = 2;
int obj_un = 0; int obj_deux = 1; int obj_trois = 2; int obj_quatre = 3; int obj_cinq = 4; int obj_six = 5;

void setup() {  
  Serial.begin(9600);
}

void loop() {  
  val_un = analogRead(obj_un);  
  float volt_un = val_un * (5.0 / 1023.0);
  Serial.print("1 : ");
  Serial.println(volt_un);
  if (volt_un >= min_un && volt_un <= max_un){digitalWrite(led_un,HIGH);} else{digitalWrite(led_un,LOW);}
  val_deux = analogRead(obj_deux);  
  float volt_deux = val_deux * (5.0 / 1023.0);
  Serial.print("2 : ");
  Serial.println(volt_deux);
  if (volt_deux >= min_deux && volt_deux <= max_deux){digitalWrite(led_deux,HIGH);} else{digitalWrite(led_deux,LOW);}
  val_trois = analogRead(obj_trois);  
  float volt_trois = val_trois * (5.0 / 1023.0);
  Serial.print("3 : ");
  Serial.println(volt_trois);
  if (volt_trois >= min_trois && volt_trois <= max_trois){digitalWrite(led_trois,HIGH);} else{digitalWrite(led_trois,LOW);}
  val_quatre = analogRead(obj_quatre);  
  float volt_quatre = val_quatre * (5.0 / 1023.0);
  Serial.print("4 : ");
  Serial.println(volt_quatre);
  if (volt_quatre >= min_quatre && volt_quatre <= max_quatre){digitalWrite(led_quatre,HIGH);} else{digitalWrite(led_quatre,LOW);}
  val_cinq = analogRead(obj_cinq);  
  float volt_cinq = val_cinq * (5.0 / 1023.0);
  Serial.print("5 : ");
  Serial.println(volt_cinq);
  if (volt_cinq >= min_cinq && volt_cinq <= max_cinq){digitalWrite(led_cinq,HIGH);} else{digitalWrite(led_cinq,LOW);}
  val_six = analogRead(obj_six);  
  float volt_six = val_six * (5.0 / 1023.0);
  Serial.print("6 : ");
  Serial.println(volt_six);
  if (volt_six >= min_six && volt_six <= max_six){digitalWrite(led_six,HIGH);} else{digitalWrite(led_six,LOW);}
}

Mon problème est que je ne comprends pas pourquoi le pin A3 me renvoie une valeur fausse (même en déconnectant le câble, j’obtiens une tension de 2.36V) et visiblement liée au pin A2, alors que ça se passe bien pour tous les autres pins…

Il y a une explication ... que je ne saurai expliquer ... Un truc d'impédance peut être

Quand tu enchaînes la lecture des pin analogiques, il faut jeter le première mesure et ne garder que la suivante
Int poubelle = analogRead(0);
Int mesure_ok = analogRead(0);

Idem à
chaque lecture de broche suivante.

Quand tu enchaînes la lecture des pin analogiques, il faut jeter le première mesure et ne garder que la suivante

Tout à fait et c'est même valable pour toute modification dans une quelquonque partie de l'ensemble convertisseur analogique digital, comme une commutation de pin ou de la référence de tension par exemple.

Il n'y a qu'un seul convertisseur qui est "alimenté" à travers un multiplexeur analogique à 10 entrées et non pas seulement les entrées analogiques.
[0:7] ADC0 à ADC7 (entrées arduino A0-A7)
[8] Bandgag = image de la référence 1,1 V
[9] GND = permet de calibrer les pertes à l'intérieur du micro pour avoir des mesures plus précises.
[10] Capteur de température.
Tout est dit dans la datasheet du micro-controleur.

Possible charge résiduelle à l'entrée du multiplexeur, non déchargée car le pont sur A3 est trop gros. Comme suggérer, faire une lecture préalable, sinon un petit delay()

mcrae:
Bonjour,
Je suis en train de réaliser un projet qui consiste à identifier des "objets" selon leur résistance, et donc la tension qui en découle.
Si "l'objet" est dans le bon intervalle de valeurs, la LED correspondante s'allume.
...
Mon problème est que je ne comprends pas pourquoi le pin A3 me renvoie une valeur fausse (même en déconnectant le câble, j'obtiens une tension de 2.36V) et visiblement liée au pin A2, alors que ça se passe bien pour tous les autres pins...

bonsoir
en dehors des reponses déjà exposées
ça donne quoi , si tu connecte A2 à GND ?

Bonjour et merci pour vos retours,

D'après ce que je crois avoir compris, j'ai essayé la solution suivante pour chaque pin, qui malheureusement ne fonctionne pas :

val_un = analogRead(obj_un);  
delay(10);
val_un = analogRead(obj_un);  
delay(10);

@Artouste : en connectant A2 à GND, j'obtiens A1 à 0.44, A2 à 0.00, et A3 à 0.45

Je reviens à la charge ... pas d'idée pour régler le problème ?

Question peut-être bête, mais est-ce normal que chaque pin analogique me renvoie une valeur en voltage de 1.2, quand aucun câble n'est connecté sur aucun de ces pins ?

Bon, j'ai compris que le voltage flottant est normal si le pin n'est pas relié au ground, pas de souci.

Pour la question de départ en revanche, toujours pas de solution...
Tout ce que je peux constater c'est que A2 et A3 sont liés d'une certaine manière : tant que la résistance d'A3 est présente, A2 ne tombe jamais à zéro si j'enlève la résistance d'A2.

Tous les autres pins sont "indépendants" et passent bien à zéro si je retire leur résistance.
Mais A2 fluctue en fonction de A3 ... pourquoi ?

Constatez-vous la même chose en reproduisant les portions A2/A3 du schéma ?