Ciao a tutti,
dato che sono un testone sto cercando di superare i miei limiti... Altro che scalate Alpine!
Sto cercado di modificare uno Sketch di DATAMAN, volevo realizzare un'animazione ferroviaria con 2 treni... Treno A parte dopo X min. muove il servo P.L. accende i 2 led e dopo X min spegne i led e servo. Arrivo in stazione sollecita Reed1 e parte il trenoB con "stessa animazione" arriva in stazione sollecita Reed2 e ricomincia.
Tutto questo con fantastico entusiasmo, quando vado a compilare la parte del treno B e mi si incrociano tutte le mie sicurezze in non riuscire ad andare avanti... Così come compilato sembra che nella parte B dello Sketch ci sia un nodo che non mi fà nemmeno lampeggiare i 2 led del P.L.
Se qualcuno può dirmi perchè non funziona vince il premio Gentilezza di Natale.
Grazie Marco
Treno_Prova_12_4.ino (5.4 KB)
/* Descrizione:
- Parte il treno e dopo X secondi si abbassa il PL e lampeggia la croce di S. Andrea, finché il treno arriva in stazione.
- In stazione, con il servo B scambia i deviatoio e parte il treno B 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.
*/
#include<Servo.h>
const int servoPinA = 4;
const int servoPinB = 7; // non voglio complicare lo shetck uso direttamente nel
// Loop i igradi che mi servono, da 0 a 45 gradi per i deviatoi
// da 0 a 90gradi per il passaggio a livello
Servo myservoA;
int posA=5;
Servo myservoB;
int posB=50;
int posC=95;
const byte TEST = 8; // led di test per debug
const byte REED = 2; // pin di input a cui è collegato il contatto reed verso massa.
const byte REEDB = 3;
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 = 12; // led B della croce di S. Andrea
const byte TRENO = 10; // Treno pilotato dal pin digitale 10
const byte TRENOB = 11;
byte statoReedPrec = 0; // stato precedente del contatto reed
byte marcia=1; // Stato del treno. Il treno partirà nel loop accelerando.
byte marciaPrec=0; // Stato precedente del treno.
byte statoReedPrecB = 0; // stato precedente del contatto reed
byte marciaPrecB=0;
unsigned long t1; // annota millis() per i 2 minuti di attesa TRENOA
unsigned long t2; // annota millis() per l'accelerazione e la frenatura del treno.
unsigned long t3;
unsigned long t1B;// annota millis() per i 2 minuti di attesa TRENOB
unsigned long t2B;// annota millis() per l'accelerazione e la frenatura del treno.
unsigned long t4;
byte vel=5; // Velocità del treno durante l'avviamento e la frenatura.
byte velB=5;
void setup()
{
myservoA.attach(4);
myservoB.attach(7);
myservoA.write(posA);
myservoB.write(posB);
pinMode(TEST, OUTPUT);
pinMode(LED_A, OUTPUT);
pinMode(LED_B, OUTPUT);
pinMode(TRENO, OUTPUT);
pinMode(TRENOB, OUTPUT);
pinMode(REEDB, INPUT);
pinMode(REEDB, INPUT_PULLUP);
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).
delay(12); // Per evitare che millis() sia minore di 11.
}
void loop()
{
if(marcia==1) // Se marcia=1 accelera fino a 255.
{
if(marciaPrec==0) {t2=millis()-11; marciaPrec=1;}
if(vel<=245 && millis()-t2>10)
{vel+=10; analogWrite(TRENO,vel); t2=millis();}
if(millis()-t3>10000) { myservoA.write(posC);}
//passaggio a livello si chiude
}
else // Se marcia=0 rallenta fino a 5 e ferma il treno.
{
if(marciaPrec==1) {t2=millis(); marciaPrec=0; }
if(vel>=15 && millis()-t2>10)
{vel-=10; t2=millis(); if(vel>5) analogWrite(TRENO,vel); else analogWrite(TRENO,0);}
}
// ----- Croce di S. Andrea -----
if(vel>5) //myservoA Passaggio a livello chiuso dopo il tempo millis
if(millis()-t3>10000)// Se il treno cammina, lampeggiano alternativamente a 1Hz.
{
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.
}
if(millis()-t3>20000) {digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW);myservoA.write(posA);} // Se il treno è fermo, spegne entrambe.
delay(15);
// ------------------------------------------------------------//myservoA Passaggio a livello aperto
if(!digitalRead(REED) && statoReedPrec==1) // Nel momento in cui il treno arriva sul reed
{
statoReedPrec=0;
marcia=0; // Ferma il treno.
}
if(digitalRead(REED)) statoReedPrec=1;
//BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
if(marcia==0) // Se marcia=0 TRENO B accelera fino a 255.
{
if(marciaPrecB==0) {t2B=millis()-11; marciaPrecB=1;}
if(velB<=245 && millis()-t2B>10)
{velB+=10; analogWrite(TRENOB,velB); t2B=millis();}
}
else // Se marcia=0 rallenta fino a 5 e ferma il treno.
{
if(marciaPrecB==1) {t2B=millis(); marciaPrecB=0;}
if(velB>=15 && millis()-t2B>10)
{velB-=10; t2B=millis(); if(velB>5) analogWrite(TRENOB,velB);
else analogWrite(TRENOB,0);}
}
// ----- Croce di S. Andrea -----
if(velB>5){
if(millis()-t4>20000) //Non riesco a mettere un timer per questo evento???
// Se il treno cammina, lampeggiano alternativamente a 1Hz.
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.
}
if(millis()-t3>30000) {digitalWrite(LED_A, LOW); digitalWrite(LED_B, LOW);} // Se il treno è fermo, spegne entrambe.
// ------------------------------
if(!digitalRead(REEDB) && statoReedPrecB==1)
{
statoReedPrecB=0;
delay(50);
marcia=1;
}
if(digitalRead(REEDB)) statoReedPrecB=1;
} // END loop()
