Déclencher un allumage progressif d'une led avec un capteur ultrason

Bonjour à tous,

Voila mon problème, j’utilise une carte uno pour allumer des led grâce à un capteur à ultrason, cependant ce que j’aimerai c’est que les led s’allument de façon progressive et non pas à 100% puis 0% etc. J’ai essayé d’insérer à la place de mes lignes (qui fonctionnent):

if (distance < mindist) 
     digitalWrite(avertisseur,HIGH);
}
  else {   
    digitalWrite(avertisseur,LOW);
  }

les lignes:

if (distance < mindist) 
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5){
    digitalWrite(avertisseur,fadeValue);
   delay(30);}
}
  else {   
    digitalWrite(avertisseur,LOW);
  }

Mais cela ne marche pas, quelqu’un aurait une idée? J’ai pas mal parcouru le forum mais je n’ai pas trouvé de solution ou de topic susceptible de m’aider. Je précise que je suis un débutant et qu’il est possible que l’erreur se trouve juste devant mes yeux…

Merci pour votre aide !

de manière progressive avec la distance ou de manière progressive quand elles s'allument ?

Juste un allumage progressive des leds, la distance me sert juste a lancer le cycle d'allumage.

Est ce que c'est branché sur une pin PWM ?

privatek:
Juste un allumage progressive des leds, la distance me sert juste a lancer le cycle d'allumage.

changez digitalWrite(avertisseur,fadeValue);-->analogWrite(avertisseur,fadeValue); //https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/(avec une pin PWM bien sûr)

D’accord merci je vais essayé en branchant sur le PWM alors .

Edit: Apparemment j’ai un autre problème :“expected unqualified-id before ‘else’”. Je vous mets le code au complet, histoire que ce soit plus claire.

#define trigPin 8      //Trig 
#define echoPin 9      //Echo 
#define avertisseur 2 //Led
int mindist = 20; //On indique la distance en dessous de laquelle nous souhaitons voir la led s'allumer

void setup() {
  Serial.begin (9600);  
  pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
  pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
  pinMode(avertisseur, OUTPUT); //On défini la led comme une sortie
}

void loop() {
  long duree, distance;
  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); //Trig envois pendant 10ms 
  digitalWrite(trigPin, LOW);
  
  // On calcul le temps pour l'aller retour du signal
  duree = pulseIn(echoPin, HIGH);
  distance = duree*340/(2*10000);  
   
 if (distance < mindist) 
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5){
     analogWrite(avertisseur,fadeValue);
   delay(30);}
}
  else {   
    digitalWrite(avertisseur,LOW);
  }
  //Pour le moniteur série
  if ( distance <= 0){  
    Serial.println("Hors de portee");
  }
  else {
    Serial.print(distance);
    Serial.print(" cm ");
    Serial.print(duree);
    Serial.println(" ms");
  }
  delay(100);
}

quel Arduino ?

Appuyez ctrl-T pour inventer le code

Uno de marque Elegoo. Il y a bien pwm écrit a côté du port n°2 (côté digitale). J'ai essayé avec la pine 3 (côté digitale) et la pine A2 côté analogue du coup et rien ne change, la pine s'allume de suite a 100%, pendant le temps que je donne dans le delay qui se situe au milieu (pas celui en bas).

Quand je fait ctlr+T j'ai dans la barre bleue: "Aucun changement nécessaire pour le formatage automatique". (il manquait une "{" après le "...mindist)")

Edit: ma pine pwm c'est bien la ~3, donc bien branché sur la 3 côté digital.

Il manque un { après le ‘if’ ici :

 if (distance < mindist)

Un conseil ici - (message #2) :

Théorème de Lesept : "Si tu as une erreur de compilation, quelqu'un l'a eue avant toi"

Donc, tu copies le texte de l’erreur (ou les termes les plus informatifs) dans ton browser et Google te trouvera (c’est un corollaire du théorème) un message sur un forum qui en parle. Avec un peu de bol, le problème sera résolu dans ce message…

Lesept, Oui en me relisant j'ai vu qu'il manquait une "{" à cet endroit comme je l'ai mit dans mon message précédant ^^.

Le problème c'est juste qu'en fait, bah, la led reste allumée le temps de mon premier "delay(30)", mais ne fluctue pas malgré ma fonction fadeValue. c'est ce que je ne comprends pas. :confused:

#define avertisseur 2 //Led

pin 2 digitale et non analogique pwm
pin 3 oui

privatek:
Edit: ma pine pwm c'est bien la ~3, donc bien branché sur la 3 côté digital.

infobarquee, yep vu aussi :wink: mais merci !

si tu ne mets pas le nouveau code, comment veux tu que l'on devine?
et un dessin du montage aussi

C’était juste pour ne pas spamer, mais voila le code corrigé:

#define trigPin 8      //Trig 
#define echoPin 9      //Echo 
#define avertisseur 3 //Led
int mindist = 20; //On indique la distance en dessous de laquelle nous souhaitons voir la led s'allumer

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);  //On défini Trig comme une sortie
  pinMode(echoPin, INPUT);   //On défini Echo comme une entrée
  pinMode(avertisseur, OUTPUT); //On défini la led comme une sortie
}

void loop() {
  long duree, distance;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); //Trig envois pendant 10ms
  digitalWrite(trigPin, LOW);

  // On calcul le temps pour l'aller retour du signal
  duree = pulseIn(echoPin, HIGH);
  distance = duree * 340 / (2 * 10000);

  if (distance < mindist) {
    for( int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5){
     digitalWrite(avertisseur, fadeValue);
      delay(30);
    }
  }
  else {
    digitalWrite(avertisseur, LOW);
  }
  //Pour le moniteur série
  if ( distance <= 0) {
    Serial.println("Hors de portee");
  }
  else {
    Serial.print(distance);
    Serial.print(" cm ");
    Serial.print(duree);
    Serial.println(" ms");
  }
  delay(100);
}

D’ailleurs je viens de comprendre le problème en me re-relisant, j’ai mal enregistré et comme on voit je suis toujours en “digitalWrite”, en repassant en “analogWrite” dans la fonction d’allumage forcément c’est mieux. Merci pour votre aide en tout cas!

évidemment, si tu laisse un digitalWrite, c'est tout ou rien