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 STROBE_ON = 0;
|
||||||
int HelicoUP = 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)
|
void notifyCVAck(void)
|
||||||
{
|
{
|
||||||
digitalWrite(LED_PIN, HIGH);
|
digitalWrite(LED_PIN, HIGH);
|
||||||
@@ -34,6 +37,11 @@ void notifyCVAck(void)
|
|||||||
digitalWrite(LED_PIN, LOW);
|
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)
|
void notifyCVChange(uint16_t CV, uint8_t Value)
|
||||||
{
|
{
|
||||||
if (CV == CV_PALES_SPEED) {
|
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()
|
void notifyCVResetFactoryDefault()
|
||||||
{
|
{
|
||||||
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
||||||
@@ -53,6 +64,9 @@ void notifyCVResetFactoryDefault()
|
|||||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
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()
|
void loadCvDefaultsIfNeeded()
|
||||||
{
|
{
|
||||||
if (EEPROM.read(EEPROM_SIG_ADDR) != EEPROM_SIG_VALUE) {
|
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()
|
void loadCvFromDcc()
|
||||||
{
|
{
|
||||||
PalesSpeed = Dcc.getCV(CV_PALES_SPEED);
|
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)
|
void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower)
|
||||||
{
|
{
|
||||||
if (Addr == 1) {
|
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)
|
void notifyDccSigOutputState(uint16_t Addr, uint8_t State)
|
||||||
{
|
{
|
||||||
digitalWrite(LED_PIN, State ? HIGH : LOW);
|
digitalWrite(LED_PIN, State ? HIGH : LOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise le système.
|
||||||
|
*/
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
|
// Sens des PINs
|
||||||
pinMode(LED_PIN, OUTPUT);
|
pinMode(LED_PIN, OUTPUT);
|
||||||
pinMode(PWM_PIN, OUTPUT);
|
pinMode(PWM_PIN, OUTPUT);
|
||||||
|
// Configure la pin pour le servo moteur
|
||||||
servoMotor.attach(SERVO_PIN);
|
servoMotor.attach(SERVO_PIN);
|
||||||
servoMotor.write(90);
|
servoMotor.write(90);
|
||||||
|
|
||||||
|
// Attachen l'interruption pour le signal DCC
|
||||||
#ifdef digitalPinToInterrupt
|
#ifdef digitalPinToInterrupt
|
||||||
Dcc.pin(DCC_SIGNAL_PIN, 0);
|
Dcc.pin(DCC_SIGNAL_PIN, 0);
|
||||||
#else
|
#else
|
||||||
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
|
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
|
||||||
#endif
|
#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);
|
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();
|
loadCvDefaultsIfNeeded();
|
||||||
loadCvFromDcc();
|
loadCvFromDcc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static unsigned long strobeNextMillis = 0;
|
||||||
|
static uint8_t strobePhase = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Boucle principale.
|
||||||
|
*/
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
|
// Lire le temps actuel en millisecondes
|
||||||
|
unsigned long now = millis();
|
||||||
|
|
||||||
|
// Traite les signaux DCC entrants
|
||||||
Dcc.process();
|
Dcc.process();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (STROBE_ON) {
|
if (STROBE_ON) {
|
||||||
digitalWrite(LED_PIN, HIGH);
|
switch (strobePhase) {
|
||||||
delay(100);
|
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);
|
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