problème avec analogRead

Bonjour à tous,

Premier post ici, aussi j'espère avoir respecter les règles.

Voilà je débute, je voulais faire un programme simple
=> Si tension détectée par pin A10, alors envoyer courant par la borne 5

Le problème c'est que dès que j'effleure le pin A10 avec un courant d'excitation, et même le pin A11 (j'ai tapé à coté) ma LED test alimentée par le pin 5 s'allume et ne veut plus s'éteindre....

En fait, je voulais essayer de faire un relais, mais ça ne marche pas :frowning:

Je vous joins mon code ci-dessous, les experts pourront peut-être détecter la faille ?

Merci !

[code]

void setup() {
  // put your setup code here, to run once:

pinMode(A10,INPUT); // initialisation pin Analog in 10 à recevoir du courant
pinMode(5,OUTPUT); // initialisation pin digital 5 à émettre du courant
}

void loop() {
  // put your main code here, to run repeatedly:



if (analogRead(A10) == HIGH) // si du courant arrive par pin A10
{digitalWrite(5,HIGH);} // émettre du courant par le pin 5



}

[/code]

analogRead(pin) retourne un entier (int), compris entre 0 et 1024, pas HIGH
analogread/

Salut,

Pourquoi passer par une entrée analogique pour tester la présence d’un signal logique haut, le plus simple est d’utiliser les ports numérique.

Bonsoir Guillh

Otez moi un doute : vous travaillez sur quelle carte?

Cordialement,
bidouilleelec

Bonjour

Christian_R:
analogRead(pin) retourne un entier (int), compris entre 0 et 1024, pas HIGH
analogread/

Dans ce cas, le port A10 a été déclaré
pinMode(A10,INPUT);
ce qui est tout à fait possible et ça donne ça:

0 0
31 0
65 0
95 0
134 0
172 0
208 0
241 0
273 0
299 0
343 0
379 0
415 0
448 0
498 0
528 1
575 1
595 1
624 1
646 1
647 1
675 1
717 1
759 1
800 1
846 1
895 1
957 1
998 1
1001 1
1023 1
1023 1
1023 1
1023 1
1023 1
1023 1
1023 1
1023 1
1023 1
1023 1
1023 1
1023 1

Cordialement
jpbbricole

Je dirais : une MEGA si cela compile avec A10.

ma LED test alimentée par le pin 5 s'allume et ne veut plus s'éteindre....

Utiliser une pin analogique comme entrée digitale est possible à partir du moment où elle configurée en entrée. A confirmer avec la pin A10 de la MEGA.

Le principal défaut de ce code est que la pin 5 n'est jamais remise à ZÉRO.

  if (analogRead(A10) == HIGH) {
    digitalWrite(5,HIGH);
}
else {
    digitalWrite(5, LOW);
}

@+

Salut,

Je m'attendais pas à avoir autant de réponses, merci !
Effectivement je travaille avec un Arduino MEGA 2560 : du moins j'essaie, ça fait seulement 5 jours que j'ai commencé la programmation, j'y connais donc pas grand chose.

Alors voici ce que j'ai tenté et qui fonctionne ! :slight_smile: :slight_smile:
J'ai pris en compte le fait qu'analogRead avait besoin d'une valeur et non pas d'HIGH ou LOW
Je pense que c'est d'ailleurs de là que venait le problème, sur le lien de Christian on peut lire

"If the analog input pin is not connected to anything, the value returned by analogRead() will fluctuate based on a number of factors (e.g. the values of the other analog inputs, how close your hand is to the board, etc.)."

je pense donc que le peu d'électricité résiduelle suffisait à être détectée

j'ai également ajouter le code else {digitalWrite(5,LOW);} proposé par hbachetti

Par contre qqn pourrait-il m'expliquer les premières lignes de mon code, franchement j'ai pas trop compris ce que je faisais avec celles la (avant le setup)

[b]int analogPin=10; //  ?????
int val=0; // ?????[/b]

void setup() {
  // put your setup code here, to run once:

Serial.begin(9600);  //cadencer affichage à 9600 caractères seconde dans le moniteur série

pinMode(A10,INPUT); // initialisation pin Analog in 10 à recevoir du courant
pinMode(5,OUTPUT); // initialisation pin digital 5 à émettre du courant
}

void loop() {
  // put your main code here, to run repeatedly:

val = analogRead(analogPin); // lire la valeur du pin A10
Serial.println(val); // afficher la valeur du pin A10 dans le moniteur série


if (val>800) // si un courant de valeur supérieure à 800 arrive A10
{digitalWrite(5,HIGH);} // émettre du courant par le pin 5

else {digitalWrite(5,LOW);} // sinon de rien émettre par le pin 5 / par défaut


}

Bonjour jpbbricole
[
quote author=jpbbricole date=1539152083 link=msg=3901127]

0 0

415 0
448 0
498 0
528 1
575 1
595 1
624 1
646 1
647 1
675 1
717 1
759 1
800 1
846 1
895 1
957 1
998 1
1001 1
1023 1
1023 1
1023 1
1023 1

[/quote]

Je ne comprends pas à quoi correspond et comment vous obtenez ce résultat.
Pourriez vous détailler?

Cordialement,
bidouilleelec

Oupsss! bien sûre!

En fait, j'ai mis un potentiomètre sur A10 et ai lu A10 avec
dans la colonne de gauche, analogRead(A10)
et dans la colonne de droite digitalRead(A10)

et le résultat indique à quel moment l'état logique change.

le programme, avec un petit supplément, l'affichage H et L

void setup()
{

 Serial.begin(115200);
 pinMode(A10, INPUT);

}

void loop()
{

 Serial.print(analogRead(A10));
 Serial.print("\t" + String(digitalRead(A10)));
 
 if (digitalRead(A10) == HIGH)
 {
 Serial.println("\t H");
 }
 else
 {
 Serial.println("\t L"); 
 }
 delay(250);
}

Cordialement
jpbbricole

Bonjour Guillh

je pense donc que le peu d’électricité résiduelle suffisait à être détectée

Non : c’est hbachetti qui donne l’explication :

Le principal défaut de ce code est que la pin 5 n’est jamais remise à ZÉRO.

Cordialement,
bidouilleelec

Salut,

Pourtant j'ai d'abord essayé de n'ajouter que la ligne :

else {digitalWrite(5,LOW);} et ça ne fonctionnait plus du tout, du tout. La LED ne s'allumait même pas quand j'envoyais du courant vers la borne A10.

J'ai réussi à bidouiller avec les infos trouvées dans le lien mais je ne comprends pas ce que veulent dire ces lignes

int analogPin=10; //  ??????????????????????????????
int val=0 // ?????????????????????????

Je pensais que "int" servait à définir une variable ?
Pouvez vous m'éclairer à ce sujet svp?

C'est étonnant que cela fonctionne avec une analogPin déclarée à 10.
Avant la lecture se faisait sur A10.
La pin digitale 10 n'a pas d'ADC.

@+

Je pensais que "int" servait à définir une variable ?

Oups ...
Si tu ne comprends pas ces deux lignes, commence pas la base : un tuto langage C
Cela ne sert à rien de commencer un projet dans ces conditions. C'est impossible d'avancer normalement.

@+

Bonjour hbachetti

hbachetti:
C'est étonnant que cela fonctionne avec une analogPin déclarée à 10.
Avant la lecture se faisait sur A10.
La pin digitale 10 n'a pas d'ADC.

@+

Guillh a confirmé qu'il utilisait une carte Arduino MEGA 2560.

Cordialement,
bidouilleelec

hbachetti:
Oups ...
Si tu ne comprends pas ces deux lignes, commence pas la base : un tuto langage C
Cela ne sert à rien de commencer un projet dans ces conditions. C'est impossible d'avancer normalement.

@+

Ba de ce que j'en ai appris int sert à définir une variable donc

int analogPin=10 => j'en ai conclu qu'elle ne servait pas dans mon code, je l'ai supprimée, ça marche quand même

int val=0. => j'ai gardé celle la, qui permet de créer et initialiser une variable dénommée val (pour valeur)

Je remet mon code ici ; je lui ai adjoint un mapping (encore un nouveau truc appris aujourd'hui) qui permet d'afficher les valeurs comprises de 0 à 1023, de 0 à 5 Volts.

J'ai annoté le tout, est-ce que ça parait cohérent selon vous ? (est-ce que j'ai bien compris ce que je faisais :D)

int val=0; // créer la variable val et la met comme étant égal à 0 ; c'est son initialisation

void setup() {
  // put your setup code here, to run once:

Serial.begin(9600);  //cadencer affichage à 9600 caractères seconde dans le moniteur série

pinMode(A10,INPUT); // initialisation pin Analog in 10 à recevoir du courant
pinMode(5,OUTPUT); // initialisation pin digital 5 à émettre du courant
}

void loop() {
  // put your main code here, to run repeatedly:

val = analogRead(A10); // val est maintenant égale à la valeur lue par le Pin 10
int VOLTAGE= map(val,0,1023,0,5); // définition de la variable voltage qui correspond à un mapping des données relevées par le pin 10. (transcription en Volts)
Serial.println(VOLTAGE); // afficher la valeur du pin A10, convertie en Volts dans le moniteur série
delay(100); // affichage toutes les 0,1 secondes


if (val>800) // si un courant de valeur supérieure à 800 arrive A10 (environ 3,91 V)
{digitalWrite(5,HIGH);} // alors émettre du courant par le pin 5

else {digitalWrite(5,LOW);} // sinon ne rien émettre par le pin 5 / par défaut


}

Guillh:
Salut,

Pourtant j’ai d’abord essayé de n’ajouter que la ligne :

else {digitalWrite(5,LOW);} et ça ne fonctionnait plus du tout, du tout. La LED ne s’allumait même pas quand j’envoyais du courant vers la borne A10.

La réponse de hbachetti convient à votre

ma LED test alimentée par le pin 5 s’allume et ne veut plus s’éteindre…

de votre premier message.

J’ai pris en compte le fait qu’analogRead avait besoin d’une valeur et non pas d’HIGH ou LOW

C’est nécessaire aussi.

if (analogRead(A10) == HIGH)

HIGH est une constante qui vaut 1.
Vous testez uniquement si la valeur de la tension présente sur A10 est exactement 5volts/1024 au moment de la lecture.
Et il se peut fortement que cela n’arrive jamais.

Si vous débutez en programmation et informatique industrielle: ce n’est pas le plus simple de commencer par la lecture analogique.

Cordialement,
bidouillelec

Guillh:

pinMode(A10,INPUT); // initialisation pin Analog in 10 à recevoir du courant

Si vous voulez utiliser A10 uniquement en mode analogique ( donc avec analogRead() ), cette instruction est inutile.

Cordialement,
bidouilleelec

Si vous voulez utiliser A10 uniquement en mode analogique ( donc avec analogRead() ), cette instruction est inutile./quote]

Absolument.

J'ajouterai que c'est inutile aussi pour une pin logique (c'est la valeur par défaut).