From c02760f2867300f5280751f659e79826ca4aeb3d Mon Sep 17 00:00:00 2001 From: Serge NOEL Date: Mon, 10 Aug 2026 16:52:43 +0200 Subject: [PATCH] Changement comportement --- platformio.ini | 1 + src/main.cpp | 74 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/platformio.ini b/platformio.ini index be81204..c5c09ba 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,3 +11,4 @@ build_flags = lib_deps = arduino-libraries/Servo@^1.1.9 + mrrwa/NmraDcc@^2.0.17 diff --git a/src/main.cpp b/src/main.cpp index 07079f8..f09b9e4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,42 +1,72 @@ #include #include +#include #define DCC_SIGNAL_PIN 2 #define LED_PIN 3 #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 +NmraDcc Dcc; Servo servoMotor; -volatile bool dccSignalReceived = false; +int STROBE_ON=0; +int HelicoUP=0 -void IRAM_ATTR handleDccSignal() { - dccSignalReceived = true; +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); + } 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 setup() { - pinMode(DCC_SIGNAL_PIN, INPUT); +void notifyDccSigOutputState(uint16_t Addr, uint8_t State) +{ + // Exemple simple : utiliser un signal DCC pour piloter la LED + digitalWrite(LED_PIN, State ? HIGH : LOW); +} + +void setup() +{ pinMode(LED_PIN, OUTPUT); pinMode(PWM_PIN, OUTPUT); - servoMotor.attach(SERVO_PIN); - servoMotor.write(90); // position centrale + servoMotor.write(90); - attachInterrupt(digitalPinToInterrupt(DCC_SIGNAL_PIN), handleDccSignal, RISING); +#ifdef digitalPinToInterrupt + Dcc.pin(DCC_SIGNAL_PIN, 0); +#else + Dcc.pin(0, DCC_SIGNAL_PIN, 1); +#endif + + Dcc.init(MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0); } -void loop() { - if (dccSignalReceived) { - dccSignalReceived = false; - - // TODO: Décoder la commande DCC et piloter les sorties - digitalWrite(LED_PIN, !digitalRead(LED_PIN)); - analogWrite(PWM_PIN, digitalRead(PWM_PIN) ? 0 : 255); - servoMotor.write(0); - delay(250); - servoMotor.write(180); - delay(250); - servoMotor.write(90); +void loop() +{ + Dcc.process(); + 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); + delay(100); + digitalWrite(LED_PIN, HIGH); + delay(100); + digitalWrite(LED_PIN, LOW); + delay(100); } - - delay(10); }