Bonjour
Ceci est mon 1er message, j'espère ne pas me tromper de lieu pour ma demande !
Sur les bons conseils de Locoduino, j'ai réalisé une commande de passage à niveau (capteurs IR pour la détection, SG90 pour les barrières, LEDs pour les feux clignotants). Tout fonctionne correctement pour les leds en tout ou rien (0 et 255 dans analogWrite)
Je me suis inspiré de l'article "La PWM : Qu’est-ce que c’est ?" pour faire un clignotement progressif. Débutant, j'ai adapté le programme au mien. Seul, il fonctionne très bien :
byte cycle = 0; // cycles de clignotement
long fading = 5; //rapidité du clignotement
byte intensite = 0; //intensité lumineuse
long LedTime = millis(); // timer pour le clignotement
void setup() {
pinMode(10, OUTPUT); //sortie Led
}
void loop() {
clignote();
}
void clignote()
{
if ( millis() > LedTime + fading) // vitesse de clignotement
{
LedTime = millis(); // reinit le timer
switch (cycle) {
case 0 : // croit
intensite += 10;
if (intensite == 250) {cycle = 1; fading=200;}
break;
case 1 : // allumé
cycle = 2; fading=5;
break;
case 2 : // décroit
intensite -= 10;
if (intensite == 0) {cycle = 3; fading=200;} break;
case 3 : // éteint
cycle = 0;
fading=5;
break;
}
analogWrite(10,intensite);
}
}
Si j'intègre cet ensemble dans mon programme (ci-dessous), la Led ne s'éclaire pas. Elle ne le fait que si l'intensite est à 255 ! (254 ne fonctionne pas !!!)
Je tourne en rond, donc si qq'un peut m'aider. Merci. Je suis sur Nano.
#include <Servo.h>
/* define a header file. Special attention here, you can call the servo function directly from Arduino's software menu bar Sketch>Importlibrary>Servo, or input
#include <Servo.h>. Make sure there is a space between #include and <Servo.h>. Otherwise, it will cause compile error.*/
Servo servoPNA; // servo voie A
Servo servoPNB; // servo voie B
boolean detect1A,detect1B;
boolean olddetect1A,olddetect1B;
boolean detect2A,detect2B=1;
boolean olddetect2A,olddetect2B=1;
boolean lastdetect2A,lastdetect2B=1;
boolean readingPNA,readingPNB;
long lastPNATime,lastPNBTime; // derniere fois que le detecteur a change
long PNDelay = 500; // durée maxi des micro-coupures
int avertissement = 2000; // durée avant fermeture
byte cycle = 0; // cycles de clignotement
long fading = 10;
byte intensite = 0;
long LedTime = millis(); // timer pour le clignotement
long PNTime = millis(); // timer pour les moteurs d'aiguillage
boolean ferme=0,fermeA=0,fermeB=0;
byte angleA=140;
void setup()
{
servoPNA.attach(5);// servo A
servoPNB.attach(6);// servo A
//Serial.begin(9600);
pinMode(2,INPUT); //entrée A
pinMode(3,INPUT); //sortie A
pinMode(7,INPUT); //entrée B
pinMode(8,INPUT); //sortie B
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
servoPNA.write(140);
servoPNB.write(140);
analogWrite(10,0);// Led A
analogWrite(11,0);// Led B
}
void loop()
{
detect1A=digitalRead(2); //reading=0 si train
if ((olddetect1A==1 && detect1A==0) && fermeA==0) {fermeA=1; if (fermeB==0) {PNTime = millis()+avertissement; LedTime = millis();} } // ferme voie A
olddetect1A=detect1A;
readingPNA = digitalRead(3); //reading=0 si train
if (readingPNA != lastdetect2A) {lastPNATime = millis();} //déclenchement chrono
if ((millis() - lastPNATime) > PNDelay) {// si le delai est atteint, le changement est valide sinon le changement est ignore (parasite ou inter-wagon)
if (readingPNA != detect2A) {detect2A = readingPNA;} // changement valide
}
lastdetect2A=readingPNA;
if (olddetect2A==0 && detect2A==1) {fermeA=0; lastPNATime = millis();} // ouvre voie A
olddetect2A=detect2A;
detect1B=digitalRead(7);
if ((olddetect1B==1 && detect1B==0) && fermeB==0) {fermeB=1; if (fermeA==0) {PNTime = millis()+avertissement; LedTime = millis();} } // ferme voie B
olddetect1B=detect1B;
readingPNB = digitalRead(8); //reading=0 si train
if (readingPNB != lastdetect2B) {lastPNBTime = millis();} //déclenchement chrono
if ((millis() - lastPNBTime) > PNDelay) {// si le delai est atteint, le changement est valide sinon le changement est ignore (parasite ou inter-wagon)
if (readingPNB != detect2B) {detect2B = readingPNB;} // changement valide
}
lastdetect2B=readingPNB;
if (olddetect2B==0 && detect2B==1) {fermeB=0; lastPNBTime = millis();} // ouvre voie B
olddetect2B=detect2B;
ferme = (fermeA || fermeB);
if ((ferme==1) || (angleA<140)) { clignote();}
else {Serial.println("ouvert");analogWrite(10,0); analogWrite(11,0);cycle = 0; intensite=0; fading = 5;}
if ((ferme==1) && (angleA>50)) {fermePN();}
if ((ferme==0) && (angleA<140)) {ouvrePN();}
//Serial.println(angleA);
}
void clignote()
{
//Serial.println(intensite);
if ( millis() > LedTime + fading) // vitesse de clignotement
{
LedTime = millis(); // reinit le timer
switch (cycle) {
case 0 : // croit
intensite += 10;
if (intensite == 250) {cycle = 1; fading = 200;}
break;
case 1 : // allume
cycle = 2; fading=5;
break;
case 2 : // decroit
intensite -= 10;
if (intensite == 0) {cycle = 3; fading = 200;} break;
case 3 : // eteint
cycle = 0;
fading = 5;
break;
}
analogWrite(10,intensite);
}
}
void ouvrePN()
{
if ((millis() - PNTime) > 20) {PNTime = millis(); angleA+=1; servoPNA.write(angleA); servoPNB.write(angleA); }
}
void fermePN()
{
if (millis() > (20+PNTime)) {PNTime = millis(); angleA-=1; servoPNA.write(angleA); servoPNB.write(angleA); }
}