Titolo un pò generico ma non mi è venuto meglio. Espongo brevemente. Ho un codice, del famoso cronografo balistico realizzato qualche tempo fa con il vostro aiuto, nel quale vorrei inserire alcune funzioni.
- il codice, che funziona benissimo, nell'attuazione mi chiede di inserire un dato (peso in grammi) per poi poter effettuare una seconda azione (sparo). L'interazione è con pulsanti e visualizzazione su LCD display. Ora dopo l'inserimento del dato, il display rimane sulla visualizzazione del dato inserito. Vorrei quindi inserire un blocco che, una volta inserito il peso, pulisca lo schermo e quindi mostri la videata dell'azione successiva...ad esempio "Pronto".
Ho provato ad inserire il nuovo codice ma, ovviamente, girando in continuazione non si "blocca"; - una seconda funziona è un reset SENZA dover premere necessariamente il reset hardware;
Sto studiando; - la possibilità di annullare/non ritenere valida una lettura "invariata" ovvero ripetere gli stessi dati del tiro precedente una seconda volta che indicano chiaramente una lettura errata.
Ho fatto qualche prova...esito negativo. Di seguito posto il codice che ho limitato, alle parti di interesse essendo abbastanza lungo sperando che sia comprensibile.
Potete darmni qualche indicazioni sul corretto approccio?
Grazie
...omissis
void setup()
{
t1 = 0;
t2 = 0;
Serial.begin(9600);
//Serial.println("Pronto ... ");
//
EIFR |= bit(INTF0);
EIFR |= bit(INTF1);
//
attachInterrupt(digitalPinToInterrupt(2), ISR0, RISING);
attachInterrupt(digitalPinToInterrupt(3), ISR1, RISING);
{
avvio();
warning();
}
}
void loop()
{
// --------- ins peso -------------------
if (digitalRead(wUp))
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
weight += 0.001;
}
{
weightIns();
}
}
if (digitalRead(wDown))
{
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval)
{
previousMillis = currentMillis;
}
weightIns();
}
// -------- misurazione -----------------------
if ((t1 == 0) && (t2 != 0))
{
//Serial.println("Errore ENTRATA");
clearAndEnable();
{
entryError(); // rimanda al void per errore sensore entrata
}
}
else if ((t1 != 0) && ((micros() - t1) > MAXTIME))
{
// Serial.println("Errore USCITA");
clearAndEnable();
{
exitError(); // rimanda al void errore sensore uscita
}
}
else if ((t1 != 0) && (t2 != 0))
{
deltaT = t2 - t1;
Serial.print("Tempo misurato : ");
Serial.print(deltaT);
Serial.println(" microsec.");
clearAndEnable();
mpsSpeed = (0.12 * 1000000) / deltaT; // s = v * t, v = s / t ;
joule = ((mpsSpeed * mpsSpeed * weight) / 2) / 1000; // joule = v * v * pesokg : 2
// weight in kg
// -------------- void per display LCD -----------------
void avvio() {
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("- SuperCrono");
lcd.setCursor(1, 2);
lcd.print("ver.3f ");
delay(1500);
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("Peso impostato :");
// lcd.setCursor(0, 2);
// lcd.print("grammi ");
// lcd.print(weight,3); // se si vogliono 3 decimali
// lcd.print(weight);
// delay(2500);
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("m/s : ");
// lcd.print(mpsSpeed);
// lcd.setCursor(0, 1);
// lcd.print("Joule : ");
// lcd.print(joule);
}
void warning() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Verificare il peso,");
lcd.setCursor(0, 1);
lcd.print("...oppure, sparare!");
lcd.setCursor(0, 3);
lcd.print("grammi: ");
lcd.setCursor(9, 3);
lcd.print(weight,3);
//lcd.print(joule);
}
void weightIns() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Inserire peso");
lcd.setCursor(0, 1);
lcd.print("...e sparare.");
lcd.setCursor(0, 3);
lcd.print("grammi: ");
lcd.setCursor(9, 3);
lcd.print(weight, 3); // se si vogliono 3 decimali
//lcd.print(weight);
// delay(1000);
// lcd.clear();
// lcd.print("Hallo");
}
void shootDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("vel m/s : ");
lcd.print(String(mpsSpeed));
//lcd.print("tiro num : ");
//lcd.print(contaSpari + 1);
lcd.setCursor(0, 1);
lcd.print("diff m/s : ");
lcd.print(deltaMS);
//lcd.print("vel m/s : ");
//lcd.print(String(mpsSpeed));
lcd.setCursor(0, 2);
lcd.print("Joule : ");
lcd.print(joule);
//lcd.print("diff m/s : ");
//lcd.print(deltaMS);
lcd.setCursor(0, 3);
lcd.print("tiro num : ");
lcd.print(contaSpari + 1);
//lcd.print("Joule : ");
//lcd.print(joule);
}
void avgDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Medie rilevate");
lcd.setCursor(0, 2);
lcd.print("vel m/s : ");
lcd.print(mpsSpeed);
lcd.setCursor(0, 3);
lcd.print("Joule : ");
lcd.print(joule);
//delay(3500);
//warning();
}
void entryError() {
lcd.clear(); // se c'è un errore nel tiro dopo la schermata media
lcd.setCursor(0, 0);
lcd.print("- Tiro non valido -");
lcd.setCursor(0, 2);
delay(300); // la scritta "error" si sovrappone e rimane la prima riga.
lcd.print(" - errore entrata -");
delay(300);
lcd.setCursor(0, 2);
lcd.print(" ");
delay(300);
lcd.setCursor(0, 2);
lcd.print(" - errore entrata -");
delay(300);
lcd.setCursor(0, 2);
lcd.print(" ");
delay(300);
lcd.setCursor(0, 2);
lcd.print(" - errore entrata -");
}
void exitError() {
lcd.clear(); // se c'è un errore nel tiro dopo la schermata media
lcd.setCursor(0, 0);
lcd.print("- Tiro non valido -");
lcd.setCursor(0, 2); // la scritta "error" si sovrappone e rimane la prima riga.
delay(300);
lcd.print(" - errore uscita -");
delay(300);
lcd.setCursor(0, 2);
lcd.print(" ");
delay(300);
lcd.setCursor(0, 2);
lcd.print(" - errore uscita -");
delay(300);
lcd.setCursor(0, 2);
lcd.print(" ");
delay(300);
lcd.setCursor(0, 2);
lcd.print(" - errore uscita -");
}
void record() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Log tiri - m/s");
lcd.setCursor(0, 1);
lcd.print("t1 ");
lcd.print(tiri2[0]);
lcd.setCursor(10, 1);
lcd.print("t4 ");
lcd.print(tiri2[3]);
lcd.setCursor(0, 2);
lcd.print("t2 ");
lcd.print(tiri2[1]);
lcd.setCursor(10, 2);
lcd.print("t5 ");
lcd.print(tiri2[4]);
lcd.setCursor(0, 3);
lcd.print("t3 ");
lcd.print(tiri2[2]);
}
void nullError() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("tiro nullo");
}
void start() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("vel m/s :");
lcd.setCursor(0, 1);
lcd.print("Joule :");
}