Nextion display: recuperare valore di un campo testo

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

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

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

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.

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

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

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?

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

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)

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

#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… :confused:

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

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?

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

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

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

Ma, riferendomi al “Serial.println(buffer);”,
sbaglio se ti dico che dovresti ciclare sul char array “buffer” per vedere sul serial monitor
i caratteri che contiene l’array “buffer”?
Così:

for(inti i=0; i<sizeof(buffer);i++)
Serial.println(buffer*);*

Perdonami ma, riaprire un topic chiuso da più di 120 giorni non andrebbe fatto, comunque la risposta è no per due motivi, primo perché la seriale la usa per inviare i comandi al display e il secondo motivo è che se scrivi sulla seriale un array di char ci pensa lei a spedirli tutti, con il tuo modo inoltre mandi un invio ad ogni carattere