Hola a todos, adjunto mi sketch, es una abrevacion de lo que quiero hacer, y esta es la parte que falla.
Es un contador de rpm, conectado al usb y mirando el monitor serial funciona durante horas sin problemas, al querer escribir el mismo dato en la tft, todo se cuelga, a veces a los 2 minutos, otras al instante..
Es un arduino mega generico
con una tft shield mcufriend 9327.
#include <Arduino.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <TouchScreen.h>
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
// Define some TFT readable colour codes to human readable names
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
const int XP=6,
XM=A2,
YP=A1,
YM=7; //240x400 ID=0x9327
const int TS_LEFT=941,TS_RT=187,TS_TOP=966,TS_BOT=178;
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); // Creates the touchscreen object
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0
#define LCD_RESET A4
#define MINPRESSURE 10
#define MAXPRESSURE 1000
#define PALETTEDEPTH 0 // do not support Palette modes
volatile int RPMcontados = 0; //Configuro volatil los RPM contados para que no se pierdan de una interrupcion a otra
const int Sensor = 18; //Declaro variable del pin del Sensor
const int Salida = 30; //Declaro variable del pin del Salida
int RPM = 0; //Declaro que la variable RPM esta a 0 en cada bucle
bool EstadoSalida = LOW;
bool EstadoSensor;
bool Lectura;
unsigned long tiempo = 0; //Declaro que la variable tiempo esta a 0 en cada bucle
unsigned long EmpezarRetraso;
unsigned long RetrasoEncendido;
unsigned long EmpezarApagado;
unsigned long RetrasoApagado;
void setup() {
Serial.begin(9600); //Abro comunicacion con la consola
pinMode(Sensor, INPUT); //Declaro el Sensor como una entrada
pinMode(Salida, OUTPUT); //Declaro el Salida como una salida
attachInterrupt(digitalPinToInterrupt(Sensor), RPM_motor, FALLING); //Activo la interrupcion
tft.reset();
uint16_t identifier = tft.readID();
tft.begin(identifier);
tft.setRotation(0);
tft.fillScreen(BLACK);
tft.drawRoundRect(0, 0, 240, 400, 8, YELLOW); //Page border
tft.fillRoundRect(0, 0, 240, 35, 8, RED);
tft.drawRoundRect(0, 0, 240, 35, 8, YELLOW);
tft.setTextSize(2);
tft.setCursor(50, 12);
tft.setTextColor(WHITE);
tft.print("DIAGN ELECTR");
tft.setTextSize(2);
tft.setTextColor(WHITE,BLACK);
}
void loop() {
Lectura = digitalRead(Sensor); //Declaro que la Lectura es leida digitalmente en el pin del Sensor
if (RPM >= 1000) {
RetrasoEncendido = 6;
RetrasoApagado = 4;
}
if (RPM >= 2000) {
RetrasoEncendido = 3;
RetrasoApagado = 2;
}
if (RPM >= 4000) {
RetrasoEncendido = 1;
RetrasoApagado = 1;
}
if (millis() - tiempo == 1000)
{
detachInterrupt(digitalPinToInterrupt(Sensor)); //Desactivo la interrupcion mientras calcula
RPM = RPMcontados * 60; //Para una interrupcion por vuelta lo multiplico por 60 para saber las RPM
////// al activar se congela sketch //////////
// tft.setCursor(50, 200);
// tft.print(RPM);
Serial.print("RPM =\t"); //Escribe las RPM en cosola
Serial.println(RPM); //Escribe las RPM en consola
RPMcontados = 0; // Reseteo el contador de revoluciones
tiempo = millis(); // Actualizo el tiempo
attachInterrupt(digitalPinToInterrupt(Sensor), RPM_motor, FALLING); //Activo la interrupcion
}
if (Lectura && !EstadoSensor)
{
EstadoSalida = !EstadoSalida;
if (EstadoSalida == HIGH)
{
EmpezarRetraso = millis() + RetrasoEncendido;
}
}
EstadoSensor = Lectura; // ...actualiza el Estado del Sensor a la Lectura
}
void RPM_motor() {
RPMcontados++; //Se suma 1 RPM cada vez que pasa por aqui
}
al comentar la parte que dice tft.print(RPM) el sketch anda bien, sino hace lo antes comentado.. me esta volviendo loco
gracias y saludos