Voilà mon projet, enfin...
Je voudrais utiliser l'attiny comme décodeur pour mes signaux de trains, j'ai vu cette vidéo
et je trouvais pratique.
J'ai suivi son explication et les autres des divers liens partagé dans cette discution, mais je dois surement me planter sur un point.
Voici l'attiny en question
Voici le sketch
#include <EEPROM.h>
#include <NmraDcc.h>
// die NmraDCC - Library gibt es unter
https://github.com/mrrwa/NmraDCC/archive/master.zip// anzupassende Konstante:
#define DCC_DECODER_VERSION_ID 02 // Versions-ID zur Speicherung in CV 7
//#define DB_PRINT( ... ) sprintf( dbgbuf,"Dbg: " __VA_ARGS__ ) ; Serial.println( dbgbuf )
//char dbgbuf[80];
#define LEDanzahl 5
#define Adressen 1
//byte ledpins [] = {8,9,10,11,12}; // Uno
byte ledpins [] = {0,1,3,4,5}; //Attiny85
int DCC_ADDR = 1; // DCC-Adresse
byte Signalbildgruppe = 0; // 0=Sh0 2=Hauptsignal
boolean Prog = false;
byte Signalbild [4][5] = {
{1,1,0,0,0}, // Sh0
{0,0,1,1,0}, // Sh1
{1,0,0,1,0}, // Hp0 Vr0
{0,1,1,1,0} // Hp2 Vr2
};
byte Letztes_Signalbild=7; //aus
const word CV_Letztes_Signalbild = 33;
const word CV_Signalbildgruppe= 34;
// CV Speicher Struktur
struct CVPair
{
uint16_t CV;
uint8_t Value;
};
// CV Default-Werte
CVPair FactoryDefaultCVs [] =
{ {CV_ACCESSORY_DECODER_ADDRESS_LSB, DCC_ADDR%256},
{CV_ACCESSORY_DECODER_ADDRESS_MSB, DCC_ADDR/256},
{CV_Letztes_Signalbild, 0},
{CV_Signalbildgruppe, 0},
};
NmraDcc DCC;
//DCC_MSG Packet ;
///////////////////////////////////////////////////////////////
void setup() {
//Serial.begin(115200);
for (int i=0; i< LEDanzahl; i++) {
pinMode(ledpins
, OUTPUT); // auf Ausgangschalten und LED aus.
digitalWrite(ledpins,HIGH);
}
Programmieren();
DCC.init( MAN_ID_DIY, DCC_DECODER_VERSION_ID, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER,0 );
DCC.pin(0, 2, 1); // DCC-Signal an Pin2 ( = Int0 );
/////////////////////////////////////
// DCC-Adresse setzen
if ( DCC.getCV( 9 ) == 255 ) { // wenn keine gültige Adresse gespeichert ist
DCC.setCV( 1, DCC_ADDR % 256 );
DCC.setCV( 9, DCC_ADDR / 256 );
}
/* // muss weg für Attiny
if ( DCC.getCV(CV_Letztes_Signalbild ) == 255 ) { // wenn keine gültige Adresse gespeichert ist
DCC.setCV( CV_Letztes_Signalbild, 0);
}
if ( DCC.getCV(CV_Signalbildgruppe ) == 255 ) { // wenn keine gültige Adresse gespeichert ist
DCC.setCV( CV_Signalbildgruppe, 0);
}
DB_PRINT( "CV1:%d, CV9:%d, CV29:%d, CV7=%d, CV8=%d, CV33=%d, CV34=%d", DCC.getCV(1), DCC.getCV(9), DCC.getCV(29), DCC.getCV(7), DCC.getCV(, DCC.getCV(33), DCC.getCV(34) );
// */
// Letztes Signalbild laden
Signalbildgruppe = DCC.getCV(CV_Signalbildgruppe); // Signalbildgruppe/Hauptsignal laden
exec_function(DCC.getCV(CV_Letztes_Signalbild ));
//Adresse aus CV 1 und 9 laden
DCC_ADDR =(DCC.getCV(9)*256)+ DCC.getCV(1);
}
////////////////////////////////////////////////////////////////
void loop() {
DCC.process(); // Hier werden die empfangenen Telegramme analysiert
if(Prog == true){
for (int i=0; i< LEDanzahl; i++) {
digitalWrite(ledpins, LOW);
delay (50);
}
for (int i=0; i< LEDanzahl; i++) {
digitalWrite(ledpins, HIGH);
delay (50);
}
}
}
void Programmieren()
{
pinMode(2, INPUT);
long Zeit;
Zeit = millis();
while(digitalRead(2)== LOW) {
}
if (millis() > Zeit+100){
// DB_PRINT("Zeit:%d",millis()- Zeit+100);
Prog = true;
}
}
//////////////////////////////////////////////////////////////
// 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 ){
if (Prog == true ){
DCC.setCV( 1, Addr % 256 );
DCC.setCV( 9, Addr / 256 );
DCC_ADDR =Addr;
if ( OutputAddr & 0x1 ){
Signalbildgruppe=2;
DCC.setCV( CV_Signalbildgruppe, Signalbildgruppe);
}
else{
Signalbildgruppe=0;
DCC.setCV( CV_Signalbildgruppe, Signalbildgruppe);
}
Prog= false;
}
//DB_PRINT ("CV_Adresse %d, Programm-adrssse %d ", Addr, DCC_ADDR);
for( int k=0; k<Adressen; k++) //
{ //überprüfe Adresse
if (Addr == DCC_ADDR+k) //
{
if ( OutputAddr & 0x1 )
{ exec_function(k*2+Signalbildgruppe);
}
else
{ exec_function(k*2+1+Signalbildgruppe);
}
} //if addr
}//for
}
void exec_function (int SBnr) {
#define fadedelay 5
// Serial.println(SBnr,DEC);
if (Letztes_Signalbild != SBnr)
{
for (int i=0; i<60; i++) //ausblenden
{
for (int j=0; j<5; j++) if (Signalbild[SBnr][j]==0 && Signalbild[Letztes_Signalbild][j]==1) digitalWrite( ledpins[j],1);
delay(fadedelay*i/60.0);
for (int j=0; j<5; j++) if (Signalbild[SBnr][j]==0 && Signalbild[Letztes_Signalbild][j]==1) digitalWrite( ledpins[j],0);
delay(fadedelay-(fadedelay*i/60.0));
}
//LEDs Aus
for (int j=0; j<5; j++) if (Signalbild[SBnr][j]==0 && Signalbild[Letztes_Signalbild][j]==1) digitalWrite( ledpins[j],1);
for (int i=0; i<60; i++) // einblenden
{
for (int j=0; j<5; j++) if (Signalbild[SBnr][j]==1 && !Signalbild[Letztes_Signalbild][j]==1) digitalWrite( ledpins[j],0);
delay(fadedelay*i/60.0);
for (int j=0; j<5; j++) if (Signalbild[SBnr][j]==1 && !Signalbild[Letztes_Signalbild][j]==1) digitalWrite( ledpins[j],1);
delay(fadedelay-(fadedelay*i/60.0));
}
// LEDs ein
for (int j=0; j<5; j++) digitalWrite( ledpins[j],!Signalbild[SBnr][j]);
Letztes_Signalbild=SBnr;
DCC.setCV( CV_Letztes_Signalbild, SBnr);
}// for
}
Même avec celui-ci pas moiyen:
void setup() {
// Initialize the digital pin as an output
pinMode(0, OUTPUT); // LED on Model B
pinMode(1, OUTPUT); // LED on Model A
}
void loop() {
digitalWrite(0, HIGH); // Turn the LED on
digitalWrite(1, HIGH);
delay(1000); // Wait for a second
digitalWrite(0, LOW); // Turn the LED off
digitalWrite(1, LOW);
delay(1000); // Wait for a second
}