From 12bfe5ed2041bd7263106660c868d8f3174a33ee Mon Sep 17 00:00:00 2001 From: Serge NOEL Date: Mon, 10 Aug 2026 16:55:13 +0200 Subject: [PATCH] Ajout CV de programmation --- src/main.cpp | 62 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f09b9e4..35ec043 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,34 +7,62 @@ #define PWM_PIN 5 #define SERVO_PIN 6 -// Parametres mécaniques -#define PALES_SPEED 255 // Définir la vitesse maximale des pales (PWM) -#define MAX_UP 180 // Position maximale du servo -#define MAX_DOWN 0 // Position minimale du servo +#define CV_PALES_SPEED 100 +#define CV_MAX_UP 101 +#define CV_MAX_DOWN 102 + +#define DEFAULT_PALES_SPEED 255 +#define DEFAULT_MAX_UP 180 +#define DEFAULT_MAX_DOWN 0 + NmraDcc Dcc; Servo servoMotor; -int STROBE_ON=0; -int HelicoUP=0 +uint8_t PalesSpeed = DEFAULT_PALES_SPEED; +uint8_t ServoMaxUp = DEFAULT_MAX_UP; +uint8_t ServoMaxDown = DEFAULT_MAX_DOWN; +int STROBE_ON = 0; +int HelicoUP = 0; + +struct CVPair +{ + uint16_t CV; + uint8_t Value; +}; + +CVPair FactoryDefaultCVs[] = { + {CV_PALES_SPEED, DEFAULT_PALES_SPEED}, + {CV_MAX_UP, DEFAULT_MAX_UP}, + {CV_MAX_DOWN, DEFAULT_MAX_DOWN}, +}; + +uint8_t FactoryDefaultCVIndex = 0; + +void notifyCVAck(void) +{ + // Si le contrôleur demande un ACK de programmation CV, on peut utiliser une LED ou un signal dédié. + digitalWrite(LED_PIN, HIGH); + delay(6); + digitalWrite(LED_PIN, LOW); +} + +void notifyCVResetFactoryDefault() +{ + FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs) / sizeof(CVPair); +} void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower) { - // Exemple de mappage des adresses DCC vers les sorties du projet if (Addr == 1) { - // Utiliser l'adresse DCC 1 pour indiquer si le strobe est activé ou non STROBE_ON = Direction; } else if (Addr == 2) { - // Mise en marche des pales - analogWrite(PWM_PIN, Direction ? PALES_SPEED : 0); + analogWrite(PWM_PIN, Direction ? PalesSpeed : 0); } else if (Addr == 3) { - // TODO à changer pour une commande lente du servo, par exemple en utilisant un timer pour faire un mouvement progressif HelicoUP = Direction; - //servoMotor.write(Direction ? 180 : 0); } } void notifyDccSigOutputState(uint16_t Addr, uint8_t State) { - // Exemple simple : utiliser un signal DCC pour piloter la LED digitalWrite(LED_PIN, State ? HIGH : LOW); } @@ -57,9 +85,13 @@ void setup() void loop() { Dcc.process(); + + if (FactoryDefaultCVIndex && Dcc.isSetCVReady()) { + FactoryDefaultCVIndex--; + Dcc.setCV(FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value); + } + if (STROBE_ON) { - // STROBE_ON -> 2 clignotements rapides de 100ms séparés de 1s - // @TODO: Ajouter un timer pour ne pas bloquer le loop() et permettre à DCC de continuer à fonctionner digitalWrite(LED_PIN, HIGH); delay(100); digitalWrite(LED_PIN, LOW);