// Esempio 10: conta quante volte il pulsante viene premuto, per un ciclo di 4 pressioni,
// ad ogni pressione del pulsante si accende un led per volta
// alla quinta pressione i led lampeggia per 5 volte in sequenza dal 4' al 1' led e poi si riavvia il ciclo.
// Il controllo del numero di volte in cui il pulsante viene premuto viene fatto con l'istruzione "case"
//Questo sketch l'ho modificato ed è l'ultimo che ho fatto, con l'aiuto della pagina di Maffucci,
//Vorrei sistemare un pochino lo sketch, togliere l'ultima parte anche se mi può tornare utile pensandoci...
//Sicuramente voglio mettere una rampa in accelerazione e una din decelerazione almeno ci provo. Marco.
#define BUTTON 4 // pin di input a cui è collegato il pulsante che diventereà il Reed Magnetico
#define DIREZIONE_M 11 // LED collegato al pin digitale 11
#define DIREZIONE_V 10 // LED collegato al pin digitale 10
//#define LED3 12 // LED collegato al pin digitale 12 ****questi led erano inseriti per controllo***
//#define LED4 13 // LED collegato al pin digitale 13 ****Magari li attivo per semaforo stazione****
// Variabili
int ContatorePulsantePremuto = 0; // conta il numero di volte che il pulsante è premuto buttonPushCounter
int StatoPulsante = 0; // stato corrente del pulsante
int StatoPulsantePrecedente = 0; // stato precedente del pulsante
void setup() {
pinMode(BUTTON, INPUT_PULLUP); // imposta il pin digitale come input
pinMode(DIREZIONE_M, OUTPUT); // imposta il pin digitale come output
pinMode(DIREZIONE_V, OUTPUT); // imposta il pin digitale come output
//pinMode(LED3, OUTPUT); // imposta il pin digitale come output
//pinMode(LED4, OUTPUT); // imposta il pin digitale come output
Serial.begin(9600); // apre la porta seriale e la inizzializza a 9600 bps
Serial.println("SKETCH Nome: Disperazione");
}
uint32_t durataAttesa;
uint32_t inizioAttesa;
uint8_t statoSuccessivo;
uint8_t statoAttuale = 0;
// Funzione che imposta il tempo di attesa
// cosi evito di replicare le stesse istruzioni per ciascun step
void myDelay(uint32_t tempo, uint8_t stato) {
durataAttesa = tempo;
statoSuccessivo = stato;
inizioAttesa = millis();
statoAttuale = 0; // Stato di attesa
}
void loop() {
// E' possibile selezionare la sequenza successiva solo se statoAttuale == 0 (ovvero è finita)
if (digitalRead(BUTTON) == LOW && statoAttuale == 0) {
ContatorePulsantePremuto++;
// controlla se il Reed è stato premuto 4 torna a case 2
if (ContatorePulsantePremuto > 3) {
ContatorePulsantePremuto = 2;
}
statoAttuale = ContatorePulsantePremuto;
delay(100);
}
// Lo switch/case va eseguito continuamente altrimenti è impossibile valutare se è trascorso il tempo imposatao
switch (statoAttuale) {
case 0:
// Aspetta che siano trascorsi "dutaAttesa" millisecondi prima di cambiare sotto-stato
if (millis() - inizioAttesa > durataAttesa) {
statoAttuale = statoSuccessivo;
}
break;
case 1:
Serial.println(statoAttuale, DEC); // stampa il numero di volte che il pulsante è stato premuto
Serial.println("Il Treno si avvia verso la S.Monte");
analogWrite(DIREZIONE_M, 10); //Partenza gioco del treno, direzione verso la S. Monte
Serial.println("Modulazione analogwrite su PIN 11");
Serial.println("Manetta al 10%");
myDelay(5000, 11);
break;
case 11:
Serial.println("Manetta al 20%");
analogWrite(DIREZIONE_M, 20); //Pin 11
myDelay(5000, 12);
break;
case 12:
Serial.println("Manetta al 40%");
analogWrite(DIREZIONE_M, 40);
myDelay(5000, 13);
break;
case 13:
Serial.println("Manetta al 75%");
analogWrite(DIREZIONE_M, 75);
myDelay(5000, 14);
break;
case 14:
Serial.println("Manetta al 100%");
analogWrite(DIREZIONE_M, 100);
myDelay(0, 0); // Altrimenti rimane in loop tornando nel case corrente
break;
case 2: // controlla se il Reed è stato premuto due volte
Serial.println("2");
Serial.print("Arrivo alla S.Monte Treno Locale proveniente da S.Valle "); // stampa sulla console "numero di volte tasto premuto:"
Serial.println(ContatorePulsantePremuto, DEC); // stampa il numero di volte che il pulsante è stato premuto
digitalWrite(DIREZIONE_M, LOW);// spegne il LED11
delay(10000);
Serial.println("Si ferma alla S.Monte");//sosta stazione
Serial.println("si disattiva il Reed");
delay(12000);
Serial.println("Parte il Treno verso S.Valle");
analogWrite(DIREZIONE_V, 10); //riparte verso la S. Monte
Serial.println("Modulazione analogwrite su PIN 10");
Serial.println("Manetta al 10%");
delay(5000);
analogWrite(DIREZIONE_V, 20);
Serial.println("Manetta al 20%");
delay(5000);
analogWrite(DIREZIONE_V, 40);
Serial.println("Manetta al 40%");
delay(5000);
analogWrite(DIREZIONE_V, 75);
Serial.println("Manetta al 75%");
delay(5000);
Serial.println("Manetta al 100%");
analogWrite(DIREZIONE_V, 100); //Velocità al 100% Verificare se pin analogico!!!!!!
Serial.println("Fine Pausa reed di 32000 millisecondi");// stampa sulla console "off"
myDelay(0, 0); // Altrimenti rimane in loop tornando nel case corrente
break;
case 3: // controlla se il Reed è stato premuto tre volte
Serial.println("3"); // stampa sulla console "on"
Serial.print("Arrivo alla S.Valle Treno Locale proveniente da S.Monte "); // stampa sulla console "numero di volte tasto premuto:"
Serial.println(ContatorePulsantePremuto, DEC); // stampa il numero di volte che il pulsante è stato premuto
Serial.println("Si ferma il Treno a S. Valle");
digitalWrite(DIREZIONE_V, LOW);
delay(10000); //sosta stazione
Serial.println("si disattiva il Reed");
Serial.println("Parte il Treno verso S.Monte");
delay(12000);
analogWrite(DIREZIONE_M, 10); //riparte verso la S. Monte
Serial.println("Manetta al 10%");
delay(5000);
analogWrite(DIREZIONE_M, 20);
Serial.println("Manetta al 20%");
delay(5000);
analogWrite(DIREZIONE_M, 40);
Serial.println("Manetta al 40%");
delay(5000);
analogWrite(DIREZIONE_M, 75);
Serial.println("Manetta al 75%");
delay(5000);
analogWrite(DIREZIONE_M, 100); //Velocità al 100% Verificare se pin analogico!!!!!!
Serial.println("Manetta al 100%");
Serial.println("Fine Pausa reed di 32000 millisecondi");
myDelay(0, 0); // Altrimenti rimane in loop tornando nel case corrente
break;
// Questo stato non è necessario.
// case 4: // controlla se il Reed è stato premuto 4 torna a case 2
// if (statoAttuale > 3) {
// statoAttuale = SEQUENZA2;
// }
// break;
}
}