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:
- all'inizio RPM:0 turbina che gira:238 fermo la turbina: 038
- 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);
}