LCD does not work unless Arduino is reset.

I still thihk the problem is that the device is not ready when the begin() command send commands to the device. I suggest trying the following, one at a time:

  1. Make sure you have a call to lcd.begin(...) in setup - assuming your LiquidCrystal variable is called "lcd".

  2. Add a delay in setup() before the begin(...) call as per retrolefty's suggestion.

  3. If that doesn't fix it, the problem may be that the lcd.begin() call in the LiquidCrystal constructor is happening too soon. Preferably, recompile the LiquidCrystal library with the begin() call at LiquidCrystal.cpp line 82 commented out. Alternatively, the following may work (it compiles but is otherwise untested):

  • Replace the declaration "LiquidCrystal lcd(...);" by the following:
void* operator new(unsigned int sz)
{
  return malloc(sz);
}

LiquidCrystal *pLcd;
  • Put the following in setup, before the lcd.begin(...) call:
  delay(1000);    // delay as per retrolefty's suggestion
  pLcd = new LiquidCrystal(...);   // insert correct pin numbers here
  • Replace every instance of "lcd." by "pLcd->"

hey there. I do have a call to begin in the set-up.

I have tried al sorts of delay times before the begin but does not seem to help

I not sure how I recompile the library?

I just tried the last suggestion, replacing some of the bits but could not get that too complie :frowning:

dtokez:
I just tried the last suggestion, replacing some of the bits but could not get that too complie :frowning:

What compile errors are you getting, and on what lines? If you post your sketch, I can try making the changes and see what problems there are compiling it.

Hi there, here is what I have currently

#include <LiquidCrystal.h>
void* operator new(unsigned int sz)
{
  return malloc(sz);
}

LiquidCrystal *pLcd;


//LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int analoginput = 0;
int analoginput1 = 1;
int analoginput2 = 2;
float vin = 0.0;
float vin1 = 0.0;
float vin2 = 0.0;

void setup(){
  delay(1000);    // delay as per retrolefty's suggestion
  pLcd = new LiquidCrystal(7, 8, 9, 10, 11, 12);   // insert correct pin numbers here
  
  
delay(100);
 pLcd.begin(16, 2);
delay(100);


    pLcd.setCursor(0, 0);
   pLcd.print("REAPsystems V1.1");
       lcd.setCursor(0, 1);
   pLcd.print("iSensor tester");
   
   
delay(4000);
   
   
   
  pLcd.clear();

}



void loop(){
  
  
     delay(1400);


 // read the value on analog input
pLcd.setCursor(0,0);
pLcd.print ("Vin:");
vin = analogRead(analoginput)*5.00/1024*2;
pLcd.print(vin, 3);
pLcd.print ("v");
 
pLcd.setCursor(0,1);
pLcd.print ("R:");
vin1 = analogRead(analoginput1)*5.00/1024;
pLcd.print(vin1, 2);
pLcd.print ("v");


pLcd.setCursor(9,1);
pLcd.print ("O:");
vin2 = analogRead(analoginput2)*5.00/1024;
pLcd.print(vin2, 2);
pLcd.print ("v");


delay(1400);

}

You need to replace "pLcd." by "pLcd->" everywhere, as in my original instructions.

thanks I overlooked the symbols :drooling_face:

I'm getting another compile error now on this line pLcd->.begin(16, 2);

do i still need that in there?

yes but remove the . in the middle.

Thanks, I should have checked my code properly!

Just complied, and downloaded to my arduino but I'm sad to say the problem is still the same :frowning:

OK, here is one more suggestion. Change the start of setup() to this:

pinMode(8, OUTPUT);
digitalWrite(8, LOW);
delay(5000);
pLcd = new LiquidCrystal(7, 8, 9, 10, 11, 12);   // insert correct pin numbers here
delay(100);
pLcd->begin(16, 2);
....

i.e. set the enable pin to be an output and drive it low early on.

PS - an alternative that might work even better would be to add a pulldown resistor between the EN input to the LCD and ground. What I'm trying to do is to make sure the LCD doesn't think it's receiving any commands while it powers up.

does not work mate.

I'm just going to try the hardware solution now (pull down)

Thanks for the help

  1. Can you confirm that the LCD doesn't work after power up, but always works if you then press the reset button?

  2. Confirm you have the LCD RW pin connected to Vcc?

  3. If the answer to both the above is yes and the pulldown on EN doesn't work, it might be worth trying:

  • a pulldown on the RS pin as well
  • sending 2 begin() calls in setup() instead of just one, with a large delay between them

1- Indeed, that is the behaviour that I'm currently dealing with.

2- Pin 5 (r/w) is tied to gnd, as per this tutorial that I followed?.. Arduino Tutorial - connecting a parallel LCD

I tried a 100k to gnd on the E pin but still the same, also just tried two begin calls with a 1 sec delay in between, also no good :frowning:

dtokez:
1- Indeed, that is the behaviour that I'm currently dealing with.

Very strange. The Arduino reset line does not go to the LCD, therefore what's resetting the LCD after you press reset must be the begin() call in the LCD constructor and/or the begin() call in setup(). So the question is, what else are you doing in your sketch that is making those calls work?

I'm running out of ideas, but maybe it is some other command you sent the LCD before you pressed reset, like printing characters or setting the cursor location. So all I can suggest now is that in between making those 2 begin calls in setup, you try try doing those things.

dtokez:
2- Pin 5 (r/w) is tied to gnd, as per this tutorial that I followed?.. Arduino Tutorial - connecting a parallel LCD

Yes, RW to Gnd is correct, not Vcc.

I see what you mean about calling the reset, its no different to when it first powers up because the arduino starts running exactly the same code.

I guess it must be something going wrong with the lcd on initial power up? Maybe its not ready and initializes before the arduino?

I'm really stumped lol.

Thanks for the help, much appreciated

by the way, if it helps to understand here is the code that I'm currently running

#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

int analoginput = 0;
int analoginput1 = 1;
int analoginput2 = 2;
float vin = 0.0;
float vin1 = 0.0;
float vin2 = 0.0;

void setup(){
delay(100);
 lcd.begin(16, 2);
delay(1000);
 lcd.begin(16, 2);

    lcd.setCursor(0, 0);

       lcd.setCursor(0, 1);
   lcd.print("iSensor tester");
   
   
delay(4000);
   
   
   
  lcd.clear();

}



void loop(){
  
  
     delay(1400);


 // read the value on analog input
lcd.setCursor(0,0);
lcd.print ("Vin:");
vin = analogRead(analoginput)*5.00/1024*2;
lcd.print(vin, 3);
lcd.print ("v");
 
lcd.setCursor(0,1);
lcd.print ("R:");
vin1 = analogRead(analoginput1)*5.00/1024;
lcd.print(vin1, 2);
lcd.print ("v");


lcd.setCursor(9,1);
lcd.print ("O:");
vin2 = analogRead(analoginput2)*5.00/1024;
lcd.print(vin2, 2);
lcd.print ("v");


delay(1400);

}

Following on from my previous reply, does it work if you repeat all the code in setup() again? i.e. do the whole block twice over.

btw I see that the AdaFruit tutorial says to connect the backlight directly between Vcc and gnd, but I think on some lcds such as the one I have, you need a series resistor for the backlight.

Just tried with the set up doubled, still no good :frowning:

Thanks for the heads up, I did use a resistor on the backlight.

I really think its something simple that I'm doing wrong, because I have tried 3 different types screens, and two arduino's with all the same results :expressionless:

I can only thing of 2 3 things left to do:

  1. Send the initialisation sequence yourself in setup(). See page 12 of the datasheet at http://www.egochina.net.cn/eBay/Download/SPLC780D.pdf for the sequence for 4-bit interface. For each item in the sequence, you need to wait for any delay time that is indicated, set the pins to the specified values, then pulse the EN pin high and then low again. If no delay time is indicated, you still need a delay between commands, but I can't find anything in the data sheet that says how long.

  2. Try with the RW pin also connected to the Arduino, using the LiquidCrystal constructor that takes 7 pin numbers. That way, the LCD library will wait for the busy flag to clear before sending new instructions to the LCD.

  3. Take a copy of the LiquidCrystal .cpp file and include it in your sketch, but double all the delays.

  1. Try with the RW pin also connected to the Arduino, using the LiquidCrystal constructor that takes 7 pin numbers. That way, the LCD library will wait for the busy flag to clear before sending new instructions to the LCD.

If you are talking about the LiquidCrystal library that is suppiled with the Arduino IDE that won't help at all. All the LiquidCrystal library does with the R/W pin is drive it low and keep it there. What you would be accomplishing is just unnecessarily tying up a extra Arduino I/O pin.

On the other hand the LiquidCrystal440 library will indeed use the busy flag as described but that won't help you either since you can't use the busy flag during the early part of the initialization where the LCD controller reset is being accomplished. The improved time delays in the library will likely take care of your problem.

Don

It sounds like he should try the LiquidCrystal440 library then. How can he get it?