no funcion LCD y encoder de velocidad

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 :frowning:

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 !

Seguramente faltan un par de instrucciones que le digan al cursor del LCD donde imprimir

lcd.setCursor ( 0, 0 );
      lcd.print("-");
      lcd.print(velocity,2);
      lcd.print("Km,");
      lcd.setCursor ( 0, 1 );
      lcd.print(metrosporsegundo,2); 
      lcd.println("m/s");

prueba asi como para asegurarse que se verán los datos pero luego tendrás que trabajar cuando las impresiones cambien de tamaño ya que no es lo mismo imprimir algo de 1,2, o mas digitos.

Hi,
Pregunta: Tu estas usando el LCD con el IIC/I2C Interface LCD1602 Adapter Board Module o estas usando el LCD con los pines del arduino.

uso el LCD con el IIC/I2C Interface LCD1602 Adapter Board Module ,

"prueba asi como para asegurarse que se verán los datos pero luego tendrás que trabajar cuando las impresiones cambien de tamaño ya que no es lo mismo imprimir algo de 1,2, o mas digitos."

no entendí :frowning:

Supongo que ejecutaste algún ejemplo de la librería LCD i2C para ver datos no?

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 ; }

Simplemente no se como te funciona. Dentro de una interrupción no funcionan las funciones Delay() millis() y micro().
Ademas estas leyendo el mismo pin que genera la interrupción. Si lo que quieres es que te cuente un solo pulso en cierto tiempo la forma correcta es deshabilitando dentro de la interrupción con detachinterrup y levantando una bandera, luego en el Loop habilitas la interrupción( luego que pase el tiempo y bajas la bandera).
Saludos

Hi,
Entonces adjunto un sketch que te indica como configurar el LCD. Algunos adapter tienen el address del LCD como 0X27 y algunas veces 0x38. Si corres el programa que escanea la linea de I2C y te dice que address tiene el LCD. Trata con la 0x27 y si no te trabaja entonces usas el programa que scanea .

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // Set the LCD I2C address

Esta instruccion se usa cuando usas los pines de el micro.eleiminala.
//LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); <<<<<<<remueve esta instruccion


void setup() {
  // put your setup code here, to run once:
lcd.begin();
  lcd.clear();
  lcd.backlight();
  lcd.setCursor(0, 0);  //set curso character position=0  line=0
  lcd.print("        System      ");
  lcd.setCursor(0, 1);  //set curso character position=0  line=0
  lcd.print("     Initializing   ");
}

void loop() {
  // put your main code here, to run repeatedly:

}