Changement comportement
This commit is contained in:
@@ -11,3 +11,4 @@ build_flags =
|
||||
|
||||
lib_deps =
|
||||
arduino-libraries/Servo@^1.1.9
|
||||
mrrwa/NmraDcc@^2.0.17
|
||||
|
||||
+53
-23
@@ -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
|
||||
|
||||
attachInterrupt(digitalPinToInterrupt(DCC_SIGNAL_PIN), handleDccSignal, RISING);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
delay(10);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user