lcd.print(); prints wrong symbols

Hi All,

I have sketch with NTP call and it working perfect

/*
 * Time_NTP.pde
 * Example showing time sync to NTP time source
 *
 * This sketch uses the Ethernet library
 */
 
#include <Time.h> 
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>
#include <LiquidCrystal.h>

byte mac_addr[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x79, 0xF9 };
IPAddress server_addr(192,168,137,5);
IPAddress arduino_addr(192,168,137,10);
EthernetClient client;
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

const int timeZone = 6;     // Central European Time
//const int timeZone = -5;  // Eastern Standard Time (USA)
//const int timeZone = -4;  // Eastern Daylight Time (USA)
//const int timeZone = -8;  // Pacific Standard Time (USA)
//const int timeZone = -7;  // Pacific Daylight Time (USA)


EthernetUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets

void setup() 
{
  lcd.begin(20, 4);
  //lcd.print("Time: ");
  
  Serial.begin(9600);
  Ethernet.begin(mac_addr, arduino_addr);
  Udp.begin(localPort);
  setSyncProvider(getNtpTime);
}

time_t prevDisplay = 0; // when the digital clock was displayed

void loop()
{  
  if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) { //update the display only if time has changed
      prevDisplay = now();
        digitalClockDisplay();
        
      }
   }
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(".");
  Serial.print(month());
  Serial.print(".");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  //Serial.println("Transmit NTP Request");
  sendNTPpacket(server_addr);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:                 
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

If I change Serial.print(); function on lcd.print(); I view wrong symbols on my LCD :frowning:
What could be the problem?
LCD is working properly.

Many thanks!

Make a test sketch to print text to the lcd display and see what happens.
Are you running the code on an Arduino Uno ? Are you out of memory ?

When exactly does this happen, do you start seeing it after this, Serial.println("No NTP Response :-("); ?

Hi Peter_n,

I running this code at Arduino Uno and I also runing simple sketch for testing

#include <LiquidCrystal.h>

LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
int counter = 0;
void setup() 
{
  lcd.begin(20, 4);
  lcd.print("Counter:");
}
void loop(){
  //lcd.clear();
  lcd.setCursor(9,0);
  lcd.print(counter);
  delay(1000);
  counter++;
  }

Simple sketch is running properly and lcd.print(); printing normal data to LCD.
Size of NTP sketch after compiling is Binary sketch size: 13,082 bytes (of a 32,256 byte maximum)
I do not see any warning messages in compilation process

Hi HazardsMind,

I stopped NTP server at my Linux box for test and I view diagnostic message "No NTP Response :-(" in serial monitor
After restart NTP server Arduino sent NTP request and receive NTP response and printing time in serial monitor window correctly
but not printing at LCD after replace function

If need I will post screenshot

Do you know the RAM usage ?

Is pin 10 somehow hardwired to the SPI. I think so. Can you use another pin for the lcd ?

Peter_n,

Thank your for your help.
I rebuilt the project slightly rewrote the code (see below)
Part of my project now working properly.

/*
 * Example showing time sync from NTP time source
 * and printing it at LCD
 */
 
#include <Time.h> 
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>
#include <LiquidCrystal.h>

byte mac_addr[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x79, 0xF9 };
IPAddress server_addr(192,168,137,5);
IPAddress arduino_addr(192,168,137,10);
EthernetClient client;
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); 

const int timeZone = 6;     // Central European Time
//const int timeZone = -5;  // Eastern Standard Time (USA)
//const int timeZone = -4;  // Eastern Daylight Time (USA)
//const int timeZone = -8;  // Pacific Standard Time (USA)
//const int timeZone = -7;  // Pacific Daylight Time (USA)


EthernetUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets

void setup() 
{
  lcd.begin(20, 4);
  Serial.begin(9600);
  Ethernet.begin(mac_addr, arduino_addr);
  Udp.begin(localPort);
  setSyncProvider(getNtpTime);
}

time_t prevDisplay = 0; // when the digital clock was displayed

void loop()
{  
  if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) { //update the display only if time has changed
      prevDisplay = now();
      digitalClockDisplay();
      }
   }
}

void digitalClockDisplay(){
  // digital clock display of the time
  lcd.setCursor(2,3);
  printDigits(hour());
  lcd.print(":");
  printDigits(minute());
  //printDigits(second());
  lcd.print(" ");
  lcd.print(day());
  lcd.print(".");
  printDigits(month());
  lcd.print(".");
  lcd.print(year()); 
}

void printDigits(int digits){
  // utility for digital clock display: prints preceding colon and leading 0
  if(digits < 10)
    lcd.print('0');
  lcd.print(digits);
}

/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  //Serial.println("Transmit NTP Request");
  sendNTPpacket(server_addr);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:                 
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}