TFT. Presentar variables en pantalla.

Estoy con acelerómetro para marcar los grados de inclinación.

Tengo el código funcionando y una pantalla ST7735 funcionando.

El caso es que los datos no 'se refrescan' en pantalla, se solapan y quedan ilegibles.

Por otro lado, he dividido la pantalla para presentar el ángulo actual, de forma continua (que es el que no consigo que 'refresque') y en otra división de la pantalla, dejar el máximo ángulo fijo, y no sé como hacer para sacar el máximo ángulo obtenido a una variable para luego 'imprimirla'.

Gracias de antemano.

Este es el código:

void loop(){

  //*************************Acelerómetro ****************************//
 analog_x=analogRead(0); 
 analog_y=analogRead(1);
 analog_z=analogRead(2);
 
  vol_x=analog_x*3.3/1024;
  vol_y=analog_y*3.3/1024;
  vol_z=analog_z*3.3/1024;
  
  add_x=vol_x-1.75; 
  add_y=vol_y-1.85;
  add_z=vol_z-1.50;
  
  g_x=add_x/0.8; 
  g_y=add_y/0.8;
  g_z=add_z/0.8;
  
  if(g_x<=1&&g_x>=-1) 
       {
  grados_x=asin(g_x)*180.0/PI; 
  grados_y=asin(g_y)*180.0/PI;
  grados_z=asin(g_z)*180.0/PI;
        }

  if(g_x>1)  
  grados_x=90;
  if(g_x<-1)
  grados_x=-90;
  if(g_y>1)
  grados_y=90;
  if(g_y<-1)
  grados_y=-90;
  if(g_z>1)
  grados_z=90;
  if(g_z<-1)
  grados_z=-90;

grad_X = int (grados_x);
grad_Y = int (grados_y);
grad_Z = int (grados_z);

// **********************  TFT  *********************//

tft.setCursor (90,60);
tft.setTextColor (ST7735_GREEN);
tft.setTextSize(4);
tft.print (grad_X);

tft.setCursor (9,6);
tft.setTextColor (ST7735_GREEN);
tft.setTextSize(4);
tft.print (grad_Y);


Serial.print("x:");
 Serial.print(grad_X);
 Serial.print(" y:");
 Serial.println(grad_Y);
 //Serial.print(" z:");
 //Serial.println(grad_Z);
 delay(100);

}

Se me olvidaba, el tft es este:

Y las librerias:

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>

el truco para imprimir sin solaparse es usar un buffer del mismo tamaño en el cual cuando imprimis borras lo anterior y presentas lo nuevo.
lo defines asi
#define LONGITUD 20 // supongamos que lo haces de 20 caracteres.
char buffer[LONGITUD];

// esto en las globales
Luego donde necesitas imprimir y como ejemplo te muestro como imprimir

tft.setCursor (90,60);
tft.setTextColor (ST7735_GREEN);
tft.setTextSize(4);
tft.print (grad_X);

tft.setCursor (9,6);
tft.setTextColor (ST7735_GREEN);
tft.setTextSize(4);
tft.print (grad_Y);

podrias crear una función que lo haga todo, algo así

void printTFT(byte X, byte Y, uint16_t COLOR, byte siZe,  float dato) {
     char TX[4];
     sprintf(TX,"%3d", dato);  // esto hace que siempre imprima un entero de 3 digitos 999 máx si se necesita mas 
                               // simplemente amplia el %3d a %5d para 5 digitos pero tmb amplia 
                               // char TX[6] creo que me sobra un digito aca pero prueba con 5.
     tft.setCursor (X,Y);
     tft.setTextColor (COLOR);
     tft.setTextSize(siZe);
     tft.print (TX);   
}

entonces lo usarías de este modo

printTFT(90, 60, ST7735_GREEN, 4, grad_X);
printTFT( 9,  6, ST7735_GREEN, 4, grad_Y);

yo no sé apenas de programación, y deduzco esto.

para usar la la librería ST7735 (y/o el tft), debo iniciar el comando con tft.comando

tft.sprintf (buffer, grad_X);

exit status 1
'class Adafruit_ST7735' has no member named 'sprintf'

tft.sprintf no me la reconoce en esa librería

el poner tft.setcursor, etc en distintas líneas, es porque no sé por qué, pero algo tipo:

tft.print(90, 60, ST7735_GREEN, 4,grad_X);

me devuelve siempre:

no matching function for call to 'Adafruit_ST7735::print(int, int, int, int, int&)'

printTFT(90, 60, ST7735_GREEN, 4,grad_X);

me devuelve:

exit status 1
'printTFT' was not declared in this scope

deduzco que ese comando es de otra librería.

cada vez me pierdo mas... XD

y donde puse yo tft.sprintf ? en ningún sitio!! asi que inventaste la deducción.

void loop(){

  //*************************Acelerómetro ****************************//
	analog_x = analogRead(0); 
	analog_y = analogRead(1);
	analog_z = analogRead(2);
 
	vol_x = analog_x*3.3/1023.0;
	vol_y = analog_y*3.3/1023.0;
	vol_z = analog_z*3.3/1023.0;

	add_x=vol_x-1.75; 
	add_y=vol_y-1.85;
	add_z=vol_z-1.50;

	g_x=add_x/0.8; 
	g_y=add_y/0.8;
	g_z=add_z/0.8;

	if (g_x<=1&&g_x>=-1) {
		grados_x = asin(g_x)*180.0/PI; 
		grados_y = asin(g_y)*180.0/PI;
		grados_z = asin(g_z)*180.0/PI;
	}

	if (g_x>1)  
		grados_x=90;
	if (g_x<-1)
		grados_x=-90;
	if (g_y>1)
		grados_y=90;
	if (g_y<-1)
		grados_y=-90;
	if (g_z>1)
		grados_z=90;
	if (g_z<-1)
		grados_z=-90;

	grad_X = int (grados_x);
	grad_Y = int (grados_y);
	grad_Z = int (grados_z);

	// **********************  TFT  *********************//

	printTFT(90, 60, ST7735_GREEN, 4, grad_X);
	printTFT( 9,  6, ST7735_GREEN, 4, grad_Y);

	Serial.print("x:");
	Serial.print(grad_X);
	Serial.print(" y:");
	Serial.println(grad_Y);
	//Serial.print(" z:");
	//Serial.println(grad_Z);
	delay(100);

}

void printTFT(byte X, byte Y, uint16_t COLOR, byte siZe,  float dato) {
     char TX[4];
     sprintf(TX,"%3d", dato);  // esto hace que siempre imprima un entero de 3 digitos 999 máx si se necesita mas 
                               // simplemente amplia el %3d a %5d para 5 digitos pero tmb amplia 
                               // char TX[6] creo que me sobra un digito aca pero prueba con 5.
     tft.setCursor (X,Y);
     tft.setTextColor (COLOR);
     tft.setTextSize(siZe);
     tft.print (TX);   
}

no no... puse eso de tft.sprintf por probar... que ya te digo que yo de programación na y menos, por eso digo que deduzco eso que puse.

si hasta que dí con que la iniciación del tft había que ponerlo entre las llaves, como el serial.print, hice como 6 o 7 pruebas...

no insinuaba que lo hubieras dicho tú.

mañana lo pruebo a ver si soy capaz.

gracias.

Yo creo que empezaste por algo demasiado complejo.
Tomaría un libro y trataría de aprender y no ir a los tumbos, sin faltarte el respeto. Es el consejo que siempre doy.

si. esa era la idea al principio.

pero se me ha echado el tiempo encima.

es un proyecto de fin de curso (que iba a disponer de 6 meses para hacerlo, pero se ha quedado en un mes).

ya, o voy para adelante o voy para adelante.

no me queda otra.

Offtopic

Te iba a ayudar pero no hago tareas de escuela. Lo siento.

PD: en mi país hubo quien copió un porcentaje de su tesis y conduce las cosas como cochecito de feria...

offtopic.

pero yo no estoy plagiando nada.

sólo pido ayuda.

y yo no soy estudiante de carrera, es una fp.

sólo pido ayuda.

lo mío es automoción, esta parte de programar apenas va a puntuar de hecho, no ha gustado a parte del jurado), lo que me puntúa es el resto del trabajo y el por qué.