Cronometro start stop - Problema

Salve a tutti,
sono un neofita del mondo del mondo arduino, quindi ringrazio anticipatamente chi vorrà aiutarmi e al contempo scusare le eventuali "bestialità" che scriverò o presenterò.

Veniamo al dunque.
Ho realizzato il seguente circuito start-stop con i componenti forniti con arduino starter kit, come nell'immagine a questo link.

Alla pressione del pulsante il cronometro si avvia. L'arresto avviene quando il segnale del piezo supera un certo di livello di soglia. Di seguito il codice che ho scritto.

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin
const int piezoPin = A1;     // the number of the Analog pin 
// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status
int press1 = 0;
int press2 = 0;
int elapsed = 0;
int piezoState = 0;
void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);      
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);  
  pinMode(piezoPin, INPUT);
  // attiva porta seriale
  Serial.begin(9600);
}

void loop(){
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  piezoState = analogRead(piezoPin);
//  Serial.print(piezoState);  //check piezo out
//  Serial.println("");
//  delay(200);
  // check if the pushbutton is pressed.
  // if not, the buttonState is LOW and the LED is off:
 if (buttonState == LOW){
    digitalWrite(ledPin, LOW);
 }
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH and the LED is on:
  if (buttonState == HIGH && press1 == 0) {        
    digitalWrite(ledPin, HIGH); 
    // start chronometer
    press1 = millis(); 
    press2= 0; 
    Serial.print("Start!");
    delay(200);
  }
  
  buttonState = digitalRead(buttonPin);
  
  if (piezoState > 15 && press2 == 0) {
    //turn LED on 
    digitalWrite(ledPin, HIGH);
    press2 = millis();
    elapsed = press2 - press1;
    Serial.print("Stop!");
    Serial.print(elapsed);
    Serial.print("ms");
    Serial.println("");
  //  delay(200);  
    press1 = 0;
  }
  
  // if (buttonState == HIGH && press1 != 0) {
    // turn LED on
  //  digitalWrite(ledPin, HIGH);q
  //  // stop chronometr
  //   press2 = millis();
  //   elapsed = press2 - press1;
  //   Serial.print("Stop!");
  //   Serial.print(elapsed);
  //   Serial.println("");
  //  delay(200);  
  //   press1 = 0;
 // }
}

In generale fa quello che desidero. Tuttavia, alcune volte si presenta un problema con il segnale dal piezo.
Mi spiego. Di norma, quando tutto funziona e non ci sono vibrazioni, il segnale in ingresso dal piezo è ovviamente nullo (lo monitoro con una parte di codice che sopra è commentata).
Dopo l'urto il livello sale "istantaneamente" per poi rilassare (come per la scarica di un condensatore, anche se non ho controllato se la caduta sia effettivamente esponenziale) diciamo che da un livello di circa 100 scende a 0 in una decina di secondi.

Questo quando tutto funziona. Al contrario alle volte, o dopo urti più intensi, o anche "a caso" (ragioni che non riesco a determinare) non c'è modo di farlo scendere di nuovo a 0. Allora agisco come segue: - stacco e cortocircuito i piedini del piezo(per scaricare eventuale carica accumulata!??!) per un po' di tempo, inoltre connetto a terra anche il cavo che esce dall'ingresso analogico per scaricare eventuale carica accumulata anche sui fili. Talvolta tutto ciò non basta dopo aver riconnesso tutto il segnale è ancora alto. La cosa ancor più strana, che proprio non mi spiego e che mi fa perdere ogni speranza di spiegare la cosa in termini di scarica di un condensatore, è che il segnale sale nel tempo!
Infatti, se col circuito del piezo montato connetto direttamente a terra il pin di ingresso analogico a terra il monitor seriale scrive 0 quando poi stacco la connessione a terra il segnale non mostra subito il livello precedente bensì inizia gradatamente a salire da 0 verso il valore letto precedentemente! (come se adesso si stesse compiendo una carica (!?!?) :cold_sweat:

Dopo svariati imprechi stacca e riattacca tutto etc. come d'incanto tutto torna a funzionare... fino alla prossima volta!

Commenti, suggerimenti, aiuti?
Grazie mille per il vostro tempo.

Ad occhio credo che manchi una resistenza di "polarizzazione" ...

Prova come l'immagine allegata.

Piezo_input_circuit.png

Una cialdina piezo e', elettricamente, equivalente ad un condensatore, quindi se non lo scarichi tu con una resistenza in parallelo (come ha gia postato Brado, da 220K ad 1M vanno bene) potrebbe caricarsi e non funzionare piu correttamente.

Altra cosa da tenere in mente e' che un piezo genera picchi in entrambe le polarita' quando viene urtato, e se lo colleghi direttamente rischi di strinare un'ingresso ... il sistema migliore sarebbe come nello schema in allegato, il diodo impedisce ai picchi negativi di arivare al pin, lo zener taglia tutto quello che e' sopra i 5V e che potrebbe bruciare il pin anche quello (i piezo possono facilmente generare impulsi di parecchie decine di volt :P) ... cambia i valori, la resistenza da 1K mettila da 100 ohm, quella da 47K mettila da 470K, il condensatore puoi toglierlo o metterlo da 10nF ...

ingresso-neg.png

Grazie molte ad entrambi per i suggerimenti e le spiegazioni...non aver chiuso il circuito per la scarica è veramente da polli(!) .. (perdonatemi!)

Riguardo al circuito di sicurezza per i pin: nello starter kit non ho ne' la resistenza da 100 ne' quella da 470K, posso farmene una da 110 (con quelle da 220) e una da 500K (con quelle da 1M) con i paralleli di quelle che ho. Che ne dici? Procedo?

Di nuovo, grazie.

P.S. Etemenanki tra le altre cose intendevi dirmi anche che il piezo potrebbe essere definitivamente andato?

No, un piezo in genere si rompe meccanicamente (quando si crepa il dischetto di ceramica per averlo piegato troppo, o quando si strappa la saldatura dalla metallizzazione), a livello elettrico e' difficile romperlo (non impossibile, ma abbastanza difficile)

Le resistenze puoi tranquillamente usarle anche cosi, 220 ohm ed 1 mega vanno bene lo stesso, anche senza usare il condensatore.