#include <NmraDcc.h>
#include <MobaTools.h>
// Demo: ein ganz einfacher Dcc-Servodecoder //
//------------------------------------------ //
// die NmraDcc - Library gibt es unter https://github.com/mrrwa/NmraDcc/archive/master.zip
// anzupassende Konstante:
const byte isROCO = 4 ; // wegen unterschiedlicher Weichenadressberechnung bei Roco (sonst = 0)
const byte weichenAdr[] = { 6, 7, 3, 123, 8, 34, 77, 88}; // DCC-Weichenadressen
const byte servoPins[] = { 3, 4, 5, 6, 7, 8, 9, 10}; // output-pin der Servos
const int geradePulse[] = {1200,1200,1200,1200,1200,1200,1200,1200}; // Pulslänge geradeaus
const int abzweigPulse[]= {1800,1800,1800,1800,1800,1800,1800,1800}; // Pulslänge abzweigend
const int speed = 8;
const byte autoOff = 1;
const byte ServoZahl = sizeof(weichenAdr);
Servo8 weicheS[ServoZahl];
NmraDcc Dcc;
///////////////////////////////////////////////////////////////
void setup() {
Dcc.init( MAN_ID_DIY, 15, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, 0 );
Dcc.pin(0, 2, 1); // Dcc-Signal an Pin2 ( = Int0 );
for ( byte i=0; i<ServoZahl; i++ ) {
// Weichenservos initiieren
weicheS[i].attach( servoPins[i], autoOff );
weicheS[i].setSpeed( speed );
}
}
////////////////////////////////////////////////////////////////
void loop() {
Dcc.process(); // Hier werden die empfangenen Telegramme analysiert
}
//////////////////////////////////////////////////////////////
// Unterprogramme, die von der DCC Library aufgerufen werden:
// Die folgende Funktion wird von Dcc.process() aufgerufen, wenn ein Weichentelegramm empfangen wurde
void notifyDccAccState( uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State ){
// Weichenadresse berechnen
word wAddr = Addr+isROCO; // Roco zählt ab 0, alle anderen lassen die ersten 4 Weichenadressen frei
// Testen ob eigene Weichenadresse
for ( byte i = 0; i < ServoZahl; i++ ) {
if ( wAddr == weichenAdr[i] ) {
// ist eigene Adresse, Servo ansteuern
if ( OutputAddr & 0x1 ) {
weicheS[i].write( geradePulse[i] );
} else {
weicheS[i].write( abzweigPulse[i] );
}
break; // Schleifendurchlauf abbrechen, es kann nur eine Weiche sein
}
}
}