Ciao a tutti.
Sto realizzando una barriera cronometrica (scusate il termine) per una pista da macchine radiocomandate.
Le gare si svolgono uno per volta cronometrando i tempi su 8 giri.
Ho quindi realizzato un sistema così composto:
La barriera è realizzata con un piccolo puntatore laser che illumina una fotoresistenza.
8 led inizialmente fanno da semaforo per la partenza poi si spengono ad indicare il passaggio dei giri (questi sono comandati tramite uno shift register).
Un buzzer passivo blippa per fare inizialmente da semaforo e poi da avviso del passaggio.
Su uno schermo LCD vengono mostrati il tempo totale e il tempo per giro.
Infine un pulsante permette di riavviare il ciclo.
Il tutto pare funzionare ma sono sicuro che il programma contenga molti errori (oltre ad essere probabilmente rozzo).
Fondamentalmente non capisco perché non riesco a sincronizzare lo shift register con il suono e il trascorrere dei lap. Per farlo funzionare come volevo ho dovuto ogni volta ri-inviare l'input.
Questo è il codice che sto usando:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 7, 8, 3, 2);
int latchPin = 5; //shift register
int clockPin = 6; //shift register
int dataPin = 4; //shift register
const int Buzzer = 10;
const int Button = 9;
const int LuceMin = 600; //soglia limite luce
int StatoRicevitore = 0; //Record luce
int START = 0; //Blocco sequenza iniziale
int Lap = 0; //Contatore giri
int LapLED = 0; //LED accesi
unsigned long TimeSTART = 0; //Tempo iniziale
unsigned long TimeNOW = 0; //Tempo corrente
unsigned long TimeSHOW = 0; //Tempo da mostrare
unsigned long TimeLAP = 0; //Tempo giro
unsigned long TimeLAST = 0; //Tempo giro precedente
unsigned long TimeEND = 0; //Tempo finale
unsigned long Minuti = 0;
unsigned long Secondi = 0;
unsigned long MilliSec = 0;
unsigned long MinutiL = 0;
unsigned long SecondiL = 0;
unsigned long MilliSecL = 0;
void setup()
{
Serial.begin(9600);
lcd.begin(16, 2); // set up the LCD's number of columns and rows
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(Buzzer, OUTPUT);
pinMode(Button, INPUT);
}
void loop()
{
// START inizio gara
if (START == 0) {
START = START + 1;
lcd.display(); // Turn on the display:
lcd.clear();
lcd.setCursor(0, 0); //Display position riga colonna
lcd.print("START ");
lcd.setCursor(0, 1);
lcd.print(" By ALEK");
digitalWrite(latchPin, LOW);
for (int i = 1; i < 3; i++) { //sequenza semaforo
digitalWrite(latchPin, HIGH); //accesi tutti no red
shiftOut(dataPin, clockPin, LSBFIRST, 127);
digitalWrite(latchPin, LOW);
delay (1000);
tone (Buzzer, 600, 500);
digitalWrite(latchPin, HIGH); //spenti tutti
shiftOut(dataPin, clockPin, LSBFIRST, 0);
digitalWrite(latchPin, LOW);
delay (2000);
}
digitalWrite(latchPin, HIGH); //accesi tutti LAP 0
shiftOut(dataPin, clockPin, LSBFIRST, 255);
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH); //accesi tutti LAP 0
shiftOut(dataPin, clockPin, LSBFIRST, 255);
digitalWrite(latchPin, LOW);
lcd.setCursor(0, 0); //Display position
lcd.print("GO ");
tone (Buzzer, 700, 700);
}
// CONTEGGIO GIRI
// GIRO INIZIALE 0
StatoRicevitore = analogRead(A0);
if (StatoRicevitore < LuceMin && START == 1) {
//PRIMO PASSAGGIO AVVIO TIMER
START = START + 1;
digitalWrite(latchPin, HIGH); //accesi tutti LAP 0
shiftOut(dataPin, clockPin, LSBFIRST, 255);
digitalWrite(latchPin, LOW);
TimeSTART = millis(); //Record tempo inizio
TimeLAST = TimeSTART;
lcd.clear();
lcd.setCursor(0, 0); //Display position colonna riga
lcd.print("LAP: 0 ");
lcd.setCursor(0, 1); //Display position colonna riga
lcd.print("Time:");
tone (Buzzer, 700, 250);
delay (200);
}
if (START == 2) {
//GIRI SUCCESSIVI 1-7
do {
//CONTEGGIO TEMPO
TimeNOW = millis(); //Registrazione tempo atuale
TimeSHOW = TimeNOW - TimeSTART; //Tempo trascorso da inizio
MilliSec = TimeSHOW;
MilliSec = MilliSec % 1000;
Secondi = TimeSHOW / 1000;
Minuti = Secondi / 60;
Secondi = Secondi % 60;
Minuti = Minuti % 60;
if (Minuti < 10) {
lcd.setCursor(9, 1); //Display position colonna riga
} else {
lcd.setCursor(8, 1); //Display position colonna riga
}
lcd.print(Minuti);
lcd.setCursor(10, 1); //Display position colonna riga
lcd.print(":");
lcd.setCursor(11, 1); //Display position colonna riga
if (Secondi < 10) {
lcd.print("0");
lcd.setCursor(12, 1); //Display position colonna riga
}
lcd.print(Secondi);
lcd.setCursor(13, 1); //Display position colonna riga
lcd.print(":");
lcd.setCursor(14, 1); //Display position colonna riga
lcd.print(MilliSec);
//CONTROLLO GIRO
StatoRicevitore = analogRead(A0);
if (StatoRicevitore < LuceMin) {
Lap = Lap + 1;
switch (Lap) {
case 0: LapLED = 255;
tone (Buzzer, 700, 250);
break;
case 1: LapLED = 254;
tone (Buzzer, 700, 250);
break;
case 2: LapLED = 252;
tone (Buzzer, 700, 250);
break;
case 3: LapLED = 248;
tone (Buzzer, 700, 250);
break;
case 4: LapLED = 240;
tone (Buzzer, 700, 250);
break;
case 5: LapLED = 224;
tone (Buzzer, 700, 250);
break;
case 6: LapLED = 192;
tone (Buzzer, 700, 250);
break;
case 7: LapLED = 128;
tone (Buzzer, 700, 250);
break;
case 8: LapLED = 0;
START = START + 1;
tone (Buzzer, 700, 700);
break;
}
lcd.setCursor(5, 0); //Display position colonna riga
lcd.print(Lap);
digitalWrite(latchPin, HIGH); //lap X
shiftOut(dataPin, clockPin, LSBFIRST, LapLED);
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH); //lap X
shiftOut(dataPin, clockPin, LSBFIRST, LapLED);
digitalWrite(latchPin, LOW);
TimeLAP = TimeNOW - TimeLAST; //Tempo trascorso da inizio giro
MilliSecL = TimeLAP;
MilliSecL = MilliSecL % 1000;
SecondiL = TimeLAP / 1000;
MinutiL = SecondiL / 60;
SecondiL = SecondiL % 60;
MinutiL = MinutiL % 60;
lcd.setCursor(9, 0); //Display position colonna riga
lcd.print(MinutiL);
lcd.setCursor(10, 0); //Display position colonna riga
lcd.print(":");
lcd.setCursor(11, 0); //Display position colonna riga
if (SecondiL < 10) {
lcd.print("0");
lcd.setCursor(12, 0); //Display position colonna riga
}
lcd.print(SecondiL);
lcd.setCursor(13, 0); //Display position colonna riga
lcd.print(":");
lcd.setCursor(14, 0); //Display position colonna riga
lcd.print(MilliSecL);
TimeLAST = TimeNOW;
delay (300);
}
} while (Lap < 8);
}
//RESTART
if (digitalRead(Button)) {
Lap = 0;
START = 0;
}
}
Grazie mille per la pazienza e per l'aiuto.
Avrei poi anche una seconda domanda ma visto che è più per la parte hardware non so se è il caso di porla qui o se conviene aprire una nuova discussione.
