Apagar una pantalla TFT desde arduino Mega 2560

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.

estas en todo lo correcto, y es verdad, la cosa es que si empleo el arduino UNO no tengo como activar otros elementos que estoy usando en sistema de riego, como una electrovalvula, la cual activo mediante un modulo de Relé, ademas de eso necesito tambien saber cuanta agua he regado, para lo cual empleo un flujometro o caudalimetro, entonces si empleo solo la pantalla en el arduino UNO, no tengo disponibilidad ara los demas elementos del proyecto, es por eso que tuve que migrearme al arduino mega 2560, mi proyecto ya funciona en el arduino Mega, ya esta todo montado, ahora lo unico que me hace falta es no fundir la pantalla por dejarla siempre encendida.

entonces, el sistema funciona asi:

dependiendo si las plantas estan humedas o no se activa la valvula, a veces es a diario y durante unos minutos, en otras ocasiones que llueve a diario puede durar hasta un mes sin tener que colocarles agua, por lo que el sistema esta alerta a las lluvias y mide la cantidad de agua que sale de la electrovalvula para poder saber cuando detener el riego, estos datos los almaceno en el SD para tener el historico y ademas uso ese mismo modulo para importar los letreros que hice con mucho cariño adornados de florecitas para que salgan en mi pantalla, a su vez escribe en la GUI los niveles de agua guardados en el TXT y me informa hace cuantos dias no llueve en casa.

si retiro perisfericos el sistema no hara todo lo que quiero, entonces no voy a poder saber hace cuanto no riego mis plantas y no siempre estoy en casa, lo que no me deja saber si he regado ya mis curcumas y pimientos, y a futuro quiero que me de una alarma si esta lloviendo mucho para activar una sombrilla que los proteja de granizos y otras cosas, por lo que voy a necesitar aun mas sensores, es por esto que veo en Arduino Mega el compañero ideal para el proyecto, por memoria, cantidad de pines, puertos SPI para varios sensores y varios lectores Analogos disponibles con esta pantalla en especifico.

he de mencionar que entre experimentos locos hice eso de apagar la pantalla poniendo en bajo el pin de la alimentacion de la energia y lo unico que logre fue tener que reiniciar el arduino para establecer de nuevo la comunicacion entre la TFT y el arduino.(ademas de hacerme un tremendo embrollo con los dupont que se sueltan y luego no sabes porque nada sirve)

ademas tambien empleo el panel tactil para desplazarme por la GUI que cree y leo el panel cada 100 ms.

mi objetivo es lograr hacer que todo funcione con un panel solar y un par de baterias, solo para garantizar que una tormenta electrica no me va a dejar sin saber como va mi huerta.

otra cosa que me encantaria lograr es que todo el sistema de gestion de energia quepa en un tabique o ladrillo de construccion, incluyendo la electrovalvula, sensorica, reles, arduino y pantalla, entre mas compacto mejor, para poder colocar baterias y panel al interior del mismo.

se que soy muy exigente pero ya tengo casi todo, es muy poco lo que me hace falta y llevo dos años sacandole tiempitos para hacerlo y ahora que acabe la cuarentena, no podre estar mas en casa y tendre que volver a tener que salir de casa para ir a trabajar.

deberia bastar con solo colocar:

#define miso 50
#define mosi 51
#define sck    52 

pero para que funcione debo conectar cables entre los pines 50, 51 y 52 del arduino mega y los pines SD_sck SD_DI y SD_DO, pero estos pines del shield ya estan conectados a los pines fisicos del arduino Mega 11, 12 y 13, por lo que aunque entren en los orficios y las dimenciones sean compatibles, el shield realmente no esta conectado a donde deberia estarlo, mas que un problema de programacion es un problema de compatibilidad de espacio...

es el mismo problema de poder conectar una memoria USB a un cargador de celular de una toma electrica, pero no por ser el mismo puerto sirve para algo o logra hacer algo con la memoria y su informacion.

Ahh bueno pero entonces el shield es el problema no el mega.
Simplemente dobla los pines del shield y conectalos a los 50,51,52 y listo.
Ponlos a 90 grados y luego un array de pines con las conexiones. En tu placa tmb podrias hacerlo.

ya lo hice, quedo horrible y los conectores Dupont se sueltan mucho...


por todas esas cositas pequeñas fue que decidi cambiar la pantalla, ahora funciona bien, esta algo loco porque cambie las fuentes, pero cosa de sentarse a ordenar tamaños de letra y ya.

pero la pantalla si que esta todo el tiempo encendida y al probar la UTFT es supremamente lenta (pero deja apagar la pantalla) a comparacion de la MCUfriend, que no es la 8va maravilla pero hace lo que debe hacer y lo hace bien, pero no deja apagar la pantalla.

es la mas clara demostracion de que siempre vas a tener que sacrificar una cosa por tener otra...

David Prentice es el desarrollador del MCU friend y es quien dio este consejo:

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()

probare a ver si me funciona en el archivo Adafruit_HX8357.h buscando que pines o registros de los ahi declarados activan o desactivan lo que necesito:

asi quedo el prototipo dentro de la libreria Adafruit_HX8357

void begin(uint32_t freq = 0), setRotation(uint8_t r),
invertDisplay(boolean i),
void sleep(void) { writecommand(HX8357_DISPOFF); }
void wake(void) { writecommand(HX8357_DISPON); }
setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h);

acabo de descubrir porque no me funciona, la libreria que tengo instalada es la HX8357 y necesito la HX8347i

y de la libreria que necesito no hay soporte de parte de Adafruit

Hay un gran hilo en Hardware del amigo @TFTLCDCyg sobre pantallas Algunos consejos para usar TFT´s - #243 by TFTLCDCyg
Ahi tienes un gran resumen de qué usar y qué no, para la próxima.

Volviendo a tu tema y al HX8347i
Supongo la encontraste porque esta esto
https://www.ramtex.dk/display-controller-driver/rgb/hx8347.htm?gclid=CjwKCAjw_o-HBhAsEiwANqYhpwJZs6tap4CwH-oyX4iI7A-q-PMZz7v31pVn0GP-XKE1xTXQT1BkXhoCbtEQAvD_BwE

1 Like

si, la verdad la seleccione por esta parte:

Special HX8347 hardware features:

  • A-I variants have slightly different command sets and data formats..*
  • 0-180, 90-270 degree frame buffer rotation with hardware support. Portrait mode, landscape mode.*
  • Full driver software support.

La informacion que me das sobre la compatibilidad con los demas drivers es de mucha ayuda, porque puedo emplear la solucion de David Prentice con el driver 7735 y solo debo colocar correctamente la direccion del registro en memoria que apaga y enciende la pantalla.

#### Seeking a display controller equivalent to HX8347?

Check these:

HX8325 HX8352 HX8353 HX8367 ILI9340 ILI9341 ILI9163 NT39122 SPFD54126 SSD1355 ST7715 ST7628 ST7735 ST7773 ST7789

These display controllers have similar internal configuration and graphic rendering features.
The differences are primarily related to display screen sizes or available bus interface types.

Gracias por ese dato, es de mucha ayuda

dejo esto por aca para compartirlo tambien con los hispan hablantes:

al parecer hay un pin, el cual permite controlar el backlight de la pantalla, solo que no se cual es, ya seguiremos buscando y daremos forma a esto.

El control de la retroiluminación de un TFT de los económicos, que todo mundo usa en sus proyectos para arduino no es simple.

En teoría se podría controlar mediante la manipulación de un registro estableciéndolo en 0 o en 1, sin embargo esto no es así de simple, ya que el pin del TFT que se usa para encender la retroiluminación va conectado directamente a 3.3V en algunos casos y en otros a 5V, por lo que manipular un registro en el TFT no dará los resultados que deseamos.

Hay que considerar que el consumo de energía de los pines restantes que se comunican con el TFT no se verá afectado.

No podemos gestionar directamente el pin de retroiluminación del TFT conectándolo a un pin del arduino, ya que la mayoría de veces la corriente que estos pueden suministrar es inferior a la de los leds del TFT.

La posible solución es utilizar algún mosfet que permita regular por PWM la intensidad de los leds, sin poner en riesgo el pin de control. Podría adaptarse un circuito similar al que se necesita para controlar un motor DC con arduino, la cuestión, es que la demanda de energía se la llevará el mosfet, en lugar de los leds de retroiluminación.

Muy pocas pantallas tienen habilitado un control PWM en los leds de la retroiluminación, pero no son baratas. Las pantallas con chips FT800, FT801, FT81X y BT81X tienen control activo de la retroiluminación. Alguna vez adafruit tuvo entre sus filas un shield TFT que tenía un pin específico para controlar la retroiluminación

WOW muchas gracias por tu explicacion, en muchos foros he visto partes de lo que explicas, pero nada tan concreto y completo, ademas de bien explicado.

si definitivamente he llegado a la conclusion de emplear la pantalla a tiempo completo sin apagarla aunque eso me signifique un consumo de energia muy superior, no tengo de otra, ya que no quiero incrementar costos.

en algun momento pense en emplear una de las pantallas de repuesto que venden en las tiendas de reparacion de celulares, ya que por costo y tamaño resutan una mejor opcion, pero no hay como controlarlas de forma barata y por eso me desanime.

Como es lo del Mosfet?

habria que desarmar la pantalla e intervenirla, soldar un par o dos de clables, un par de resistencias y soldar un cable del mosfet al pin, verdad?

@TFTLCDCyg tienes un poco mas detallada esa solucion, ya para dejarla como ayuda para los hispanohablantes, si me animo lo hago y lo subo para mostrar como se hace.

El control de brillo tal como describe @TFTLCDCyg no es complicado.

Este es un ejemplo para un LCD común.

El comando desde arduino se hace usando pines adecuados para salida PWM (revisar para tu Arduino cuales son) y la instrucción analogWrite(pin, valor) donde valor va de 0 para No Brillo o apagado hasta 255 como máximo.

Para que puedas manipular el pin de retroiluminación deberás construir un shield intermedio entre el MCU y tu pantalla. Existen placas para prototipo que ajustan perfectamente al formato del MEGA o del UNO.

Como señala surbyte es una de las posibles formas de manipular la retroiluminación, para extender la vida útil de tu TFT.

También podrías agregar un relevador y accionarlo con el panel táctil de tu pantalla, asignas un botón en una posición específica para que te permita encender o apagar los leds de la retroiluminación a voluntad.