Ajout timer pour strobe
This commit is contained in:
+84
-7
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user