Considera che quel programma l'ho scritto tutto di seguito senza fare alcuna prova...
Inoltre ti ho detto "per quello che ho capito", perché non avevo capito esattamente come avrebbe dovuto funzionare. Soprattutto non ho capito che cosa dovrebbe accadere ogni volta che premi il pulsante: non vuoi che faccia tutto di seguito da solo?
Per quanto riguarda l'arrivo, non l'ho ancora inserito.
il treno deve rimanere nascosto in una galleria per l'effetto sorpresa, uscire dopo circa 2/3 min e quando esce sarebbe bello far partire la segnalazione led lampeggianti croce di S.Andrea, quando torna c'è un contatto reed che viene sollecitato (in galleria) e far ricominciare il ciclo.
L'ideale sarebbe, 1:partenza treno (punto reed o tasto) dopo 2/3 min con lampeggio, torna al punto di partenza e si arresta ( eccita il reed o tasto) e si spengono le luci, dopo 2/3minriparte da solo.
La croce di S.Andrea segue lo stato di accensione treno.
Perdonami, ma non capisco. Scrivi le varie fasi in sequenza, una per riga, ad esempio:
Setup:
Accendi tutto e lampeggia la croce di S. Andrea per 10 secondi, poi si spegne.
Loop:
2. Parte il treno.
3. Arriva in galleria e il reed lo ferma per 2 minuti, poi
4. Si accende la croce di s. Andrea.
5. Dopo 10 secondi si torna al punto 2.
Credo che quello che intende lui (credo, ripeto), sia che la croce debba iniziare a lampeggiare nel momeno in cui il treno parte dell'interno della galleria (tipo. per avvisare che arriva), poi il treno dopo aver fatto il suo giro (che non so se preveda delle soste in stazione o altro), una volta rientrato in galleria, chiuda un reed che gli fa fare un ciclo di attesa di 2/3 minuti fermo in galleria ...
Quello che non e' chiaro e':
il pulsante serve per far ripartire il treno prima dei 2/3 minuti, annullando il ciclo di attesa in galleria ?
oppure per far partire il treno dall'esterno della galleria quando lo disponi, inizializzando il programma ?
oppure entrambe le cose ? ( un generico "inizia ciclo" ? )
se la croce deve iniziare a lampeggiare quando il treno parte, poi per quanto tempo deve lampeggiare, per tutto il tempo in cui il treno e' in movimento (e quindi spegnersi insieme al treno quando rientra in galleria), oppure solo per "tot" secondi (e quindi spegnersi mentre il treno ancora gira, e riaccendersi solo quando riparte dall'interno della galleria) ?
(eventuali) hai altre cose sul tracciato, passaggi a livello, semafori, stazione in cui fermare il treno, eccetera, che richiedano altre azioni o altri comandi ? (perche' sarebbe meglio saperlo subito )
Ah! Vedo ora che ha scritto che la croce di s. Andrea deve lampeggiare per tutto il tempo che il treno cammina. Temo, però, che oggi non potrò lavorare sul programma.
Ecco, mi sembra che ci sia tutto. Questa è la versione finale, con tutti gli aggiornamenti di cui abbiamo discusso nei messaggi seguenti questo tranne il for() per l'avviamento progressivo.
Ho velocizzato il lampeggìo della croce di S. Andrea, poiché mi sembra di capire che tu preferisca così.
/* Descrizione:
- Parte il treno e si lampeggia la croce di S. Andrea, finché il treno entra nella galleria.
- In galleria, il treno chiude il contatto reed e il treno si ferma. Si spegne la croce di S. Andrea.
- Dopo 2 minuti, riprende a lampeggiare la croce di S. Andrea e il treno riparte.
*/
const byte REED = 8; // pin di input a cui è collegato il contatto reed verso massa.
const byte LED_A = 13; // led A della croce di S. Andrea
// N.B.: Il pin 13 lampeggia all'accensione per la presenza del bootloader.
const byte LED_B = 11; // led B della croce di S. Andrea
const byte TRENO = 10; // Treno pilotato dal pin digitale 10
// Variabili globali
byte statoReedPrec = 0; // stato precedente del contatto reed
byte marcia=0; // Stato del treno.
unsigned long t1; // millis() per i 2 minuti di attesa.
void setup()
{
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(TRENO, OUTPUT); digitalWrite (TRENO, HIGH); marcia=1; // Il treno parte.
pinMode(REED, INPUT);
pinMode(REED, INPUT_PULLUP); // Resistenza di pullup interna per mettere il pulsante verso massa.
// Il contatto reed verso massa è anche comodo perché non devi portare fuori il +V.
// Metti un condensatore da 1uF (meglio se con 100 ohm in serie) tra il pin di ingresso e
} // massa come antirimbalzo (un contatto reed fa meno rimbalzi).
void loop()
{
if(!digitalRead(REED) && statoReedPrec==1) // Nel momento in cui il treno arriva sul reed
{
statoReedPrec=0;
digitalWrite (TRENO, LOW); marcia=0; // Ferma il treno.
t1=millis(); // prende il tempo.
}
if(digitalRead(REED)) statoReedPrec=1;
if(millis()-t1>120000) // Se sono passati 2 minuti
{
digitalWrite (TRENO, HIGH); marcia=1; // Riparte il treno.
}
if(marcia) // Se il treno è in movimento, la croce di S. Andrea lampeggia.
{
if(millis()%1000<500) {digitalWrite(LED_B, LOW); digitalWrite(LED_A, HIGH);} // spegne il LED B e accende il LED A.
else {digitalWrite(LED_A, LOW); digitalWrite(LED_B, HIGH);} // spegne il LED A e accende il LED B.
}
else {digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW);}
} // END loop()
In realtà, per fare tutto questo sarebbe sufficiente un timer per le luci delle scale con uscita a scambio, che quando viene chiuso un interruttore (deve essere non retriggerabile, cioè se il pulsante rimane premuto alla fine del tempo impostato deve commutare comunque) toglie alimentazione al treno e alla croce di S. Andrea (che deve avere un proprio lampeggatore) per 2 minuti... Qui, però, lo facciamo con Arduino!
No, no!
Prendi l'ultima versione del programma. L'ho aggiornato un minuto fa.
In questo momento non posso provare con l'IDE il programma che ho scritto.
Datman: correggimi se sbaglio, ma ... statoReedPrec lo metti a zero per evitare che il reed chiuso continui ad azzerare il tempo, e qui e' corretto, ma ho l'impressione che poi quando il treno riparte ed il reed si apre, non lo riporti allo stato precedente ... per cui probabilmente il ciclo te lo fa una sola volta e poi basta ... oppure mi e' sfuggito ?
EDIT: inoltre c'e' qualcosa di strano nell'if dei led ... se il treno non e' in marcia in teoria dovrebbero essere entrambi spenti, in quel modo anche se smettono di lampeggiare, uno dei due non rimane sempre acceso ? (e poi, perche' "millis()%1000" ?)
ArTex:
ho anche pensato al timer scale, ne avevo uno in "cantina" ma gestire tutto in 220V non mi piaceva, avevo Arduino e la mia "saccenza"...
Hai ragione. Non mi sono posto il problema pensando che esistessero anche a 12V (e serve anche con lo scambio in uscita, perché deve lavorare al contrario e, come detto, deve essere non ripristinabile). In effetti, però, non ne sono sicuro...
E' perfetto, ti ringrazio molto ora posso finire e fare la vetrina.
Una delle cose per me più difficili da capire sono uso di questo comando:
if(!digitalRead(REED) && statoReedPrec==1)
ho un paio di libri che mi sono letto e riletto più letture sui vari forum, ma proprio non riesco a farli miei, è anche vero che non è il mio campo per mè è uno hobby...
Grazie mille a Voi che vi siente impegnati per me che alla fine sono un "rompibolle".
Se posso e vi fà piacere vorrei condividere questo sketch con i miei amici appassionati fermodellisti, così magari possono usarlo anche loro.
Saluti e a questo punto vi posto appena riesco a fare il video e la foto del lavoro fatto.