Go Down

Topic: Nextion display: recuperare valore di un campo testo (Read 266 times) previous topic - next topic

enrico_19

Ciao a tutti, sto cercando di recuperare un valore di un testo dal display touch Nextion...

Code: [Select]
char buffer[100];
memset(buffer, 0, sizeof(buffer));
t_hourmax.getText(buffer, sizeof(buffer));
Serial.println(buffer);


Sapete dirmi se c'è un altro modo visto che questo non funziona?
Grazie, ciao

fabpolli

Troppe poche informazioni
Com'è definito t_hourmax?
Che oggetto è sul display?
Perché ti serve recuperarne il testo?
Se puoi/vuoi metti tutto il codcie che magari è più comprensibile capire come mai una cosa non va


enrico_19

NexText t_hourmax = NexText(3, 7, "t_hourmax");

E' un campo testo, mi serve recuperare il valore per poi utilizzarlo...
E' solo quello che non va, riesco ad assegnargli un valore con setText, ma il getText non mi funziona.

fabpolli

Sembra corretto allora, non è che fai la setText prima di spostarti nella pagina del componente sul display?

enrico_19

No, il testo sul componente t_hourmax viene modificato direttamente dal codice del nextion premendo dei pulsanti... vuoi dire che posso fare il gettext solo se prima gli assegno un valore con settext?  :o

fabpolli

#5
Mar 25, 2019, 02:58 pm Last Edit: Mar 25, 2019, 02:58 pm by fabpolli
No scusa ho sbagliato invece di setText volevo scrivere getText, ovvero fai la getText che sei nella pagina del controllo o ti sei spostato di pagina?

enrico_19

Si sono nella pagina giusta, premendo un pulsante sulla stessa pagina dovrei recuperare quel valore, ma non mi restituisce niente...

fabpolli

Metti tutto il codcie di Arduino che magari la magagna si annida li, altrimenti non saprei cos'altro pensare a meno non vi sia un errore nella libreria Nextion (che io non uso)

enrico_19

Ho provato anche a togliere tutto e tenere solo la parte che non funziona...

Code: [Select]

#include <Nextion.h>

char buffer[100];

SoftwareSerial HMISerial(D5, D6);
NexText t_temp     = NexText(0, 1, "t_temp");
NexButton btn_settemp = NexButton(0, 13, "btn_settemp");

NexTouch *nex_listen_list[] = {
  &btn_settemp,
  NULL
};

void btn_settempPushCallback(void *ptr) {
  memset(buffer, 0, sizeof(buffer));
  t_temp.getText(buffer, sizeof(buffer));
  Serial.print("text: ");
  Serial.println(buffer);
}

void setup() {
  Serial.begin(115200);
  nexInit();
  t_temp.setText("11");
  btn_settemp.attachPush(btn_settempPushCallback, &btn_settemp);
}

void loop() {
  nexLoop(nex_listen_list);
}



Ma non funziona lo stesso...  :smiley-confuse:

fabpolli

Credo che il problema possa risiedere nel tipo d'oggetto e/o nella valorizzazione del valore sul Nextion, la getText invia un comando che richiede la proprietà t_temp.txt se tu setti sul display t_temp.val allora non può funzionare, se invece tu setti t_temp.txt allora c'è qualcosa che non va nella libreria, di più non so cosa dirti in quanto non la uso perché ho preferito farmi tutto da me perché ritenevo la loro libreria pesante e complessa da usare rispetto a intercettare i valori dalla seriale, analizzando proprio ora il contenuto della getText ho visto che fa uso della classe String per poi inviare un array di char, inutilmente pesante per la MCU in termini di memoria e alla lunga può portare a blocchi improvvisi. Prova a chiedere sul loro forum se esiste una segnalazione d'errore sulla getText o se esiste un workaround

enrico_19

Ok grazie per la disponibilità... se mi rispondono ti faccio sapere anche per completare il thread...
Da seriale per prendere il valore come si farebbe?

fabpolli

Dovresti ragionare "al contrario" ovvero lato arduino non puoi proprio usare la libreria, apri la seriale (HW o SoftwareSerial poco importa) e programmare lato Nextion la scrittura di ciò che vuoi ricevere lato Arduino con i comandi print e printh.
A quel punto su arduino ti basta verificare se esistono caratteri sulla seriale, riceverli e interpretare il comando.
Io per gestire i pulsanti sul display ho fatto un po' di salti mortali ma alla fine sono soddisfatto del risultato, ovvero:
  • Quando premo un pulsante incremento/decremento il valore di un oggetto/variabile
  • Nel codice del pulsante premtuo dopo aver incrementato/decrementato faccio partire un timer che ogni tot mS incrementa/decrementa il solito oggetto/variabile in questo modo no devo premere mille volte ma mi basta tener premuto
  • Quando viene rilasciato il pulsante fermo il timer descritto al punto due e tramite print invio su seriale il valore impostato preceduto da N caratteri (due/tre) che identificano il dato in arrivo

Lato arduino mi arriva una cosa tipo
NT20
Scompongo la stringa (array di char non classe String) per capire cosa fare e lo faccio :)

In questo modo ho diviso completamente la gestione dell'interfaccia grafica dall'operatività del programma. L'interaccia è a carico del Nextion che invia/riceve dati solo quando serve, Arduino si occupa di gestire i dati e operare in base ad essi.
In fase di avvio se devo inviare dei dati al display mi basta scrivere su seriale una cosa tipo
Code: [Select]

displaySeriel.print("text1.txt=pippo");
displaySeriel.write(0xFF);
displaySeriel.write(0xFF);
displaySeriel.write(0xFF);

Il Nextion vuole come terminatore tre 0xFF e il gioco è fatto

enrico_19

Ti ringrazio ancora per la dettagliata risposta, mi sa che mi farò la mia libreria utilizzando solo comandi seriali come mi hai spiegato tu

Go Up