Problema trasmissione dato numerico da HMI Nextion ad Arduino

Salve a tutti, da qualche giorno sto tentando di creare uno sketch in grado di ricevere un dato numerico da una numbox sul display che acquisisce il valore dell'RTC integrato nella HMI Nextion in modo da non dover utilizzare un modulo RTC direttamente collegato ad arduino.
Mi spiego meglio, sulla HMI Nextion ho utilizzato i comandi rtc0, rtc1, rtc2, rtc3 e rtc4 per visualizzare sullo schermo: anno, mese, giorno, ora e minuto correnti, associandoli a numbox rispettivamente nominate n0, n1, n2, n3, n4.
Per quanto riguarda l'interfaccia HMI sembra essere tutto ok, la visualizzazione avviene correttamente sia della data che dell'orario; Il problema sorge quando tento di inviare una delle numbox sopracitate ad arduino.
Premetto che in passato avevo provato a scrivere un valore numerico da arduino a HMI tramite il comando "numbox.setText(nome variabile); " e funzionava benissimo.
Sto ora tentando di fare l'esatto contrario, ovvero ricevere la numbox con il comando "numbox.getValue(nome variabile); " ottenendo sempre 0 come risultato.
Inserendo infatti un comando "Serial.print(nome variabile); " non visualizzo l'effettivo numero della numbox su Nextion.

Vi scrivo lo sketch per una più esaustiva spiegazione:

#include <Nextion.h>

NexNumber n2 = NexNumber(0, 4, "n2");
uint8_t NUMminuti;

void setup() {
  nexInit();
  Serial.begin(9600);
}

void loop() {
  n2.getValue(&NUMminuti);
  Serial.println(&NUMminuti);
  Serial.println();
  delay(1000);
}

Cosa succede se nella Serial.print togli la &?

salve! prima di tutto grazie per la tua attenzione.
Ho provato a togliere la & dal comando Serial.print, esattamente come mi hai detto tu ma restituisce un errore:

In function 'void loop()':
sketch_jul20c:12:25: error: no matching function for call to 'NexNumber::getValue(uint8_t*)'
   n2.getValue(&NUMminuti);

Da quanto ho letto in giro su internet la & indica l'indirizzo della variabile seguente, che non è quello di cui ho bisogno, perchè devo solo inviare un valore reale di una NumberBox su Nextion ad Arduino.
In poche parole volevo sfruttare l'RTC del display per poter eseguire alcune funzioni su Arduino.
Ho programmato infatti la HMI in modo da leggere la data e l'orario su dei NumberBox e volevo riportare esattamente i valori di quei NumberBox in delle variabili su Arduino.
Spero di essermi spiegato bene.

Hai provato così?

  n2.getValue(&NUMminuti);
  Serial.println(NUMminuti);
  Serial.println();
  delay(1000);

Salve, prima di tutto mi scuso per il ritardo nel risponderti, in questi giorni ho cercato di capire come far comunicare dati da Nextion ad Arduino e ci sono riuscito utilizzando i comandi della seriale trasmettendo il valore dei minuti correnti letti dall'RTC interno di Nextion, ho provato anche con i secondi e il risultato ottenuto è stato quello sperato.
Ora però ho un nuovo problema, non riesco a capire come far comunicare 3 byte contemporaneamente da Nextion ad Arduino.
Mi spiego meglio, sullo sketch di Arduino leggo la seriale attraverso il comando Serial.read(), questo però non mi permette di capire quale byte spetta alle ore, quale ai minuti e quale ai secondi proprio per il fatto che il byte in arrivo da Nextion non sia scomposto ma contenga tutti e 3 i valori nello stesso byte.
Esiste un comando della seriale che permette di scomporre i byte o devo inviare questi in maniera diversa dal Nextion?
Grazie mille per la disponibilità!

Posta il codice che stai usando e spiega meglio la storia di "un solo byte" (magari mettendo un esempio).

Salve, mando il codice e spiego anche altri problemi che ho riscontrato.

void setup() {
  Serial.begin(9600);
}

void loop() {
  receiveData();
}

void receiveData() {
  char RxTemp;
  while (Serial.available()) {
    RxTemp = Serial.read();
    Serial.println((byte)RxTemp);
  }
}

Il problema sta nel fatto che ho una sola variabile che contiene 3 valori, perchè da Nextion ho scritto:

prints rtc3, 1 (sta per printString, attributo (in questo caso rtc3 che sono le ore) di lenght 1 byte.
prints rtc4, 1 (minuti, lenght 1 byte)
prints rtc5, 1 (secondi, lenght 1 byte)

Sulla HMI nextion ho anche impostato un timer di 1000 millisecondi che allo scadere, invia i dati nuovi via seriale e si autoresetta.

Il punto è che non voglio una sola variabile che contenga 3 byte ( le tre variabili dell'rtc) presi dalla seriale, ma bensì 3 variabili diverse, nominate rispettivamente: ore, minuti e secondi che contengono i corrispettivi valori dell'rtc di Nextion.

Un altro problema che ho riscontrato è che questo codice che ti ho mandato ora (sketch di arduino attuale) ogni tanto restituisce dei valori di 255 e non ho ancora capito come mai.
Posto anche ciò che mi scrive la seriale:

23
5
58
23
5
59
23
6
0
23
6
1
23
6
2
23
6
3
23
6
4
23
6
5

All'inizio è tutto ok, poi dopo qualche minuto:

23
7
45
23
7
46
23
7
47
36
255
255
255
23
7
48
23
7
49
23
7
50
23
7
51

Come si può osservare, restituisce un valore di 36, successivamente tre volte 255.
Non ho idea da dove provengano questi valori.
Grazie per la vostra pazienza!

36 equivale a 24 in esadecimale, e se controlli i possibili valori ritornati dal Nextion ti accorgi che corrisponde a "serial buffer overflow", cioè troppi caratteri presenti nel buffer di comunicazione seriale, il cui limite è 1024.

Ciao, Ale.

Ti ringrazio tantissimo, sono settimane che tento di risolvere questo problema.

Chiedo se è possibile svuotare in qualche modo il buffer, ho letto su internet che vari utenti hanno addirittura disabilitato e riabilitato la seriale tramite i rispettivi comandi Serial.end() e Serial.begin(baudrate) ma mi sembra un po' eccessivo interrompere la comunicazione seriale.

Ci sono alternative per svuotare il buffer?

P.S: Ho notato però che questo problema non avviene in maniera cadenzata, cioè in periodi precisi, ma in maniera casuale, per esempio dopo 5 secondi, successivamente dopo 30, poi dopo 8, e così via.

Non credo esista un'istruzione specifica, in genere occorre prestare attenzione a non sovraccaricare il buffer. Per rimediare alla situazione di buffer overflow in corso una strategia può essere:

  1. Arrestare con un delay() ogni altra operazione di trasmissione, dando così tempo al Nextion di svuotare il buffer.

  2. Ritrasmettere l'ultimo dato inviato, che sarà andato probabilmente perduto.

Ciao, Ale.

[quote="Gabriele_Arduino, post:5, topic:887186, full:true"]
Salve, prima di tutto mi scuso per il ritardo nel risponderti, in questi giorni ho cercato di capire come far comunicare dati da Nextion ad Arduino e ci sono riuscito utilizzando i comandi della seriale trasmettendo il valore dei minuti correnti letti dall'RTC interno di Nextion, ho provato anche con i secondi e il risultato ottenuto è stato quello sperato.

Salve a tutti, posso chiedere come hai risolto . ho più ho meno lo stesso problema e vorrei sapere come hai risolto la lettura del dato numerico da nextion

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.