/*
**********************************
* Décodeur d'accessoires basique *
* version 20250317 *
* ARDUINO *
**********************************
*
*
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
! Ce code est distribué gratuitement sous licence !
! Creativ Commons CC-BY-NC-ND 3.0 !
! !
! Cette licence permet à d'autres utilisateurs d'utiliser ce code !
! à des fins non commerciales, dans la mesure où le nom de l'auteur est !
! mentionné. Toute modification du code devra être soumise à !
! l'autorisation expresse de l'auteur. !
! !
! auteur Philippe GUENET - [email protected] - https://wgnt-train.fr !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
*/
#include <EEPROM.h>
/* A décommenter si utilisation d'une centrale Sprog3 */
#define Sprog3ON
/* ================================================== */
/* A décommenter si utilisation d'une centrale z21 dont la norme RCN 213 n'est pas activée */
//#define IsZ21
/* ======================================================================================= */
/* A decommenter si utilistion du mode bascule de la sortie */
//#define IsBascule
/* ======================================================== */
String Version = "Decodeur-Accessoire-20250317";
#define numCarte 1
#define adresseDepart 100
const int Nb_Sorties = 8;
const int pin_DCC = 2;
int pin_Sortie[Nb_Sorties] = {3, 4, 5, 6, 7, 8, 9, 10}; // Arduino Nano & pro-mini32
/* POUR LA DETECTION DCC */
//#include <DCC_Decoder.h>
#define kDCC_INTERRUPT 0
const int pinInterruptionDCC = 2;
bool etatSortieDCC;
int adresseDCCDepart = adresseDepart + (Nb_Sorties * (numCarte - 1));
void setup() {
Serial.begin(38400);
Serial.println(F("Tests decodeur accessoire Arduino"));
pinMode(LED_BUILTIN, OUTPUT);
pinMode(pin_DCC,INPUT_PULLUP);
/* Initialisation des pins de sorties et test des connexions */
for (int J = 0; J < Nb_Sorties; J++){
pinMode(pin_Sortie[J], OUTPUT);
digitalWrite(pin_Sortie[J], HIGH);
delay(500);
digitalWrite(pin_Sortie[J], LOW);
delay(500);
} // Fin de for (int J = 0; J < Nb_Sorties; J++)
/* ========================================================= */
/* on lit la valeur enregistrée de adresseDepart */
//EEPROM.get(0, adresseDCCDepart);
Serial.print(F("Adresse DCC Depart : ")); Serial.println(adresseDCCDepart);
/* on visualise la valeur de adresseDCCDepart */
affiche_adresseDCCDepart(pin_Sortie[0], (adresseDCCDepart / 100) % 10);
affiche_adresseDCCDepart(pin_Sortie[1], (adresseDCCDepart / 10) % 10);
affiche_adresseDCCDepart(pin_Sortie[2], adresseDCCDepart % 10);
delay(1000);
/* ========================================== */
/* configuration DCC */
//DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
//DCC.SetupDecoder( 0x00, 0x00, 0);
//DCC.SetupDecoder( 0x00, 0x00, digitalPinToInterrupt(pinInterruptionDCC));
attachInterrupt(digitalPinToInterrupt(pinInterruptionDCC), BasicAccDecoderPacket_Handler, CHANGE);
/* ================= */
}
void loop() {
// put your main code here, to run repeatedly:
}
void BasicAccDecoderPacket_Handler(int adresseDecode, boolean activate, byte data) {
Serial.println(F("Appel ISR OK")); digitalWrite(LED_BUILTIN, HIGH); delay(300); digitalWrite(LED_BUILTIN, LOW); //Débug
#ifndef Sprog3ON
/* N'est pas utilisé pour les tests avec une centrale Sprog3 */
adresseDecode -= 1;
adresseDecode *= 4;
adresseDecode += 1;
adresseDecode += (data & 0x06) >> 1;
/* ========================================================= */
#ifdef IsZ21
/* Est utilisé pour une centrale z21 dont la norme RCN 213 n'est pas activée.*/
adresseDecode += 4;
/* ========================================================================= */
#endif
#endif
if((adresseDecode >= adresseDCCDepart) && (adresseDecode <= adresseDCCDepart + Nb_Sorties -1)){
#if defined(IsBascule)
etatSortieDCC =! etatSortieDCC;
#else
etatSortieDCC = (data & 0x01) ? 1 : 0;
#endif
digitalWrite(pin_Sortie[adresseDecode - adresseDCCDepart], etatSortieDCC);
Serial.print(F("Sortie ")); Serial.print(adresseDecode - adresseDCCDepart); Serial.print(F(" = ")); Serial.println(etatSortieDCC);
/* Écriture EEPROM avec la bibliothèque standard */
EEPROM.update(adresseDecode, etatSortieDCC);
} // Fin de if((adresseDecode >= adresseDCCDepart) && (adresseDecode <= adresseDCCDepart + Nb_Sorties -1)
} // Fin de procédure BasicAccDecoderPacket_Handler(int adresseDecode, boolean activate, byte data
void affiche_adresseDCCDepart(int pin, int nombre) {
for (int i = 0; i < nombre; i++) {
digitalWrite(pin, HIGH);
delay(300);
digitalWrite(pin, LOW);
delay(300);
} // Fin de for (int i = 0; i < nombre; i++)
delay(1000); // Pause entre chaque série de clignotements
} // Fin de procédure affiche_adresseDCCDepart(int pin, int nombre)