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("%");
}
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.
: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
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.
---> 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 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:
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.
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.
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.