Ajout CV standards

This commit is contained in:
Serge NOEL
2026-08-10 17:35:29 +02:00
parent d4e4f44197
commit 4acea1a799
2 changed files with 106 additions and 4 deletions
+71 -3
View File
@@ -3,28 +3,48 @@
#include <NmraDcc.h>
#include <EEPROM.h>
// Affectation des PINs Arduino
#define DCC_SIGNAL_PIN 2
#define LED_PIN 3
#define PWM_PIN 5
#define SERVO_PIN 6
// Valeurs des CV (Configuration Variables)
#define CV_ADDRESS_LSB 513
#define CV_ADDRESS_MSB 521
#define CV_PALES_SPEED 100
#define CV_MAX_UP 101
#define CV_MAX_DOWN 102
// Valeurs par défaut des CV
#define DEFAULT_PALES_SPEED 255
#define DEFAULT_MAX_UP 180
#define DEFAULT_MAX_DOWN 0
#define DEFAULT_ADDRESS 1
#define VITESSE 20 // Temps en millisecondes entre chaque pas de servo
#define EEPROM_SIG_ADDR 0
#define EEPROM_SIG_VALUE 0xA5
#define DIY_MANUFACTURER_ID 13
struct DCCAccessoryConfig {
byte Sig; // Signature pour vérifier la validité de la structure (0x45)
byte ManufacturerID; // Manufacturer ID (0-255)
byte Version; // Version of the accessory decoder (0-255)
int address; // From 1 to 2044
byte MotorSpeed; // Speed of the motor (0-255)
byte ServoMaxUp; // Maximum position for servo up (0-180)
byte ServoMaxDown; // Maximum position for servo down (0-180)
};
NmraDcc Dcc;
Servo servoMotor;
uint8_t PalesSpeed = DEFAULT_PALES_SPEED;
uint8_t ServoMaxUp = DEFAULT_MAX_UP;
uint8_t ServoMaxDown = DEFAULT_MAX_DOWN;
uint16_t currentAddress = DEFAULT_ADDRESS;
int STROBE_ON = 0;
int HelicoUP = 0;
int currentServoPos = 90;
@@ -54,9 +74,34 @@ void notifyCVChange(uint16_t CV, uint8_t Value)
ServoMaxUp = Value;
} else if (CV == CV_MAX_DOWN) {
ServoMaxDown = Value;
} else if (CV == CV_ADDRESS_LSB || CV == CV_ACCESSORY_DECODER_ADDRESS_LSB) {
currentAddress = (currentAddress & 0xFF00) | Value;
if (CV == CV_ADDRESS_LSB) {
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, Value);
} else {
Dcc.setCV(CV_ADDRESS_LSB, Value);
}
} else if (CV == CV_ADDRESS_MSB || CV == CV_ACCESSORY_DECODER_ADDRESS_MSB) {
currentAddress = (currentAddress & 0x00FF) | ((Value & 0x07) << 8);
if (CV == CV_ADDRESS_MSB) {
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, Value & 0x07);
} else {
Dcc.setCV(CV_ADDRESS_MSB, Value);
}
}
}
uint8_t notifyCVValid (uint16_t CV, uint8_t Writable)
{
if (CV == CV_PALES_SPEED || CV == CV_MAX_UP || CV == CV_MAX_DOWN ||
CV == CV_ADDRESS_LSB || CV == CV_ADDRESS_MSB ||
CV == CV_ACCESSORY_DECODER_ADDRESS_LSB || CV == CV_ACCESSORY_DECODER_ADDRESS_MSB) {
return 1;
}
return 0;
}
/**
* Notifie la réinitialisation des valeurs par défaut de la CV.
*/
@@ -65,6 +110,8 @@ void notifyCVResetFactoryDefault()
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07);
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
}
@@ -78,6 +125,9 @@ void loadCvDefaultsIfNeeded()
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, DEFAULT_ADDRESS & 0xFF);
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, (DEFAULT_ADDRESS >> 8) & 0x07);
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
}
}
@@ -102,6 +152,24 @@ void loadCvFromDcc()
if (ServoMaxDown == 0) {
ServoMaxDown = DEFAULT_MAX_DOWN;
}
uint8_t addrLo = Dcc.getCV(CV_ADDRESS_LSB);
uint8_t addrHi = Dcc.getCV(CV_ADDRESS_MSB) & 0x07;
uint16_t address = ((uint16_t)addrHi << 8) | addrLo;
if (address == 0) {
addrLo = Dcc.getCV(CV_ACCESSORY_DECODER_ADDRESS_LSB);
addrHi = Dcc.getCV(CV_ACCESSORY_DECODER_ADDRESS_MSB) & 0x07;
address = ((uint16_t)addrHi << 8) | addrLo;
}
if (address == 0) {
address = DEFAULT_ADDRESS;
}
currentAddress = address;
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_LSB, addrLo);
Dcc.setCV(CV_ACCESSORY_DECODER_ADDRESS_MSB, addrHi);
Dcc.setCV(CV_ADDRESS_LSB, addrLo);
Dcc.setCV(CV_ADDRESS_MSB, addrHi);
}
/**
@@ -151,9 +219,9 @@ void setup()
Dcc.pin(0, DCC_SIGNAL_PIN, 1);
#endif
// Initialise le décodeur DCC avec l'adresse 10 et les fonctionnalités de décodeur d'accessoires et de mode d'adresse de sortie.
Dcc.init(MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0);
// Charge les valeurs par défaut des CV si elles n'ont pas encore été initialisées.
// Initialise le décodeur DCC en mode accessoire avec filtrage d'adresse sur l'adresse DCC courante.
Dcc.init(MAN_ID_DIY, 10, FLAGS_MY_ADDRESS_ONLY | FLAGS_DCC_ACCESSORY_DECODER | FLAGS_OUTPUT_ADDRESS_MODE, 0);
loadCvDefaultsIfNeeded();
loadCvFromDcc();
}