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 (!?!?)
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.