Apagar una pantalla TFT desde arduino Mega 2560

Hola a todos, estoy construyendo un sistema que riegue mis plantas cuando no estoy en casa o cuando se me olvide y para leer cuanta agua les ha puesto he usado un flujometro y visualizo los datos en una pantalla TFT tactil, pero en el Datasheet de la pantalla dice que no dura mas de 120 horas encendida antes de dañarse, asi que he estado buscando y en otros datasheet de la misma pantalla dice que se puede encender y apagar por software, pero no tengo ni idea de como hacerlo.

les agradezco si me pueden hacer el favor de guiarme para lograr que la pantalla se apague y se encienda, dejo aqui la referencia de la pantalla y los datasheets:

pantalla MCUfriend 2.4"

pagina 80 indica como apagar y encender la TFT (ayuda con esto)

EDITO: tambien dicen en otro foro que se puede apagar desconectando la energia de alimentacion de la pantalla, pero ya hice eso y al reconectar la energia no se sincroniza la pantalla con el arduino, por lo que estoy buscando como reconectarla por software.

aunque si pudiese apagarla y encenderla sin necesidad de conexiones extra de Hardware seria fantastico.

Screenshot 2021-06-12 at 02-46-57 ST7781_SPEC_V1 0_20090210 - st7781 pdf
por si acaso a futuro no se puede ver el datasheet, adjunto la imagen de la pagina 80

estudiando un poco y con calma el datasheet, dice en la pagina 79 el proceso para iniciar el modo STAND BYE pero de nuevo no tengo idea de como hacerlo, como para probar con ambos metodos a ver que sirve, si apagarla o solo ponerla en espera.

claro que comprendo que indican activar determinados registros del micro de la pantalla, pero ¿como se hace desde arduino?, porque voy a estar cambiando registros de un segundo microcontrolador, desde el primero y ahi es donde me pierdo por 2da vez.

Estas enfocando el problema a progamar a "bajo nivel" , es decir a progamar al arduino para que encienda o apaque los pines correspondientes para realizar lo que quieres. Pero esas funciones ya la realizan las librerias. En ellas debes buscar la solución , mira en los ejemplos de la libreria que estas usando o en un fichero que tendras el la carpeta de la libreria llamado KEYWORD.TXT, en el que se indican los posibles comandos de esa libreria. Por ejemplo pra apagar mi tft solo tengo que usar en cualquier lugar del codigo el comando: " myDisplay.noDisplay(); " y ya se encarga la libreria de encender o apagar los puertos de la forma adecuada.
Saludos.

Oh, gracias no sabia eso, al buscar el fichero Keywords.txt encontre que hay una serie de comandos y los metodos que requiero estan comentados con un "#" al comienzo, dejo copia del archivo, sin embargo al implementarlas en mi codigo aparece el error:

'class MCUFRIEND_kbv' has no member named 'lcdOff'

lo que quiere decir que mi libreria no tiene implementado este metodo pese a que aparece en el archivo Keywords.txt

por lo que me quedan 2 opciones o lo desarrollo e implemento o simplemente cambio de pantalla y libreria.

archivo Keywords:

#######################################
# Syntax Coloring Map For Mcufriend_kbv
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

MCUFRIEND_kbv	KEYWORD1
#UTFTGLUE	KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################

#InitLCD	KEYWORD2
#LCD_Write_DATA	KEYWORD2
WriteCmdData	KEYWORD2
begin	KEYWORD2
#clrScr	KEYWORD2
color565	KEYWORD2
#dispBitmap	KEYWORD2
#drawBitmap	KEYWORD2
drawCircle	KEYWORD2
drawFastHLine	KEYWORD2
drawFastVLine	KEYWORD2
drawLine	KEYWORD2
drawPixel	KEYWORD2
drawRect	KEYWORD2
drawRoundRect	KEYWORD2
fillCircle	KEYWORD2
fillRect	KEYWORD2
fillRoundRect	KEYWORD2
#fillScr	KEYWORD2
fillScreen	KEYWORD2
#getDisplayXSize	KEYWORD2
#getDisplayYSize	KEYWORD2
height	KEYWORD2
invertDisplay	KEYWORD2
#lcdOff	KEYWORD2
#lcdOn	KEYWORD2
#ltoa	KEYWORD2
#print	KEYWORD2
#printNumF	KEYWORD2
#printNumI	KEYWORD2
#println	KEYWORD2
pushColors	KEYWORD2
readGRAM	KEYWORD2
readID	KEYWORD2
readPixel	KEYWORD2
readReg	KEYWORD2
readReg32	KEYWORD2
reset	KEYWORD2
setAddrWindow	KEYWORD2
#setBackColor	KEYWORD2
#setColor	KEYWORD2
#setContrast	KEYWORD2
setCursor	KEYWORD2
#setFont	KEYWORD2
setRotation	KEYWORD2
#setrgb	KEYWORD2
setTextColor	KEYWORD2
setTextSize	KEYWORD2
#settextcursor	KEYWORD2
vertScroll	KEYWORD2
width	KEYWORD2
#write_data_block	KEYWORD2

es por este motivo que andaba buscando una solucion de programacion a bajo nivel, pero estas circustancias me hacen creer que si no fue implementado es porque posiblemente no sea posible hacerlo por alguna circunstancia extraordinaria.

Por eso la opcion por la que opto es cambiar de pantalla y libreria

No cabies de pantalla , cambia solo la libreria a una que te permita apagarla.

si claro,eso es aun mas interesante, logre encontrar esta libreria modificada que al parecer funciona mejor que la descargada desde el gestor de librerias de arduino, se trata de la UTFT_modificada, la cual puedes descargar desde el link anterior o desde esta pagina UTFT modificada

Si y esa libreria contiene los comandos :lcdOff y lcdOn lo cual solucionaria tu problema.

1 Like

si, exacto, apenas pude abrirla fui a buscar esos comandos y en efecto estan disponibles en el Keyword.txt, hay dije, la mitad de mis problemas estan solucionados y ademas hay mas cosas, Gracias por tu ayuda @gonpezzi

OK:
Saludos

Reabro el hilo porque probe para arduino UNO y funciona la libreria, para Arduino Mega no funciona por tema de compatibilidad entre pines, asi que 11,12 y 13 no son lo mismo que 51,50,52, asi que no me funciono esta pantalla, asi que compre una nueva, de la que no etngo soporte en esa libreria, tuve que probar otra y otra y ahora no hay mucho respaldo.

MCU friend es una buena libreria que tiene el respaldo para el driver pero no para apagarlo, asi que adquiri una nueva pantalla, la tercera, esta vez siendo mas cuidadoso.

ahora estoy trabajando con una Himax 8347-I compatible para arduino Mega y todo va bien excepto por el tema de apagado, dice David Prentice que se puede hacer esto:

david_prentice

Sep '15

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.

pero al usarlo con la MCU Friend me dice que writecommand no esta declarado en ninguna parte...

asi que he quedado loco. tienes alguna idea de que mas puedo hacer @gonpezzi ?

trate de usar el pin de Backligth Control que segun el Datasheet es el numero 1, pero no encuentro un esquematico que me indique cual es el pin 1, como para saber si es el mismo pin en Arduino o al menos saber en que pin hace Contacto, dejo por aqui los dos Datasheets que estoy empleando a ver si he pasado de largo algun dato importante.

pantalla TFT 2.8- T28-HX8347I-V12-ETC.pdf (690.0 KB)
en algun sitio de este datasheet encontre que 1|DB0

https://www.waveshare.com/w/upload/0/09/HX8347-D_DS_T_preliminary_v01_081129.pdf he aqui el segundo Datasheet

En respusta al post#14

Me resulta raro que no funcione con el MEGA.
Yo bajé el UTFT y veo que tiene soporte para todos los AVR.

// Include hardware-specific functions for the correct MCU
#if defined(__AVR__)
	#include <avr/pgmspace.h>
	#include "hardware/avr/HW_AVR.h"
	#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
		#include "hardware/avr/HW_ATmega1280.h" 
	#elif defined(__AVR_ATmega328P__)
		#include "hardware/avr/HW_ATmega328P.h"
	#elif defined(__AVR_ATmega32U4__)
		#include "hardware/avr/HW_ATmega32U4.h"
	#elif defined(__AVR_ATmega168__)
		#error "ATmega168 MCUs are not supported because they have too little flash memory!"
	#elif defined(__AVR_ATmega1284P__)
		#include "hardware/avr/HW_ATmega1284P.h"
	#else
		#error "Unsupported AVR MCU!"
	#endif

Incluido el MEGA, con esto quiero decir que si tu pones

#include <SPI.h>

la seleccion de pines debería corresponderse con el AVR que se este usando.

si, funciona para todo AVR, lo que pasa es que por cuestion de espacio necesito que el TFT valla montado sobre el Arduino, y los pines conectan pero no puedo activar la SD, porque los pines donde debe ir la coneccion SPI del arduino UNO y del arduino Mega no son compatibles, es decir, enciende la pantalla, grafica, puedo apagarla pero no puedo encender la SD, accesar para cargar imagenes, tampoco puedo accesar la SD para guardar data y para poder hacerlo debo recablear todo,(4 cables) es decir mi nuevo problema es de espacio y cableado, por lo que he tenido que cambiar de pantalla en ultimas.

en el Arduino UNO son los pines 10,11,12,13 y en el mega son los pines 51,50,52,53, por lo que la imagen puede mostrar que el problema son las ubicaciones de los pines.

de hecho al conectar MISO, MOSI, CLK y el pin de activacion del dispositivo, puedo encender la SD, accesarla y todo funciona, pero necesito hacerlo compacto.

Gracias por tu atencion.

he estado siguiendo estos consejos, pero no logro apagarla, al parecer hay un pin, no se cual que logra apagar el backlight, pero no lo encuentro en los Datasheet de la pantalla.

se que uno de los primero 6 pines es el de backligth, solo que no se cual,

> JP4 (6 pins)
> used for powering the shield
> These libraries I am using

esto ya lo hice y en efecto funciona la pantalla con el soporte y todo bien, pero sin apagar la pantalla:

When using the MCUFRIEND_kbv library, you must edit some files in it:
mcufriend_kbv.cpp:
#define SUPPORT_8347D

mcufriend_shield.h:
#define USE_SPECIAL

mcufriend_special.h:
#define USE_MEGA_16BIT_SHIELD

And since this shield is write-only, you MUST force the ID in EVERY sketch:
tft.begin(0x9595); //HX8347-I

luego en este otro foro me han dado algunas guias, pero claramente me he metido en un lio grande, ya que no resulta trivial de resolver, ya que estan empleando la misma pantalla que he comprado y aunque MCUfriend ya tiene soporte con esta pantalla, aun no se como podria apagarla/ponerla en SLEEp mode/ en IDLE/ StandBy o cualquier modo que evite que se estropee en solo un par de dias por estar encendida mucho tiempo.

tambien estudiando un poco de todo lo que hay en el foro, encontre esta gran idea, pero me dice el compilador que writecommand no esta declarada en este scope

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.

No quiero distraer tu atención pero una cosa son los pines SPI del MEGA y otro el pin de Chip Select
image

Como verás
SCK es 52
MOSI es 50
MISO es 51
SS que es el Chip Select puede ser 53 pero tmb puede ser el que gustes.
Solo para que lo tengas en cuenta.
Es posible y no te lo discuto que la placa este cableado o sea la pista apunte a digamos la 9 y si defines la 9 como en el UNO debería funcionar.