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);
}
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...
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);
}
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.
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.
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!