Bonjour
Je continue mon apprentissage .
Comme je n'ai aucun aiguillage a solénoïde, je suis passé directement à l'exemple 6, celui du passage à niveau sur voie unique.
Je l'ai modifié par l'ajout d'une Led verte allumée et par l'extinction des deux rouges dès que la barrière est grande ouverte.
Je me suis un peu creusé la tète, pour arriver à cela. Mais ca fonctionne (presque) parfaitement.
Pourquoi presque ?
Parce que le premier appui sur le bouton ne fait pas baisser lentement la barrière. Elle descend d'un coup quand elle reçoit l'ordre de remonter, puis remonte lentement.
Les LEDS font exactement ce que je leur demande.
Et les appuis suivants sur le bouton de déclanchement entrainent une animation parfaite. Ce n'est que le premier appui qui "foire".
Qu'ai je raté ?
Oui, je sais, je pinaille
Merci de votre aide (qui n'urge pas du tout)
/* Programme 6 exemple Accessorie modifié par Jerome
Effets recherchés par les modifications:
- en fin d'animation, les LEDS changent d etat après que les barrieres soient levées.
- une LED verte indique que la passage est autorisé.
*/
#include <Accessories.h>
#include <Commanders.h>
#define TEMPO 20000 //duree de l animation, 20 secondes
// L'ILS ...
ButtonsCommanderPush boutonILS; // remplacé par un poussoir sur pin A2 et GND
// Le moteur
AccessoryServo PN; // "donnée" sur sur pin3
// Les DELS
AccessoryLightMulti Dels; //Deux rouges sur pin7&8, une verte sur pin9.
// Les ports pour connecter le moteur et les DELs.
PortServo portPN; //servo
PortOnePin portLight1; //LED Rouge 1
PortOnePin portLight2; //LED Rouge 2 (ou une jaune)
PortOnePin portLight3; //LED Verte
bool etatPN; //position de la barriere
void setup()
{
Commanders::begin(LED_BUILTIN);
Accessories::begin();
// Un seul bouton, mais deux événements pour le PN
boutonILS.begin(1234, 6); // premier événement pour le déclanchement
// Les ports avec leurs broches en digital (pas PWM)
portPN.begin(3);
portLight1.begin(7, DIGITAL);
portLight2.begin(8, DIGITAL);
portLight3.begin(9, DIGITAL); //LED Verte
// begin de l'accessoire de 2 Dels qui doivent clignoter à 500ms d'intervalle.
Dels.begin(0, 3, 500);
// Les DELs avec pour chaque, le port utilisé.
Dels.beginLight(0, &portLight1);
Dels.beginLight(1, &portLight2);
Dels.beginLight(2, &portLight3);
// On fait clignoter les leds...
Dels.SetBlinking(0, 500);
Dels.SetBlinking(1, 500);
// Le servo : pas de durée de mouvement, un débattement entre 90 et 160 degres
// et deux positions stables annoncées avec des identifiants inutiles (mais obligatoires)
PN.begin(&portPN, 75, 90, 160, 1);
// Les deux positions sont au mini et au maxi :
PN.AddMinMaxMovingPositions(456, 789);
// initialisation barriere ouverte et led verte allumée
Dels.LightOff(); // extinction des 3 LEDS
Dels.LightOn(2); // allumage de la LED Verte.
PN.MoveMaximum(); //barriere grande ouverte
Accessories::loop(); // et on fait bouger tout ca.
}
unsigned long dateFermeture = 0;
void loop()
{
Accessories::loop();
etatPN=PN.IsMaximumOrGreaterPosition(); // on recupere la position de la barriere : 1 si grande ouverte
unsigned long id = Commanders::loop();
// si l'ils est activé !
if (id == 1234)
{
if (dateFermeture== 0)
{
dateFermeture = millis();
// mise en route clignotement des rouges et extinction de la verte.
Dels.Blink(); //en fait les 3 clignotent, mais on eteint la verte juste apres.
Dels.LightOff(2);
//Dels.LightOn(1); // si on veut garder une rouge fixe.
// mouvement servo : fermeture de la barriere
PN.MoveMinimum();
// Plus rien à faire, attendons l'étape suivante.
return;
}
else
{
dateFermeture = millis();
}
}
if (dateFermeture > 0)
{
if (millis() - dateFermeture > TEMPO)
{
// Fin de l'animation. On ouvre les barrières, puis on éteint les LED
PN.MoveMaximum(); //on ouvre les barrieres
if(etatPN == 1) // 1 si la barriere est en haut
{
Dels.LightOff(); // extinction des 3 LEDS
Dels.LightOn(2); // allumage de la LED Verte.
dateFermeture = 0;
}
//sinon on ne modifie pas l etat des LEDS
}
}
}