Ajout stockage CV en mémoire non volatile
This commit is contained in:
+52
-21
@@ -1,6 +1,7 @@
|
||||
#include <Arduino.h>
|
||||
#include <Servo.h>
|
||||
#include <NmraDcc.h>
|
||||
#include <EEPROM.h>
|
||||
|
||||
#define DCC_SIGNAL_PIN 2
|
||||
#define LED_PIN 3
|
||||
@@ -15,6 +16,9 @@
|
||||
#define DEFAULT_MAX_UP 180
|
||||
#define DEFAULT_MAX_DOWN 0
|
||||
|
||||
#define EEPROM_SIG_ADDR 0
|
||||
#define EEPROM_SIG_VALUE 0xA5
|
||||
|
||||
NmraDcc Dcc;
|
||||
Servo servoMotor;
|
||||
uint8_t PalesSpeed = DEFAULT_PALES_SPEED;
|
||||
@@ -23,31 +27,60 @@ uint8_t ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||
int STROBE_ON = 0;
|
||||
int HelicoUP = 0;
|
||||
|
||||
struct CVPair
|
||||
{
|
||||
uint16_t CV;
|
||||
uint8_t Value;
|
||||
};
|
||||
|
||||
CVPair FactoryDefaultCVs[] = {
|
||||
{CV_PALES_SPEED, DEFAULT_PALES_SPEED},
|
||||
{CV_MAX_UP, DEFAULT_MAX_UP},
|
||||
{CV_MAX_DOWN, DEFAULT_MAX_DOWN},
|
||||
};
|
||||
|
||||
uint8_t FactoryDefaultCVIndex = 0;
|
||||
|
||||
void notifyCVAck(void)
|
||||
{
|
||||
// Si le contrôleur demande un ACK de programmation CV, on peut utiliser une LED ou un signal dédié.
|
||||
digitalWrite(LED_PIN, HIGH);
|
||||
delay(6);
|
||||
digitalWrite(LED_PIN, LOW);
|
||||
}
|
||||
|
||||
void notifyCVChange(uint16_t CV, uint8_t Value)
|
||||
{
|
||||
if (CV == CV_PALES_SPEED) {
|
||||
PalesSpeed = Value;
|
||||
} else if (CV == CV_MAX_UP) {
|
||||
ServoMaxUp = Value;
|
||||
} else if (CV == CV_MAX_DOWN) {
|
||||
ServoMaxDown = Value;
|
||||
}
|
||||
}
|
||||
|
||||
void notifyCVResetFactoryDefault()
|
||||
{
|
||||
FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs) / sizeof(CVPair);
|
||||
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
||||
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
||||
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
||||
}
|
||||
|
||||
void loadCvDefaultsIfNeeded()
|
||||
{
|
||||
if (EEPROM.read(EEPROM_SIG_ADDR) != EEPROM_SIG_VALUE) {
|
||||
if (Dcc.isSetCVReady()) {
|
||||
Dcc.setCV(CV_PALES_SPEED, DEFAULT_PALES_SPEED);
|
||||
Dcc.setCV(CV_MAX_UP, DEFAULT_MAX_UP);
|
||||
Dcc.setCV(CV_MAX_DOWN, DEFAULT_MAX_DOWN);
|
||||
EEPROM.update(EEPROM_SIG_ADDR, EEPROM_SIG_VALUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void loadCvFromDcc()
|
||||
{
|
||||
PalesSpeed = Dcc.getCV(CV_PALES_SPEED);
|
||||
if (PalesSpeed == 0) {
|
||||
PalesSpeed = DEFAULT_PALES_SPEED;
|
||||
}
|
||||
|
||||
ServoMaxUp = Dcc.getCV(CV_MAX_UP);
|
||||
if (ServoMaxUp == 0) {
|
||||
ServoMaxUp = DEFAULT_MAX_UP;
|
||||
}
|
||||
|
||||
ServoMaxDown = Dcc.getCV(CV_MAX_DOWN);
|
||||
if (ServoMaxDown == 0) {
|
||||
ServoMaxDown = DEFAULT_MAX_DOWN;
|
||||
}
|
||||
}
|
||||
|
||||
void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputPower)
|
||||
@@ -58,6 +91,7 @@ void notifyDccAccTurnoutOutput(uint16_t Addr, uint8_t Direction, uint8_t OutputP
|
||||
analogWrite(PWM_PIN, Direction ? PalesSpeed : 0);
|
||||
} else if (Addr == 3) {
|
||||
HelicoUP = Direction;
|
||||
servoMotor.write(Direction ? ServoMaxUp : ServoMaxDown);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,17 +114,14 @@ void setup()
|
||||
#endif
|
||||
|
||||
Dcc.init(MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0);
|
||||
loadCvDefaultsIfNeeded();
|
||||
loadCvFromDcc();
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
Dcc.process();
|
||||
|
||||
if (FactoryDefaultCVIndex && Dcc.isSetCVReady()) {
|
||||
FactoryDefaultCVIndex--;
|
||||
Dcc.setCV(FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value);
|
||||
}
|
||||
|
||||
if (STROBE_ON) {
|
||||
digitalWrite(LED_PIN, HIGH);
|
||||
delay(100);
|
||||
|
||||
Reference in New Issue
Block a user