PANTALLA LCD 16X2 CON I2C

Hola a todos, este es mi primer proyecto aunque tengo poca experiencia en este tema si comprendo mas o menos y pues tengo una tarjeta arduino uno con una pantalla LCD de 16x2 con I2C y un sensor de polvo GP2Y1010AU0F y este es el codigo que he utilizado

 #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
 

LiquidCrystal_I2C lcd(0x27, 16, 2);
 
  int muestreo = 0; // Pin analógico para el pin Vo del sensor GP2Y10
  int IRED = 2; // Pin digital para el IRED
 
  // Tiempos constantes para el pulso de control del IRED
  int retardo_1 = 280;
  int retardo_2 = 40;
  int retardo_3 = 9680;
 
  // Variables auxiliares del programa
  int valor = 0;
  float ppm = 0;
  float voltaje = 0;
  float densidad_polvo = 0;
  float ppm_real = 0;
  int i=0;
 
  void setup()
  {
    lcd.begin();   // Inicializa el LCD para 16x2
    pinMode(IRED,OUTPUT); // Pin digital 2 como salida
   
    // Mostramos un mensaje a través del LCD
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("  DETECTOR  DE  ");
    lcd.setCursor(0,1);
    lcd.print("PARTICULAS POLVO");
    delay(3000);
  }
 
  void loop()
  {
    i=i+1; // Contador de pulsos de control
    // El IRED se va a activar con LOW y se desactiva con HIGH según las conexiones internas del sensor
    digitalWrite(IRED,LOW); // LED activado
    delayMicroseconds(retardo_1); // Retardo de 0,28ms
    valor = analogRead(muestreo); // Se muestrea el valor de Vo a través del pin analógico A0
    ppm = ppm + valor; // Media ponderada de Vo
    delayMicroseconds(retardo_2); // Retardo de 0,04ms
    digitalWrite(IRED,HIGH); // LED desactivado
    delayMicroseconds(retardo_3); // Retardo de 9,68ms
    // retardo_1 + retardo_2 + retardo_3 = 10ms
   
    // Fórmulas matemáticas para el cálculo de los valores del sensor GP2Y10
    voltaje = ppm/i*0.0049; // Voltaje en voltios (media de los valores ppm obtenidos)
    densidad_polvo = 0.17*voltaje-0.1; // Densidad de partículas de polvo en mg/m³
    ppm_real = (voltaje-0.0356)*120000; // Concentración de partículas de polvo en ppm
    if (ppm_real < 0)
      ppm_real = 0;
    if (densidad_polvo < 0 )
      densidad_polvo = 0;
    if (densidad_polvo > 0.5)
      densidad_polvo = 0.5;
   
    // Presentamos el voltaje a través del LCD 
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("-> VOLTAJE");
    lcd.setCursor(0,1);
    lcd.print(voltaje,3); // Tres decimales
    lcd.print(" V");
    delay(2000);
   
    // Presentamos la densidad de partículas de polvo a través del LCD 
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("-> DENSIDAD");
    lcd.setCursor(0,1);
    lcd.print(densidad_polvo,3); // Tres decimales
    lcd.print(" mg x m3");
    delay(2000);
   
    // Presentamos la concentración de partículas de polvo a través del LCD
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("-> CONCENTRACION");
    lcd.setCursor(0,1);
    lcd.print(ppm_real,3); // Tres decimales
    lcd.print(" ppm");
    delay(2000);    
  }

el cual no genera ningun error y se sube a la tarjeta pero en la pantalla LCD enciende y queda en blanco y no los datos
las conexiones que tengo en el LCD son GND->GND, VCC->5V, SDA->A4 y SCL->A5

Gracias de antemano

yo uso este codigo en estas pantallas y me funciona, si quieres comparalo con el tuyo haber

#include <Wire.h>
//#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
//LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7); //DIR, E, RW, RS, D4, D5, D6, D7
//PINES PANTALLA LCD: CLOCK A5 - SDA A4

void setup() {
 lcd.setBacklightPin(3,POSITIVE);
 lcd.setBacklight(HIGH);
 lcd.begin(16, 2);
 lcd.clear();

}

void loop() {
 lcd.setCursor(0, 0);
 lcd.print("Hola buenos dias");
 lcd.setCursor(0, 1);
 lcd.print(millis()/1000);
 lcd.print(" seg.");

}

espero te sirva :slight_smile:

el problema que puedes tener es la direccion del i2c, Estas seguro que es 0x27? (LiquidCrystal_I2C lcd(0x27, 16, 2) )

si no lo estas te dejo aqui un programa para ver, en el puerto serial, cual es exactamente la que está asociada a tu i2c en ese módulo concreto, ya que no todas vienen con el mismo numero.

#include <Wire.h>
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  Serial.println("\nI2C Scanner");
}
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Hay dos cosas a verificar. La primera que la dirección del lcd no sea 0x27, algunos vienen con 0x3F. La segunda es verificar que no sea un problema de contraste del lcd, el que se puede regular con un preset.