Pantalla QVGA 2.2 TFT SPI 240X320 refrescar datos. (SOLUCIONADO)

Intento usar una TFT esta en concreto:

El tema es que al imprimir en la pantalla los valores de humedad y temperatura se imprime bien pero si el valor cambia permanece el numero antiguo y el nuevo se superpone encima y se ve fatal. Dejo unas fotos de prueba adjuntas en la primera todo bien pero en la segunda se ve en donde dice Humedad la cifra se superpone y pasa con todas.

Estoy seguro que es mi código de noob total.

Alguien sabe como se refrescan este tipo de pantallas? o como mostrar esta info por la tft correctamente?

El sketch usado:

#include "SPI.h"
#include "DHT.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"


// NANO
#define TFT_DC 9
#define TFT_CS 10
#define TFT_SCK 13
#define TFT_MISO 11
#define TFT_MOSI 12
#define TFT_RST 10

  // DHT22
  #define DHTPIN 2         
  #define DHTTYPE DHT11    
  DHT dht(DHTPIN, DHTTYPE);
  // END DHT22

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST, TFT_MISO);

int SoilSensor;

 void setup() {

  dht.begin();
  tft.begin();
  tft.setTextWrap(true);
  tft.setRotation(3);
  tft.fillScreen(ILI9341_BLACK);
  
}

  void loop() {
      
  int h = dht.readHumidity();    //Se lee la humedad DHT11.
  int t = dht.readTemperature(); //Se lee la temperatura DHT11.
  
  SoilSensor = analogRead(A0);
  SoilSensor = map (SoilSensor, 0, 1023, 100, 0);
  
  tft.setTextColor(ILI9341_GREEN);
  tft.setTextSize(3);
  tft.setCursor(55, 0);
  tft.print("EasyGrowWeed");
  tft.setTextSize(2);
  tft.setCursor(65, 30);
  tft.print("By Hiddenotebook");
  tft.setTextColor(ILI9341_WHITE);
  tft.setCursor(0, 60);
  tft.println("Datos del Ambiente.");
  tft.println("");
  tft.print("Humedad:     ");
  tft.print(h);
  tft.println("%");
  tft.print("Temperatura: ");
  tft.print(t);
  tft.print((char)247);
  tft.println("C");
  tft.println("");
  tft.setTextColor(ILI9341_BLUE);
  tft.print("Agua en Sustrato: ");
  tft.print(SoilSensor);
  tft.print("%");
}

Un saludo!

Después de días probando códigos que tardaban mucho en refrescar la pantalla he dado con algo en tiempo real y es tan fácil que me da vergüenza jajaja pero bueno yo lo voy a dejar dicho para que otro no pierda su fin de semana intentando esta parida.

Al lio, el código que deje funciona pero los números se superponen cuando cambia la cifra, para refrescar los números basta con jugar con el color del texto. En el Primer código cuando selecciono el color del texto así: tft.setTextColor(ILI9341_WHITE,); imprime los números pero cuando cambian se sobrescriben y no se ve bien, la solución es poner el color del fondo de pantalla después del color del texto así: tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);, desconozco si es la mejor manera pero es la que yo he podido sacar.

Dejo el código por si a alguien le interesa.

#include "SPI.h"
#include "DHT.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"


// NANO
#define TFT_DC 9
#define TFT_CS 10
#define TFT_SCK 13
#define TFT_MISO 11
#define TFT_MOSI 12
#define TFT_RST 10

  // DHT11
  #define DHTPIN 2         
  #define DHTTYPE DHT11    
  DHT dht(DHTPIN, DHTTYPE);
  // END DHT11

Adafruit_ILI9341 tft = Adafruit_ILI9341 (TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST, TFT_MISO);

int SoilSensor;

 void setup() {

  dht.begin();
  tft.begin();
  tft.setTextWrap(true);
  tft.setRotation(3);
  tft.fillScreen(ILI9341_BLACK);
  
}

  void loop() {
      
  int h = dht.readHumidity();    //Se lee la humedad DHT11.
  int t = dht.readTemperature(); //Se lee la temperatura DHT11.
  
  SoilSensor = analogRead(A0);
  SoilSensor = map (SoilSensor, 0, 1023, 100, 0);
  
  tft.setTextColor(ILI9341_GREEN);
  tft.setTextSize(3);
  tft.setCursor(55, 0);
  tft.print("EasyGrowWeed");
  tft.setTextSize(2);
  tft.setCursor(65, 30);
  tft.print("By Hiddenotebook");
  tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
  tft.setCursor(0, 60);
  tft.println("Datos del Ambiente.");
  tft.println("");
  tft.print("Humedad:     ");
  tft.print(h);
  tft.println("%");
  tft.print("Temperatura: ");
  tft.print(t);
  tft.print((char)247);
  tft.println("C");
  tft.println("");
  tft.setTextColor(ILI9341_BLUE, ILI9341_BLACK);
  tft.print("Humedad Sustrato: ");
  tft.print(SoilSensor);
  tft.print("%");
}

Vídeo de la pantalla trabajando

:o Yo pensaba que esta arreglado pero nop, cuando sale un número encima de otro si que funciona mi solución, pero cuando marca 100% por ejemplo y después 1% lo muestra así: 1%%% esta solución no sirve :frowning: :frowning: :frowning: :frowning:

Lo mejor es que le des formato a los resultados numéricos empleando una variable tipo char. No es necesario que definas una para cada variable, con tan solo definir una para presentar resultados es mas que suficiente.

Por ejemplo, usando tus propias lineas así quedaría definida la variable tipo char:

int SoilSensor;
char textBuff[40];

---> Copia esa linea adicional en la zona del encabezado de tu código

Ahora bien, para poder usarla, tomé la linea en la que presentas la humedad del sustrato, y le cambié el color.

  tft.setTextColor(ILI9341_YELLOW, ILI9341_BLACK);
  tft.println("");  
  tft.print("Humedad Sustrato:");
  sprintf(textBuff, "%3d", SoilSensor);  
  tft.print(textBuff);
  tft.print("%");

---> Coloca éstas lineas al final de tu sketch y mira como funciona

En particular en esta parte de la instrucción sprintf:

"%3d"

Indicamos que el número que estamos convirtiendo en texto, en pantalla tendrá un máximo de 3 caracteres. Al pasar de 100 a 99, por ejemplo, se eliminará el 1 y solo aparecerá 99, además el símbolo % no se desplazará a la izquierda, y por lo tanto no te dejará caracteres remanentes.

wow! millones de gracias funciona perfecto :wink: te he leído buscando cosas sobre las TFT eres un crack y tienes una bonita colección de pantallas muchas gracias por la ayuda!!

Dejo el resultado porque seguro que a alguien le ayuda:

#include "SPI.h"
#include "DHT.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

// NANO
#define TFT_DC 9
#define TFT_CS 10
#define TFT_SCK 13
#define TFT_MISO 11
#define TFT_MOSI 12
#define TFT_RST 8

#define DHTPIN 2         
#define DHTTYPE DHT11    
DHT dht(DHTPIN, DHTTYPE);

#define RELAY_ON 0
#define RELAY_OFF 1
#define RELAY_1 3

Adafruit_ILI9341 tft = Adafruit_ILI9341 (TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST, TFT_MISO);

int SoilSensor;
char textBuff[40];
int histeresis = 10; // Margen de riego

void setup(void) {

pinMode(RELAY_1, OUTPUT);
digitalWrite(RELAY_1, RELAY_OFF);

dht.begin();
tft.begin();
tft.setTextWrap(true);
tft.setRotation(3);
tft.fillScreen(ILI9341_BLACK);

}

void loop(void) {
    
int h = dht.readHumidity();    //Se lee la humedad DHT11.
int t = dht.readTemperature(); //Se lee la temperatura DHT11.

SoilSensor = analogRead(A0);
SoilSensor = map (SoilSensor, 0, 1023, 100, 0);

tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(3);
tft.setCursor(55, 0);
tft.print("EasyGrowWeed");

tft.setTextSize(2);
tft.setCursor(65, 30);
tft.print("By Hiddenotebook");

tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.setCursor(0, 60);
tft.println("Datos del Ambiente.");
tft.println("");
tft.print("Humedad aire:    ");
sprintf(textBuff, "%3d", h);  
tft.print(textBuff);
tft.println("%");
tft.print("Temperatura aire:");
sprintf(textBuff, "%3d", t);  
tft.print(textBuff);
tft.print((char)247);
tft.println("C");

tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK); 
tft.print("Agua en Sustrato:");
sprintf(textBuff, "%3d", SoilSensor);  
tft.print(textBuff);
tft.print("%"); 

  if (SoilSensor < 85)
{
  digitalWrite(RELAY_1, RELAY_ON);
}

if (SoilSensor > (85 + histeresis)) // Parar de regar al 95%
{
  digitalWrite(RELAY_1, RELAY_OFF);
}

}

Vídeo demostrativo

Lo que no entiendo muy bien es que a pesar de hacer el buffer para la temperatura y la humedad ambiente si quito el color negro en tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK); ahí sigue sin refrescar los números.

Que bien que te funcionó.

Ampliando un poco más la función sprintf, al final del hilo hay una buena explicación de como funciona, la conozco poco pero viene excelente para presentar datos numéricos en tiempo real y lo mejor con un formato.

Respecto a la duda que tienes; en la instrucción:

tft.setTextColor(ILI9341_CYAN, ILI9341_BLACK);

El primer color corresponde al color del texto, la segunda definición de color corresponde al fondo del texto. Esta combinación de alguna forma dibuja una máscara atrás de las letras, con la idea de eliminar caracteres remanentes cuando sobreescribes en la misma posición. Si retiras el fondo del texto, la máscara de color no se dibujará y quedarán residuos de caracteres.

El color del fondo de pantalla en tu proyecto lo defines desde el setup con esta instrucción

tft.fillScreen(ILI9341_BLACK);

Si quieres cambiar el fondo a digamos verde, tendrías que definirlo asi:

tft.fillScreen(ILI9341_GREEN);

Para que las mediciones no muestren fondo negro y no muestren residuos, convendría usar todas las instrucciones `para color de texto de esta forma:

tft.setTextColor(ILI9341_CYAN, ILI9341_GREEN);

PD: vi el video, me agrada la nitidez de la pantalla de 2.2" que estás usando; al pendiente de los avances en tu proyecto de cultivo.

Así da gusto que bien te explicas me ha quedado clarinete!!

Gracias a ti ya tengo preparado la parte del riego para seguir con las pruebas.

Me agrada mucho que eches un ojo al proyecto del cultivo es un poco ambicioso para lo novato que soy pero la verdad es que me estáis ayudando mucho y yo le pongo muchas ganas así que seguiremos con fuerza aprendiendo cosas sobre la marcha.

Por cierto si te gustan las bases que uso de metacrilato para la electrónica yo las saco gratis del curro te puedo mandar si quieres.

Un saludo y muchas gracias de verdad!