Im a newbie. I have a problem with displaying text in LCD (16x2). It shows incorrect message in the lcd. Here is the code and the picture that gives the wrong output : Kindly help Thank you.

#include "SIM900.h"
#include <SoftwareSerial.h>

#include "sms.h"
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


int numdata;
boolean started  = false;
char smsbuffer[160]; //message
String newsms;
char n[20];
unsigned char i;
int sensorPin = A0;    // select the input pin for the potentiometer
int sensorValue = 0;  // variable to store the value coming from the sensor
int outputValue = 0;   // value output to the %
int outputValue1 = 0;   // value output to cursor

void setup()
  //Serial connection.
    lcd.begin(16, 2);


//  lcd.setCursor(0, 1);
//  lcd.clear();
//  lcd.print("   Wireless Public       via GSM"); //55 chars
//  lcd.setCursor(0, 2);
//  lcd.print("    Notice Board "); //55 chars
   Serial.println("GSM Shield testing.");
  if (gsm.begin(2400)) {
    started = true;
  else Serial.println("\nstatus=IDLE");

  // set up the LCD's number of columns and rows:


void loop()

  // read the value from the sensor:
  sensorValue = analogRead(sensorPin);
  // map it to the range of the analog out:
  outputValue = map(sensorValue, 0, 1023, 0, 100);
  outputValue1 = map(sensorValue, 0, 1023, 0, 200);

  //scroll = lcd.scrollDisplayLeft();
  if (started) {
    //Read if there are messages on SIM card and print them.
    if (gsm.readSMS(smsbuffer, 160, n, 20))
      lcd.setCursor(0, 2);
      lcd.print("SMS Received!");
//      lcd.clear();

enter image description here

  • What characters does Serial.println(smsbuffer); print to the serial monitor?
    – VE7JRO
    May 12, 2018 at 19:27
  • Yes In Serial Monitor it display the correct message that being send by the sender but when i print it in lcd it did not display the same output as what serial monitor display It only display the image that i upload.
    – Megumichan
    May 12, 2018 at 19:29
  • Please edit your question to show the wireup of the LCD to your Arduino. Are you sure you didn't exchange one of the data line wires? (arduino.cc/en/Tutorial/HelloWorld) Is every message displayed wrong or just the contents of smsbuffer? Have you tried running a minimal sketch to just test the LCD with a 'hello world'? May 12, 2018 at 19:38
  • I did print the smsbuffer in serial so that i can see the content of the message that being receive. Well in Serial it gives the correct output/content that the sender message. but when i print it in lcd it shows incorrect content.
    – Megumichan
    May 12, 2018 at 19:46
  • @Megumichan, when i print it in lcd it shows incorrect content .... you are misunderstanding the problem ... the LCD is displaying exactly the correct content .... it is displaying what you are telling it to display ..... you have to figure out why your program is sending content that you do not want to see .... start by running the "helloWorld" demo
    – jsotola
    May 13, 2018 at 2:20

3 Answers 3


The first thing to try is replacing lcd.begin(16, 2) with lcd.begin(20, 4). The image of your LCD looks like a 20 char by 4 line display. Based on your comments, it seems that the SMS part of your code is working because it's outputting the correct characters to the serial monitor. I would focus on the LCD code and connections to your Arduino.

  • Yeah in serial it shows the correct content of the message but in lcd it shows degree symbol(extended ascii code) Is it possible to convert this ascii code to string? or how can i remove this degree ascii code and change it to text? Thank you
    – Megumichan
    May 12, 2018 at 21:30
  • What would you like to replace the degree symbol with?
    – VE7JRO
    May 13, 2018 at 2:19
  • can i possibly replace the degree symbol to string ??
    – Megumichan
    May 13, 2018 at 3:46
  • I'm not sure what you mean, "to string". An empty string? A space character?
    – VE7JRO
    May 13, 2018 at 4:20

I arrived a little late; however I'm leaving some further information to Debug similar problems for those who arrive here in the Future.

Regarding the Question

As already answered above:
- You are specifying your LCD as a 16 Column with 2 Rows (1602); and in your picture you clearly have a 20 Column with 4 Rows.


lcd.begin(16, 2);


lcd.begin(20, 4);

How LCD Works

Take into consideration that LCD works as a Matrix and both Columns and Rows are Zero Based Index. That is; when you set the LCD Cursor Columns or Rows; you start counting with 0.

See Example Bellow:

lcd.setCursor(0, 2);

The 1st Parameter (Zero) Represents Columns.
The 2nd (Two) Represents Rows.

Therefore on the 1st Parameter: "0" (Column); (Considering you're reading from Left to Right and Top to Bottom); You Set the Cursor on the very 1 Column on the LCD.

The 2nd Parameter (2): you’l be Setting char on the 3rd Row (Line).

Note: 3rd and not 2nd; because both Columns and Rows are "Zero Based" Indexed.

Debugging LCD Issues

  1. Check If your LCD is Properly Wired. You may have switched a wire; wire not properly plugged or broken. Specially if you’re not using a I2C back module). Wiring without I2C (“I Squared C”) module can be confusing in certain occasions.

  2. Check your Library and Hardware. Make sure you’re using the correct library (I2C library: if your LCD has the module: use a compatible I2C Library; and specify the LCD parameters accordingly). In case you don’t have a I2C module; then use a library to with a workaround for that situation. (You specify all the Pins).

  3. Check you Code: Check the way you initialize your LCD. i.e: lcd.begin(16,2); or lcd.begin(20, 4);

  4. Make sure you print inside LCD Index. Setting the cursor outside its bounds can also cause “weird” chars.

  5. There can be other situations related with improper wiring or some sort of short circuit with other components connected to your project that can also produce weird characters.

  6. In certain circumstances; pressing Reset; Cutting the Power for a little while or Re-Uploading the project fixes the issue.

  7. Not clearing the LCD whenever there is New data can simulate the effect of weird characters; but actually they are old data characters that remained there.

Writing Custom Characters to LCD

As you've Probably Noticed you are Unable to print the a Custom Character (i.e: Degree Symbol) on your LCD. That can be solved by Creating your own (Custom) char and Declare it on your Code. I won't explain every detail, in order to avoid going off topic and to avoid providing an extensive and hard-to-read answer. Instead will leave an example, that is easy to understand and 2 Links bellow with further information regarding Custom Characters.


Example for Degree Character

/* LCD Custom Characters
// This is your Char Definition in Bytes:
byte DegreeDef[8] = { B01100, B10010, B10010, B01100, B00000, B00000, B00000, B00000 };

// This is the byte Char to be used to write to LCD.
const byte Degree = 0x2;

void LCDInitialization()
  // LCD Initialiation Code Here
  // ...

  // Initialize Custom Characters.
  lcd.createChar(2, DegreeDef);

  // Do Something Else...

void PrintToLCD()
  // Note:
  // "lcd.write" is Different from "lcd.print".
  // Use "write" to Print your Custom LCD Characters.
  lcd.setCursor(0, 1);

I hope this helps debugging your issue.


Hello I had the same problem and noticed that if you setup the lcd screen in this order:

LiquidCrystal lcd (d7, d6, d5, d4, , en, rs) ;

you get some weird character showing up... but if you do this way:

LiquidCrystal lcd (rs, en, d4, d5, d6, d7) ;

you don't get any weird character.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.