Problème avec le while et opérateur logique

Bonjour, Bonsoir,

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 d’avance de bien vouloir m’aider.

Bonne journée/soirée :slight_smile:

j'ai commencé par utiliser la boucle if...else...

Ce n’est pas un opérateur de boucle... c’est juste un test de condition..

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

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.

Merci encore.

( Résistance LED: 220 Ohms ; Résistance photorésistance : 10 Kilo Ohms )

Console.PNG

On peut aussi copier le code de la console et le coller...

Est ce que votre led éclaire votre capteur ?

Vos noms de pins ne sont pas parlants..

J-M-L:
On peut aussi copier le code de la console et le coller...

Pour tout vous avouer, je me suis inscri aujourd'hui donc je découvre le site :confused: mais merci de la précision je ferai plus attention la prochaine fois :slight_smile:

J-M-L:
Est ce que votre led éclaire votre capteur ?

C'est-à-dire? Je ne suis pas sûr de bien comprendre votre question?

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 réglé mon problème.

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.

Merci encore de l’aide qui m’a été apporté.

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

Je vais essayer grâce à votre tuto :slight_smile: