Semplice Contatore RPM

Ciao a tutti,
sto realizzando un contatore di giri al minuto (rpm) di una turbina eolica con Arduino 2009.
Ho iniziato facendo così un semplice sistema IR con un led IR e un ricevitore TSOP4838 che quando c'è un ostacolo tra TX e RX mi da in uscita 5V.
Poi, usando la funzione PulseIn di Arduino, mi sono ricavato il tempo approssimato tra il passaggio della pala ed il passaggio successivo.

vorrei chiedervi un'aiuto perchè ho un problema di visualizzazione degli rpm, cioè all'inizio il programma mi da giustamente RPM: 0, poi se faccio girare la turbina, mi segnala il numero ma se fermo la turbina, la prima cifra diventa 0 mentre le altre rimangono uguali. Per farvi capire faccio due esempi:

  1. all'inizio RPM:0 turbina che gira:238 fermo la turbina: 038
  2. all'inizio RPM:0 turbina che gira:176 fermo la turbina: 076
    Come tipo di variabile ho usato int, se uso invece float la variabile si resetta correttamente ma visualizzo il puntino, cioè 0.00
    es. 1) all'inizio RPM:0 turbina che gira:238 fermo la turbina: 0.00 Come posso risolvere questo problema di visualizzazione sull'lcd?
    Se invece lo voglio visualizzare sulla seriale, funziona correttamente.
    Ecco qui il codice:
int RPM = 0;
float durata = 0;
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

void setup()
{
  pinMode(9, OUTPUT); //38kHz per IR
  pinMode(12, INPUT); //ingresso RPM
  lcd.begin(16,2);

  //Genera frequenza di 38kHz
  bitWrite(TCCR1A, WGM10, 0);
  bitWrite(TCCR1A, WGM11, 0);
  bitWrite(TCCR1B, WGM12, 1);
  bitWrite(TCCR1B, WGM13, 0);

  bitWrite(TCCR1A, COM1A0, 1);
  bitWrite(TCCR1A, COM1A1, 0);
  bitWrite(TCCR1A, COM1B0, 1);
  bitWrite(TCCR1A, COM1B1, 0);

  // Senza prescaling
  bitWrite(TCCR1B, CS10, 1);
  bitWrite(TCCR1B, CS11, 0);
  bitWrite(TCCR1B, CS12, 0);

  OCR1A = 210;
  OCR1B = 210;
}


void loop()
{

  //conta RPM
 durata = pulseIn(12, LOW);
 RPM = 1/((durata/1000000)/60); //ho diviso per 1000000 per ottenere
 lcd.setCursor (0,0); //il valore in secondi
  lcd.print("RPM:");
 lcd.print (RPM);
 
 
 
 delay (1000);
 }

Ciao semplicemente devi cancellare il valore precedente, infatti se prima hai 238, quando lui va a scrivere 0 lo fa mettendolo nella sua posizione corretta, che è quella occupata dal 2 ecco perché leggi 038, 0 è il nuovo valore, 38 il residuo "visivo" del valore precedente. Di "crudo" aggiungerei un doppio spazio dopo il valore di RPM, ma certamente c'è una tecnica migliore, intanto fai la prova e vedi che spariranno le due cifre "vecchie".
Non ho ancora lavorato con gli LCD, se esiste il comando lcd.println, come per la seriale, ad ogni lettura va sulla riga successivo, se il tuo lcd è ad una sola riga, risolverai anche così.

Ciao Menniti,
grazie per le informazioni ed i consigli.
Ho provato col sistema "crudo" ma purtroppo non cambia nulla. Il primo valore va a 0 mentre gli altri rimangono invariati.
L'lcd è a due righe.
Facendo lcd.println, escono dei caratteri incomprensibili sia provando la visualizzazione sulla prima riga che sulla seconda.

Prova con questo "codice da cavernicolo" :wink:

lcd.setCursor (0,4);  //do per scontato che le coordinate siano in formato X,Y
lcd.print("   "); //3 spazi
lcd.setCursor(0,0);
lcd.print("RPM:");
lcd.print (RPM);

Scrive 3 spazi sulle vecchie cifre e poi riscrive il nuovo valore

Bravo Leo!
Inserendo il codice "da cavernicolo" funziona!
Una precisazione, l'lcd ragiona YX, quindi lcd.setCursor (4,0); :wink:
Grazie mille ragazzi!!

lcd.clear(); :smiley:

cacncella tutto riscrivi tutto da capo più lento ma sei sicuro che cancelli tutto

Con lcd.clear hai il problema del refresh: sfarfallano tutte le scritte, mentre col "codice da cavernicolo" solo i numeri.