16
Débuter / Re : analogWrite qui ne fonctionne pas toujours correctement avec des LEDs
« le: septembre 21, 2020, 03:47:43 pm »
Merci pour les conseils, j'ai tenu compte des remarques.
Voici le montage joint
J'ai effectivement mis des tests un peu partout :
Serial.println(intensite); pour tester la valeur envoyée sur la sortie 10 PWM de la Led, ça augmente 0>250, puis ça diminue 250>0..., le timing est correct.
Serial.println(angle); pour vérifier la valeur envoyée aux servomoteurs, les barrières se ferment et s'ouvrent.
Tout est normal
Le problème c'est que la Led ne s'allume que si la valeur envoyée est 255 !!! (ce qui n'est pas atteint dans le programme puisque ça va de 0 à 250 par pas de 10, mais que je produis dans mes tests). Alors que le programme clignotement fonctionne très bien tout seul !!!
Est-ce un problème de typage incorrect avec des octets qui viennent en écraser d'autres ?
Je remets le code plus clair :
Voici le montage joint
J'ai effectivement mis des tests un peu partout :
Serial.println(intensite); pour tester la valeur envoyée sur la sortie 10 PWM de la Led, ça augmente 0>250, puis ça diminue 250>0..., le timing est correct.
Serial.println(angle); pour vérifier la valeur envoyée aux servomoteurs, les barrières se ferment et s'ouvrent.
Tout est normal
Le problème c'est que la Led ne s'allume que si la valeur envoyée est 255 !!! (ce qui n'est pas atteint dans le programme puisque ça va de 0 à 250 par pas de 10, mais que je produis dans mes tests). Alors que le programme clignotement fonctionne très bien tout seul !!!
Est-ce un problème de typage incorrect avec des octets qui viennent en écraser d'autres ?
Je remets le code plus clair :
Code: [Sélectionner]
#include <Servo.h>
/* PN double voie A et B
détection par capteur IR de l'arrivée : detect1 passe de 1 à 0
et du passage du dernier wagon : detect2 passe de 0 à 1 avec delai de micro-coupure
*/
Servo servoPNA; // servo voie A
Servo servoPNB; // servo voie B
boolean detect1A,detect1B; //détection des capteurs en entrée du PN (0 si train)
boolean olddetect1A,olddetect1B; //dernière détection prise en compte
boolean detect2A,detect2B=1; // en sortie du PN
boolean olddetect2A,olddetect2B=1;
boolean lastdetect2A,lastdetect2B=1; //dernière détection lue, pas forcément prise en compte (micro coupure due aux inter-wagons)
boolean readingPNA,readingPNB;
unsigned long lastPNATime,lastPNBTime; // derniere fois que les detecteurs ont changes
unsigned long PNDelay = 500; // durée maxi des micro-coupures
int avertissement = 2000; // durée avant fermeture
byte phase = 0; // phase de clignotement (4 phases : croissance-max-decroissance-nulle)
unsigned long fading = 5; // durée initiale entre 2 éclairages
byte intensite = 0; //intensite de l'éclairement
unsigned long LedTime = millis(); // timer pour le clignotement
unsigned long PNTime = millis(); // timer pour les moteurs d'aiguillage
boolean ferme=false,fermeA=false,fermeB=false;
byte angle=140; // angle initial barrières ouvertes
void setup()
{
servoPNA.attach(5);// servo A
servoPNB.attach(6);// servo B
//Serial.begin(9600);
pinMode(2,INPUT); // détecteur entrée PN voie A
pinMode(3,INPUT); // détecteur sortie PN voie A
pinMode(7,INPUT); // détecteur entrée PN voie B
pinMode(8,INPUT); // détecteur sortie PN voie B
pinMode(10, OUTPUT); // 2 Leds clignotantes
pinMode(11, OUTPUT); // 2 Leds clignotantes
servoPNA.write(140); // barrière A ouverte
servoPNB.write(140); // barrière B ouverte
analogWrite(10,0);// 2 Leds coté A éteintes
analogWrite(11,0);// 2 Leds coté B éteintes
}
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) || (angle<140)) { clignote();}
else {Serial.println("ouvert");
analogWrite(10,0);
analogWrite(11,0);
phase = 0;
intensite=0;
fading = 5;}
if ((ferme==1) && (angle>50)) {fermePN();}
if ((ferme==0) && (angle<140)) {ouvrePN();}
//Serial.println(angle);
}
void clignote()
{
//Serial.println(intensite);
if ( millis() > LedTime + fading) // vitesse de clignotement
{
LedTime = millis(); // reinit le timer
switch (phase) {
case 0 : // croit
intensite += 10;
if (intensite == 250) {phase = 1; fading = 200;}
break;
case 1 : // allume
phase = 2; fading=5;
break;
case 2 : // decroit
intensite -= 10;
if (intensite == 0) {phase = 3; fading = 200;} break;
case 3 : // eteint
phase = 0;
fading = 5;
break;
}
analogWrite(10,intensite);
}
}
void ouvrePN()
{
if ((millis() - PNTime) > 20) {PNTime = millis();
angle+=1;
servoPNA.write(angle);
servoPNB.write(angle); }
}
void fermePN()
{
if (millis() > (20+PNTime)) {PNTime = millis();
angle-=1;
servoPNA.write(angle);
servoPNB.write(angle); }
}