Go Down

Topic: Un GO TO per Nextion display (Read 586 times) previous topic - next topic

lanjazz

Gentilissimo....
Domani mi ci rimetto... purtroppo ci sono pochi esempi online e i pochi video che potrebbero spiegare sono senza... spiegazioni (non capisco a cosa serve un video You Tube senza spiegazioni.....).
Ero riuscito a far partire il rotore tramite 4 "pulsanti" (NORD, EST, SUD e OVEST) ma una volta giunti ai gradi voluti la definizione (ruota finch'è == Gradi) non funziona e il rotore continua a girare. Funzionava anche la funzione (se posizione attuale < posizione richiesta gira in senso orario) mentre (se posizione attuale >posizione richiesta gira in senso antiorario). Ma poi non funzionavano più i due "pulsanti" manuali CW e CCW (clock e controclock ).

Del Nextion posso dirti che flaggando una casella ogni azione touch invia un codice seriale.
Quindi una volta che ho digitato 100° sulla tastierina touch e ho dato invio, vedo l'invio del seguente messaggio:
31 30 30   ossia da pagina 3 sono stati inviati i numeri 1, 0 e 0.
Ora il problema è farli vedere e gestirli su Arduino.....

fabpolli

Il problema dell'== è quello a cui facevo riferimento alcuni post fa, ovvero se tar lo spostamento e la lettura dell'encoder esiste la possibilità che non tutti i gradi vengono rilevati non puoi (e in linea generale non è mai una buona cosa fare) usare l'== ma < o >, alla peggio sei quanche grado in più o in meno che si va a sistemare con una procedura di orientamento fine ovvero piccoli spostamenti volti a raggiungere il grado desiderato, ma come farla dipende dall'hardware quindi casomai si affronta a tempo debito

fabpolli

Suppongo tu abbia fatto un "tastierino numerico" sul display, hai previsto un campo che fa vedere all'utente il numero digitato e eventualmente un tasto che permetta di cancellare eventuali errori? Se si puoi disattivare l'invio dei singoli pulsanti lasciandolo solo nel pulsante "invio" e quando Arduino riceve il segnale "invio premuto" nella sua callback leggi il valore del campo visualizzato sul Nextion e dovresti essere a posto
Mi scordavo casomai se servisse allegare il codice e/o il file del nextion il forum accetta i file zip

lanjazz

Si, tastierino numerico con visualizzazione dei dati, la possibilità di cancellare errori e il dato viene inviato dal pulsante INVIO.
Per il programma dell'editor Nextion ho provato ad inviarlo come .zip ma non vuole partire...

lanjazz

Ecco il file .zip che potrai aprire con Nextion Editor.
Ancora grazie.

fabpolli

Ne più ne meno di quanto già detto hai un campo contenente il valore digitato, leggilo da Arduino e fai andare l'antenna in quella posizione.
Aggiungo una cosa, che magari non sarà il tuo caso, trovo aberrante (per non dire altro) chiedere aiuto in un forum pubblico basato sull'open source e non fornire il sorgente con il quale si può sicuramente ottenere un aiuto maggiore, francamente non vi trovo il motivo nel farlo, per proteggere il lavoro fatto? Scusate lo sfogo ma trovo sempre più fastidioso l'utente che arriva con il progetto del termostato della serra/acquario che ritiene di aver "inventato" una soluzione super innovativa e che debba essere protetta da sguardi indiscreti

lanjazz

#21
Nov 17, 2018, 08:24 pm Last Edit: Nov 17, 2018, 08:32 pm by lanjazz
Beh, spero che non ti riferissi a me con quello che hai scritto... sul primo post di questo topic c'è il codice completo. Da quello ho fatto qualche minima correzzione ma è quello. Tra l'altro essendo io Radioamatore di vecchio stampo posseggo l'Ham Spirit... per chi non conoscesse il termine si tratta dello spirito di reciproca collaborazione e aiuto verso chi ne sa meno di noi con un'assenza totale di alterigia e lo scambio di idee, progetti e di collaborazione nel realizzarli.
Sul mio sito iz3zlu.weebly.com sono pubblicati tutti i miei progetti, sia quelli "originali" che quelli fatti seguendo un progetto già realizzato, con schemi elettrici e pcb. Ultimamente ricevo dal mio sito qualche richiesta di chiarimenti e sono sempre molto disponibile. Purtroppo quando mi trovo ad avere bisogno io sono pochissime le persone disposte ad investire un po del loro tempo. Per questo ti ringrazio e ti rimando al primo post per lo sketch completo... anzi, lo rimetto qua sottoe aggiungo l'indirizzo del nuovo video su Youtube
https://www.youtube.com/watch?v=JVZOkg2VBbw


Code: [Select]
// Sostituzione frontalino meccanico rotore Yaesu G-450C con display touch Nextion Advanced da 7''

byte PotentiometerPin = A0;  // pin del potenziometro

int PotentiometerValue;  // variabile del potenziometro
int GaugeValue;  // variabile del gauge
int ProgressBarValue;  // variabile progressbar
int ProgressBar2Value; // variabile progressbar2
int Numerogradi;// visualizza sul display il numero dei gradi di rotazione
int DigitNumber; //Valore digitato sul tastierino numerico
int CurrentPage = 0;  // variabile pagina iniziale


#include <Nextion.h>  
NexButton b3 = NexButton(0, 18, "b3");
NexButton b4 = NexButton(0, 19, "b4");
NexButton b5 = NexButton(0, 20, "b5");
NexButton b6 = NexButton(0, 21, "b6"); // pulsanti 0_90_180_270°
NexButton b0 = NexButton(0, 10, "b0");
NexButton b1 = NexButton(0, 11, "b1");
NexButton b16 = NexButton(3, 12, "b16");
NexButton b17 = NexButton(3, 11, "b17");
NexButton b15 = NexButton(2, 17, "b15");  //Tasto GO TO con valore impostato su tastierino numerico
NexText t0 = NexText(2, 19, "t0");
//
NexPage page0 = NexPage(0, 0, "page0");  // Pagina 0
NexPage page1 = NexPage(1, 0, "page1");  // Pagina 1
NexPage page2 = NexPage(2, 0, "page2");  // Pagina 2
NexPage page3 = NexPage(3, 0, "page3");  // Pagina 3

NexTouch *nex_listen_list[] =
{
  &b3,
  &b4,
  &b5,
  &b6,
  &b0,  // CW a pagina 0
  &b1,  // CCW a pagina 0
  &b15,   //-------------------- Tasto GO TO tastierino numerico
  &b16, // CW a pagina 3
  &b17, // CCW a pagina 3
  &page0,
  &page1,
  &page2,
  &page3,  
  NULL  
};  // Fine eventi touch


// Pulsanti Avanti e indietro Rotore:

// CW

void b0PushCallback(void *ptr)  
{
  digitalWrite(2, HIGH);  // Rotore gira in senso Orario CW
}  
void b0PopCallback(void *ptr)  
{
  digitalWrite(2, LOW);  // Rotore stop
}

void b16PushCallback(void *ptr)  // Rotore avanti da pagina 3
{
  digitalWrite(2, HIGH);
}  
void b16PopCallback(void *ptr)  
{
  digitalWrite(2, LOW);  // Rotore stop
}


// CCW

void b1PushCallback(void *ptr)  // Rotore indietro CCW
{
  digitalWrite(3, HIGH);  
}  
void b1PopCallback(void *ptr)  
{
  digitalWrite(3, LOW);  // Rotore stop
}  


void b17PushCallback(void *ptr)  
{
  digitalWrite(3, HIGH);  // Rotore indietro da pagina 3 CCW
}
void b17PopCallback(void *ptr)  
{
  digitalWrite(3, LOW);  // Rotore stop
}

// Inizio prova puntamento da tastierino numerico ////////////////////////////////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 // End of press event

// Cambio eventi a seconda della pagina selezionata
void page0PushCallback(void *ptr)
{
  CurrentPage = 0;  
}  
void page1PushCallback(void *ptr)  
{
  CurrentPage = 1;  
}
void page2PushCallback(void *ptr)  
{
  CurrentPage = 2;  
}
void page3PushCallback(void *ptr)
{
  CurrentPage = 3;  
}  // Fine cambio eventi


void setup()
{

  pinMode(PotentiometerPin, INPUT);  
  Serial.begin(9600);  


  b15.attachPush(b15PushCallback);
  b0.attachPush(b0PushCallback);
  b0.attachPop(b0PopCallback);  
  b1.attachPush(b1PushCallback);
  b1.attachPop(b1PopCallback);
                                  // INSERIRE b15 PAGINA 2?????
  b16.attachPush(b16PushCallback);
  b16.attachPop(b16PopCallback);  
  b17.attachPush(b17PushCallback);
  b17.attachPop(b17PopCallback);
  page0.attachPush(page0PushCallback);  // Pagina controllo rotazione
  page1.attachPush(page1PushCallback);  // Pagina cartina zone DXCC
  page2.attachPush(page2PushCallback);  // Pagina tastierino numerico
  page3.attachPush(page3PushCallback);  // Pagina Elevazione e azimuth


  pinMode(13, OUTPUT); // Led overlap
  pinMode(2, OUTPUT);  //Rotazione in senso orario CW
  pinMode(3, OUTPUT);  //Rotazione in senso antiorario CCW

}  //Fine SETUP

void loop()
{

  delay(100);  

  PotentiometerValue = analogRead(PotentiometerPin);  // leggi il potenziometro da 0 a 1023

  
 if(CurrentPage == 2){
  

Numerogradi = map(PotentiometerValue, 5, 1023, 0, 450);
 if(Numerogradi > 359)  // se il valore di rotazione supera i 359°
  {
    Numerogradi = Numerogradi - 360;  // Sottrai 360° e riparti da 0° in overlap
  }

  Serial.print("n0.val=");  
  Serial.print(Numerogradi);  
  Serial.write(0xff);  
  Serial.write(0xff);
  Serial.write(0xff);
}

  
if(CurrentPage == 3){
  

Numerogradi = map(PotentiometerValue, 5, 1023, 0, 450);
 if(Numerogradi > 359)  // se il valore di rotazione supera i 359°
  {
    Numerogradi = Numerogradi - 360;  // Sottrai 360° e riparti da 0° in overlap
  }

  Serial.print("n0.val=");  
  Serial.print(Numerogradi);  
  Serial.write(0xff);  
  Serial.write(0xff);
  Serial.write(0xff);
}

  if(CurrentPage == 0){

Numerogradi = map(PotentiometerValue, 5, 1023, 0, 450);
 if(Numerogradi > 359)  // se il valore di rotazione supera i 359°
  {
    Numerogradi = Numerogradi - 360;  // Sottrai 360° e riparti da 0° in overlap
  }

  Serial.print("n0.val=");  
  Serial.print(Numerogradi);  
  Serial.write(0xff);  
  Serial.write(0xff);
  Serial.write(0xff);


  GaugeValue = map(PotentiometerValue, 5, 1023, 90, 540);  

  if(GaugeValue > 359)  // se il valore di rotazione supera i 359°
  {
    GaugeValue = GaugeValue - 360;  // ricomincia da 0° (overlap)
  }

  Serial.print("z0.val=");  
  Serial.print(GaugeValue);
  Serial.write(0xff);  
  Serial.write(0xff);
  Serial.write(0xff);



  Serial.print("va0.val=");  
  Serial.print(GaugeValue);  
  Serial.write(0xff);  
  Serial.write(0xff);
  Serial.write(0xff);


  ProgressBarValue = map(PotentiometerValue, 5, 818, 0, 100);
  Serial.print("j0.val=");
  Serial.print(ProgressBarValue);  
  Serial.write(0xff);  
  Serial.write(0xff);
  Serial.write(0xff);
  
  ProgressBar2Value = map(PotentiometerValue, 819, 1023, 0, 100);
  Serial.print("j1.val=");
  Serial.print(ProgressBar2Value);
  Serial.write(0xff);  
  Serial.write(0xff);
  Serial.write(0xff);


  
// Led indicatore di overlap
if(ProgressBar2Value > 2)
 {
  digitalWrite(13,HIGH); // Se la barra di OVERLAP parte, accendi il led
 }
else
 {
  digitalWrite(13,LOW);}  

if(ProgressBar2Value > 99)
  {
 digitalWrite(2,LOW);
  }


  nexLoop(nex_listen_list);  // controlla ogni azione touch

}}

fabpolli

#22
Nov 21, 2018, 02:15 pm Last Edit: Nov 21, 2018, 02:15 pm by fabpolli
Allora ammetto che avrei potuto argomentare, il discorso parte dal fatto che hai allegato il compilato del Nextion anziché il sorgente che avrebbe consentito di essere più precisi senza andare ad indovinare nomi dei pulsanti ecc.
Comunque hai aggiunto parzialmente la gestione del pulsante invio, devi aggiungere la sua funzione di callback e all'interno della funzione che scatta alla pressione del pulsante invio devi leggere il valore contenuto nella casella di testo con i gradi impostati, fatto questo (guarda nella libreria c'è il metodo per leggere il testo di una casella) allora puoi implementare il resgo, intanto se riesci ad ottenere l'informazione dei gradi sei già quasi alla soluzione del problema, senza quest'informazione non puoi andare a implementare la rotazione

lanjazz

Ti ringrazio. Proverò a leggere la libreria per capirci qualcosa.
Grazie ancora.

fabpolli

Dovrebbe essere getString o una roba del genere

Go Up