Hola a todos
Estoy haciendo una pequeña estación meteorológica y me encuentro trabado en el anemómetro ( mide velocidad del viento ) , tengo un código que lee la velocidad perfectamente en monitor serie el problema es cuando trato de que se visualice la información en el LCD , no sale nada y no se por que ![]()
Este código funciona perfectamente en el monitor serie
/// Variables //////////////////////////////////////////////////////////////////////////////////////////////////////////////
int encoder_pin = 2; //Pin 2, donde se conecta el encoder
unsigned int rpm = 0; // Revoluciones por minuto calculadas.
float velocity = 0; //Velocidad en [Km/h]
float metrosporsegundo; //
volatile byte pulses = 0; // Número de pulsos leidos por el Arduino en un segundo
unsigned long timeold = 0; // Tiempo
unsigned int pulsesperturn = 4; // Número de muescas que tiene el disco del encoder.
const int wheel_diameter = 180; // Diámetro de la rueda pequeña[mm]
static volatile unsigned long debounce = 0; // Tiempo del rebote.
//// Configuración del Arduino /////////////////////////////////////////////////////////
void setup(){
Serial.begin(9600); // Configuración del puerto serie
pinMode(encoder_pin, INPUT); // Configuración del pin nº2
attachInterrupt(0, counter, RISING); // Configuración de la interrupción 0, donde esta conectado.
pulses = 0;
rpm = 0;
timeold = 0;
}
//// Programa principal ///////////////////////////////////////////////////////////////////////
void loop(){
if (millis() - timeold >= 1000){ // Se actualiza cada segundo
noInterrupts(); //Desconectamos la interrupción para que no actué en esta parte del programa.
rpm = (60 * 1000 / pulsesperturn )/ (millis() - timeold)* pulses; // Calculamos las revoluciones por minuto
velocity = rpm * 3.1416 * wheel_diameter * 60 / 1000000; // Cálculo de la velocidad en [Km/h]
metrosporsegundo = velocity / 3.6 ;
timeold = millis(); // Almacenamos el tiempo actual.
Serial.print(velocity,2);
Serial.print("Km,");
Serial.print(metrosporsegundo,2);
Serial.println("m/s");
pulses = 0; // Inicializamos los pulsos.
interrupts(); // Restart the interrupt processing // Reiniciamos la interrupción
}
}
////Fin de programa principal //////////////////////////////////////////////////////////////////////////////////
///////////////////////////Función que cuenta los pulsos buenos ///////////////////////////////////////////
void counter(){
if( digitalRead (encoder_pin) && (micros()-debounce > 500) && digitalRead (encoder_pin) ) {
// Vuelve a comprobar que el encoder envia una señal buena y luego comprueba que el tiempo es superior a 1000 microsegundos y vuelve a comprobar que la señal es correcta.
debounce = micros(); // Almacena el tiempo para comprobar que no contamos el rebote que hay en la señal.
pulses++;} // Suma el pulso bueno que entra.
else ; }
este código no muestra la información en el LCD
/// Variables //////////////////////////////////////////////////////////////////////////////////////////////////////////////
int encoder_pin = 2; //Pin 2, donde se conecta el encoder
unsigned int rpm = 0; // Revoluciones por minuto calculadas.
float velocity = 0; //Velocidad en [Km/h]
float metrosporsegundo; //
volatile byte pulses = 0; // Número de pulsos leidos por el Arduino en un segundo
unsigned long timeold = 0; // Tiempo
unsigned int pulsesperturn = 4; // Número de muescas que tiene el disco del encoder.
const int wheel_diameter = 180; // Diámetro de la rueda pequeña[mm]
static volatile unsigned long debounce = 0; // Tiempo del rebote.
//// Configuración del Arduino /////////////////////////////////////////////////////////
//librerias
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup(){
lcd.begin(16, 2);
lcd.home ();
lcd.print("test");
lcd.setCursor ( 0, 1 );
////////////
pinMode(encoder_pin, INPUT); // Configuración del pin nº2
attachInterrupt(0, counter, RISING); // Configuración de la interrupción 0, donde esta conectado.
pulses = 0;
rpm = 0;
timeold = 0;
}
//// Programa principal ///////////////////////////////////////////////////////////////////////
void loop(){
if (millis() - timeold >= 1000){ // Se actualiza cada segundo
noInterrupts(); //Desconectamos la interrupción para que no actué en esta parte del programa.
rpm = (60 * 1000 / pulsesperturn )/ (millis() - timeold)* pulses; // Calculamos las revoluciones por minuto
velocity = rpm * 3.1416 * wheel_diameter * 60 / 1000000; // Cálculo de la velocidad en [Km/h]
metrosporsegundo = velocity / 3.6 ;
timeold = millis(); // Almacenamos el tiempo actual.
lcd.print("-");
lcd.print(velocity,2);
lcd.print("Km,");
lcd.print(metrosporsegundo,2);
lcd.println("m/s");
pulses = 0; // Inicializamos los pulsos.
interrupts(); // Restart the interrupt processing // Reiniciamos la interrupción
}
}
////Fin de programa principal //////////////////////////////////////////////////////////////////////////////////
///////////////////////////Función que cuenta los pulsos buenos ///////////////////////////////////////////
void counter(){
if( digitalRead (encoder_pin) && (micros()-debounce > 500) && digitalRead (encoder_pin) ) {
// Vuelve a comprobar que el encoder envia una señal buena y luego comprueba que el tiempo es superior a 1000 microsegundos y vuelve a comprobar que la señal es correcta.
debounce = micros(); // Almacena el tiempo para comprobar que no contamos el rebote que hay en la señal.
pulses++;} // Suma el pulso bueno que entra.
else ; }
alguna idea ???
gracias !