How to turn off a TFT display?

Hallo,

[u]to save battery life of my motorcycle[/u] I would like to be able to turn off my TFT display power and after send Arduino in sleep mode. But... how to do that? :-[

The display I'm using is the Adafruit 1.44" color TFT. It is powered by the Vcc pin of an Arduino Pro Mini 328 - 16Mthz/5Volt as suggested by the instructions.

It would be possible to power the TFT by using a digital output pin of the Pro Mini? So I could simply set the pin to zero and turn off the display to save the battery. It's a bad idea? :-*

Below my power consumption measurements: (I've also realized a small overvoltage-protection circuit)

Protection circuit + Arduino Pro Mini +

TFT display (at 100% backlight) =

35 mA circa

Accordingly to what reported here the consumption of the Pro Mini itself should be around 12.7 mA. So the TFT display can be powered with 22 mA or less (some current is absorbed by the protection circuit also).

use i extra pin as output and connect it to lcd's power pin , whenever you want to turn the lcd, make the pin HIGH and whenever you want to turn off the lcd make that pin LOW. its very simple :)

Nilanj: use i extra pin as output and connect it to lcd's power pin

Thanks Nilanj, I will do it. I was in doubt until I discovered a detailed explanation about pin current limitations on the Arduino website. Since my Pro Mini mount the 328 chip that explanation applies to my case too.

Roughly: max 40 mA per digital output pin is supported, but 20 mA are recommended. So I should have no problems.

Thanks!

Measure the current taken by the backlight. You will probably be ok with the 1.44" display. Bigger TFT displays draw serious current for their backlight. Use a transistor or MOSFET to do the switching.

Since you are mounting this on a motorbike, you will not worry about microampere sleep currents. If you want the minimal current, keep the TFT controller powered but give it a "DISPLAY OFF" command before sending the AVR to sleep.

David.

Thanks for the suggestions David. I will keep them on mind when/if I will migrate to a bigger TFT display.

BTW, what you mean exactly with "DISPLAY OFF" command? There is no such command for the adafruit 1.44" display. I missed something?

Your display uses a ST7735R controller. This has a SLEEPIN command (0x10) and a SLEEPOUT command (0x11)

Most current will be taken by the backlight LED(s). The controller gets sent into Sleep with the tft.writecommand(0x10); The controller gets wakes up from Sleep with the tft.writecommand(0x11);

The Adafruit library has writecommand() as a private method. The easiest way to control Sleep is by editing the public methods in "Adafruit_7735.h" file: from

           ...
           setRotation(uint8_t r),
           invertDisplay(boolean i);
  uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);
  ...

to

           ...
           setRotation(uint8_t r),
           invertDisplay(boolean i);
  void   sleep(void) { writecommand(ST7735_SLPIN); }
  void   wake(void) { writecommand(ST7735_SLPOUT); }
  uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);
  ...

Untested. You would call with tft.sleep() and tft.wake()

In practice, I doubt if you want to go to sleep when riding your motorbike. I expect that you would be perfectly happy with just switching the AVR+TFT on and off with your ignition. All the time that the engine is running, you have plenty of power. If you want to "remember" your journey or average speed, you save them in the AVR EEPROM when you turn the ignition off.

The computer on my pedal-cycle runs on a CR2032 coin cell. It goes to sleep when the bike is not moving. It wakes up when you start cycling or if you press the buttons. It retains all the data until you change the battery. The CR2032 lasts for a couple of years, but you cannot read it at night because there is no backlight.

David.

1 Like

David would this work on a mega r3 with a 5 inch SSD1963 based display? Im using one with UTFT library and after doing testing, found that with the display connected (16bit mode) and connected to power on 5v and 3.3v lines, draws 390mA. If i run the mega (same code) with screen and sheild completely disconnected (all 30 or so wires) it draws 84mA. If i run the screen connected and just pull the 5v and 3.3v lines the screen goes out but still draws 300mA through the mega and upon reconnecting the screen power, i find the screen does not require re initialisation. Its like the screen is pulling power through all the data lines also. Im trying to shut down the screen so the mega can go into sleep mode and in the future possibly wake it occasionally to uplodd data to xively and go back to sleep. Then a IR sensor will detect if i walk into the room and wake up the screen. Do you have any information that can help me? Many thanks for info you have supplied already.

Switch the backlight LEDs off. Depending on your particular module, it may already be possible to do this in software. Put the TFT controller to sleep. It may have some other "power saving" commands. You will need to read the SSD1963 data sheet. UTFT has no official method of writing directly to the registers but it allows public access to several things that should be private. i.e. you can write helper functions.

I am fascinated by a motorbike with a 5" screen. I would have thought you would be concentrating on the road ahead!

Arduinos are not really designed for power saving.

David.

Thanks David - i will check it out!

Ok ive added the lcdOff (); and lcdOn (); to the cpp file under the model number SSD1963_800 which makes the screen fade away when lcdOff (); is initiated. (Sends 0x10) Sweet! So now i can biuld it into my project together with something which will cut power to the backlight as well. Didnt have time tonight to set up the current draw measurement equipment but will report it back later in case others need to use this on their CTE50 screen also (im using the sainsmart version of the SSD1963 5inch screen) And its working awesome! (Yeah its a sainsmart too i know who knew?)

Not sure if anyone else is interested in this, but I have had limited success. I enabled the lcdOff(); function which indeed turns the display off. I can connect some power transistors later to the power wires to disconnect power to the screen later, meanwhile I am just pulling the 5 and 3.3 v lines out during testing. I have even enabled the AVR/SLEEP command, which also works. If I run the sleep command in a separate code, it reduces current down to 25mA. great! With the screen code also included, and the screen running, unfortunately it is still running at 290mA with the AVR in sleep, and the LCD display off, and the power wires pulled. If I send data to the seriel port, the whole lot wakes up as it should. (nice!)

Weird. Its like the data lines between the Mega and the screen shield are still working in the background and pulling power. (theres like 19 data lines, which take up the mega pins 22 to 41. Is anyone able to offer any suggestions? I even thought of maybe changing the pins setup to a high impedance, like set pin to (INPUT) and then switch it back again when it all wakes up. Would this work?

cheers

If I can get the power down to 25mA or lower that would be perfect.

Well I just tried switching all the pins 22 to 41 into input mode (turning them to high impedance state)
and when I initiated the lcd off and avr sleep and pinmode INPUT, it reduced the current down to 40mA.
if I plug the screen power back in, and then wake it back up, (and set the pins back to OUTPUT mode) everything comes back to life.
Now to see if there are other ways I can save power:)

I used

 for (int p = 22; p < 42; p++ ) {  // turns pins back on for display

  pinMode(p, OUTPUT);

  }

Ok no one is following this so i guess this is now a blog lol but that's all good. I now have a working unit that goes to sleep unless someone stays in the room. The PIR is connected to an interrupt and wakes it up. I had to install two small relays on the 0v and 5v power lines so there was no voltage drop. Transistors just made the 0v more like 0.6v and the vcc was more like 4.6v rather than 5v which caused wierd problems. Forcing all the data lines into input mode before sleep is the key. Now it uses 412mA during normal operation and only 63mA during sleep. And it wakes up nicely.

@Stimps can you share further findings and/or sources? I am also in the process of trying to switch off the display for power savings. Preferably while still having the Touch Sensors alive (touch==on, timeout==off)

Regards!

Nilanj: use i extra pin as output and connect it to lcd's power pin , whenever you want to turn the lcd, make the pin HIGH and whenever you want to turn off the lcd make that pin LOW. its very simple :)

Great idea, BUT... if you use code to power it down (set pin LOW), when you set HIGH again to turn on the display, wouldn't code have to init the display again?

Like, myGLCD.InitLCD(); ??