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 =
arduino-libraries/Servo@^1.1.9
mrrwa/NmraDcc@^2.0.17
+52 -22
View File
@@ -1,42 +1,72 @@
#include <Arduino.h>
#include <Servo.h>
#include <NmraDcc.h>
#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);
}