Arduino Mega2560 e display Nextion

Il 02/01/2022 22:42, Drizzt do'Urden ha scritto:

Dunque, rivediamo il codice, vedi al centro la spiegazione:

String caffe= ""; // questi comandi devono essere uguali a quelle stringhe che vedi String caffeoff= "99 97 102 102 101 111 102 102 "; String caffeon="99 97 102 102 101 111 110 "; String a="";

String com;

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

pinMode(22, OUTPUT); pinMode(13, OUTPUT); analogReference( INTERNAL2V56 );

}

void loop() { com="";

if (Serial2.available()) { a=Serial2.read();

}

if(a=="167") { //inizio comando int start=1; while(start==1) { a=Serial2.read();

if(a!="176")

com=com + a + " "; } else { start=0; // permette di uscire dal ciclo } } }

////////////////// ho cambiato questo Serial.print(com + " - ");

quello che viene memorizzato in com ora quando premo il pulsante caffeon esce questa roba

-1 -1 -1 -1 -1 -1 99 -1 -1 -1 -1 97 -1 -1 -1 -1 102 -1 -1 -1 102 -1 -1

-1 101 -1 -1 -1 111 -1 -1 110 -1 -1 /////////////////////////

Serial.print(com);

if (com == caffeon ) { digitalWrite (13, HIGH); Serial.print(" * HIGH * "); }

if (com == caffeoff ) { digitalWrite (13, LOW); Serial.print(" * LOW * "); }

}
--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden
Loading thread data ...

tante cose ti sfuggono.

cambia :

Serial.print(com + " - ");

in :

if(com!="")Serial.print(com + " - ");

tutto il resto lascialo invariato. non era colpa della seriale ma io che stampavo troppo :)

giusta la modifica che hai fatto :

if(a=="167"){

sei sicuro del codice ascii "167" ?

per vedere il numero ascii cambia il codice :

"""" if (Serial2.available()) { a=Serial2.read();

}

if(a=="167") """

in:

"""" if (Serial2.available()) { a=Serial2.read();

}

Serial.print(a + " "); if(a=="167") """

Questo solo per vedere se effettivamente ti arriva il codice giusto,

vedere il 167.

Reply to
Franco Af

Poi evidenziamo bene il comando:

sostituisci quello che ti ho scritto prima :

if(com!="")Serial.print(com + " - ");

con :

if(com!=""){ Serial.println(" "); Serial.print("comand = ") ;}

attento agli spazi se ci siano tutti, poi dopo li potrai togliere

Reply to
Franco Af

Il 03/01/2022 09:31, Franco Af ha scritto:

ok, fatto tutto, la seriale comunica ancora troppo :-D All'inizio il monitor fa una serie infinita di spazi vuoti poi quando premo il tasto la prima volta esce questo che dovrebbe corrispondere a caffeon: comand = 176

176 176 176 176 176 176 176 176 176 176 con 176 all'infinito

quando premo la seconda volta che dovrebbe corrispondere a caffeoff esce un 167 seguito a capo da questo: comand = 176 176

176 176 176 176 176 176 176 176 176 176 con 176 all'infinito

forse la continua comunicazione seriale intasa tutto, appare un 167 seguito a capo da questo:

comand = * HIGH * 176 176 176 176

176 176 176 176 176 176 176 176 con 176 all'infinito

Non riesco a capire dove sta l'inghippo.

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

dobbiamo eliminare un po' di "-1" (dovrebbe bastare Serial2.available()

modifica la parte:

while(start==1){ a=Serial2.read();

com=com + a + " "; }else{ start=0; // permette di uscire dal ciclo } }

con :

while(start==1){ if (Serial2.available()) { a=Serial2.read();

com=com + a + " "; }else{ start=0; // permette di uscire dal ciclo } } }

Reply to
Franco Af

Il 03/01/2022 14:02, Franco Af ha scritto:

ieri) non vedo altre differenze, cosa mi sto perdendo? :-)

String caffe= ""; // questi comandi devono essere uguali a quelle stringhe che vedi String caffeoff= "99 97 102 102 101 111 102 102 "; String caffeon="99 97 102 102 101 111 110 "; String a="";

String com;

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

pinMode(22, OUTPUT); pinMode(13, OUTPUT); analogReference( INTERNAL2V56 );

}

void loop() { com="";

if (Serial2.available()) { a=Serial2.read();

}

Serial.print(a + " ");

if(a=="167") { //inizio comando int start=1; while(start==1) { a=Serial2.read();

if(a!="176")

com=com + a + " "; } else { start=0; // permette di uscire dal ciclo } } }

if(com!="") { Serial.println(" "); Serial.print("comand = "); }

if (com == caffeon ) { digitalWrite (13, HIGH); Serial.print(" * HIGH * "); }

if (com == caffeoff ) { digitalWrite (13, LOW); Serial.print(" * LOW * "); }

}
--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

if (Serial2.available()) {

non hai guardato bene cosa ho scritto :)

Reply to
Franco Af

Il 03/01/2022 14:51, Franco Af ha scritto:

Reply to
Franco Af

Il 03/01/2022 14:51, Franco Af ha scritto:

volte per non fare brutta figura, inutile, bisogna ammetterlo, sono proprio negato per queste cose, per fortuna ci siete voi ad aiutarmi :-D Ora funziona perfettamente, la seriale parla ancora tantissimo, non si ferma mai ma il led si accende e si spegne senza perdere un colpo.

istruzioni poi vediamo se ci capisco.

Codice aggiornato:

String caffe= ""; // questi comandi devono essere uguali a quelle stringhe che vedi String caffeoff= "99 97 102 102 101 111 102 102 "; String caffeon="99 97 102 102 101 111 110 "; String a="";

String com;

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

pinMode(22, OUTPUT); pinMode(13, OUTPUT); analogReference( INTERNAL2V56 );

}

void loop() { com="";

if (Serial2.available()) { a=Serial2.read();

}

Serial.print(a + " ");

if(a=="167") { //inizio comando int start=1; while(start==1) { if (Serial2.available())

{ a=Serial2.read();

if(a!="176")

com=com + a + " "; } else { start=0; // permette di uscire dal ciclo } } }

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

figurati io che programmo da 40 anni e ti ho fatto fare l'errore che avevo corretto :) succedono ste cose

correggiamo qualcosa :

vedi, serviva per capire i comandi :

memoria (come ti dicevo all'inizio) , dovrai modificare tutto con gli array e usare le funzioni per il confronto.

Potresti togliere anche gli spazi, ma meglio alla fine. Fai una sola modifica alla volta per non ritrovarti con codice che non funizona :)

Reply to
Franco Af

Il 03/01/2022 15:48, Franco Af ha scritto:

appaiono bene HIGH e LOW, ho anche eliminato gli spazi della stringa. Ora devo mandare al display la temperatura e siccome varia velocemente

temperatura non si perda un tocco al pulsante, usando la libreria Nextion il problema era proprio quello, si perdevano alcuni tocchi se capitavano mentre si mandava la temperatura.

Sempre un grande grazie :-)

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

ottimo :) non mandarli spesso i messaggi della temperatura, altrimenti ogni volta che spedisci puoi creare il problema, usa un metodo per un timer non bloccante, li trovi sul web :)

Reply to
Franco Af

Il 03/01/2022 16:14, Franco Af ha scritto:

E' quello il problema, avevo usato il millis() anche con la libreria, si trovano tutorial in rete ma se nel momento che mandi la temperatura premi un pulsante, non viene letto, io pensavo che comunque il dato arrivasse al buffer e venisse letto in seguito.

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

Il 03/01/2022 16:14, Franco Af ha scritto:

Dunque, sono riuscito a mandare la temperatura al modulo facendola transitare dalla seriale continuamente, ad ogni loop e il pulsante non perde un colpo. E' presto per cantare vittoria ma almeno per ora funziona meglio che con la libreria Nextion. Poi con calma mi spiegherai il discorso delle stringhe e della frammentazione della memoria, magari come lo spiegassi ad un inscimunito :-)

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

Il 03/01/2022 21:42, Drizzt do'Urden ha scritto:

Ho aggiunto, per provare, un'altra trasmissione dati ad un altro modulo e in questo caso, con due moduli che ricevono costantemente il pulsante

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

Il 03/01/2022 21:42, Drizzt do'Urden ha scritto:

dichiara una variabile fuori dal loop

unsigned long tim=0;

void loop(){

if (tim >= 10000){ // ho messo 10000 ma regola tu il tempo giusto che possa trasmettere ogni 2\3 secondi

// questo per vedere il tempo che passa poi lo togli Serial.print("* ");

tim = 0;

}else{ ++tim; // incrementi di 1 la variabile }

}

La classe String gestisce la memoria per la stringa dinamicamente, ogni volta che cerchi di darle un valore (cambiare la lunghezza della

piccola, lei realloca la memoria creando dei buchi che arduino non gestisce nel migliore dei modi. Per non far troppi danni, dichiara le variabili String al di fuori delle funzioni (all'interno vengono cancellate ogni volta che esci da quella funzione, se create staticamente nello stack) che non verranno mai

minore rispetto al doverle ricreare ogni volta in un loop.

devi seguire, per non far troppi danni, e quella della dichiarazione al di fuori delle funzioni.

Per il momento non cambiare nulla non mi sembra ci siano grossi problemi, aspetta :)

Reply to
Franco Af

Il 04/01/2022 14:59, Franco Af ha scritto:

molto meglio, a professionisti come voi potrebbe sembrare scritta da un

Ho ottimizzato i dati sulla seriale per trasmetterli solo se siamo sulla pagina giusta, manca ancora la gestione della temperatura e, cosa molto importante, memorizzare il set della temperatura su eeprom per mantenerlo anche quando si spegna la macchinetta. Non ridere :-P

#include

String caffeoff = "9997102102101111102102"; //stringa pulsante caffe che arriva dal Nextion String caffeon = "9997102102101111110"; String vapoff = "11897112111102102"; //stringa pulsante vapore che arriva dal Nextion String vapon = "11897112111110"; String setpiu = "115101116109101110111"; //stringa pulsante +Set Temp che arriva dal Nextion String setmeno = "115101116112105117";//stringa pulsante -Set Temp che arriva dal Nextion String page0 = "1129710310148"; //stringa numero pagina String page1 = "1129710310149";

int page0on = 1; int page1on = 0;

String a=""; //variabile dove si memorizza la lettura della seriale dal Nextion String com; //variabile dove viene memorizzata la stringa completa che arriva dal Nextion

float intemperatura = A0; // ingresso sensore temperatura int settemp=80; //minima temperatura di set

unsigned long t1, dt; //timer per mandare valori al display

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

pinMode(22, OUTPUT); pinMode(13, OUTPUT); analogReference( INTERNAL2V56 );

}

void loop() { com=""; //azzeramento variabile

if (Serial2.available())// in attesa che arrivi un carattere dal Nextion { a=Serial2.read(); }

{ int start=1; while(start==1) { if (Serial2.available()) { a=Serial2.read(); if(a!="176")

{

comando }

else { start=0; // permette di uscire dal ciclo } } } }

if (com == caffeon ) { digitalWrite (13, HIGH); }

if (com == caffeoff ) { digitalWrite (13, LOW); }

if (com == vapon ) { digitalWrite (22, HIGH); }

if (com == vapoff ) { digitalWrite (22, LOW); }

if (com == page0) // memorizza la pagina 0 su cui stiamo lavorando { page0on = 1;

}

if (com == page1) // memorizza la pagina 1 su cui stiamo lavorando { page1on = 1;

}

selezionata la pagina relativa { settemp= settemp + 1; Serial2.print("settemp.val="); // selezionare il modulo numerico scrivendo l'id corrispondente al modulo a cui si vuole inviare Serial2.print(settemp); //manda la temperatura al modulo numerico che vuole un intero Serial2.write(0xff); // bisogna mandare i tre caratteri di fine trasmissione Serial2.write(0xff); Serial2.write(0xff); }

selezionata la pagina relativa { settemp= settemp - 1; Serial2.print("settemp.val="); // selezionare il modulo numerico scrivendo l'id corrispondente al modulo a cui si vuole inviare Serial2.print(settemp); //manda la temperatura al modulo numerico che vuole un intero Serial2.write(0xff); // bisogna mandare i tre caratteri di fine trasmissione Serial2.write(0xff); Serial2.write(0xff); }

if (page1on == 1) // manda il valore del set temperatura solo se la

{ Serial2.print("settemp.val="); // selezionare il modulo numerico scrivendo l'id corrispondente al modulo a cui si vuole inviare Serial2.print(settemp); //manda la temperatura al modulo numerico che vuole un intero Serial2.write(0xff); // bisogna mandare i tre caratteri di fine trasmissione Serial2.write(0xff); Serial2.write(0xff); }

float temperatura = mapFloat(analogRead(intemperatura), 186, 585, 150,

19); int temp=temperatura;

pagina 0 { dt = millis() - t1;

if (dt > 500) { Serial2.print("n0.val="); // selezionare il modulo numerico scrivendo l'id corrispondente al modulo a cui si vuole inviare Serial2.print(temp); //manda la temperatura al modulo numerico che vuole un intero Serial2.write(0xff); // bisogna mandare i tre caratteri di fine trasmissione Serial2.write(0xff); Serial2.write(0xff); } }

}
--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

Il 04/01/2022 16:07, Drizzt do'Urden ha scritto:

Trovato subito un errore, manca: t1=millis();

--
Saluti da Drizzt, quello vero! 


www.agidone.altervista.org 
MAI PIU' UN CESSO DI OPEL IN VITA MIA!!!! 
http://www.tappezzeriagraziella.com/
Reply to
Drizzt do'Urden

ad una occhiata veloce sembra buono :)

un float. Magari ti serve per altri motivi, non vedendo tutto il codice per quella

ottimo lavoro dai :)

Reply to
Franco Af

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.