Problemi con display 2,4 pollici touch

Buonasera a tutti
In rete ho trovato questo progetto di tastiera a display touch per poter comandare un relè dopo aver digitato il codice corretto .

Producten gemarkeerd met *** zijn niet beschikbaar in de gewenste hoeveelheid of niet op voorraad.

Ho acquistato un display da 2,4 pollici collegato ad arduino uno , ho scaricato la libreria SPFD5408 , caricato tutto su arduino uno ma ovviamente qualcosa non deve funzionare , sul display la tastiera appare se voglio cambio anche i colori dei tasti , ma la parte touch non funziona , ho scoperto che il display usato nel sito è un display detto MCU ed usa appunto una libreria Adafruit modificata .
Mentre il mio display non è un MCU , ma un classico display a 2,4 pollici , secondo voi il problema della gestione del touch è dovuta a questa differenza ?
E se si sarebbe possibile modificare solo le librerie inserite nello sketch con le classiche di Adafruit o va riscritto completamente il codice ?

@Chris41 : perdona, ma ... non riesco a trovare il tuo post di presentazione :confused:, per cui, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il succitato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

Ciao Guglielmo
Quando mi ero iscritto mi ero presentato , non c'è nessun problema a ripresentarmi solo che se clicco sul tuo link vado nella pagina presentazione me non mi fa scrivere nulla

Se comunque posso continuare a descrivere il mio problema ho notato una cosa provando a caricare altri sketch trovati in rete per fare delle prove , se il verso del immagine è con la parte bassa verso la presa usb di arduino tutto funziona tranquillamente , se invece la parte bassa dell'immagine e rivolta verso la parte opposta della presa usb non funziona più nulla , del touch

Buona sera a tutti
ho risolto il mio problema per quanto riguarda il touch , adesso ho un altro problema legato a ciò che viene scritto sul display .

Descrivi il problema :slight_smile:

Guglielmo

Buongiorno Guglielmo
Il primo problema ovvero sia che non funzionava il touch l'ho risolto sostituendo alcune righe del vecchio programma :

#define YP A1  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 7   // can be a digital pin
#define XP 6   // can be a digital pin

Questo è il vecchio programma e leggendo un po' qui sul forum un po' nella rete ho capito che definiscono la calibrazione del display touch .
E ho ridefinito i pin del display in questo modo:

#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin

E d ora il touch funziona correttamente se clicco su tasto 1 appare 1 e cosi per tutti gli altri tasti.
Il problema che ho adesso è che se digito un numero più lungo di 4 cifre tipo "12345" dal monitor seriale viene letta la cifra corretta mentre sul display alla pressione della quinta cifra appare un numero con dei numeri completamente diversi da quelli inseriti,
Ad esempio se digito il numero "45632" sul display appare -19904
e questo ogni volta che digito il numero 45632 mi restituisce quel valore con il trattino che precede tutti i numeri , non è un valore casuale perche è sempre quello il valore per la cifra 45632 .
Qualcuno sa darmi un indicazione su dove potrebbe essere il problema ?

P.S.
Da monitor seriale viene visualizzato la cifra corretta che si inserisce , se digito 45632 il monitor seriale visualizza che sono stati premuti i pulsanti 4,5,6,3,2 .
Grazie a tutti

Come hai dichiarato la variabile dove salvi il valore inserito?

Ciao Fratt
Intendi questa parte del programma:

     if (Y>140 && Y<200) //If Button 4 is pressed
    {Serial.println ("Button 4"); 
    if (Number==0)
    Number=4;
    else
    Number = (Number*10) + 4; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>200 && Y<260) //If Button 1 is pressed
    {Serial.println ("Button 1");
    if (Number==0)
    Number=1;
    else
    Number = (Number*10) + 1; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    } 

Se Number è dichiarato come int è "troppo piccola" per contenere quel numero.
Devi usare un tipo più grande, ad esempio un long.
Prova a guardare qui
https://www.arduino.cc/reference/en/language/variables/data-types/int/

Proprio come dice @fratt una variabile di tipo int ha una lunghezza di 16 bit quindi può rappresentare un totale di 2^16=65536 valori numerici.

Siccome int rappresenta numeri interi con segno (il trattino di cui parli) questi valori vanno da -32768 a 32765

Quindi o usi una variabile di tipo più capiente come long come dice fratt, oppure se ti basta fino 65535 usi un unsigned int

Ciao Fratt e Cotestatnt
Ho modificato il valore int con long
ora posso scrive un numero più lungo di 4 cifre è tutti i numeri vengono visualizzati corretti e nella sequenza giusta , però accade un altra cosa adesso se tento di modificare la password e ne creo una da 5 caratteri sul display appare la password da 5 caratteri ma in realtà la password non è quella da me scritta , ma un altra .
Questo codice va molto ma molto oltre le mie conoscenze .

Personalmente non ho capito qual è il nuovo problema.
Prova a postare anche il codice completo.

Il nuovo problema è che durante la procedura di cambio password se inserisco il numero 45632, viene visualizzato correttamente e anche da monitor seriale tutto regolare .
Ma il realtà la password non è 45632 ma un altro numero che non corrisponde a 45632 e la password è di 4 cifre non 5.

include <SPFD5408_Adafruit_GFX.h>    // Core graphics library
#include <SPFD5408_Adafruit_TFTLCD.h> // Hardware-specific library
#include <SPFD5408_TouchScreen.h>
#include <EEPROM.h>
#define YP A2  // must be an analog pin, use "An" notation!
#define XM A3  // must be an analog pin, use "An" notation!
#define YM 8   // can be a digital pin
#define XP 9   // can be a digital pin
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4
#define WHITE   0x0000 //Black->White
#define YELLOW    0x001F //Blue->Yellow
#define CYAN     0xF800 //Red->Cyan
#define PINK   0x07E0 //Green-> Pink
#define RED    0x07FF //Cyan -> Red
#define GREEN 0xF81F //Pink -> Green 
#define BLUE  0xFFE0 //Yellow->Blue
#define BLACK   0xFFFF //White-> Black
#define MINPRESSURE 10
#define MAXPRESSURE 1000
/*_______Assigned______*/
/*____Calibrate TFT LCD_____*/
#define TS_MINX 125
#define TS_MINY 85
#define TS_MAXX 965
#define TS_MAXY 905
/*______End of Calibration______*/
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); //300 is the sensitivity
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //Start communication with LCD
String symbol[4][3] = {
  { "1", "2", "3"},
  { "4", "5", "6"},
  { "7", "8", "9"},
  { "x", "0", "OK"}
};
long X,Y;
long Number;
int relayPin = 11;// set pin 11 for relay output
int buzzer = 12;
long pass, currentpage;
long password;
long addr = 0;
long addr1 = 1;
unsigned long interval = 2000;
unsigned long previousMillis = 0;
unsigned long currentMillis;
void setup() 
{
  Serial.begin(9600); //Use serial monitor for debugging
  tft.reset(); //Always reset at start
  tft.begin(0x9341); // My LCD uses LIL9341 Interface driver IC
  tft.setRotation(2); // 
  tft.fillScreen(WHITE);
  draw_BoxNButtons(); 
  pinMode(relayPin, OUTPUT);
  pinMode(buzzer, OUTPUT);
  digitalWrite(relayPin, LOW);// set relay pin to LOW
  currentpage = 0;
  pass = 0;
}
void loop() {
currentMillis = millis(); // grab current time
TSPoint p = waitTouch();
X = p.y; Y = p.x;
//  Serial.print(X); Serial.print(','); Serial.println(Y);// + " " + Y);
DetectButtons();  
delay(300);
}
TSPoint waitTouch() {
  TSPoint p;
  do {
    p = ts.getPoint(); 
    pinMode(XM, OUTPUT);
    pinMode(YP, OUTPUT);
  } while((p.z < MINPRESSURE )|| (p.z > MAXPRESSURE));
  p.x = map(p.x, TS_MINX, TS_MAXX, 0, 320);
  p.y = map(p.y, TS_MINY, TS_MAXY, 0, 240);;
  return p;
}
void DetectButtons()
{
   if (currentpage == 0)
   {
    tft.fillRect(0, 0, 240, 80, CYAN);  //clear result box
    tft.setCursor(10, 20);
    tft.setTextSize(5);
    tft.setTextColor(BLACK);
  if (X<80 && X>0) //Detecting Buttons on Column 1
  {
    if (Y>0 && Y<80) //If cancel Button is pressed
    {Serial.println ("Cancel"); 
    Number=0; 
    if ((unsigned long)(currentMillis - previousMillis) >= interval) {
      Serial.print("Detected");
      currentpage = 1;
      previousMillis = millis();
    }
    }
     if (Y>80 && Y<140) //If Button 1 is pressed
    {Serial.println ("Button 7");
    if (Number==0)
    Number=7;
    else
    Number = (Number*10) + 7; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>140 && Y<200) //If Button 4 is pressed
    {Serial.println ("Button 4"); 
    if (Number==0)
    Number=4;
    else
    Number = (Number*10) + 4; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>200 && Y<260) //If Button 1 is pressed
    {Serial.println ("Button 1");
    if (Number==0)
    Number=1;
    else
    Number = (Number*10) + 1; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    } 
  }
    if (X<160 && X>80) //Detecting Buttons on Column 2
  {
    if (Y>0 && Y<85)
    {Serial.println ("Button 0"); //Button 0 is Pressed
    if (Number==0)
    Number=0;
    else
    Number = (Number*10) + 0; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>85 && Y<140)
    {Serial.println ("Button 8"); 
    if (Number==0)
    Number=8;
    else
    Number = (Number*10) + 8; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>140 && Y<192)
    {Serial.println ("Button 5");
    if (Number==0)
    Number=5;
    else
    Number = (Number*10) + 5; //Pressed twic
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>192 && Y<245)
    {Serial.println ("Button 2");
    if (Number==0)
    Number=2;
    else
    Number = (Number*10) + 2; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }   
  }
    if (X<240 && X>160) //Detecting Buttons on Column 3
  {
    if (Y>0 && Y<85)
    {Serial.println ("OK"); 
    checkPassword();
    Number = 0;
    delay(150);
    }
     if (Y>85 && Y<140)
    {Serial.println ("Button 9"); 
    if (Number==0)
    Number=9;
    else
    Number = (Number*10) + 9; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>140 && Y<192)
    {Serial.println ("Button 6"); 
    if (Number==0)
    Number=6;
    else
    Number = (Number*10) + 6; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>192 && Y<245)
    {Serial.println ("Button 3");
    if (Number==0)
    Number=3;
    else
    Number = (Number*10) + 3; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }   
  }
}
if (currentpage == 1) {
    tft.fillScreen(BLACK);
    tft.setCursor(30, 55);
    tft.setTextSize(3);
    tft.setTextColor(WHITE);
    tft.println("Reset PIN?");
    tft.fillRect  (35,140,60,50,BLUE);
    tft.fillRect  (140,140,60,50,RED);
    tft.setTextSize(2);
    tft.setTextColor(WHITE);
    tft.setCursor(45, 157);
    tft.println("Yes"); 
    tft.setCursor(157, 157);
    tft.println("No"); 
    if (Y>140 && Y<190) 
    {
     if (X>35 && X<95){
      Serial.print("Yes");
      setup();
      pass = 1;
      checkPassword();
     }
     if (X>140 && X<200){
      Serial.print("No");
      setup();
     }    
   }
}
if (currentpage == 2)
{
    tft.fillRect(0, 0, 240, 80, CYAN);  //clear result box
    tft.setCursor(10, 20);
    tft.setTextSize(4);
    tft.setTextColor(BLACK);
  if (X<80 && X>0) //Detecting Buttons on Column 1
  {
    if (Y>0 && Y<80) //If cancel Button is pressed
    {Serial.println ("Set");
    Serial.println(Number);
    long password1 = (Number / 100); //12 First two digit of entered number
    long password2 = (Number % 100); //34 Last two digit of entered number
    Serial.println(password1);
    Serial.println(password2);
    EEPROM.write(addr, password1);
    EEPROM.write(addr1, password2);
    setup();
    Number = 0;
    }
     if (Y>80 && Y<140) //If Button 1 is pressed
    {Serial.println ("Button 7");
    if (Number==0)
    Number=7;
    else
    Number = (Number*10) + 7; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>140 && Y<200) //If Button 4 is pressed
    {Serial.println ("Button 4"); 
    if (Number==0)
    Number=4;
    else
    Number = (Number*10) + 4; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>200 && Y<260) //If Button 1 is pressed
    {Serial.println ("Button 1");
    if (Number==0)
    Number=1;
    else
    Number = (Number*10) + 1; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    } 
  }
    if (X<160 && X>80) //Detecting Buttons on Column 2
  {
    if (Y>0 && Y<85)
    {Serial.println ("Button 0"); //Button 0 is Pressed
    if (Number==0)
    Number=0;
    else
    Number = (Number*10) + 0; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>85 && Y<140)
    {Serial.println ("Button 8"); 
    if (Number==0)
    Number=8;
    else
    Number = (Number*10) + 8; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>140 && Y<192)
    {Serial.println ("Button 5");
    if (Number==0)
    Number=5;
    else
    Number = (Number*10) + 5; //Pressed twic
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>192 && Y<245)
    {Serial.println ("Button 2");
    if (Number==0)
    Number=2;
    else
    Number = (Number*10) + 2; //Pressed twice
    tft.println(Number); //update new value
    delay(150);    
    }   
  }
    if (X<240 && X>160) //Detecting Buttons on Column 3
  {
   // if (Y>0 && Y<85)
    //{Serial.println ("OK");     
    //delay(150);
    //}
     if (Y>85 && Y<140)
    {Serial.println ("Button 9"); 
    if (Number==0)
    Number=9;
    else
    Number = (Number*10) + 9; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>140 && Y<192)
    {Serial.println ("Button 6"); 
    if (Number==0)
    Number=6;
    else
    Number = (Number*10) + 6; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }
     if (Y>192 && Y<245)
    {Serial.println ("Button 3");
    if (Number==0)
    Number=3;
    else
    Number = (Number*10) + 3; //Pressed twice
    tft.println(Number); //update new value
    delay(150);
    }   
  }
}
}
void draw_BoxNButtons()
{
  //Draw the Result Box
  tft.fillRect(0, 0, 240, 80, YELLOW);
  tft.setCursor(37, 27);
  tft.setTextSize(3);
  tft.setTextColor(BLACK);
  tft.println("Enter PIN");
 //Draw First Column
  tft.fillRect  (0,260,80,60,RED);
  tft.fillRect  (0,200,80,60,BLACK);
  tft.fillRect  (0,140,80,60,BLACK);
  tft.fillRect  (0,80,80,60,BLACK);
 //Draw SEcond Column
  tft.fillRect  (80,260,80,60,BLACK);
  tft.fillRect  (80,200,80,60,BLACK);
  tft.fillRect  (80,140,80,60,BLACK);
  tft.fillRect  (80,80,80,60,BLACK);
 //Draw Third Column  
  tft.fillRect  (160,260,80,60,BLUE);
  tft.fillRect  (160,200,80,60,BLACK);
  tft.fillRect  (160,140,80,60,BLACK);
  tft.fillRect  (160,80,80,60,BLACK);
  //Draw Horizontal Lines
  for (long h=80; h<=320; h+=60)
  tft.drawFastHLine(0, h, 240, WHITE);
  //Draw Vertical Lines
  for (long v=0; v<=240; v+=80)
  tft.drawFastVLine(v, 80, 240, WHITE);
  //Display keypad lables 
  for (long j=0;j<4;j++) {
    for (long i=0;i<3;i++) {
      tft.setCursor(22 + (85*i), 100 + (60*j));
      tft.setTextSize(3);
      tft.setTextColor(WHITE);
      tft.println(symbol[j][i]);
    }
  }
}
void checkPassword() {
     long value1 = EEPROM.read(addr) ;
     long value2 = EEPROM.read(addr1) ;
     password = (value1*100)+(value2);
  if (pass == 0){
     Serial.print(password);
     Serial.println();
     Serial.print(Number);
     if (Number == password){
      Serial.println("Access Granted");
      Serial.println("Relay ON");
      tft.fillScreen(PINK);
      tft.setCursor(25, 115);
      tft.setTextSize(5);
      tft.setTextColor(WHITE);
      tft.println("Welcome");
      digitalWrite(relayPin, HIGH);// Turn the relay switch ON to open door
      digitalWrite(buzzer, HIGH);
      delay(1000);
      digitalWrite(buzzer, LOW);
      Serial.println("Relay OFF");
      delay(2000);
      digitalWrite(relayPin, LOW);// set relay pin to LOW
} 
     else {
      Serial.println("Access Denied");
      tft.fillScreen(CYAN);
      tft.setCursor(30, 100);
      tft.setTextSize(5);
      tft.setTextColor(RED);
      tft.println("Access  Denied");
      delay(2000);
      digitalWrite(relayPin, LOW);// set relay pin to LOW
   }
     Number = 0;
     setup();
   }
if (pass==1){
  tft.fillRect(0, 0, 240, 80, CYAN);
  tft.setCursor(5, 10);
  tft.setTextSize(2);
  tft.setTextColor(BLACK);
  tft.println("Enter Current PIN:");
  if (X<240 && X>160 && Y>0 && Y<85)
    { 
      Serial.println ("OK");
      Serial.print(password);
      Serial.println(Number);
    if (Number == password){
      Number = 0;
      tft.fillRect(0, 0, 240, 80, CYAN);
      tft.setCursor(5, 10);
      tft.setTextColor(BLACK);
      currentpage = 2;
      tft.println("Enter New PIN:");
      if (X<80 && X>0 && Y>0 && Y<80){
        Serial.print("Set");
      }
      }
    else{
      Serial.println("Wrong Pin");
      tft.fillScreen(BLACK);
      tft.setCursor(60, 100);
      tft.setTextSize(5);
      tft.setTextColor(RED);
      tft.println("Wrong");
      tft.setCursor(86, 140);
      tft.println("Pin");
      delay(2000);
      setup();
    }
    }  
    }
}

Secondo me il problema è nel salvataggio della pwd in eeprom.
Io che sono pigro userei i metodi put() e get() invece di write() e read()... così puoi passare direttamente la variabile long invece di scomporla e ricomporla.
Qui il reference.
Se preferisci mantenere il tuo metodo devi considerare che un long è composto da 4 byte e non 2 come l'int.

Ciao Fratt
Mi potresti gentilmente fare un esempio sul mio programma , non riesco a capire come fare , perdona la mia ignoranza .
Grazie ancora per il tuo aiuto

password = EEPROM.get(addr);
EEPROM.put(addr, password);

Ciao Fratt
Ho provato a modificare il programma ,ma se sostituisco read con get , mi da errore se tento di compilare il programma

@Chris41 se guardi il reference che ha già linkato @fratt , puoi vedere che la sintassi della funzione non è corretta.
A scrivere a memoria così di getto su un forum è anche normale che uno non si ricordi esattamente... va bene il copia/incolla, ma un minimo di approfondimento lo devi fare tu :wink: :wink::joy:

EEPROM.get(addr, password);

Azz... e avevo pure linkato il reference... chiedo venia.