// Rispetto alla versione 8 è stato aggiunto un partitore resistivo per leggere // la tensione di batteria quando si preme il tasto reset. // E' cambiata la logica sullo stato dei piedini // di imput // QUINDI LA CONDIZIONE NORMALE E' UNO e diventa ZERO quando passa l'ombra. // Il tubo originale si è rotto e nel nuovo è cambiata anche la distanza tra i fotodiodi // che adesso si trovano a 523 millimetri l'uno dall'altro. // // Invece che due pin analogici leggo i pin digitali 3 e 12 comandati da un trigger esterno // controllando solo se stanno ad uno o a zero // quando passa un'ombra e NON FACENDO ALTRO se non il controllo del pin 2 per il reset // Il display DFRobot porta in uscita solo i pin D0,D1,D2,D3,D11,D12 // e gli analogici A1,A2,A3,A4.A5 usa A0 per leggere quale pulsante // è stato premuto /*-----( Importa le librerie necessarie)-----*/ #include "LiquidCrystal.h" /*-----( Dichiarazioni Variabili )-----*/ int Diodo_Uno = 0; int Diodo_Due = 0; int pin2 = 1; int pin3 = 1; int pin12 = 1; int pinA1 = 0; float Volt; int Lux_Norm_1 = 0; int Lux_Norm_2 = 0; int Lux_1 = 0; int Lux_2 = 0; unsigned long Tempo = 0; unsigned long Tempo_Start = 0; unsigned long Tempo_Stop = 0; unsigned long Tempo_Loop_1 = 0; unsigned long Tempo_Loop_2 = 0; unsigned long Start_Loop_1 = 0; unsigned long Start_Loop_2 = 0; unsigned long Stop_Loop_1 = 0; unsigned long Stop_Loop_2 = 0; float Metri_Secondo = 0; float Km_Ora = 0; float Errore =0; LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Sono i piedini usati dal display LCD void setup() /*----( SETUP: Viene letto solo alla partenza )----*/ { lcd.begin(16, 2); // Fa partire l'oggetto lcd // pinMode(A1, INPUT); // Pin analogici a cui sono connessi i fotodiodi // pinMode(A2, INPUT); // nella versione senza trigger pinMode(2, INPUT); // Pin a cui è connesso il pulsante di reset pinMode(3, INPUT); // è connesso al primo fotodiodo triggherato // pinMode(0, INPUT); // pinMode(1, INPUT); // pinMode(11, INPUT); pinMode(12, INPUT); // è connesso al secondo fotodiodo triggherato pinMode(A1,INPUT); // ci leggo la tensione di batteria //Serial.begin(9600); // Inizializzo la porta seriale lcd.clear(); lcd.setCursor(0, 0); lcd.print("CRONOGRAFO V.8.1 "); //Scrivo versione ed autore lcd.setCursor(0, 1); lcd.print("di Pino Grasso"); delay(2000); lcd.clear(); // ripulisco lo schermo e ci scrivo lcd.setCursor(0, 0); // i campi fissi normali sul display lcd.print("m/s= "); lcd.setCursor(0, 1); lcd.print("Errore % = "); }/*--(Fine setup )---*/ void loop() /*----( LOOP: Gira costantemente)----*/ { Diodo_Uno = 0; // Azzero gli indicatori di evento Diodo_Due = 0; do { //Start_Loop_1 = micros(); // mi segno quando comincia il giro pin2 = digitalRead(2); // leggo lo stato del piedino due if (pin2 == 0) { // se è stato pigiato azzero e mostro la tensione di batteria azzera(); } pin3 = digitalRead(3); // Leggo il piedino tre // pin11 = digitalRead(11); // pin12 = digitalRead(12); // Serial.print ("Stato dei piedini 3 11 e 12 "); // Serial.print (pin3);Serial.print (" "); Serial.print (pin11);Serial.print (" ");Serial.print (pin12);Serial.println(" "); } while (pin3 == 1); // continua a girare fino a quando il pin 3 sta alto //Tempo=micros() - Start_Loop_1; //Serial.print(" Tempo del primo loop = "); //Serial.println(Tempo); // stampo a schermo quanto tempo è passato per completare un giro Tempo_Start = micros(); // dato che è uscito dal loop mi segno il tempo dell'evento ed alzo il flag del diodo uno Diodo_Uno = 1; do { // passo ad osservare il secondo fotodiodo pin12 = digitalRead(12); // leggo lo stato del secondo fotodiodo // Serial.print(" Sto nel secondo fotodiodo, tempo trascorso = "); // Serial.println((micros() - Tempo_Start )); //Serial.print(" Il secondo fotodiodo sta a = "); // Serial.println(pin12); if ((micros() - Tempo_Start ) > 1000000) // Controllo il tempo che passa aspettando un segnale { // Serial.println ("Esco dal loop per timeout "); break; // se è passato troppo tempo dal primo evento esco dal ciclo while } // perché è una falsa partenza } while (pin12 == 1); // altrimenti continua il giro fino a quando succede qualcosa anche al diodo due Tempo_Stop = micros(); // è uscito dal loop perchè ha sentito qualcosa o perché è passato troppo tempo e mi segno il tempo Tempo = (Tempo_Stop - Tempo_Start); // mi calcolo l'intervallo tra i due eventi if (Tempo < 1000000 && Tempo > 100) // Se il tempo è maggiore di 100 microsecondi e minore di un secondo { Diodo_Due = 1; // alzo il flag del diodo due perché qualcosa è passato davvero } else { Diodo_Due = 0; // altrimenti lo abbasso per un falso allarme } //scrivi_sullo_schermo(); // quando serve in fase di test if ((Diodo_Uno == 1) && (Diodo_Due == 1)) // se entrambi i diodi hanno sentito un evento faccio i conti { Metri_Secondo = ((0.523 * 1000000) / Tempo); // 0.523 metri è la distanza fisica tra i diodi // se il proiettile, nei microsecondi indicati da Tempo, // ha percorso mezzo metro, quanti metri percorrerà in un milione di microsecondi ? // Tempo sta a 0.523 come 1000000 sta ad x quindi x=0.523*1000000/Tempo Errore = (1200/Tempo); //Errore tiene conto dei 12 microsecondi che il sistema impiega per leggere il fotodiodo // più è bassa la velocità (quindi tempo più alto) più è piccolo l'errore e viceversa scrivi_sul_display(); // scrivo sul display i valori calcolati //scrivi_sullo_schermo(); // quando serve in fase di test } } // Chiude il LOOP principale /*-----( Dichiarazioni di funzioni)-----*/ void azzera() { lcd.clear(); // Pulisco lo schermo lcd.setCursor(0, 0); // Posiziono il cursore all'inizio della prima riga lcd.print(" VOLT BATTERIA "); // Scrivo sul display pinA1 = analogRead(A1); // Leggo il piedino analogico 1 Volt = 3*pinA1; // a cui ho applicato la tensione di batteria diviso tre (tre resistenze uguali in serie) Volt=Volt*5/1023; // calcolo i volt corrispondenti lcd.setCursor(0, 1); // posiziono il cursore all'inizio della seconda riga lcd.setCursor(6, 1); // Posiziono il cursore alla sesta posizione della seconda riga lcd.print(Volt); // Scrivo sul display il valore della tensione misurata delay(1000); // Aspetto un secondo per dare modo di leggere quei valori lcd.clear(); // poi ripulisco lo schermo e ci scrivo lcd.setCursor(0, 0); // i campi fissi normali sul display lcd.print("m/s= "); lcd.setCursor(0, 1); lcd.print("Errore % = "); Metri_Secondo = 0; Km_Ora = 0; // Azzero tutte le variabili Tempo_Start = 0; Tempo_Stop = 0; Tempo = 0; Diodo_Uno = 0; Diodo_Due = 0; } // FUNZIONE CHE SCRIVE SUL DIPLAY void scrivi_sul_display() { //Serial.println(micros() - Start_Loop_1); lcd.setCursor(0, 0); // Scrivo i campi fissi sul display lcd.print("m/s= "); lcd.setCursor(0, 1); lcd.print("Errore % = "); lcd.setCursor(6, 0); // Cursore alla posizione 6 della prima riga lcd.print(Metri_Secondo); // Scrive la velocità rilevata in m/s lcd.setCursor(12, 1); // Cursore alla posizione 12 della seconda riga lcd.print(Errore); // Scrive l'errore relativo a quella velocità } // FUNZIONE CHE SCRIVE SULLA LINEA VERSO IL PC I DATI CHE CI INTERESSANO /* void scrivi_sullo_schermo() { // pin0 = digitalRead(0); // Serial.print(" Pin 0:"); //Serial.print(pin0); //pin1 = digitalRead(1); //Serial.print(" Pin 1:"); //Serial.print(pin1); //pin2 = digitalRead(2); //Serial.print(" Pin 2:"); //Serial.print(pin2); pin3 = digitalRead(3); Serial.print(" Pin 3:"); Serial.print(pin3); //pin11 = digitalRead(11); //Serial.print(" Pin 11:"); //Serial.print(pin11); pin12 = digitalRead(12); Serial.print(" Pin 12:"); Serial.print(pin12); Serial.print(" Tempo Start:"); Serial.print(Tempo_Start); Serial.print(" Tempo Stop:"); Serial.print(Tempo_Stop); Serial.print(" Tempo:"); Serial.print(Tempo); Serial.print(" "); Serial.print(" Metri/s: "); Serial.print(Metri_Secondo); Serial.print(" "); Serial.print(" Errore % "); Serial.print(Errore); Serial.println(" "); } */