Ajout timer pour strobe

This commit is contained in:
Serge NOEL
2026-08-10 17:08:35 +02:00
parent f7ef209bdf
commit 504ffb651c
+84 -7
View File
@@ -27,6 +27,9 @@ uint8_t ServoMaxDown = DEFAULT_MAX_DOWN;
int STROBE_ON = 0;
int HelicoUP = 0;
/**
* Génére un clignotement de la LED pour signaler l'accusé de réception d'une commande DCC.
*/
void notifyCVAck(void)
{
digitalWrite(LED_PIN, HIGH);
@@ -34,6 +37,11 @@ void notifyCVAck(void)
digitalWrite(LED_PIN, LOW);
}
/**
* Notifie le changement d'une CV.
* @param CV Le numéro de la CV modifiée.
* @param Value La nouvelle valeur de la CV.
*/
void notifyCVChange(uint16_t CV, uint8_t Value)
{
if (CV == CV_PALES_SPEED) {
@@ -45,6 +53,9 @@ void notifyCVChange(uint16_t CV, uint8_t Value)
}
}
/**
* Notifie la réinitialisation des valeurs par défaut de la CV.
*/
void notifyCVResetFactoryDefault()
{
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
@@ -53,6 +64,9 @@ void notifyCVResetFactoryDefault()
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
}
/**
* Charge les valeurs par défaut des CV si elles n'ont pas encore été initialisées.
*/
void loadCvDefaultsIfNeeded()
{
if (EEPROM.read(EEPROM_SIG_ADDR) != EEPROM_SIG_VALUE) {
@@ -65,6 +79,9 @@ void loadCvDefaultsIfNeeded()
}
}
/**
* Charge les valeurs des CV depuis le bus DCC.
*/
void loadCvFromDcc()
{
PalesSpeed = Dcc.getCV(CV_PALES_SPEED);
@@ -83,6 +100,12 @@ void loadCvFromDcc()
}
}
/**
* Notifie la sortie d'une voie d'accès DCC.
* @param Addr L'adresse de la voie d'accès.
* @param Direction La direction de la voie d'accès.
* @param OutputPower La puissance de sortie.
*/
void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower)
{
if (Addr == 1) {
@@ -95,41 +118,95 @@ void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputP
}
}
/**
* Notifie le changement d'état d'une sortie DCC.
* @param Addr L'adresse de la sortie.
* @param State L'état de la sortie.
*/
void notifyDccSigOutputState(uint16_t Addr, uint8_t State)
{
digitalWrite(LED_PIN, State ? HIGH : LOW);
}
/**
* Initialise le système.
*/
void setup()
{
// Sens des PINs
pinMode(LED_PIN, OUTPUT);
pinMode(PWM_PIN, OUTPUT);
// Configure la pin pour le servo moteur
servoMotor.attach(SERVO_PIN);
servoMotor.write(90);
// Attachen l'interruption pour le signal DCC
#ifdef digitalPinToInterrupt
Dcc.pin(DCC_SIGNAL_PIN, 0);
#else
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
#endif
// Initialise le décodeur DCC avec l'adresse 10 et les fonctionnalités de décodeur d'accessoires et de mode d'adresse de sortie.
Dcc.init(MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0);
// Charge les valeurs par défaut des CV si elles n'ont pas encore été initialisées.
loadCvDefaultsIfNeeded();
loadCvFromDcc();
}
static unsigned long strobeNextMillis = 0;
static uint8_t strobePhase = 0;
/**
* Boucle principale.
*/
void loop()
{
// Lire le temps actuel en millisecondes
unsigned long now = millis();
// Traite les signaux DCC entrants
Dcc.process();
if (STROBE_ON) {
digitalWrite(LED_PIN, HIGH);
delay(100);
switch (strobePhase) {
case 0:
digitalWrite(LED_PIN, HIGH);
strobePhase = 1;
strobeNextMillis = now + 100;
break;
case 1:
if (now >= strobeNextMillis) {
digitalWrite(LED_PIN, LOW);
strobePhase = 2;
strobeNextMillis = now + 100;
}
break;
case 2:
if (now >= strobeNextMillis) {
digitalWrite(LED_PIN, HIGH);
strobePhase = 3;
strobeNextMillis = now + 100;
}
break;
case 3:
if (now >= strobeNextMillis) {
digitalWrite(LED_PIN, LOW);
strobePhase = 4;
strobeNextMillis = now + 1000;
}
break;
case 4:
if (now >= strobeNextMillis) {
strobePhase = 0;
}
break;
}
} else {
strobePhase = 0;
digitalWrite(LED_PIN, LOW);
delay(100);
digitalWrite(LED_PIN, HIGH);
delay(100);
digitalWrite(LED_PIN, LOW);
delay(100);
}
}