bonjour, j'essaie de programmer un éclairage automatique dans le cadre d'un oral de concours. Mon programme fonctionnait bien jusqu'à ce que mon capteur photorésistant se mette à détecter des valeurs absurdes (lues dans le moniteur série). Une idée de comment l'initialiser ou de l'endroit d'où pourrait venir l'erreur
Il y a une balise "< code />" pour formater le code, qui est plus facile à lire et manipuler qu'une image.
Tu ne donne pas ta sortie sur le moniteur série, c'est domage, cela pourrait nous donne rune idée des valeurs que ton capteur remonte
Il vaut mieux mettre un code en texte (avec les balises CODE) plutôt qu'en image, pour ceux qui voudraient l'essayer.
Tu utilises quel Arduino ? As-tu réglé la console sur 9600 baud?
Donne un exemple de valeurs fausses (en texte aussi). Merci
Ton while est en boucle infinie puisque la variable n'est pas modifiée. Il faut relire la capteur donc ajouter
valeur = digitalRead(Captlum);
dans le bloc du while
#define Captlum A0 //capteur de lumiere infrarouge
#define LED1 2
unsigned int valeur;
void setup() {
Serial.begin(9600);
pinMode(Captlum, INPUT);
pinMode(LED1, OUTPUT);
}
void loop() {
int valeur=analogRead(Captlum);
Serial.println(valeur);
while(valeur<500){
digitalWrite(LED1,HIGH);
delay(1000);
valeur=analogRead(Captlum);
Serial.println(valeur);
}
digitalWrite(LED1,LOW);
delay(1000);
}
merci beaucoup
j'ai mis le code en texte ci dessous. je ne maitrise pas du tout les balises code par contre, désolée...
j'ai rajoute la ligne dans la boucle while
.
La loop, comme son nom l'indique, tourne en boucle : dès qu'elle a terminé, elle recommence.
Pour écrire la loop la plus efficace, il faut bien exprimer ce que tu veux faire. Jusque là, tu ne l'as pas fait.
Je suppose que tu veux allumer une lampe (ici une LED, connectée sur la pin 2) pendant une seconde lorsque la luminosité descend en dessous d'un certain seuil.
Ou bien tu veux l'allumer tant que la luminosité est en dessous de ce seuil ?
J'imagine que c'est plutôt le second cas : on va partir là-dessus.
Donc la loop doit (en boucle) :
- lire le capteur
- comparer la valeur au seuil
- tant que la valeur est inférieure au seuil, allumer la led
- éteindre la led lorsque la valeur repasse au dessus du seuil.
Ce que tu as fait est correct, tu n'as pas besoin du delay(1000)
ni du second Serial.println
. Ca donne ça :
void loop() {
int valeur=analogRead(Captlum);
Serial.println(valeur);
while(valeur<500){
digitalWrite(LED1,HIGH);
valeur=analogRead(Captlum);
}
digitalWrite(LED1,LOW);
}
Le code affiche la valeur lue jusqu'à ce qu'elle descende sous le seuil, puis recommence à l'afficher si elle passe au dessus.
Si la lampe s'allume alors qu'elle n'est pas censée s'allumer, c'est tout simplement parce tu as mal choisi ton seuil. Tu peux le faire par essais jusqu'à trouver la bonne valeur. Une autre solution serait de connecter un potentiomètre sur ton arduino et t'en servir pour choisir la valeur du seuil. Voir ici, cas de la résistance variable :
Oui, c'est nettement plus plaisant.
Maintenant, si tu pouvais mettre la sortie du moniteur série, on pourrait avoir une idée des valeurs absurdes que donne ton capteur.
Bonjour @vaaloutee,
- Tout d'abord au lieu d'une boucle
while()
personnellement j'utiliserai plutôt des Instructions conditionnelles :
if (condition) {
// instruction(s) exécutée(s) si la condition est vraie
//digitalWrite(LED1,HIGH);
}
else {
// instruction(s) exécutée(s) si la condition est fausse
//digitalWrite(LED1,LOW);
}
- Ensuite comme il s'agit de mesurer une quantité de lumière et d'un "oral de concours", j’essayerai de me renseigner sur la manière de la calculer (je me focaliserai en particulier sur son unité de mesure). Doit-on se contenter de lire une valeur ou doit doit-on la transformer avant de l'exploiter ? Comment fonctionne mon capteur photorésistant ?
Les réponses à ces questions me semblent être des prérequis.
Bonnes recherches et bon courage.
la première fois que j'ai réalisé mon programme j'ai obtenu en une journée d'été des valeurs autour 400_500. Sauf qu'ici j'obtiens des variations entre 0 (valeur impossible) et 1200 non continues ce qui absurde....
0
0
375
1023
1023
1023
1023
476
0
0
0
63
j'ai également essayé cette méthode mais ca ne s'améliore pas vraiment. Je m'intéresse aussi a ces questions là qui seront des essentielles. Or il me faut des résultats a présenter. Si mon programme fonctionne il sera plié à une lampe et a partir de la je voudrai mesurer la durée d'allumage, la tension, le courant afin d'avoir la puissance consommée par ma lampe
Vérifie que ton capteur est bien connecté. Au besoin change de pin, passe par exemple sur A1
J'ai essayé ton programme du post #5, mais avec un potentiomètre et il fonctionne très bien.
Je rejoins @lesept pour soupçonner le capteur ou ses branchements.
Donnes nous le schéma de montage ou fait une photo en gros plan de l'installation.
A+
Cordialement
jpbbricole
Ton capteur renvoi dans le même environnement lumineux sur une dizaine de secondes les valeurs cités?
comme @jpbbricole une ou des photos de ton montage serait bien.
Tu n'a rien modifier à ton montage plus ou moins récemment?
Oui effectivement c'est un PB matériel ...
Bonjour philippe86220
Peut-être des GND pas mis en commun.
@vaaloutee Eventuellement, une photo en gros plan du truc serait utile.
Cordialement
jpbbricole
Bonjour @jpbbricole,
On peut lui conseiller ça :
Maintenant à voir si c'est une simple photorésistance à laquelle il faudra adjoindre une résistance
ou un module ...
il faut changer de pin ou utiliser un autre module pour tester comme l'a dit je ne sais plus qui
Bonne journée à toi.
PS : analogRead() donne une valeur sur 10 bits (sauf paramétrage sur 12, ce qui n'est pas le cas en plus je crois pas me tromper si je dis qu'on ne connait pas la plateforme), du coup je ne comprends pas trop :
je vais tenter de changer de capteur des que possible, merci pour tous les conseils