Ola Pessoal,

Estou fazendo um projeto , onde consiste em uma tela inicial com dados de uns 3 sensores (temperatura , rpm e tempo ) , porém esbarrei em um problema . Eu havia montado a tela para aparecer esse 3 dados , e ao pressionar em um deles na tela , iria abrir uma nova tela com detalhes do que foi pressionado. Funcionou corretamente com dados estáticos , sem ler de nenhum sensor.

Ao colocar a leitura de apenas 1 sensor , o touch screen ficou muito lento , quase impraticável e eu não estou conseguindo identificar o problema. Coloco abaixo um código semelhante , porém com o mesmo problema, conseguem me ajudar a identificar o erro ?

#include <Adafruit_GFX.h> // biblioteca de graficos
#include <Adafruit_TFTLCD.h> // biblioteca de LCD
#include <TouchScreen.h>
#include <max6675.h>

#define YP A2
#define XM A3
#define YM 8
#define XP 9
#define MINPRESSURE 1
#define MAXPRESSURE 1000
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 364);
short TS_MINX = 150;
short TS_MINY = 120;
short TS_MAXX = 850;
short TS_MAXY = 891;
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
int X;
int Y;
int Z;

// ThermoCouple
int thermo_gnd_pin = 53;
int thermo_vcc_pin = 51;
int thermo_so_pin = 45;
int thermo_cs_pin = 47;
int thermo_sck_pin = 49;
int led_pin = 24;

MAX6675 thermocouple(thermo_sck_pin, thermo_cs_pin, thermo_so_pin);
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
int led =0;
void setup(void)
{
//Serial.begin(9600);
tft.begin(0x9341);
tft.setRotation(3);
tft.fillScreen(BLACK);
pinMode(thermo_vcc_pin, OUTPUT);
pinMode(thermo_gnd_pin, OUTPUT);
pinMode(led_pin, OUTPUT);
digitalWrite(thermo_vcc_pin, HIGH);
digitalWrite(thermo_gnd_pin, LOW);
digitalWrite(led_pin, LOW);
}

void loop()
{
TouchPanel();
if((X > 194 && X < 315) && (Y > 0 && Y < 240) && (Z > MINPRESSURE && Z < MAXPRESSURE)){
if (led==0){
digitalWrite(led_pin, HIGH);
led=1;
}
else
{
digitalWrite(led_pin, LOW);
led=0;
}
}
temperature();
}

void temperature(){
tft.setTextColor(CYAN, BLACK);
tft.setCursor(55, 50);
tft.setTextSize(3);
tft.print("Temp: ");
tft.print(thermocouple.readCelsius());
tft.print(" C");
}
void TouchPanel()
{
digitalWrite(13, HIGH);
TSPoint p = ts.getPoint(); // Realizamos lectura de las coordenadas
digitalWrite(13, LOW);
pinMode(XM, OUTPUT); // La librería utiliza estos pines como entrada y salida
pinMode(YP, OUTPUT); // por lo que es necesario declararlos como salida justo
X = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
Y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);
Z = p.z;
}

Exibições: 353

Responder esta

Respostas a este tópico

Neste projeto você está usando algumas libs bem pesadas que podem ocupar muita memória e afetar a performance. Então é preciso otimizar bem o código.

Percebi que você está usando o Arduino Mega, que é a melhor escolha.

Sugestão:

A temperatura é uma medida que varia pouco. Não é necessário atualizá-la a cada ciclo do loop.

Você poderia fazer algo do tipo:

if (millis() % 30000 == 0) {

temperature();

}

Isso vai atualizar a temperatura somente a cada 30 segundos.

Quando você colocar o relógio no projeto, pode usá-lo no lugar de millis.

Vou modificar aqui e ver o resultado , publico em seguida.

Obrigado

Luiz, esqueci de dizer que, nesse caso, precisa colocar no setup, a seguinte chamada:

temperature();

Para exibir a temperatura pela primeira vez e depois a intervalos maiores.

José,

Realmente deu uma grande diferença , coloquei 30s e o touch passou a responder normal , baixei até para 1s , e a resposta ainda foi satisfatória para o que eu preciso . Obrigado pela ajuda.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço