Bonjour,
Je ne sais pas si cela pourra répondre à vos interrogations mais vous pouvez trouver chez Arcomora (
http://www.arcomora.com) un petit programme en libre accès ayant pour nom DCCmonitor.ino.
Voici une copie écran des informations affichées par ce programme.
Au démarrage, il faut répondre par Y/N en fonction de la centrale utilisée. Ensuite, chaque commande d'un accessoire provoquera l'affichage de l'adresse en "langage naturel" de l'accessoire et l'état demandé (0 ou 1, en fonction de la position de l'aiguille par exemple). Accessoirement, il affiche le nombre de trames envoyées pour commander cet accessoire.
Dans cette copie écran, on voit que j'ai déclaré utiliser une Multimaus, l'adresse 0 est celle qui s'est affichée à la mise sous tension et j'ai ensuite manœuvré les accessoires 6, 12 et 125.
Ce programme est court (114 lignes). Il est paramétré pour utilise le terminal Putty mais les
Serial.print peuvent être facilement modifiés (il suffit d'enlever les caractères de contrôle destinés à Putty). Il peut également être facilement francisable.
Il vous permettra peut-être de comprendre ses fonctionnalités.
Pour vous faciliter un éventuel essai de ce programme, je le joins à ce message. Comme il utilise la bibliothèque
NmraDcc.h, celle-ci est à installer préalablement bien entendu.
Jean-Michel
- Code: Tout sélectionner
// Arcomora
/*
DCC_Monitor tool
*/
#include <NmraDcc.h>
#define kDCC_INTERRUPT 0
#define kONE_Max 80 // for compliance with Digikeijs DR5000;
#define DCCPIN 2
#define DCCINT kDCC_INTERRUPT
#define VERSION_ID 30
NmraDcc Dcc;
int lastaddress;
int address;
bool output;
bool lastoutput;
byte offset;
int count;
unsigned long lastmillis;
bool on13;
//*************************
void setup()
{
Serial.begin (57600);
Serial.println("\e[2J\e[1;1HArcomora Accessory monitor (V3.0)started");
pinMode(2,INPUT_PULLUP); //DCC input
pinMode(13,OUTPUT);
Serial.print(F("\nDo you use a ROCO MultiMaus or z/Z21 Y/N ? (N) "));
if (askyn()=='Y') offset=5; else offset=1;
// Setup which External Interrupt, the Pin it's associated with that we're using and disable the Pull-Up
Dcc.pin(DCCINT, DCCPIN, 0);
// Call the main DCC init function to enable the DCC Receiver
Dcc.init(MAN_ID_DIY, VERSION_ID, FLAGS_OUTPUT_ADDRESS_MODE | FLAGS_DCC_ACCESSORY_DECODER, CV_MULTIFUNCTION_EXTENDED_ADDRESS_MSB);
Serial.println("\nStart sending DCC accessorie addresses\n");
digitalWrite (13,LOW);
on13=false;
}
static uint16_t buildLinearAddress(uint16_t BoardAddr, uint8_t OutputAddr)
{
// Serial.print('B'); Serial.print(BoardAddr); Serial.print(" O"); Serial.print(OutputAddr); Serial.print(" L"); Serial.println((BoardAddr << 3) + OutputAddr);
return (BoardAddr << 3) + OutputAddr;
}
//
// This function is called whenever a normal DCC Turnout Packet is received
//
void notifyDccAccState(uint16_t Addr, uint16_t BoardAddr, uint8_t OutputAddr, uint8_t State)
{
uint16_t incomingAddr = buildLinearAddress(BoardAddr, OutputAddr);
BasicAccDecoderPacket_Handler(incomingAddr >> 1, State != 0, incomingAddr et 1);
}
void loop ()
{
Dcc.process();
if (millis()>lastmillis+250)
{
digitalWrite (13,1-digitalRead(13));
lastmillis=millis();
}
}
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data)
{
// Convert NMRA packet address format to human address
output = (data et 0x01) ? 1 : 0;
if (offset==5) address=address+1;
if (offset==1) address=address-3;
// address += (data et 0x06) >> 1;
if ((address!=lastaddress || lastoutput!=output) etet (count>0))
{
Serial.print("Address ");
Serial.print(lastaddress);
Serial.print(" with data ");
Serial.print(lastoutput);
Serial.print(" was sent ");
Serial.print(count);
Serial.println(" times");
count=1;
digitalWrite (13,HIGH);
on13=true;
lastmillis=millis();
Serial.print("Address: ");
Serial.print(address);
Serial.print(" Data: ");
Serial.println(output);
lastaddress=address;
lastoutput=output;
} else count++;
}
//---------------------------------- askyn
char askyn()
{
flushwait();
byte Command = Serial.read();
if (Command=='y') Command = 'Y';
if (Command!='Y') Command=' '; //default no
Serial.println ("");
return Command;
}
void flushwait()
{
while(Serial.available()); Serial.read();
while (!Serial.available()); //Wait for new input
}