Ciao a tutti!
Sto facendo un pò di prove con Arduino Mega R3 e il display Nextion NX4024T032_011 (sono andato a vedermi un pò di tutorial), ho creato un'interfaccia con l'ide di Nextion in cui ci sono 3 pulsanti e una casella di testo, alla pressione dei tre pulsanti viene acceso o spento il led corrispondente al colore del bottone premuto, fin qui tutto bene, funziona tutto... poi ho deciso che quando viene premuto un pulsante, oltre ad accendere/spegnere il led, il programma deve cambiare il testo della label sul display scrivendo "Rosso", "Giallo" o "Verde" a seconda dei casi o "Nessuno" se nessun led è acceso.
Qui nascono i problemi, il testo non cambia, il mio codice è questo:
NexButton bRed = NexButton(0, 1, "bRed");
NexButton bGreen = NexButton(0, 2, "bGreen");
NexButton bYellow = NexButton(0, 3, "bYellow");
NexText tLed = NexText(0, 4, "tLed");
NexTouch *nex_listen_list[] = {
&bRed,
&bGreen,
&bYellow,
NULL
};
// Callbacks buttons
void bRedPopCallback(void* ptr) {
digitalWrite(L_RED, !digitalRead(L_RED));
digitalWrite(L_GREEN, LOW);
digitalWrite(L_YELLOW, LOW);
tLed.setText("Rosso");
// Commentato perché non funziona
//writeStringToDisplay("tLed", "Rosso");
}
void bGreenPopCallback(void* ptr) {
digitalWrite(L_RED, LOW);
digitalWrite(L_GREEN, !digitalRead(L_GREEN));
digitalWrite(L_YELLOW, LOW);
tLed.setText("Verde");
}
void bYellowPopCallback(void* ptr) {
digitalWrite(L_RED, LOW);
digitalWrite(L_GREEN, LOW);
digitalWrite(L_YELLOW, !digitalRead(L_YELLOW));
tLed.setText("Giallo");
}
/*
Cercando su Internet ho trovato questo workaround
ma non funziona
*/
void writeStringToDisplay(String textName, String value) {
String stringData = textName + ".txt=\"" + value + "\"";
dbSerial.println("WriteStringToDisplay -> StringData: " + stringData);
nexSerial.println(stringData);
// Trovato su internet ma neanche questo funziona
// invia il comado un byte alla volta invece che come un'unico array di char
/*for (int i = 0; i < stringData.length(); i++)
{
Serial2.print(stringData[i]); // Push each char 1 by 1 on each loop pass
}*/
nexSerial.write(0xff); //We need to write the 3 ending bits to the Nextion as well
nexSerial.write(0xff); //it will tell the Nextion that this is the end of what we want to send.
nexSerial.write(0xff);
}
void setup() {
dbSerial.begin(9600);
nexSerial.begin(9600);
dbSerial.println("Pronto...");
nexInit();
// Register the pop event callback function of the components
bRed.attachPop(&bRedPopCallback);
bGreen.attachPop(&bGreenPopCallback);
bYellow.attachPop(&bYellowPopCallback);
// Leds setup
pinMode(L_RED, OUTPUT);
pinMode(L_GREEN, OUTPUT);
pinMode(L_YELLOW, OUTPUT);
}
void loop() {
// Listener for touch screen
nexLoop(nex_listen_list);
}
il metodo tLed.setText([i vari colori]);
non ha effetto, ho provato a fare un pò di debug alla libreria del display e ho scoperto che questa funzione richiama a sua volta la funzione SendCommand
e conseguentemente la funzione recvRetCommandFinished
che verifica l'esito della SendCommand. Se tutto va bene, la funzione di verifica riceve, dal display, la sequenza di caratteri "0x01, 0xff, 0xff, 0xff" quindi 4 byte, nel mio caso invece riceve il comando che avevo trasmesso e poi una sequenza di 3 byte contenenti 0xff, nella fattispecie "tLed.txt="[i vari colori]"0xff0xff0xff".
A questo punto vorrei sapere se qualcuno può darmi una mano a risolvere questo problema, perché aggiornare il testo di una label sul display, mi pare una cosa abbastanza comune da fare, ma potrei sbagliarmi...
Grazie!