Decoder: Miningen Light 2

Miningen Light 2 ist DER Decoder auf unserer Modellbahn-Anlage.de. Er soll die Verbindung zwischen DCC-Zentralen und Hardware sein.

Ein- und Ausgänge des Decoders

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// DARSTELLUNG DES DECODERS, SEINER EIN- UND AUSGÄNGE
//
// _________
// PC6 REST RESET-o|1 28|o-Druckknopf/I/O 7 analog 5 PC5
// PD0 digital 0 (RX) I/O 3-o|2 27|o-I/O 6 analog 4 PC4
// PD1 digital 1 (TX) I/O 5-o|3 26|o-DKnopf LED analog 3 PC3
// PD2 digital 2 DCC IN-o|4 25|o-I/O 2 analog 2 PC2
// PD3 digital 3 ~ WS2812B-o|5 24|o-I/O 1 analog 1 PC1
// PD4 digital 4 BOARD LED-o|6 23|o-I/O 4 analog 0 PC0
// VCC-o|7 22|o-GND
// GND-o|8 21|o-AREF
// PB6 CLOCK-o|9 20|o-VCC
// PB7 CLOCK-o|10 19|o-LED5 digital 13 PB5
// PD5 digital 5 ~ LED1-o|11 18|o-LED4 digital 12 PB4
// PD6 digital 6 ~ LED3-o|12 17|o-LED6 ~ digital 11 PB3
// PD7 digital 7 LED2-o|13 16|o-LED7 ~ digital 10 PB2
// PB0 digital 8 Relais-o|14_____15|o-Servo/LED8 ~ digital 9 PB1
//
// Define Pins
#define IO3 0
#define IO5 1
#define DCC 2
#define WS2812B 3
#define BOARD_LED 4
#define LED1 5
#define LED3 6
#define LED2 7
#define Relais 8
#define Servo 9 #(oder LED8)
#define LED7 10
#define LED6 11
#define LED4 12
#define LED5 13
void setup()
{
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
digitalWrite(RED, HIGH);
digitalWrite(GREEN, LOW);
digitalWrite(BLUE, LOW);
}

LED per DCC ein- und ausschalten

#include <NmraDcc.h>
NmraDcc Dcc;
const int ledPin = 13;
const int dccPin = 2; // DCC-Eingang
void setup() {
pinMode(ledPin, OUTPUT);
Dcc.pin(dccPin, 0); // DCC-Eingang initialisieren
Dcc.begin(); // DCC-Decoder starten
}
void loop() {
Dcc.process(); // DCC-Befehle verarbeiten
}
// Diese Funktion wird aufgerufen, wenn ein DCC-Befehl für diese Adresse kommt
void notifyDccAccTurnout(uint16_t addr, uint8_t direction, uint8_t outputPower) {
if (addr == 1) { // Adresse 1
if (direction == 1) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
}

LED faden mit DCC

const int dccInputPin = 2; // Eingang vom DCC-Decoder
const int ledPin = 9; // LED-Pin (muss PWM-fähig sein: 3, 5, 6, 9, 10, 11)
int brightness = 0;
int fadeAmount = 5; // Schrittweite für das Faden
bool fadeIn = true; // Richtung: ein- oder ausfaden
void setup() {
pinMode(dccInputPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
if (digitalRead(dccInputPin) == HIGH) {
// LED langsam ein- und ausfaden
analogWrite(ledPin, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount; // Richtung umkehren
}
delay(30); // Verzögerung für sanftes Faden
} else {
analogWrite(ledPin, 0); // LED aus
brightness = 0;
}
}

LED schaltet hier sofort aus, wenn der DCC Befehl kommt

const int dccInputPin = 2; // Eingang vom DCC-Decoder
const int ledPin = 9; // LED-Pin (PWM-fähig: 3, 5, 6, 9, 10, 11)
int brightness = 0;
int fadeAmount = 5;
bool fadeIn = true;
void setup() {
pinMode(dccInputPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
if (digitalRead(dccInputPin) == HIGH) {
// LED langsam ein- und ausfaden
analogWrite(ledPin, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
delay(30);
} else {
// LED sofort ausschalten, wenn DCC-Befehl LOW ist
analogWrite(ledPin, 0);
brightness = 0;
}
}

Mehrere LEDs, wobei jede LED auf eine eigene DCC Adresse hört

DCC-Signal an Arduino-Pin 2 (über Optokoppler oder DCC-Shield)

Jede LED an einen PWM-fähigen Pin (z.B. 3, 5, 6, 9, 10, 11)

Jede LED hat eine eigene DCC-Adresse und wird unabhängig gesteuert.

Der Fade-Effekt läuft nur, wenn der DCC-Befehl (direction == 1) aktiv ist.

Bei direction == 0 wird die LED sofort ausgeschaltet.

Du kannst die Anzahl der LEDs und Adressen einfach anpassen.

#include <NmraDcc.h>
NmraDcc Dcc;
const int dccPin = 2; // DCC-Eingang
// LED-Pins und zugehörige DCC-Adressen
struct LED {
int pin;
int dccAddr;
int brightness;
int fadeAmount;
bool isFading;
};
LED leds[] = {
{3, 1, 0, 5, false}, // LED an Pin 3, DCC-Adresse 1
{5, 2, 0, 5, false}, // LED an Pin 5, DCC-Adresse 2
{6, 3, 0, 5, false}, // LED an Pin 6, DCC-Adresse 3
{9, 4, 0, 5, false}, // LED an Pin 9, DCC-Adresse 4
{10, 5, 0, 5, false}, // LED an Pin 10, DCC-Adresse 5
{11, 6, 0, 5, false} // LED an Pin 11, DCC-Adresse 6
};
const int ledCount = 6;
void setup() {
for (int i = 0; i < ledCount; i++) {
pinMode(leds[i].pin, OUTPUT);
}
Dcc.pin(dccPin, 0);
Dcc.begin();
}
void loop() {
Dcc.process();
for (int i = 0; i < ledCount; i++) {
if (leds[i].isFading) {
leds[i].brightness += leds[i].fadeAmount;
if (leds[i].brightness <= 0 || leds[i].brightness >= 255) {
leds[i].fadeAmount = -leds[i].fadeAmount;
}
analogWrite(leds[i].pin, leds[i].brightness);
delay(30);
}
}
}
// Wird aufgerufen, wenn ein DCC-Accessory-Befehl kommt
void notifyDccAccTurnout(uint16_t addr, uint8_t direction, uint8_t outputPower) {
for (int i = 0; i < ledCount; i++) {
if (leds[i].dccAddr == addr) {
if (direction == 1) {
leds[i].isFading = true; // LED faden lassen
} else {
leds[i].isFading = false;
analogWrite(leds[i].pin, 0); // LED sofort aus
leds[i].brightness = 0;
}
}
}
}