Ciao a tutti! Mi chiamo Davide, e sono relativamente nuovo sia del mondo dell'elettronica ma sopratutto di Arduino. Ci sto smanettando da un mesetto grazie ad uno starter kit, ho fatto un po' di prove, ho acquistato anche altri sensori, e adesso mi trovo alle prese con il primo problemone...
Antefatto: devo misurare il tempo di pendolamento di una grossa attrezzatura; per darvi l'idea si tratta di tempi nell'ordine di 1,5-2,5 secondi circa. Si tratta di prove omologative per le macchine agricole, e attualmente utilizziamo un vecchissimo PC con porta seriale collegata ad un sensore magnetico, e con un programma in C che richiamiamo da MS-Dos.
Abbiamo deciso di aggiornare "l'hardware" e ho provato a costruire una piccola cosina in Arduino, che sorprendentemente funziona. Ho utilizzato anche qua un banale sensore Hall lineare, collegato al pin 2 e che lavoro in Interrupt. L'idea dell'interrupt l'ho trovata su questo forum se non sbaglio, relativamente al calcolo degli RPM.
Il codice è il seguente, e gestisce bene il tutto, nel senso che il sensore funziona, sull'LCD e sul monitor seriale vedo i valori di tempo che ad occhio sono corretti (verrà poi verificato questo), e anche il "contatore" che ho fatto con un if...else funziona, nel senso che mi conta il numero di "pendolate" e arrivati alla fine mi ferma il tutto dando un "Prova terminata" (Count è pari a 21 perchè devo fare 10 pendolate complete, quindi 20 mezze pendolate, e la prima è per "azzerare" il tempo, altrimenti ho visto che il primo dato dipende anche da quanto ho acceso la scheda).
#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 10, 6, 5, 4, 3);
int Tempo_Attuale; //variabile che conterra il tempo attuale misurato dalla funzione millis()
int Tempo_Precedente; //variabile che conterra la copia del tempo attuale per poter valutare il
//tempo trascorso tra due eventi consecutivi
int Tempo_Evento; //variabile che conterra il risultato del calcolo del tempo trascorso tra due
//eventi in presenza di segnale HALL
int Count = 21; //definizione numero pendolate
//*********************************************************************************************************
void setup(){
lcd.begin(16,2);
lcd.print((Count-1)/2);
lcd.setCursor(3, 0);
lcd.print(" pendolamenti");
attachInterrupt(0,Evento,RISING); //funzione che serve a "interrompere" il programma alla presenza di
//un segnale sul pin interrupt 0 (pin 2 dei pin digitali) se trova un
//segnale RISING ovvero da 0V sale a 5V
//Evento è la funzione dove andrà in caso di interrupt
Serial.begin(9600); //abilita il comando trasmissione seriale a 9600 bps
}
//*********************************************************************************************************
void loop() { //loop infinito
Tempo_Attuale = millis(); //assegna alla variabile il tempo in mS dall'accensione di Arduino
}
//**********************************************************************************************************
void Evento(){ //la nostra funzione eseguita ogni qual volta si incontra un segnale del sensore HALL.
if(Count>0){
Count--; //ciclo if per il contatore, se è superiore a 0 va avanti con il calcolo evento, altrimenti "stampa" prova terminata
Tempo_Evento = Tempo_Attuale - Tempo_Precedente;
Serial.println(Tempo_Evento); //invia alla seriale il contenuto della variabile
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(Tempo_Evento);
Tempo_Precedente = Tempo_Attuale; //uguaglia il tempo precedente a quello misurato attualmente,
//serve a permettere la misurazione del tempo trascorso tra due
//eventi successivi
}
else {
lcd.clear();
lcd.print("Prova terminata");
}
//il dato trasmesso alla variabile è il tempo trascorso tra due eventi segnale HALL, ovvero, se abbiamo un unico
//dente sulla ruota fonica da misurare, significa che ogni giro impiega quel tempo in mS quindi basterà poi
//calcolare (sul nostro programma PC) i giri/min o RPM così: RPM = (1000 / Tempo_Attuale) * 60 ).
} //fine funzione
Sicuramente non sarà elegante, e ho "scopiazzato" anche molta parte del codice. Adesso però mi sovviene un problema. Io mi ritrovo alla fine con sul monitor seriale una fila di 20 valori (21 compreso il primo che è "nullo"), che ho visto anche sull'LCD in sequenza.
Ora, purtroppo manualmente, devo sommarli e fare la media. Come posso automatizzare questa funzione direttamente su Arduino e visualizzarla sull'LCD, rendendo quindi magari indipendente il tutto dal PC?
Grazie in anticipo a chi mi vorrà rispondere!