Problema 2.8 TFT bianco dopo qualche minuto

Ciao a tutti,
sto cercando di costruire una stazione meteorologica.
Ho collegato ad un arduino mega, un MCU 2,8 TFT e un DHT11 (vorrei collegare anche un BMP280, ma devo capire come prendere la 3,3)
Ho usato i pin grd, 53 e 51 per il DHT11.
All'avvio tutto funziona (a parte il refresh dello schermo fastidioso), ma dopo un paio di minuti lo schermo va in bianco e così rimane.
Potete dirmi cosa sbaglio?
Grazie mille
AC

#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 // Can alternately just connect to Arduino's reset pin

#define TS_MINX 158
#define TS_MINY 148
#define TS_MAXX 922
#define TS_MAXY 958

#define YP A1 // Chip Select goes to Analog 3
#define XM A2 // Command/Data goes to Analog 2
#define YM 7 // LCD Write goes to Analog 1
#define XP 6 // LCD Read goes to Analog 0

#include <SPI.h>          // f.k. for Arduino-1.5.2
#include "Adafruit_GFX.h"// Hardware-specific library

#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
//#include <Adafruit_TFTLCD.h>
#include <TouchScreen.h>
//Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

// Assign human-readable names to some common 16-bit color values:
#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 a = 0;
boolean buttonEnabled = true;

#include <DHT.h>
#include <Wire.h>
#include "i2c.h"

#include "i2c_BMP280.h"

BMP280 bmp280;
DHT dht(51, DHT11);
int t = 0;
int h = 0;

void setup() {
  // put your setup code here, to run once:
//  Serial.begin(9600);
//  Serial.println("Inizio scansione temperatura ed umidità:");
//  Serial.print("Probe BMP280: ");
//  if (bmp280.initialize()) Serial.println("Sensor found");
//  else {
//    Serial.println("Sensor missing");
//    while (1) {}
//  }

  pinMode(53, OUTPUT);        //pin 53 USCITA
  digitalWrite(53, HIGH);

  // onetime-measure:
//  bmp280.setEnabled(0);
//  bmp280.triggerMeasurement();
  dht.begin();
  
  tft.reset();                 //hardware reset
  uint16_t ID = tft.readID(); //
/*  Serial.print("ID = 0x");
  Serial.println(ID, HEX);
*/  if (ID == 0xD3D3) ID = 0x9481; // write-only shield
  //    ID = 0x9329;                             // force ID
  tft.begin(ID);
  tft.fillScreen(BLACK);
  tft.setRotation(1);
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.println("Aria di Tempesta");
  tft.setTextColor(YELLOW); tft.setTextSize(2);
  tft.println("");
  tft.setTextColor(RED);    tft.setTextSize(2);
  tft.println("Temperatura e umidita'");
  tft.println();
  tft.setTextColor(GREEN);
  tft.setTextSize(3);
  tft.println(" 0C");
  tft.println(" 0%");
  //Create Red Button
  tft.fillRect(50, 180, 220, 40, RED);
  tft.drawRect(50, 180, 220, 40, WHITE);
  tft.setCursor(70, 188);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Clicca qui");
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
  t = dht.readTemperature();
  h = dht.readHumidity();
/*  Serial.print("Temperatura: ");
  Serial.println(String(t) + "°C");
  Serial.print("Umidità: ");
  Serial.println(String(h) + "%");
*/
/*  bmp280.awaitMeasurement();

  float temperature;
  bmp280.getTemperature(temperature);
  float pascal;
  bmp280.getPressure(pascal);

  static float meters, metersold;
  bmp280.getAltitude(meters);
  metersold = (metersold * 10 + meters)/11;

  bmp280.triggerMeasurement();

  Serial.print(" Altezza iniziale: ");
  Serial.print(metersold);
  Serial.print(" m; Altezza: ");
  Serial.print(meters);
  Serial.print(" Pressure: ");
  Serial.print(pascal);
  Serial.print(" Pa; T: ");
  Serial.print(temperature);
  Serial.println("°C");
*/
  tft.fillScreen(BLACK);
  tft.setRotation(1);
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(2);
  tft.println("Aria di Tempesta");
  tft.setTextColor(YELLOW); tft.setTextSize(2);
  tft.println("");
  tft.setTextColor(RED);    tft.setTextSize(2);
  tft.println("Temperatura e umidita'");
  tft.println();
  tft.setTextColor(GREEN);
  tft.setTextSize(3);
  tft.println(" " + String(t) + "C");
  tft.println(" " + String(h) + "%");
  //Create Red Button
  tft.fillRect(50, 180, 220, 40, RED);
  tft.drawRect(50, 180, 220, 40, WHITE);
  tft.setCursor(70, 188);
  tft.setTextColor(WHITE);
  tft.setTextSize(3);
  tft.print("Clicca qui");
  TSPoint p = ts.getPoint();  //Get touch point

  if (p.z > ts.pressureThreshhold) {
    Serial.print("X = "); Serial.print(p.x);
    Serial.print("\tY = "); Serial.print(p.y);
    Serial.print("\n");
    Serial.println(map(p.x, TS_MAXX, TS_MINX, 0, 320));
    Serial.println(map(p.y, TS_MAXY, TS_MINY, 0, 240));
  }
   p.x = map(p.x, TS_MAXX, TS_MINX, 0, 320);
   p.y = map(p.y, TS_MAXY, TS_MINY, 0, 240);
       
   if(p.x>30 && p.x<80 && p.y>35 && p.y<200 && buttonEnabled)// The user has pressed inside the red rectangle
   {
    buttonEnabled = false; //Disable button
        
    //This is important, because the libraries are sharing pins
   pinMode(XM, OUTPUT);
   pinMode(YP, OUTPUT);
    
    //Erase the screen
    tft.fillScreen(BLACK);
  
    //Draw frame
    tft.fillRect(0,0,318,240,BLACK);
    tft.drawRect(0,0,318,240,WHITE);
    
    tft.setCursor(50,50);
    tft.setTextColor(WHITE);
    tft.setTextSize(3);
    tft.print("OK");
   }
}

Probabilmente 'String' ha colpito ancora.

Fa' una ricerca qui sul forum e guarda cosa può combinare.

Occorre passare al trattamento delle stringhe come array di caratteri secondo la sintassi del C++.

Ciao,
P.

pgiagno:
Probabilmente 'String' ha colpito ancora.

... però non mi sembra di vedere variabili di classe String() nel suo codice ... ::slight_smile:

>sksvip: di che Arduino parliamo? ... come sei messo con l'occupazione di memoria? ... cosa ti dice il compilatore alla fine della compilazione?

Guglielmo

Queste no?

  tft.println(" " + String(t) + "C");
  tft.println(" " + String(h) + "%");

Ciao,
P.

pgiagno:
Queste no?

Azz ... complimenti per la vista, m'erano sfuggite nascoste nelle tft.println() ... :smiley:

Rimangono comunque valide le mie domande di cui al post #2 ... perché ho il sospetto che stia molto stretto di memoria. ::slight_smile:

Guglielmo

Grazie per le risposte :slight_smile: all'inizio avevo pensato anche io alla memoria o meglio a qualche variabile che non deallocava (sto ancora studiando come funziona il codice)...

Questa la compilazione:

Lo sketch usa 17152 byte (6%) dello spazio disponibile per i programmi. Il massimo è 253952 byte.
Le variabili globali usano 465 byte (5%) di memoria dinamica, lasciando altri 7727 byte liberi per le variabili locali. Il massimo è 8192 byte.

che credo vada bene...
Ora provo a togliere le string e vedere che succede....
Vi faccio sapere e grazie per la dritta!!!

Ah, ok ... se quindi sei su un Arduino MEGA (quelle sono le caratteristiche di memoria di un ATmega2560) e NON mi sembra tu stia effettivamente usando troppa memoria ... ho il sospetto che il problema sia altrove, comunque prova e facci sapere. :wink:

Guglielmo

Purtroppo nulla...
Ho sostituito con questa sezione:

    tft.setTextColor(GREEN);
    tft.setTextSize(3);
    tft.print(" ");
    tft.print(t, 1);
    tft.println("C");
    tft.print(" ");
    tft.print(h, 1);
    tft.println("%");

tuttavia nulla... inoltre la cosa che mi sembra strana è che nonostante i valori t e h cambiano (li leggo 2 righe prima sul serial), ed eseguo prima un tft.fillScreen(BLACK); viene stampato sempre il valore 0,0...

Secondo voi il problema dello schermo bianco può dipendere dal fatto che alimento da USB e il DHT11 lo alimento con un digital?

Ciao,
credo di aver trovato... mancava questo:

pinMode(XM, OUTPUT);
pinMode(YP, OUTPUT);

nel loop prima di scrivere i valori.
A presto
AC

sksvip:
il DHT11 lo alimento con un digital?

Se stai alimentando il DHT con in pin non stai facendo cosa buona, i pin nascono per leggere uno stato o impostare un livello logico non per alimentare.
Se vuoi alimentare il DHT puoi usare i pin +5V e GND che, rispettando i limiti di assorbimento dell'USB/regolatore di tensione, possono essere usati a tal scopo.

fabpolli:
Se stai alimentando il DHT con in pin non stai facendo cosa buona, i pin nascono per leggere uno stato o impostare un livello logico non per alimentare.
Se vuoi alimentare il DHT puoi usare i pin +5V e GND che, rispettando i limiti di assorbimento dell'USB/regolatore di tensione, possono essere usati a tal scopo.

Il problema è che così dovrei costruire un qualcosa per mandare il 5v dall'altra parte della scheda... Però avevo visto molti esempi che facevano cosi (e usavano anche dei pin per GND impostandoli a LOW... Che problemi può dare?

In più adesso dovrei risolvere il problema di come alimentare con un 5v il BMP280 che ne accetta solo 3,3 (visto che il 3,3v è occupato dal TFT)... Secondo voi una resistenza o simili può andare? Come faccio a calcolarla, visto che non conosco la i?

Sul web si trovano molti esempi fatti decismente male. Non sapendo di che scheda parli non posso dare una risposta sensata ma tipo usare un filo per portare l'alimentazione?
Per i 3.3 puoi alimentar due cose dal medesimo pin se rientri nelle specifiche del regolatore di tensione e l'assorbimento di corrente lo trovi nel datasheet del sensore o più semplcemnete lo rilevi con un multimetro

Dal altro Tread chiuso.

Il problema è che non so come collegare il BMP280. Infatti va bene per GND e SDA SCL, ma non so come ottenere la 3,3v dato che il sensore non è 5v tolerant.

"5V tollerant" si riferisce alle entrate. Normalmente entrate sopportano al massimo la tensione di alimentazione. "5V tollerant" su un circuito con alimentazion 3,3V vuol dire che il circuito puó ricevere segnali a 5V nonostante alimentato a 3,3V.
Percui Ti serve un alimentazione 3,3V e un level shifter per avere i 3,3V anche sui pin SDA e SCL.

Si possono alimentare piú circuiti dallo stesso pin 3,3V.

In più adesso dovrei risolvere il problema di come alimentare con un 5v il BMP280 che ne accetta solo 3,3 (visto che il 3,3v è occupato dal TFT)... Secondo voi una resistenza o simili può andare? Come faccio a calcolarla, visto che non conosco la i?

Non si puó usare una resistenza per abbassare la tensione di un circuito elettronico perché la corrente non é costante e percui la tensione sulla resistenza non é costante. Serve un Stabilizatore lineare o un convertitore DC/DC.

Ciao Uwe