Visualizzare valori su progress bar Nextion

Buongiorno,
vorrei chiedere un aiuto, io ho una variabile "segnale" che mi da valori da 0.1 a 100, la trasmetto in una casella di testo al Nextion con il seguente sketch

char sSeg[4];
  dtostrf(segnale, 4, 1, sSeg);
  lbvalue.setText(sSeg);

e fin qui nessun problema.
Vorrei però avere affiancata alla casella di testo anche una Progress Bar, qui mi sorgono problemi.
Anche leggendo gli esempi contenuti nella libreria non riesco a venirne a capo.

Qualcuno potrebbe spiegarmi meglio l'utilizzo della funzione

NexProgressBar

Grazie

Vedi se questo aiuta, in italiano

Ciao e grazie.
Sai che non ci sono link

Ooops

"la PROGRESS BAR cambia COLORE nei Nextion !! - Nextion #15 - YouTube"

1 Like

Ciao e grazie per il consiglio.
Il tuo esempio mi ha dato spunto per altre idee sempre sulla progress bar.

Ho risolto così però:

 if (segnale >= 0 <= 100);
  segnale = map(segnale, 0, 100, 100, 0);
  j0.setValue(segnale);

Ora ho completato un piccolo lavoro con tutte le informazioni che mi servivano.
Grazie

Occhio che la condizione dell'if scritta così non fa quello che pensi.

if ((segnale >= 0) && (segnale <= 100))

Poi il punto e virgola subito dopo l'if chiude l'if e quindi le istruzioni successive vengono sempre eseguite. Forse volevi aprire una graffa.

1 Like

Ciao e grazie.
Come vedi sono un po inesperto....
Non ho ancora provato a fare come mi hai consigliato, però nonostante tutto la progress bar mi funzionava (ci credo ovviamente a ciò mi hai detto sia chiaro).

Appena dopo aver postato la parte del codice, ho provato a rimuovere ma giusto per prova tutta la condizione dell'if e la progress bar andava ancora.

Quindi a questo punto secondo te, per un corretto funzionamento la condizione dell'if (come lìhai scritta tu) è meglio lasciarla oppure no ?

Non volevo aprire una graffa.

E allora a che serve l'istruzione condizionale if, se poi non metti le istruzioni da eseguire quando la condizione è vera?

1 Like

Questa riga viene "scartata" dal compilatore, è come se non esistesse.
Impostano nell'IDE i warning al massimo esce:

C:\Temp\arduino_modified_sketch_558277\sketch_jul28a.ino: In function 'void setup()':
C:\Temp\arduino_modified_sketch_558277\sketch_jul28a.ino:4:18: warning: comparison of constant '100' with boolean expression is always true [-Wbool-compare]
 if (segnale >= 0 <= 100);
     ~~~~~~~~~~~~~^~~~~~
C:\Temp\arduino_modified_sketch_558277\sketch_jul28a.ino:4:13: warning: comparisons like 'X<=Y<=Z' do not have their mathematical meaning [-Wparentheses]
 if (segnale >= 0 <= 100);
     ~~~~~~~~^~~~
C:\Temp\arduino_modified_sketch_558277\sketch_jul28a.ino:4:25: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
 if (segnale >= 0 <= 100);
                         ^

Cosi' ha senso

if ( segnale >= 0 && segnale <= 100 )
{ segnale = map(segnale, 0, 100, 100, 0);
  j0.setValue(segnale);
}

poi, se in quel codice, segnale non sarà mai >100, allora non serve a nulla il controllo

Grazie.
Si, il segnale non potrà mai essere superiore a 100, quindi a questo punto mi sembra di capire che è inutile mettere l'istruzione condizionale if.

Invece, ho aggiunto qualche riga nello sketch, per far cambiare colore alla progress bar, ho creato tre range in cui dovrebbe cambiare colore.
Sono riuscito a capire (in parte) come fare, però la barra mi cambia colore ripetutamente.

segnale = map(segnale, 0, 100, 100, 0);
  j0.setValue(segnale);

  if
  (segnale >= 0 < 2)
  {
    j0.Set_font_color_pco(2016);
  }
  else if
  (segnale >= 2 <= 5)
  {
    j0.Set_font_color_pco(65504);
  }
  else
    (segnale > 5 <= 100);
  {
    j0.Set_font_color_pco(63488);
  }

  delay(3);
}

E' come se il programma leggesse tutte e tre le condizioni ripetutamente, senza verificare effettivamente se la condizione sia soddisfatta.
Tutta questa parte di codice è sotto un

}
void updateNextion() {

Dove sto sbagliando ?
Grazie

Nel NON leggere con attenzione le risposte che ti stanno dando :wink:

Come ti hanno già fatto notare @fratt e @nid69ita non puoi fare un if del genere (da dov'è che hai preso questa sintassi fantasiosa???)
if (segnale >= 0 < 2)

deve invece essere cosi

if ( segnale >= 0 && segnale <2 )

1 Like

Eeee.... non posso dirtelo da dove è uscita.
E' uscita dalla mia mente contorta :laughing: comunque !

Piccolo consiglio spassionato... mettendo istruzioni "a caso" non arriverai mai da nessuna parte :dizzy_face:

Secondo me devi fare qualche passo indietro e prendere tra le mani un bel manuale di C/C++ o almeno di Arduino (che poi di base siamo li).

1 Like

Questo è tutto ciò che ho fatto, seguendo consigli, cercando nel web e leggendo le librerie dei vari componenti che sto utilizzando

#include <DHT.h>                                   
#include <Nextion.h>                                
#include <TinyGPS++.h>                              
#include <SoftwareSerial.h>                        

static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;

NexText lbalt = NexText(0, 13, "t10");              
NexText lbtemperatura = NexText(0, 7, "t2");       
NexText lbumidita = NexText(0, 8, "t3");            
NexText lblat = NexText(0, 11, "t8");               
NexText lblon = NexText(0, 12, "t9");               
NexText lbvel = NexText(0, 14, "t11");              
NexText lbhdop = NexText(1, 3, "segnale");          
NexProgressBar j0 = NexProgressBar(1, 4, "j0");     

#define DHTPIN 9                                    // SENSORE COLLEGATO AL PIN 9
#define DHTTYPE DHT22                               // SELEZIONO IL TIPO DI SENSORE

DHT dht(DHTPIN, DHTTYPE);                           // CREO OGGETTO DHT
SoftwareSerial gpsSerial(3, 4);                     // IL NEXTION E' COLLEGATO AI PIN 3 (RX) E 4 (TX)
TinyGPSPlus gps;                                    // CREO L'OGGETTO GPS

SoftwareSerial mySerial(RXPin, TXPin);

float t;                                            // DICHIARO LA VARIABILE PER LA TEMPERATURA
float u;                                            // DICHIARO LA VARIABILE PER L'UMIDITA'
float latitudine;                                   // DICHIARO LA VARIABILE PER LA LATITUDINE
float longitudine;                                  // DICHIARO LA VARIABILE PER LA LONGITUDINE
float altitudine;                                   // DICHIARO LA VARIABILE PER L'ALTITUDINE
float velocita;                                     // DICHIARO LA VARIABILE PER LA VELOCITA'
float segnale;                                      // DICHIARO LA VARIABILE PER IL HDOP ("SEGNALE")

void setup() {
  Serial.begin (115200);                            // INIZIALIZZO LA SERIALE
  mySerial.begin (9600);                            // INIZIALIZZO LA SOFTWARE SERIAL
  dht.begin();                                      // INIZIALIZZO IL SENSORE
  nexInit();                                        // INIZIALIZZO IL NEXTION
}

unsigned long t1, dt;

void loop() {

  dt = millis() - t1;                              
  if (dt > 100) {
    updateNextion();
    t1 = millis();
  }

  latitudine = gps.location.lat ();                 // LEGGO LA LATITUDINE
  longitudine = gps.location.lng ();                // LEGGO LA LONGITUDINE
  altitudine = gps.altitude.meters ();              // LEGGO L'ALTITUDINE
  velocita = gps.speed.kmph ();                     // LEGGO LA VELOCITA'
  segnale = gps.hdop.hdop ();                       // LEGGO HDOP ("SEGNALE")
  t = dht.readTemperature();                        // LEGGO LA TEMPERATURA
  u = dht.readHumidity();                           // LEGGO L'UMIDITA'

  while (mySerial.available() > 0)
    if (gps.encode(mySerial.read()));

}
void updateNextion() {

  if (gps.altitude.isValid())
  {
    char sAlt[8];
    dtostrf(altitudine, 5, 0, sAlt);
    lbalt.setText(sAlt);
  }
  else lbalt.setText("---");

  if (gps.location.isValid())
  {
    char sLat[11];
    dtostrf(latitudine, 11, 6, sLat);
    lblat.setText(sLat);
  }
  else lblat.setText("no signal");

  if (gps.location.isValid())
  {
    char sLon[12];
    dtostrf(longitudine, 12, 6, sLon);
    lblon.setText(sLon);
  }
  else lblon.setText("no signal");

  if (gps.speed.isValid())
  {
    char sVel[8];
    dtostrf(velocita, 5, 1, sVel);
    lbvel.setText(sVel);
  }
  else lbvel.setText("---");

  char sSeg[4];
  dtostrf(segnale, 4, 1, sSeg);
  lbhdop.setText(sSeg);

  char sTemp[8];                                    // CREO UN ARRAY DI CARATTERI PER LA TEMPERATURA
  dtostrf(t, 5, 2, sTemp);                          // TRASFORMO UNA VARIABILE FLOAT (t) E LA MEMORIZZO IN UNA STRINGA (sTemp)
  lbtemperatura.setText(sTemp);                     // PASSO UNA STRINGA ALLA LABEL lbtemperatura

  char sUmid[8];                                    // CREO UN ARRAY DI CARATTERI PER L'UMIDITA'
  dtostrf(u, 5, 2, sUmid);                          // TRASFORMO UNA VARIABILE FLOAT (t) E LA MEMORIZZO IN UNA STRINGA (sTemp)
  lbumidita.setText(sUmid);                         // PASSO UNA STRINGA ALLA LABEL lbumidita

  segnale = map(segnale, 0, 100, 100, 0);
  j0.setValue(segnale);

  if
  (segnale >= 0 && < 2)
  {
    j0.Set_font_color_pco(2016);
  }
  else if
  (segnale >= 2 && <= 5)
  {
    j0.Set_font_color_pco(65504);
  }
  else
    (segnale > 5 && <= 100);
  {
    j0.Set_font_color_pco(63488);
  }

  delay(3);
}

Io prendo spunto da qui.
Hai magari altro da consigliarmi ?

Arduino si programma in C, quindi un qualsiasi manuale di questo linguaggio può essere utile.
Qui: Appunti di programmazione su Arduino: controllo di flusso | Michele Maffucci
un sito con esempi base Arduino e linguaggio.

1 Like

Questo volendo è ulteriolmente semplificabile in:

j0.setValue(100-segnale);

Ciao, Ale.

Ottimo grazie.
Ai fini pratici, come è meglio e perché ?
Si risparmia memoria e il codice diventa più “snello” ?

In pratica è assolutamente uguale.

Si, in linea generale è così, si risparmia la chiamata ad una funzione e la relativa creazione di variabili usate come parametri, roba che richiede comunque tempo e memoria.
Nel caso specifico non ricordo se map() è effettivamente una funzione od una macro (e sono troppo pigro per andare a controllare...), nel secondo caso può solo aumentare leggermente la dimensione del programma, ma non la memoria occupata.

Ciao, Ale.