Display 1.8" TFT refresh schermo

Ciao a tutti,
ho comperato questo Display TFT da 1.8"

Ho compilato il codice correttamente e tutto gira, solo che quando aggiorna la schermata il refresh dello schermo si vede molto ed è fastidioso...è normale o si può eliminare o meglio, velocizzare il refresh?
Precedentemente avevo questo display 0.96"
https://www.amazon.it/gp/product/B0156CO5IE/ref=oh_aui_detailpage_o03_s00?ie=UTF8&psc=1

e questo alla variazione dei dati come vedete nei video non dava lo stesso effetto....anzi sembrava quasi che si modificassero solo i campi in aggiornamento. Nel 1.8" invece sembra che ogni ciclo ricambi tutto lo schermo!

Vi allego 2 video d'esempio, uno relativo al display 0.96" :
https://drive.google.com/open?id=14lwLJ4aaEQHlMZUnrYcrqAJRYWUGyIkh

e uno relativo a quello 1.8" :
https://drive.google.com/open?id=1oFOQxfX6ARBG6NWlgLOE1ZgGCfkSkniq

Grazie

Ho il sospetto che tu aggiorni lo schermo ad ogni ciclo di loop, in quello piccolo non noti l'aggiornamento, in quello grande si.
Aggiorna lo schermo solo quando necessario, magari se posti il codice che utilizzi possiamo dare dei suggerimenti più precisi

fabpolli:
Ho il sospetto che tu aggiorni lo schermo ad ogni ciclo di loop, in quello piccolo non noti l’aggiornamento, in quello grande si.
Aggiorna lo schermo solo quando necessario, magari se posti il codice che utilizzi possiamo dare dei suggerimenti più precisi

Ciao, il codice da me utilizzato è lo stesso risistemato con i comandi del nuovo display 1.8" e te lo posto quì sotto

Grazie

// Display Test
// Test several Display Adafruit_GFX functions
// for 1.8" TFT LCD Color Display (SainSmart).
// Hans Luijten, Tweaking4All.com

// Init pins
#define sclk 13
#define mosi 11
#define cs   10
#define dc   9
#define rst  8

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

int sensorValue = 0;
float PERCENTUALE, TOTALE = 0.0;
int Rele = 6; //INSERISCO LA VARIABILE RELE' AL PIN 6
int POWERBANK = 5; // INSERISCO LA VARIABILE POWERBANK AL PIN 5
int LEDIR = 4; // // INSERISCO LA VARIABILE PER ACCENSIONE LED IR AL PIN 4

Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);

void setup() {
  // Init serial for serial monitor, so we can see debug text in the Serial Monitor Window
  Serial.begin(9600);

  // If your TFT's plastic wrap has a Black Tab, use the following:
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  // If your TFT's plastic wrap has a Red Tab, use the following:
  //tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab
  // If your TFT's plastic wrap has a Green Tab, use the following:
  //tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab

  //  tft.fillScreen(ST7735_BLACK);
  tft.setRotation(1);
  tft.setTextSize(1);
  pinMode(6, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(4, OUTPUT);
}

void loop() {

  sensorValue = analogRead(A1);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):

  // Questa variabile serve solo qui, quindi è dichiarata all'interno dell'if
  float voltage = sensorValue * (5.058 / 1023.0);
  // print out the value you read:
  TOTALE = voltage / (0.329); //0,329674 è IL VALORE alfa =(r2)/(r1+r2) e pure Vout = alfa * Vin
  PERCENTUALE = (100 * TOTALE) / (12.27);

  ///////////////////////////

  // Clear screen
  tft.fillScreen(ST7735_BLACK);
  tft.setTextSize(1);
  tft.setCursor(28, 2); //( X, y ....)
  tft.setTextColor(ST7735_YELLOW);
  tft.print("TENSIONE BATTERIA");


  tft.setTextSize(1);
  tft.setCursor(3, 25); //( X, y ....)
  tft.setTextColor(ST7735_CYAN);
  tft.print("V BATT:");
  tft.setTextSize(3);
  tft.setCursor(3, 38); //( X, y ....)
  tft.setTextColor(ST7735_YELLOW);
  tft.print(TOTALE); tft.println("V");


  tft.setTextSize(1);
  tft.setCursor(3, 70); //( X, y ....)
  tft.setTextColor(ST7735_CYAN);
  tft.print("CARICA BATT:");
  tft.setTextSize(3);
  tft.setCursor(3, 82); //( X, y ....)
  tft.setTextColor(ST7735_YELLOW);
  tft.print(PERCENTUALE);  tft.println("%");

  tft.drawRect(0, 0, 160, 12, ST7735_RED); //RETTANGOLO TESTO "TENSIONE BATTERIA"
  tft.drawRect(0, 20, 128, 45, ST7735_WHITE); //RETTANGOLO TESTO "V BATT"1
  tft.drawRect(0, 63, 128, 45, ST7735_WHITE); //RETTANGOLO TESTO "CARICA BATT"
  //   tft.drawRect(0, 20, 112, 45, ST7735_WHITE); //RETTANGOLO TESTO "V BATT"1
  //   tft.drawRect(0, 63, 112, 45, ST7735_WHITE); //RETTANGOLO TESTO "CARICA BATT"

  //tft.drawRect(0, 0, 160, 128, ST7735_WHITE); //RETTANGOLO PROVA FINE SCHERMO

  // Questa variabile serve solo qui, quindi è dichiarata all'interno dell'if
  byte stepVoltage = map(PERCENTUALE, 0, 100, 0, 11);

  // drawRect/fillRect(X, Y, Larghezza, Altezza, WHITE);
  tft.fillRect(137, 18, 11, 5, ST7735_YELLOW);
  for (byte i = 0; i < 10; i++) {
    byte newY = i * 8 + 25;

    if ((stepVoltage >= 10 - i)) {
      // Visualizzo un rettangolo bianco "fill"
      tft.fillRect(131, newY, 26, 6, ST7735_CYAN);
      // tft.fillRect(118, newY, 34, 6, ST7735_CYAN);
    }
    else {
      // Visualizzo un rettangolo bianco normale
      tft.drawRect(131, newY, 26, 6, ST7735_YELLOW);
      // tft.drawRect(118, newY, 34, 6, ST7735_YELLOW);
    }
  }
  {
    Serial.println(analogRead(A1));
    delay(200); //aspetto(100 millisecondi);
    if (analogRead(A1) > 700) {
      digitalWrite(Rele, LOW);   // OSSIA TOTALE STA AL DI SOPRA DEL VALORE 700 il PIN 10 ossia "Rele" è in stato LOW e quindi chiuso
      digitalWrite(POWERBANK, LOW);   // OSSIA TOTALE STA AL DI SOPRA DEL VALORE 700 il PIN 6 ossia "POWERBANK" è in stato LOW e quindi chiuso
    }
    if (analogRead(A1) < 650) {
      digitalWrite(Rele, HIGH);   // OSSIA TOTALE STA AL DI SOTTO DEL VALORE 600 il PIN 10 ossia "Rele" è in stato LOW
      // e quindi apre il circuito evitando la continua scarica della batteria
      digitalWrite(POWERBANK, HIGH);   // OSSIA TOTALE STA AL DI SOTTO DEL VALORE 600 il PIN 6 ossia "POWERBANK" è in stato HIGH
    }
    delay(3000);
  }
  {
    Serial.println(analogRead(A2));
    delay(200); //aspetto(100 millisecondi);
    if (analogRead(A2) > XXXX) { //VALORE DA SETTARE DELLA LUMINOSITA'
      digitalWrite(LEDIR, LOW);   // I LED IR SONO CHIUSI
    }
    if (analogRead(A2) < XXXXX) {  //VALORE DA SETTARE DELLA LUMINOSITA' LASCIANDO ISTERESI
      digitalWrite(LEDIR, HIGH);   // I LED IR SONO ACCESI
    }
    delay(3000);
  }
  delay(10000);
}

Da quel che vedo fai proprio ciò che indicavo nel post precedente, ad ogni ciclo di llop aggiorni tutto lo schermo, questo provoca lo sfarfallamento visibile.
Per ovviare a questa cosa dovresti aggiornare lo schermo se e solo se almeno un'informazione varia, quindi ti devi definire per ogni informazione che invii al display (Es. TOTALE) una varibile che contenga il valore precedente (Es. TOTALE_PREC), quando il valore attuale differisce dal precedente (ES. TOTALE!=TOTALE_PREC) allora aggiorni il display.
Dentro alla procedura (o all' if) che aggiorna il display memorizzerai le variabili precedenti (Es. TOTALE_PREC=TOTALE)
in questo modo dovresti ovviare, se poi il tuo display (io non lo conosco e quindi non so aiutarti) ti permette di aggiornare solo alcune aree puoi ottimizzare ulteriormente non aggiornando l'intero display ma le sole porzioni che variano

Però quello che mi fa strano è che l'altro display con lo stesso codice ( ovviamente diversa libreria ma stesso codice) non sfarfallava :confused: cmq ci sta mi devo informare della cosa delle aree...tu quali schermi conosci? Avresti consigliato più un ILI9347 da 2.8" che forse è più conosciuto?

Giusto anche da sapere per un futuro su quale puntare come schermo buono (avevo puntato a questo più che altro perchè aveva una dimensione da via di mezzo ne troppo piccolo ne troppo grosso)

Non è poi così strano, ci sta che raddoppiando la diagonale il numero di pizel da aggiornare da parte del display aumenta in modo esponenziale quindi nel piccolo display non si nota il refresh su un display più grande si.
Come conoscenza personale non ne ho molte, conosco grossomodo gli LCD 16x2 e 16x4 oppure i Nextion che però sono tutta un'altra cosa rispetto al tuo.
I Nextion hanno grafica e funzionalità avanzate incorporate e li comandi via seriale.
Se non ho capito male valorizzi due o tre informazioni sul tuo display, non credo sia il caso di valutarne altri, se ottimizzi un poco il codice ottieni sicuramente quel che desideri, se poi vuoi divertirti ed imparare l'uso un pochino più approfondito dei display allora puoi verificare su riuscendo ad aggiornare solo piccole aree le performace e la stabilità aumentato ulteriormente.

Non uso quegli schermi, ma mi sembra abbastanza ovvio che avendo il secondo un'area quadrupla del primo, per quanto poco, ci impieghi piu tempo ad aggiornare ... magari l'altro non lo vedi solo perche' l'operazione e' piu fluida e veloce che con il secondo ... :wink: