Comme marqué dans le titre, j'ai un problème avec la boucle while ainsi que les opérateurs logiques.
Le but de ce programme consiste à allumer une LED en fonction de la luminosité d'une pièce ET en fonction de la distance d'un obstacle.
Pour arriver à cela j'ai commencé par utiliser la boucle if...else... avec l'opérateur logique ET mais le problème c'est que la LED clignotée, avec ou sans delay. Ceci ne me convient pas. Je souhaite que lorsque la condition est atteint que la LED ne clignote pas.
J'ai ensuite essayé de résoudre mon problème avec la boucle while mais malheureusement mon programme ne fonctionnait plus. J'ai alors essayé le break mais sans résultat.
Merci JML d'avoir répondu aussi vite. J'ai donc lu votre tutoriel. Si j'ai bien compris, je dois utiliser : switch...case... ? Mais je ne comprends pas si c'est cela, pourquoi? Je j'appuie pas sur un bouton.
Non mais vous avez des événements (luminosité, distance) et des états (led allumée ou éteinte au minimum) donc une machine à état c’est bien pratique pour cela et évolutif (même si là c’est simple - votre if peut marcher mais souvenez vous que vous bloquez pendant 1/2 sec à chaque loop donc c’est pas super réactif) que dit la console ?
Postez votre code en copier coller avec les balises de codes, pas des photos!!!
#include <NewPing.h>
#define TRIGGER_PIN 12
#define ECHO_PIN 11
#define MAX_DISTANCE 350
int analogPin=0;
int analogValue=0;
int LED_LUM=7;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup()
{
Serial.begin(9600);
pinMode(LED_LUM,OUTPUT);
}
void loop()
{
unsigned int uS = sonar.ping();
unsigned int Distance = uS / US_ROUNDTRIP_CM;
delay(500);
Serial.print("Distance: ");
Serial.print(Distance);
Serial.println("cm");
analogValue=analogRead(analogPin);
Serial.println(analogValue);
if (analogValue < 400 && Distance < 300)
{
digitalWrite(LED_LUM, HIGH);
}
else
{
digitalWrite(LED_LUM, LOW);
}
/*while (analogValue < 400 && Distance < 300)
{
digitalWrite(LED_LUM, HIGH);
}*/
}
Voilà le code comme demandé. ( Désolé pour la réponse tardive mais ma connexion internet a coupé. )
Je n'ai pas réussi à trouver un autre moyen pour la console qu'une photo.
En revanche dans la console je viens de me rendre compte d'un problème. Lorsque la lumière est éteinte, en dessous de 400, la LED est censé être allumé. Seulement, on peut voir qu'une fois sur deux ceci est au-dessus de 400 malgré que la lumière soit éteinte. Cela ne viendrai pas par hasard du branchement? Par précaution, je vous fournis un schéma Fritzing en photo.
Votre led que vous allumez quand il fait nuit va créer de la lumière donc modifie la valeur du capteur qui ne voit plus de la nuit —> est-ce significatif ?
Oui c'est bien le cas ( test tout juste réaliser ). J'ai aussi augmenter la valeur ( 700 pour être précis ) et cela c'est mis à arrêter de clignoter. J'ai baissé mon ordinateur et mis à l'abri le prototype de toute " Lumière parasite " et cela ne clignotait plus. Seulement, je me suis aperçu quand refaisant baisser la valeur à 400, la luminosité de la LED était détecté. D'où le fait que celle ci clignote quand je programme 400 comme condition. Que faire pour éviter cela? ( si cela est possible )
J'ai augmenté la valeur du analogValue ( je l'ai fais passé de 400 à 550 ). J'ai fait aussi modifier la distance pour que cela soit meilleur. ( Compris entre 10 cm et 250 cm ). Et tout bêtement, pour éviter les clignotements, j'ai mis une carte de visite pour séparer la photorésistance et la LED.
En revanche, si mon programme peut être améliorer je suis partant.
Vous pourriez améliorer en laissant la lumière allumée au moins un certain temps après allumage initial et/ou tenir compte du fait que quand vous allumez il y a de la lumière et donc changer le seuil
Un structure en machine à état permet de bien gérer ce genre d’amélioration