Ciao, quello che ti serve si chiama debounce, solitamente si usa per letture sui pulsanti per ovviare appunto a letture false o ripetute per via dei transitori dei contatti. Puoi dare un occhiata qui http://playground.arduino.cc//Code/Bounce
La libreria si applica a pulsanti digitali quindi il link l'ho messo solo per capire il funzionamento, dovrai replicare quello che avviene nella libreria per poterlo adattare alle tue esegenze di lettura analogica, sostanzialmente si tratta di effettuare un ciclo con dei ritardi nelle letture e delle operazioni matematiche che ritarrai più opportune (media, valore di picco, ecc.)
fabpolli: lui usa un'ingresso analogico, dubito che una routine di debounce possa avere senso per un'analogread
gius: non sono sicuro di come si possa fare, ma fondamentalmente quello che ti serve e' una campionatura con controllo del valore massimo ... tipo, leggi in sequenza parecchi valori rapidamente, la prima lettura la salvi in una variabile, e ad ogni lettura successiva confronti il nuovo valore con i precedenti, se e' inferiore lo ignori, se e' superiore lo salvi al posto del precedente ... alla fine dovresti avere nella variabile solo il valore piu alto che hai letto ... (softwaristi, correggetemi se sbaglio :P)
quindi posso tralsciare la libreria Bounce?
Grazie Etemenanki per la risposta,
mi poptreste indicare uno sketch da cui estrarre il codice o modificarlo?
fabpolli:
La libreria si applica a pulsanti digitali quindi il link l'ho messo solo per capire il funzionamento, dovrai replicare quello che avviene nella libreria per poterlo adattare alle tue esegenze di lettura analogica, ...
Pensavo fosse meglio che si leggesse il codice della bounce e capendone il funzionamento lo adattasse ai suoi scopi... mea culpa
#define piezoPin A0
const unsigned int nRead = 5; //numero di letture da campionare
const unsigned int delRead = 1; //millisecondi di "distanza" tra le misurazioni
unsigned int value = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
value = readVal(piezoPin);
Serial.println(value);
delay(1);
}
unsigned int readVal(unsigned int sensorPin){
unsigned int maxVal = 0;
for(unsigned int x=0; x<=nRead; x++){
unsigned int tempVal = analogRead(sensorPin);
if(tempVal > maxVal){
maxVal == tempVal;
}
delay(delRead);
}
return maxVal;
}
Aspetta che ricontrollo il codice
EDIT: Strano, il codice sembra corretto..
Prova questo e dimmi se va (ho cambiato alcuni tipi di variabili..)
const int piezoPin = A0;
const int nRead = 5; //numero di letture da campionare
const int delRead = 1; //millisecondi di "distanza" tra le misurazioni
int value = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
value = readVal(piezoPin);
Serial.println(value);
delay(1);
}
int readVal(int sensorPin){
int maxVal = 0;
for(int x=0; x<=nRead; x++){
int tempVal = analogRead(sensorPin);
if(tempVal > maxVal){
maxVal == tempVal;
}
delay(delRead);
}
return maxVal;
}
La variabile maxVal o la definisci come globale oppure la devi definire come static ("static unsigned int maxVal = 0;") all'interno della funzione altrimenti ogni volta che esci dalla stessa viene distrutta e ricreata a 0 ogni volta che entri nella funzione.
Ma in quel caso non importa che quella variabile si azzeri quando si esce dalla funzione, perchè tanto la riporto manualmente a 0 all'inizio della stessa..
gius:
...
il sensore è collegato nel seguente modo:
...
Scusa, i due pin a cui sono connessi il filo di massa e la resistenza da 1M sono entrambi masse ? ... perche' se e' cosi, non dovrebbe funzionare un gran che, la resistenza da 1M andrebbe al +5V
Poi un'altra cosa, suggerirei di mettere un diodo 1N4148 fra il pin di ingresso e la massa (catodo al pin di ingresso ed anodo a massa), cosi taglia la parte negativa del segnale e non rischia di danneggiare il micro ( lo so che le correnti sono basse, ma un piezo genera alternata, in fondo, quindi e' sempre meglio non rischiare )
maxVal == tempVal; // errore, usare = per assegnare
}
deve essere:
if(tempVal > maxVal){
maxVal = tempVal;
}
Che dire..quando le cose si fanno di fretta
#define piezoPin A0
const unsigned int nRead = 5; //numero di letture da campionare
const unsigned int delRead = 1; //millisecondi di "distanza" tra le misurazioni
unsigned int value = 0;
void setup(){
Serial.begin(9600);
}
void loop(){
value = readVal(piezoPin);
Serial.println(value);
delay(1);
}
unsigned int readVal(unsigned int sensorPin){
unsigned int maxVal = 0;
for(unsigned int x=0; x<=nRead; x++){
unsigned int tempVal = analogRead(sensorPin);
if(tempVal > maxVal){
maxVal = tempVal;
}
delay(delRead);
}
return maxVal;
}