Bonjour
Il faut installer les biblotheques suivantes:
ACCESSORIES
COMMANDERS
DIO2
J ai progresse dans l écriture mais j ai eu quelques mauvaises surprises à la compilation!
SPARKFUN1509.h manquant ==> solution installation de la bibliothèque gérant le 1509.
Idem pour le SH74HC595==> installation de la bibliothèque correspondante
Une fois ces désagréments passés la série continue mais sur un autre registre cette fois liée au code proprement dit:
DCCID et DCC ACTIVATION posent problème
...\Documents\Arduino\sketch_aug12a\sketch_aug12a.ino: In member function 'virtual void SignalArduinoPattern::Move(long unsigned int)':
sketch_aug12a:77:25: error: 'DCCID' was not declared in this scope
int etat = (DCCID(inId) - this->startingDcc) * 2 + DCCACTIVATION(inId);
^
sketch_aug12a:77:72: error: 'DCCACTIVATION' was not declared in this scope
int etat = (DCCID(inId) - this->startingDcc) * 2 + DCCACTIVATION(inId);
Si certains savent comment resoudre cet élément bloquant on pourra ensuite regarder le reste que je glisse ci dessous...
D avance merci
Laurent.
^
/*************************************************************
project: <Accessories>
author: <Thierry PARIS>
co author: <Laurent ROEKENS>
description: <8 leds for a french railroad signal>
*************************************************************/
#include "Commanders.h"
#include "Accessories.h"
#define NB_LEDS_MAX 16 //LTR modif 20>16 (qui vont etre repartis en 2 groupes de 8 leds
#define PATTERN_NB_LEDS_MAX 4 // sauf cas des ID max = 6ID + 2 Accesoires
#define PATTERN_END_LIST 127
#define DCCSTART 10
// ajout pour compatibilite DR5000 #define kDCC_INTERRUPT 80
#define kDCC_INTERRUPT 80
//-------------------------------------------------------------------
// This class defines a light signal by giving patterns of lights:
// like the state -x--BB-- for a signal with 8 lights (modif LTR).
// - = 0 = OFF
// x = 1 = ON
// B = BLINK
// Where x means light on, - means off, and B is blink.
//-------------------------------------------------------------------
class SignalArduinoPattern : public AccessoryLightMulti
{
private:
const uint8_t *pPatterns;
const uint8_t *pRealStates;
int startingDcc;
int blinkDuration;
public:
inline SignalArduinoPattern() {}
void beginSignal(uint8_t inNbLeds, const int *inpPins, int inStartingDcc, int inBlinkDuration, const uint8_t *inPatterns, const uint8_t *inpRealStates = 0);
void Move(unsigned long inId);
static int GetStatesNumber(const uint8_t *pStates);
};
void SignalArduinoPattern::beginSignal(uint8_t inNbLeds, const int *inpPins, int inStartingDcc, int inBlinkDuration, const uint8_t *inPatterns, const uint8_t *inpRealStates)
{
begin(0, inNbLeds, 0);
for (int led = 0; led < inNbLeds; led++)
{
PortOnePin *pPort = new PortOnePin();
pPort->begin(inpPins[led], DIGITAL);
this->beginLight(led, pPort, 255);
}
this->startingDcc = inStartingDcc;
this->blinkDuration = inBlinkDuration;
this->pPatterns = inPatterns;
this->pRealStates = inpRealStates;
/*#ifdef DEBUG_MODE
// Pass through all states during 5s to check
for (int i = 0; i < SignalArduinoPattern::GetStatesNumber(this->pRealStates); i++)
{
this->Move(this->startingDcc + (i / 2), i % 2);
unsigned long start = millis();
while (millis() - start < 1000)
Accessories::loop();
this->LightOff();
start = millis();
while (millis() - start < 1000)
Accessories::loop();
}
#endif*/
}
void SignalArduinoPattern::Move(unsigned long inId)
{
int pospattern = 0;
int etat = (DCCID(inId) - this->startingDcc) * 2 + DCCACTIVATION(inId);
// All leds off
for (unsigned char led = 0; led < this->GetSize(); led++)
this->LightOff(led);
char symbText[16];
for (int i = 0; i < 16-1; i++)
symbText = '.';
symbText[15] = 0;
// Change affected leds in the list
for (int led = 0; led < PATTERN_NB_LEDS_MAX; led++)
{
uint8_t c = pgm_read_byte(this->pPatterns + (etat * PATTERN_NB_LEDS_MAX) + pospattern++);
if (c > 0 && c <= 100)
{
this->SetBlinking(c-1, 0);
this->LightOn(c-1);
symbText[c-1] = 'O';
}
else
if (c > 100)
{
this->SetBlinking(c-101, this->blinkDuration);
this->Blink(c-101);
symbText[c-101] = 'B';
}
}
Serial.println(symbText);
}
int SignalArduinoPattern::GetStatesNumber(const uint8_t *pStates)
{
for (int i = 0;; i++)
{
uint8_t c = pgm_read_byte(pStates + i);
if (c == PATTERN_END_LIST)
return i;
}
return 9999;
}
//-------------------------------------------------------------------
// Le feu Francais le plus complexe presente un panneau (ou cible) dit unifie de type "H".
// Il est compose d'au maximum 10 lampes (dont l'oeilleton).
// Plusieurs lampes de meme ordre sont allumees systematiquement en meme temps ce qui reduit le nombre des sorties a utiliser a 8 ( RAL et RRAL).
// Tous les autres panneaux SNCF (hormis la cible circulaire) sont des combinaisons simplifiées de ce dispositif.
// Les combinaisons proposees sont toutes de type "mode nominal" et pas de mode dégrade ou en anomalie.( Ex carre brule avec 1 seul rouge et pas d'oeilleton) mais on pourrait ajouter ce cas precis facilement si besoin
// (avec le cablage propose il ne sera pas possible de n allumer qu un des deux jaunes du RAL ou RRAL)
// Les rouges du Carre et du semaphore sont gérés de manière autonome
// le cablage de l'oeilleton est facultatif
////////////////////////////////////////////////
// Panneau unifie type H:
//
// |7|
// |6| |6|
// |5| |7|
// |4|
// |3|
// |2|
// |1|
// |0|
//
// Avec
// 0 = oeilleton blanc
// 1 = jaune (Avertissement)
// 2 = rouge ( sémaphore)
// 3 = vert ( Voie Libre)
// 4 = feu rouge superieur du Carre ou Carre Violet
// 5 = blanc (manoeuvre)
// 6 = double jaune horizontal branche montage en parallele
// 7 = double jaune vertical branche montage en parallele
//
/////////////////////////////////////////////////////////////////
// Panneau unifie type I (dite cible 2 feux)(sans oeilleton):
//
// |5|
// |5||4| ou |4|
//
// 4= violet (carreviolet)
// 5= blanc (manoeuvre)
//
// I1 = Man,CV
/////////////////////////////////////////////////////////////////
// Panneau unifie type A (dite cible 3 feux)(sans oeilleton)
// A1
// |3|
// |2|
// |1|
//
// A2
// |3|
// |2|
// | |
//
//
// 1 = jaune (Avertissement)
// 2 = rouge (semaphore)
// 3 = vert (Voie Libre)
//
// A1 = Av,VL,S
// A2 = VL,S
/////////////////////////////////////////////////////////////////
// Panneau unifie type B
// B1
// |4|
// |3|
// |2|
// |1|
// |0|
//
// 0 = oeilleton blanc
// 1 = jaune (Avertissement)
// 2 = rouge ( sémaphore)
// 3 = vert ( Voie Libre)
// 4 = feu rouge superieur du Carre
//
// B1 = Oe,Av,VL,S,C
////////////////////////////////////////////////////////////////
// Panneau de type E
// E1
// |6| |6|
// |4|
// |3|
// |2|
// |1|
// |0|
//
//
// E2
// |6| |6|
// | |
// |3|
// |2|
// |1|
// |0|
//
// 0 = oeilleton blanc
// 1 = jaune (Avertissement)
// 2 = rouge ( sémaphore)
// 3 = vert ( Voie Libre)
// 4 = feu rouge superieur du Carre
// 6 = double jaune horizontal (montage en parallele)
//
// E1 = Oe,Av,VL,S,C,RAL
// E2 = Oe,Av,VL,S,RAL
//
/////////////////////////////////////////////////////////////////////
// Panneau de type F
// F1
// |6| |6|
// |5|
// |4|
// |3|
// |2|
// |1|
// |0|
//
// 0 = oeilleton blanc
// 1 = jaune (Avertissement)
// 2 = rouge ( sémaphore)
// 3 = vert ( Voie Libre)
// 4 = feu rouge superieur du Carre
// 5 = blanc (manoeuvre)
// 6 = double jaune horizontal (montage en parallele)
//
// F1 = Oe,Av,VL,S,C,M,RAL
// ///////////////////////////////////////////////////////////////////
// Cible de type G
// G1
// |7|
// |6| |6|
// |4| |7|
// |3|
// |2|
// |1|
// |0|
//
// G2
// |7|
// |5| | |
// |4| |7|
// |3|
// |2|
// |1|
// |0|
//
// G3
// |7|
// | | | |
// |4| |7|
// |3|
// |2|
// |1|
// |0|
//
//
// 0 = oeilleton blanc
// 1 = jaune (Avertissement)
// 2 = rouge ( sémaphore)
// 3 = vert ( Voie Libre)
// 4 = feu rouge superieur du Carre
// 5 = blanc (manoeuvre)
// 6 = double jaune horizontal (montage en parallele)
// 7 = double jaune vertical (montage en parallele)
//
// G1 = Oe,Av,VL,S,C,RAL,RRAL
// G2 = Oe,Av,Vl,S,C,M,RRAL
// G3 = Oe,Av,Vl,S,C,RRAL
/////////////////////////////////////////////////////////////////
// cible de type H
//
// H1
// |7|
// |6| |6|
// |5| |7|
// |4|
// |3|
// |2|
// |1|
// |0|
//
// 0 = oeilleton blanc
// 1 = jaune (Avertissement)
// 2 = rouge ( sémaphore)
// 3 = vert ( Voie Libre)
// 4 = feu rouge superieur du Carre ou Carre Violet
// 5 = blanc (manoeuvre)
// 6 = double jaune horizontal (montage en parallele)
// 7 = double jaune vertical (montage en parallele)
//
// H1= Oe,Av,VL,S,C,Man,Ral,RRAL
// H2= Oe,Av,VL,S,Cv,Man,Ral,RRAL
//
//////////////////////////////////////////////////////////////////
// Cible de type D (Disque) ou R (Ronde)
//
// forme circulaire
// C1
// | | | |
// |3|
// |2*| |2**|
// |1|
//
// 1 = jaune (Avertissement)
// 2* = jaune (disque) (en combinaison avec 2**)
// 2** = rouge (disque) (en combinaison avec 2*)
// 3 = vert ( Voie Libre)
//
//
// C2
// | | | |
// |3|
// |2*| |2**|
// | |
//
//
// 2* = jaune (disque) (en combinaison avec 2**)
// 2** = rouge (disque) (en combinaison avec 2*)
// 3 = vert ( Voie Libre)
//
// C3
// | | | |
// |3|
// | | | |
// |1|
//
//
// 1 = jaune (Avertissement)
// 3 = vert ( Voie Libre)
//
//
// C4
// |6| |6|
// |3|
// | | | |
// |1|
//
//
// 1 = jaune (Avertissement)
// 3 = vert ( Voie Libre)
// 6 = double jaune horizontal branche montage en parallele
//
//
//
// C1 = Av,VL,Disque,RAL
// C2 = VL,Disque
// C3 = Av,VL
// C4 = Av,VL,RAL
/////////////////////////////////////////////////////////////////////////////////////////////
// La norme SCNF veut qu'il y ait quatre leds allumées au maximum, oeilleton compris.
// La liste décrit, 4 par 4, les numéros des leds allumées : positif allumé,
// supérieur à 100 clignotant, 0 inutilisé. Ce qui signifie que les numéros commencent à 1.
// Le code texte sur chaque ligne "--x-----" symbolise plus clairement les états.
// Enfin les numéros de chaque ligne sont notés de 0 à 24. Ils vont être réutilisés plus tard.
// ex 101 signifie 1ere sortie clignotante
// ex 102 signifie 2eme sortie clignotante
// etc
/////////////////////////////////////////////////////////////////////////////////////////////
// ordre de distribution
// Oe sortie 1
// Av sortie 2
// S sortie 3
// VL sortie 4
// C ou CV sortie 5
// Man sortie 6
// RAL sortie 7
// RRAL sortie 8
/////////////////////////////////////////////////////////////////////////////////////////////
const uint8_t SignalFrStates[] PROGMEM = {
// 12345678
101,102,103,104, // "BBBB----" 0:(Oe,Av,VL,S)Cli
105,106,107,108, // "----BBBB" 1:(C/Cv,Man,RAL,RRAL)Cli
0,0,0,0, // "--------" 2: ALL OFF
0, 3, 5, 0, // "--x-x---" 3: CARRE
0, 5, 0, 0, // "----x---" 4: CARRE VIOLET
1, 3, 0, 0, // "x-x-----" 5: Semaphore
1, 103, 0, 0, // "x-x-----" 6: Rouge Cli
0, 3, 0, 0, // "-----x--" 7: Man
0, 103, 0, 0, // "-----x--" 8: Man limitée
1, 8, 0, 0, // "x------x" 9: RRAL 30
1, 108, 0, 0, // "x------B" 10:RRAL 60
1, 2, 0, 0, // "xx------" 11: Avertissement
1, 7, 0, 0, // "x-----x-" 12: RAL 30
1, 102, 0, 0, // "xB------" 13: Jaune Cli
1, 107, 0, 0, // "x-----B-" 14: RAL 60
1, 104, 0, 0, // "x--B----" 15: RAL 160
1, 4, 0, 0, // "x--x----" 16: VL
1, 0, 0, 0, // "xx-----x" 17: RRAL 30 + Av
1, 0, 0, 0, // "xB-----x" 18: RRAL 30 + Jaune Cli
1, 0, 0, 0, // "xx-----B" 19: RRAL 60 + Av
1, 0, 0, 0, // "xB-----B" 20: RRAL 60 + Jaune Cli
1, 0, 0, 0, // "xB----B-" 21: RAL 60 +Jaune Cli
0, 3, 0, 0, // "--x-----" 22: Disque
0, 0, 0, 0, // "--------" 23: RESERVE
0, 0, 0, 0, // "--------" 24: RESERVE
// 12345678
PATTERN_END_LIST // end of the list !
};
// Pour chaque type de feu, il n'y a que certains états de la liste ci-dessus qui sont utilisables.
// const uint8_t SignalFr3[] PROGMEM = { 0, 1, 2, 3, 4, PATTERN_END_LIST };
// const uint8_t SignalFr5[] PROGMEM = { 0, 1, 2, 3, 4, 5, 6, PATTERN_END_LIST };
// const uint8_t SignalFr7[] PROGMEM = { 0, 1, 2, 3, 4, 5, 6, 7, 11, 12, PATTERN_END_LIST };
// const uint8_t SignalFr9[] PROGMEM = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, PATTERN_END_LIST };
const uint8_t SignalI1[] PROGMEM = { 0, 1, 2, 4, 7, 8, PATTERN_END_LIST }; // I1 = Man,CV
const uint8_t SignalA1[] PROGMEM = { 0, 1, 2, 5, 6, 11, 13, 15, 16, PATTERN_END_LIST }; // A1 = Av,VL,S
const uint8_t SignalA2[] PROGMEM = { 0, 1, 2, 5, 6, 15, 16, PATTERN_END_LIST }; // A2 = VL,S
const uint8_t SignalB1[] PROGMEM = { 0, 1, 2, 3, 5, 6, 11, 13, 15, 16, PATTERN_END_LIST }; // B1 = Oe,Av,VL,S,C
const uint8_t SignalE1[] PROGMEM = { 0, 1, 2, 3, 4, 6, 11, 13, 15, 16, 12, 14, 21, PATTERN_END_LIST }; // E1 = Oe,Av,VL,S,C,RAL
const uint8_t SignalE2[] PROGMEM = { 0, 1, 2, 5, 6, 11, 13, 15, 16, 12, 14, 21, PATTERN_END_LIST }; // E2 = Oe,Av,VL,S,RAL
const uint8_t SignalF1[] PROGMEM = { 0, 1, 2, 3, 5, 6, 7, 8, 11, 13, 14, 15, 16, 12, 14, 21, PATTERN_END_LIST }; // F1 = Oe,Av,VL,S,C,M,RAL
const uint8_t SignalG1[] PROGMEM = { 0, 1, 2, 3, 5, 6, 9, 10, 11, 12, 13, 15, 16, 12, 13, 14, 15, 16, 17,18,19,20,21, PATTERN_END_LIST }; // G1 = Oe,Av,VL,S,C,RAL,RRAL
const uint8_t SignalG2[] PROGMEM = { 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, PATTERN_END_LIST }; // G2 = Oe,Av,Vl,S,C,M,RRAL
const uint8_t SignalG3[] PROGMEM = { 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 17, 18, 19, 20, PATTERN_END_LIST }; // G3 = Oe,Av,VL,S,C,RRAL
const uint8_t SignalH1[] PROGMEM = { 0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, PATTERN_END_LIST }; // H1= Oe,Av,VL,S,C,Man,RAL,RRAL
const uint8_t SignalH2[] PROGMEM = { 0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, PATTERN_END_LIST }; // H2= Oe,Av,VL,S,Cv,Man,RAL,RRAL
const uint8_t SignalC1[] PROGMEM = { 0, 1, 2, 11, 12, 13, 14 , 15, 16, 22, PATTERN_END_LIST }; // C1 = Av,VL,Disque,RAL
const uint8_t SignalC2[] PROGMEM = { 0, 1, 2, 15, 16, 22, PATTERN_END_LIST }; // C2 = VL,Disque
const uint8_t SignalC3[] PROGMEM = { 0, 1, 2, 11, 13, 15, 16, PATTERN_END_LIST }; // C3 = Av,VL
const uint8_t SignalC4[] PROGMEM = { 0, 1, 2, 11, 12, 13, 14, 15, 16, 21, PATTERN_END_LIST }; // C4 = Av,VL,RAL
// 0:(Oe,Av,VL,S)Cli
// 1:(C/Cv,Man,RAL,RRAL)Cli
// 2: ALL OFF
// 3: CARRE
// 4: CARRE VIOLET
// 5: Semaphore
// 6: Rouge Cli
// 7: Man
// 8: Man limitée
// 9: RRAL 30
// 10: RRAL 60
// 11: Avertissement
// 12: RAL 30
// 13: Jaune Cli
// 14: RAL 60
// 15: RAL 160
// 16: VL
// 17: RRAL 30 + Av
// 18: RRAL 30 + Jaune Cli
// 19: RRAL 60 + Av
// 20: RRAL 60 + Jaune Cli
// 21: RAL 60 +Jaune Cli
// 22: Disque
// 23: RESERVE
// 24: RESERVE
// Liste des états pour un feu rond.
// const uint8_t SignalFrStatesRound[] PROGMEM = {
// 123456789012
// 3, 0, 0, 0, // "--x---------" 0: voie libre
// 103, 0, 0, 0, // "--B---------" 1: voie libre limitée à 160km/h
// 101, 0, 0, 0, // "B-----------" 2: Avertissement arrêt très proche.
// 1, 0, 0, 0, // "x-----------" 3: Avertissement arrêt.
// 10, 11, 0, 0, // "---------xx-" 4: Conduite à vue (signal rond seulement)
// 6, 7, 0, 0, // "-----xx-----" 5: Vitesse réduite à 30
// 106, 107, 0, 0, // "-----BB-----" 6: Vitesse réduite à 60
// 101, 106, 107, 0, // "B----BB-----" 7: Vitesse réduite à 60 + avertissement
// 123456789012
// PATTERN_END_LIST // end of the list !
// };
// Tous les états sont utilisables, à priori.
// const uint8_t SignalFrRound[] PROGMEM = { 0, 1, 2, 3, 4, 5, 6, 7, PATTERN_END_LIST };
// Four leds on only. First led is 1. Negative led number will blink.
// Liste des états pour un feu horizontal.
// const uint8_t SignalFrStatesHorizontal[] PROGMEM = {
// 123456789012
// 1, 0, 0, 0, // "x-----------" 0: Vitesse de manoeuvre (feu horizontal)
// 101, 0, 0, 0, // "B-----------" 1: Vitesse de manoeuvre réduite (feu horizontal)
// 2, 0, 0, 0, // "-x----------" 2: idem AbsoluteStop mais sur un signal horizontal ou deux feux.
// 123456789012
// PATTERN_END_LIST // End of the list
// };
// Tous les états sont utilisables, à priori.
// const uint8_t SignalFrHorizontal[] PROGMEM = { 0, 1, 2, PATTERN_END_LIST };
SignalArduinoPattern signal;
// Commanders
#ifdef VISUALSTUDIO
ButtonsCommanderKeyboard push;
#else
ButtonsCommanderPush push;
#endif
// Accessories
// Drivers
// #define signalPattern SignalFr9
// #define NB_LEDS 12
#define signalPattern SignalH1
#define NB_LEDS 8
// int pins[NB_LEDS] = { 3, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 };
int pins[NB_LEDS] = { 3, 4, 5, 6, 7, 8, 9, 10 };
void ReceiveEvent(unsigned long inId, COMMANDERS_EVENT_TYPE inEventType, int inEventData)
{
int id = DCCID(inId);
if (id >= DCCSTART && id < DCCSTART + (SignalArduinoPattern::GetStatesNumber(signalPattern) + 1) / 2)
signal.Move(inId);
Accessories::ReceiveEvent(inId, (ACCESSORIES_EVENT_TYPE)inEventType, inEventData);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Setup
//
void setup()
{
Serial.begin(115200);
//while (!Serial); // For Leonardo only. No effect on other Arduino.
Commanders::begin(ReceiveEvent, LED_BUILTIN);
Accessories::begin();
// Commanders setup
DccCommander.begin(0x00, 0x00, digitalPinToInterrupt(3));
// UNDEFINED_ID here means that this id is not significant.
#ifdef VISUALSTUDIO
push.begin(UNDEFINED_ID, '0');
#else
push.begin(UNDEFINED_ID, 17);
#endif
int nb_etats = SignalArduinoPattern::GetStatesNumber(signalPattern);
// Ce petit bouton va permettre de passer en revue tous les codes dcc des feux en séquence...
int dcc = DCCSTART;
bool etat = false;
for (int i = 0; i < nb_etats; i++)
{
if (!etat)
{
push.AddEvent(DCCINT(dcc, 0));
etat = true;
}
else
{
push.AddEvent(DCCINT(dcc, 1));
dcc++;
etat = false;
}
}
signal.beginSignal(NB_LEDS, pins, DCCSTART, 500, SignalFrStates, signalPattern);
}
void loop()
{
Accessories::loop();
Commanders::loop();
}