Ajout CV de programmation

This commit is contained in:
Serge NOEL
2026-08-10 16:55:13 +02:00
parent c02760f286
commit 12bfe5ed20
+47 -15
View File
@@ -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);