Changement comportement

This commit is contained in:
Serge NOEL
2026-08-10 16:52:43 +02:00
parent 33f130d8f3
commit c02760f286
2 changed files with 53 additions and 22 deletions
+1
View File
@@ -11,3 +11,4 @@ build_flags =
lib_deps = lib_deps =
arduino-libraries/Servo@^1.1.9 arduino-libraries/Servo@^1.1.9
mrrwa/NmraDcc@^2.0.17
+52 -22
View File
@@ -1,42 +1,72 @@
#include <Arduino.h> #include <Arduino.h>
#include <Servo.h> #include <Servo.h>
#include <NmraDcc.h>
#define DCC_SIGNAL_PIN 2 #define DCC_SIGNAL_PIN 2
#define LED_PIN 3 #define LED_PIN 3
#define PWM_PIN 5 #define PWM_PIN 5
#define SERVO_PIN 6 #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; Servo servoMotor;
volatile bool dccSignalReceived = false; int STROBE_ON=0;
int HelicoUP=0
void IRAM_ATTR handleDccSignal() { void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower)
dccSignalReceived = true; {
// 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() { void notifyDccSigOutputState(uint16_t Addr, uint8_t State)
pinMode(DCC_SIGNAL_PIN, INPUT); {
// Exemple simple : utiliser un signal DCC pour piloter la LED
digitalWrite(LED_PIN, State ? HIGH : LOW);
}
void setup()
{
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
pinMode(PWM_PIN, OUTPUT); pinMode(PWM_PIN, OUTPUT);
servoMotor.attach(SERVO_PIN); 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() { void loop()
if (dccSignalReceived) { {
dccSignalReceived = false; Dcc.process();
if (STROBE_ON) {
// TODO: Décoder la commande DCC et piloter les sorties // STROBE_ON -> 2 clignotements rapides de 100ms séparés de 1s
digitalWrite(LED_PIN, !digitalRead(LED_PIN)); // @TODO: Ajouter un timer pour ne pas bloquer le loop() et permettre à DCC de continuer à fonctionner
analogWrite(PWM_PIN, digitalRead(PWM_PIN) ? 0 : 255); digitalWrite(LED_PIN, HIGH);
servoMotor.write(0); delay(100);
delay(250); digitalWrite(LED_PIN, LOW);
servoMotor.write(180); delay(100);
delay(250); digitalWrite(LED_PIN, HIGH);
servoMotor.write(90); delay(100);
digitalWrite(LED_PIN, LOW);
delay(100);
} }
delay(10);
} }