[SOLVED] LCD 1602A won't display Data

I used the code below for my project and it actually works when I display it in the Serial Monitor.
But wouldn't work when I see it in the LCD. The LCD screen did have the light on.

#include <LiquidCrystal.h>
#include "DHT.h" //including the dht22 library
#define DHTPIN 9 //Declaring pin 9 of arduino for the dht22
#define DHTTYPE DHT22 //Defining which type of dht22 we are using (DHT22 or DHT11)
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
DHT dht(DHTPIN, DHTTYPE); //Declaring a variable named dht
void setup() { //Data written in it will only run once
Serial.begin(9600); //setting the baud rate at 9600
dht.begin(); //This command will start to receive the values from dht22
}
void loop() { //Data written in it will run again and again
float hum = dht.readHumidity(); //Reading the humidity and storing in hum
float temp = dht.readTemperature(); //Reading the temperature as Celsius and storing in temp
float fah = dht.readTemperature(true);
if (isnan(hum) || isnan(temp) || isnan(fah)) {
 Serial.println("Failed to read from DHT sensor!");
 return;
}
 float heat_index = dht.computeHeatIndex(fah, hum);
 float heat_indexC = dht.convertFtoC(heat_index);
Serial.print("Humidity: "); //Writing the humidity on the serial monitor
Serial.print(hum); //Writing the humidity value stored in hum on the Serial monitor
Serial.print(" %\t");
Serial.print("Temperature: "); //Writing the temperature on the serial monitor
Serial.print(temp); //Writing the value of temperature on the serial monitor
Serial.print(" °C ");
Serial.print(fah);
Serial.print(" °F\t");
Serial.print("Heat index: ");
Serial.print(heat_indexC);
Serial.print(" °C ");
Serial.print(heat_index);
Serial.println(" °F ");
delay(2000); //Giving a delay of 2 seconds
}

and I am using the sketch attached

Anyone know how to fix this problem?
Anything missing in the code?

Thank you in advance!

look at the example code that comes with your library. Isn't there a lcd.begin() statement in setup()?

If you want something the show up on the LCD you need to print to the LCD. Again, look at the example code.

what do you mean by that?

groundFungus:
look at the example code that comes with your library. Isn't there a lcd.begin() statement in setup()?

If you want something the show up on the LCD you need to print to the LCD. Again, look at the example code.

which example code?

Most every library comes with example code to familiarize you with the use of the library. In the IDE go to the File menu. There is a menu item, Examples. Click on Examples and a list of the installed libraries will be shown. Select the LiquidCrystal library and you will see the examples for that library.

What about this?
I did try to add the lcd.print() and lcd.display()
Anything missing?

#include <LiquidCrystal.h>
#include "DHT.h" //including the dht22 library
#define DHTPIN 9 //Declaring pin 9 of arduino for the dht22
#define DHTTYPE DHT22 //Defining which type of dht22 we are using (DHT22 or DHT11)
LiquidCrystal lcd(2,3,4,5,6,7); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
DHT dht(DHTPIN, DHTTYPE); //Declaring a variable named dht

void setup() { //Data written in it will only run once
Serial.begin(9600); //setting the baud rate at 9600
dht.begin(); //This command will start to receive the values from dht22
lcd.begin(16,2);
}
void loop() { //Data written in it will run again and again
float hum = dht.readHumidity(); //Reading the humidity and storing in hum
float temp = dht.readTemperature(); //Reading the temperature as Celsius and storing in temp
float fah = dht.readTemperature(true);
if (isnan(hum) || isnan(temp) || isnan(fah)) {
 Serial.println("Failed to read from DHT sensor!");
 return;
}
 float heat_index = dht.computeHeatIndex(fah, hum);
 float heat_indexC = dht.convertFtoC(heat_index);
Serial.print("Humidity: "); //Writing the humidity on the serial monitor
Serial.print(hum); //Writing the humidity value stored in hum on the Serial monitor
Serial.print(" %\t");
Serial.print("Temperature: "); //Writing the temperature on the serial monitor
Serial.print(temp); //Writing the value of temperature on the serial monitor
Serial.print(" °C ");
Serial.print(fah);
Serial.print(" °F\t");
Serial.print("Heat index: ");
Serial.print(heat_indexC);
Serial.print(" °C ");
Serial.print(heat_index);
Serial.println(" °F ");


lcd.print("Humidity: "); //Writing the humidity on the serial monitor
lcd.print(hum); //Writing the humidity value stored in hum on the Serial monitor
lcd.print(" %\t");
lcd.print("Temperature: "); //Writing the temperature on the serial monitor
lcd.print(temp); //Writing the value of temperature on the serial monitor
lcd.print(" °C ");
lcd.print(fah);
lcd.print(" °F\t");
lcd.print("Heat index: ");
lcd.print(heat_indexC);
lcd.print(" °C ");
lcd.print(heat_index);
lcd.println(" °F ");

lcd.display ();
delay(2000); //Giving a delay of 2 seconds
}

It does display the black boxes on the screen
Thank you in advance

It would be better to have a "real" circuit schema, not a Fritzing picture as it is pretty heavy to study those Fritzing pictures.

  1. Did you check the connections if they match with the constructor?
  2. Does your display react when you adjust the contrast of the LCD?

Last but not least: what is your electronics skill level?

rpt007 asked.

  1. Did you check the connections if they match with the constructor?

The current constructor:

LiquidCrystal lcd(2,3,4,5,6,7);

Looking at the Fritz, the LCD is wired

LiquidCrystal lcd(7,6,5,4,3,2);

What about this?

Better, but, as far as I know, none of the LiquidCrystal libraries for the 1602 displays have a display() method and lcd.println() is not supported. You use the setCursor() function to tell the display where to print.

lcd.print("Humidity: "); //Writing the humidity on the serial monitor
lcd.print(hum); //Writing the humidity value stored in hum on the Serial monitor
lcd.print(" %\t");
lcd.print("Temperature: "); //Writing the temperature on the serial monitor
lcd.print(temp); //Writing the value of temperature on the serial monitor
lcd.print(" °C ");
lcd.print(fah);
lcd.print(" °F\t");
lcd.print("Heat index: ");
lcd.print(heat_indexC);
lcd.print(" °C ");
lcd.print(heat_index);
lcd.println(" °F ");

lcd.display ();
delay(2000); //Giving a delay of 2 seconds
}

You can't print to the LCD just like you do Serial. A 1602 display has only 2 lines of 16 characters. The way that you are doing print will not work and you are printing way to much to the display at once. You will need to rethink what data goes to the display so that you use the 16 character and 2 line limits.

The character set for the LCD is not the same as the character set for Serial (which is the ASCII character set) so you may see some weird characters printed.

f285c763cbb8acd7267deb44e8d55715ad2ef863.jpg

Just while you are at it - remove the red wire between the potentiometer and 5 V, and never put it back (you can connect that end to the wiper). It is a mistake propagated through ham-fisted tutorials and designs but not the cause of your problem because those published designs do obviously manage to work.

I tried to look at the example code but still confused with it.
This is how I want to the LCD screen to show the data:

Humid.:12.34%
Temp.:12.34°C

How should I add the code?

Paul__B:
Just while you are at it - remove the red wire between the potentiometer and 5 V, and never put it back (you can connect that end to the wiper). It is a mistake propagated through ham-fisted tutorials and designs but not the cause of your problem because those published designs do obviously manage to work.

And for that, I tried to remove it but why is the black squares on the lower row doesn't show?

Thanks.

I tried to look at the example code but still confused with it.

Post the example that you tried and tell us what confuses you. Did you upload the example code to your Arduino?

What does the display show?

This is the example code for LiquidCrystal Display

/*
  LiquidCrystal Library - display() and noDisplay()

 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.

 This sketch prints "Hello World!" to the LCD and uses the
 display() and noDisplay() functions to turn on and off
 the display.

 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 modified 7 Nov 2016
 by Arturo Guadalupi

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystalDisplay

*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // Turn off the display:
  lcd.noDisplay();
  delay(500);
  // Turn on the display:
  lcd.display();
  delay(500);
}

and below is the example code for LiquidCrystal SetCursor

/*
  LiquidCrystal Library - setCursor

 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.

 This sketch prints to all the positions of the LCD using the
 setCursor() method:

  The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * LCD R/W pin to ground
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)

 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 modified 7 Nov 2016
 by Arturo Guadalupi

 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystalSetCursor

*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// these constants won't change.  But you can change the size of
// your LCD using them:
const int numRows = 2;
const int numCols = 16;

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(numCols, numRows);
}

void loop() {
  // loop from ASCII 'a' to ASCII 'z':
  for (int thisLetter = 'a'; thisLetter <= 'z'; thisLetter++) {
    // loop over the columns:
    for (int  thisRow = 0; thisRow < numRows; thisRow++) {
      // loop over the rows:
      for (int thisCol = 0; thisCol < numCols; thisCol++) {
        // set the cursor position:
        lcd.setCursor(thisCol, thisRow);
        // print the letter:
        lcd.write(thisLetter);
        delay(200);
      }
    }
  }
}

Which one should I use
and
How am I supposed to change the code into my code?
*The change I tried is still in comment mode because I'm still confused with it.

#include <LiquidCrystal.h>
#include "DHT.h" //including the dht22 library
#define DHTPIN 9 //Declaring pin 9 of arduino for the dht22
#define DHTTYPE DHT22 //Defining which type of dht22 we are using (DHT22 or DHT11)
LiquidCrystal lcd(7,6,5,4,3,2); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
DHT dht(DHTPIN, DHTTYPE); //Declaring a variable named dht
const int numRows = 2;
const int numCols = 16;

void setup() { //Data written in it will only run once
Serial.begin(9600); //setting the baud rate at 9600
dht.begin(); //This command will start to receive the values from dht22
lcd.begin(16,2);
}
void loop() { //Data written in it will run again and again
float hum = dht.readHumidity(); //Reading the humidity and storing in hum
float temp = dht.readTemperature(); //Reading the temperature as Celsius and storing in temp
float fah = dht.readTemperature(true);
if (isnan(hum) || isnan(temp) || isnan(fah)) {
 Serial.println("Failed to read from DHT sensor!");
 return;
}
 float heat_index = dht.computeHeatIndex(fah, hum);
 float heat_indexC = dht.convertFtoC(heat_index);
Serial.print("Humidity: "); //Writing the humidity on the serial monitor
Serial.print(hum); //Writing the humidity value stored in hum on the Serial monitor
Serial.print(" %\t");
Serial.print("Temperature: "); //Writing the temperature on the serial monitor
Serial.print(temp); //Writing the value of temperature on the serial monitor
Serial.print(" °C ");
Serial.print(fah);
Serial.print(" °F\t");
Serial.print("Heat index: ");
Serial.print(heat_indexC);
Serial.print(" °C ");
Serial.print(heat_index);
Serial.println(" °F ");

/*  // loop from ASCII 'a' to ASCII 'z':
  for (int hum = 'a'; hum <= 'z'; thisLetter++) {
    // loop over the columns:
    for (int  thisRow = 0; thisRow < 2; thisRow++) {
      // loop over the rows:
      for (int thisCol = 0; thisCol < 16; thisCol++) {
        // set the cursor position:
        lcd.setCursor(16, 2);
        // print the letter:
        lcd.write(hum);
        delay(2000);
      }
    }
  }
*/
}

I successfully find the code which works well!
Thank you for your guide this whole time :slight_smile:

For those having the same problem this is the code I used for my project (for reference):

#include <LiquidCrystal.h>
#include "DHT.h" //including the dht22 library
#define DHTPIN 9 //Declaring pin 9 of arduino for the dht22
#define DHTTYPE DHT22 //Defining which type of dht22 we are using (DHT22 or DHT11)
LiquidCrystal lcd(7,6,5,4,3,2); // Creates an LCD object. Parameters: (rs, enable, d4, d5, d6, d7)
DHT dht(DHTPIN, DHTTYPE); //Declaring a variable named dht
const int numRows = 2;
const int numCols = 16;

void setup() { //Data written in it will only run once
Serial.begin(9600); //setting the baud rate at 9600
dht.begin(); //This command will start to receive the values from dht22
lcd.begin(16,2);
}
void loop() { //Data written in it will run again and again
lcd.clear();
float hum = dht.readHumidity(); //Reading the humidity and storing in hum
float temp = dht.readTemperature(); //Reading the temperature as Celsius and storing in temp
if (isnan(hum) || isnan(temp)) {
 lcd.print("Failed to read from DHT sensor!");
 return;
}
lcd.setCursor(0,0);
lcd.print("Hum. : "); //Writing the humidity on the serial monitor
lcd.print(hum); //Writing the humidity value stored in hum on the Serial monitor
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("Temp.: "); //Writing the temperature on the serial monitor
lcd.print(temp); //Writing the value of temperature on the serial monitor
lcd.print(" C ");
delay(2000); //Giving a delay of 2 seconds
}

Thank you again guys :slight_smile: