// Production 17 Function DCC Decoder Dec_17LED_1Ftn.ino // Version 6.01 Geoff Bunza 2014,2015,2016,2017,2018 // Now works with both short and long DCC Addesses // // ******** UNLESS YOU WANT ALL CV'S RESET UPON EVERY POWER UP // ******** AFTER THE INITIAL DECODER LOAD REMOVE THE "//" IN THE FOOLOWING LINE!! // #define DECODER_LOADED // // --- // Anpassung an Arduino Nano JoFri 2023-10-24 // Die Tasten F0, F1 - F16 steuern 17 Ausgänge // Sketch Name: Relais12_Dec_17LED_1Ftn.ino // Anpassung an Relais_12 Steuerung , mit !( ) invertiert low = aktiv JoFri 2023-10-30 // Initialisierung der Relais ausgeschaltet 2023-11-10 // // benötigt wird die NmraDcc-master.zip // Diese Bibliothek ist auf neuerem Stand unter: https://github.com/mrrwa/NmraDcc // #include #define This_Decoder_Address 8 // CV1 DCC Adresse #define numleds 17 // Anzahl der Ausgänge const int FunctionPin0 = 13; // NANO interne LED const int FunctionPin1 = 3; // D3 const int FunctionPin2 = 4; // D4 const int FunctionPin3 = 5; // D5 const int FunctionPin4 = 6; // D6 const int FunctionPin5 = 7; // D7 const int FunctionPin6 = 8; // D8 const int FunctionPin7 = 9; // D9 const int FunctionPin8 = 10; // D10 const int FunctionPin9 = 11; // D11 const int FunctionPin10 = 12; // D12 const int FunctionPin11 = 14; // A0 const int FunctionPin12 = 15; // A1 const int FunctionPin13 = 16; // A2 const int FunctionPin14 = 17; // A3 const int FunctionPin15 = 18; // A4 const int FunctionPin16 = 19; // A5 NmraDcc Dcc; DCC_MSG Packet; uint8_t CV_DECODER_MASTER_RESET = 120; struct CVPair { uint16_t CV; uint8_t Value; }; CVPair FactoryDefaultCVs[] = { { CV_MULTIFUNCTION_PRIMARY_ADDRESS, This_Decoder_Address & 0x7F }, // These two CVs define the Long DCC Address { CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB, ((This_Decoder_Address >> 8) & 0x7F) + 192 }, { CV_MULTIFUNCTION_EXTENDED_ADDRESS_LSB, This_Decoder_Address & 0xFF }, // ONLY uncomment 1 CV_29_CONFIG line below as approprate DEFAULT IS SHORT ADDRESS // {CV_29_CONFIG, 0}, // Short Address 14 Speed Steps { CV_29_CONFIG, CV29_F0_LOCATION }, // Short Address 28/128 Speed Steps // {CV_29_CONFIG, CV29_EXT_ADDRESSING | CV29_F0_LOCATION}, // Long Address 28/128 Speed Steps { CV_DECODER_MASTER_RESET, 0 }, }; uint8_t FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs) / sizeof(CVPair); void notifyCVResetFactoryDefault() { // Make FactoryDefaultCVIndex non-zero and equal to num CV's to be reset // to flag to the loop() function that a reset to Factory Defaults needs to be done FactoryDefaultCVIndex = sizeof(FactoryDefaultCVs) / sizeof(CVPair); }; void setup() { // initialize the digital pins as an outputs for (int i = 2; i <= numleds; i++) { pinMode(i + 1, OUTPUT); digitalWrite(i + 1, HIGH); // war LOW, zur Initialisierung der Relais ausgeschaltet } // Setup which External Interrupt, the Pin it's associated with that we're using and enable the Pull-Up Dcc.pin(0, 2, 0); // Call the main DCC Init function to enable the DCC Receiver Dcc.init(MAN_ID_DIY, 601, FLAGS_MY_ADDRESS_ONLY, 0); delay(800); #if defined(DECODER_LOADED) if (Dcc.getCV(CV_DECODER_MASTER_RESET) == CV_DECODER_MASTER_RESET) #endif { for (int j = 0; j < FactoryDefaultCVIndex; j++) Dcc.setCV(FactoryDefaultCVs[j].CV, FactoryDefaultCVs[j].Value); digitalWrite(13, 1); //Blink the on board LED delay(1000); digitalWrite(13, 0); } } void loop() { // You MUST call the NmraDcc.process() method frequently from the Arduino loop() function for correct library operation Dcc.process(); if (FactoryDefaultCVIndex && Dcc.isSetCVReady()) { FactoryDefaultCVIndex--; // Decrement first as initially it is the size of the array Dcc.setCV(FactoryDefaultCVs[FactoryDefaultCVIndex].CV, FactoryDefaultCVs[FactoryDefaultCVIndex].Value); } } void notifyDccFunc(uint16_t Addr, DCC_ADDR_TYPE AddrType, FN_GROUP FuncGrp, uint8_t FuncState) { switch (FuncGrp) { case FN_0_4: digitalWrite(FunctionPin0, (FuncState & FN_BIT_00) >> 4); // F0 digitalWrite(FunctionPin1, !((FuncState & FN_BIT_01))); // F1 mit !( xxx ) invertiert LOW = aktiv digitalWrite(FunctionPin2, !((FuncState & FN_BIT_02) >> 1)); // F2 digitalWrite(FunctionPin3, !((FuncState & FN_BIT_03) >> 2)); // F3 digitalWrite(FunctionPin4, !((FuncState & FN_BIT_04) >> 3)); // F4 break; case FN_5_8: digitalWrite(FunctionPin5, !((FuncState & FN_BIT_05))); // F5 digitalWrite(FunctionPin6, !((FuncState & FN_BIT_06) >> 1)); // F6 digitalWrite(FunctionPin7, !((FuncState & FN_BIT_07) >> 2)); // F7 digitalWrite(FunctionPin8, !((FuncState & FN_BIT_08) >> 3)); // F8 break; case FN_9_12: digitalWrite(FunctionPin9, !((FuncState & FN_BIT_09))); // F9 digitalWrite(FunctionPin10, !((FuncState & FN_BIT_10) >> 1)); // F10 digitalWrite(FunctionPin11, !((FuncState & FN_BIT_11) >> 2)); // F11 digitalWrite(FunctionPin12, !((FuncState & FN_BIT_12) >> 3)); // F12 break; case FN_13_20: digitalWrite(FunctionPin13, (FuncState & FN_BIT_13)); // F13 nicht verwendet HIGH = aktiv digitalWrite(FunctionPin14, (FuncState & FN_BIT_14) >> 1); // F14 nicht verwendet digitalWrite(FunctionPin15, (FuncState & FN_BIT_15) >> 2); // F15 nicht verwendet digitalWrite(FunctionPin16, (FuncState & FN_BIT_16) >> 3); // F16 nicht verwendet break; case FN_21_28: break; } }