Compatibilita tra touch screen e software.serial

Ciao ragazzi

Sto cercando di scambiare dei dati tra due schede arduino una MEGA ed una UNO. Iproblemi di comunicazione li ho anche risolti ma questo mi sa che mi fara penare. Appena includo nel setup "mySerial.begin(9600)" per settare il seriale ausiliario touch ed azionamenti smettono di funzionare. :astonished: :astonished:

Mmm ... credo che la SoftwareSerial usi la "Pin Change Interrupts" che lavora a livello di singola PORT ... non vorrei che la cosa creasse qualche conflitto con le altre cose che usi ...

Guglielmo

Edit : Non solo, sulla Mega devi anche stare attento a che pin usi ... come descritto nel reference della SoftwareSerial

Si è vero infatti solo alcuni pin possono essere usati per fare da seriale (io uso il 52 ed il 53). Lo sketch che girava prima andava benone poi mi sono inventato di richiedere dei dati dall'altra scheda ho inserito un programma su softSerial e si inchioda tutto. Allora comincio a togliere e rimettere le parti di programma per vedere dove si inchioda (di solito faccio cosi e funziona) e quando tolgo e rimetto la parte di setup mySerial.begin che imposta la comunicazione seriale il sistema risponde. Ho provato di inserire la parte di programma in un "if , else" e quando si avvera l' if si inizializza la seriale e richiede il dato e quando l non si avvera si avvia lo sketch.

Il problema è che non ho idea di come portarmi fuori i dati.

Comunque non demordo 8) 8)

capitankevin: Si è vero infatti solo alcuni pin possono essere usati per fare da seriale (io uso il 52 ed il 53). ....

Mmm ... 52 è anche SCK (PB1) e 53 è anche SS (PB0) ... quindi occhio se usi qualche cosa su bus SPI ... e verifica anche se hai altre cose che stanno anche loro su PORTB ... :roll_eyes:

Guglielmo

Allora provo prima a cambiare i pin e vediamo

Guglielmo sei un grande. Ora lo sketch gira bene.

Senza che scriva un'altro topic: La seriale che ho fatto tra le due schede mi trasmette i dati ma dopo un po di tempo comincia a mischiarmi i dati e infine smette di funzionare (non sto usando quella lunga ma le schede sono appaiate) Potrebbe essere che resta qualche dato in memoria?

Difficile a dirsi così ... ... riesci a mettere il pezzo di codice che trasmette e dall'altra parte il pezzo che riceve ?

Guglielmo

P.S. : Do per scontato che i collegamenti elettrici siano tutti fatti correttamente, le masse in comune, ecc. ecc. ;)

Sono quasi perito elettrotecnico :smiley:

Con questa funziona

#include <SoftwareSerial.h>
SoftwareSerial mySerial(50, 51); // RX, TX

int temperatura=0;

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

void loop()
{ 
  mySerial.begin(9600);// Imposto la velocita di transfer dei dati 
  
  if (mySerial.available())
  mySerial.write (2);
  delay(200);
  mySerial.write (2);
  delay(200); 
  mySerial.write (2);
  delay(200); 
  mySerial.write (2);
  delay(200);
 
  temperatura=(mySerial.read());
  Serial.println(temperatura);
  delay(1000);
}

Dall’altra parte leggo una fila di 2 ed in questo seriale leggo 40 che il dati che l’altra scheda mi invia.
Se metto insieme questo programma con quello del touch dall’altra parte leggo file di numeri senza senso.
Se tiro lo sketch del touch leggo file di -1
Mi sa che è il touch.

Comunque lo sketch completo è circa questo
Poi ci devo attaccare il crono che ho fatto l‚Äôaltra volta ( quello con centomila ‚Äúwhile‚ÄĚ )

Temperature_stanze_con_lcd_soglie_e_time.ino (7.98 KB)

L'ho provato anche sulla linea lunga. se allo sketch tolgo la parte che gestisce il TFT il master riceve la richiesta ed invia il dato come numero "int" a patto che sia un numero positivo. Quindi è il touch. Un'idea sarebbe mettere la parte del seriale sotto ad un "if" e richiedere il dato allo slave ogni minuto e mettere il touch sotto ad else.

ma ci provo domani ora :sleeping: :sleeping: :sleeping:

buonanotte!

Non so se ci sono altri problemi, ma .. di sicuro la logica dentro loop() è sbagliata ...

l'inizializzazione della mySerial, con la mySerial.begin(9600) la devi fare una sola volta a livello di setup() e non di continuo nel loop() e poi :

void loop()
{ 
  mySerial.write (2);
  delay(200);
  mySerial.write (2);
  delay(200); 
  mySerial.write (2);
  delay(200); 
  mySerial.write (2);
  delay(200);
  if (mySerial.available()) {
    temperatura=(mySerial.read());
    Serial.println(temperatura);
  }
  delay(1000);
}

... è la lettura che deve essere condizionata dalla mySerial.available() ( ... che ti indica se ci sono dati presenti da leggere). In ogni caso ... qui vedo la scrittura di TRE caratteri (fai tre volte Serial.write()), ma vedo la lettura di UN solo carattere (una sola volta la Serial.read()) ... spero che dall'altro lato la situazione sia diversa o ... in poco tempo si perde i dati.

I -1 che leggi sono le mySerial.read() fatte quando non ci sono dati disponibili ... per questo si deve fare la Serial.read() solo quando è vera la Serial.available(). ;)

Guglielmo

Sostanzialmente, questo è un circuito di prova fatto solo per vedere se le schede comunicano (e per capire come funziona la trasmissione) quindi ho fatto delle prove: Inizialmente erano tre valori diversi (mySerial.write 1 ,2 e 3) e l'altra scheda a seconda del valore letto (1,2 o 3) mi mandava un diverso dato di risposta. Questo mi serviva a capire che dato mi arriva dall'altra parte e come posso fare per lavorarlo eventualmente con un conteggio ( che so moltiplica per 100 oppure se vale 30 fammi qualcosa). Dall'altra parte pero' non mi arrivavano sempre e non so se è per la linea lunga o altro. Se metto un solo mySerial.write(2) dall'altra parte leggo -1 -1 -1 2 2 2 -1 -1 2 -1 2 2 2 -1 -1 -1 -1-1 -1 2 2 -1 -1 ecc Con due andava meglio con tre serial era già ok. Il mySerial.begin era all'inizio sul setup poi ho provato a spostarlo in ottica di mettere tutto sotto ad un "if" per aggirare il problema del touch. Comunque se io tolgo tutta la parte che compila lo schermo, la seriale funziona benino (da una parte leggo 2 2 2 2 2 e dall'altra il valore della temperatura ) unica cosa se tolgo il collegamento continuo ad avere dati per un po' sia da una parte che dall'altra. Ma con il touch dentro allo sketch non se ne parla proprio (leggo numeri senza senso, e se li converto in ascii simboli senza senso) quindi per me potrebbe essere della tensione residua nelle uscite un po come succede agli ingressi analogici scollegati.

Buona notte e grazie per i consigli

Continuo a non vedere un codice ben scritto … e continuo a credere che il problema sia nel TUO software e non in altre cose …

Puoi mettere, con copia e incolla (così siamo sicuri) l’attuale parte di codice che coinvolge la seriale ?

Guglielmo

@capitankevin: non sei proprio nuovo del forum, dovresti mettere il codice usando gli appositi tag... :cold_sweat:

Scusate se ci ho messo un po’ a rispondere ma tra il lavoro e la scuola di tempo me ne rimane veramente poco :cold_sweat:
Gli sketch che uso per le prove di comunicazione sono questi:
Nella seriale ‚ÄúUSB‚ÄĚ del MASTER leggo tutti numeri senza senso.
Se allo sketch della SLAVE tolgo tutta la parte che riguarda il TFT (lascio al limite la libreria) il MASTER riceve 2 2 2 2 2 2 ed invia il dato temperatura e quindi funziona correttamente.

Potrebbe essere l‚Äôorologio interno di arduino? E‚Äôun‚Äôidea che mi √® venuta ora: ‚Äúl‚Äôuso di serial.begin a valore troppo basso disturba l‚Äôorologio interno di aduino‚ÄĚ quindi potrebbe essere anche il contrario‚Ķ?

Temperature_stanze_con_lcd_soglie_e_time.ino (8.02 KB)

prova_dialogo_bus_sketch_di_esempio_master.ino (469 Bytes)

Vedo che NON hai minimamente capito quello che ti ho detto in merito alla ricezione dei dati ... :roll_eyes:

Nella parte master spiegami il senso di queste righe :

if (mySerial.available())
  mySerial.write (2);
  delay(200);
  mySerial.write (2);
  delay(200); 
  mySerial.write (2);
  delay(200); 
  mySerial.write (2);
  delay(200);

In particolar modo il test sulla disponibilità in INPUT di dati sulla seriale ... prima di scriverne in OUTPUT ??? :astonished: :astonished: :astonished:

Nell'altra parte stessa situazione se non peggiore ... ... lettura di dati in INPUT senza sapere se ce ne sono disponibili e ... test della disponibilità in INPUT prima di un OUTPUT ... :astonished: :astonished: :astonished:

void loop()
{ 
  dato=(mySerial.read());
  
  if (dato==2)
  { 
    if (mySerial.available())
    mySerial.write (temperatura);
  }
    
   Serial.println(dato);
  delay(1000);
 }

NO, non ci siamo, cos√¨ √® pi√Ļ che normale che tu abbia risultati stravaganti ...

Guglielmo

Quindi il "mySerial.available()" andrebbe solo per la ricezione? OK. provo a cambiare. Il problema è che non ho mai lavorato con la seriale e sto cercando di capire come funziona trasmissione e ricezione per poi cercare di ricavarmi i dati che mi servono.

Però t'avevo detto di studiarti il reference ... perché usare le funzioni senza sapere quello che fanno ... è un bel caos ...

Ripeto ... ... la disponibilità dei dati in INGRESSO sulla porta seriale NON è garantita, occorre verificare che ci siano dati disponibili. La funzione che permette di fare questo è : Serial.available() (... idem per la SoftwareSerial) e va chiamata prima della lettura di OGNI singolo carattere :

if ( Serial.available() ) {
   carattere = Serial.read();
   ...
   elabora il SINGOLO carattere
   ...
}

Ti ricordo che la Serial.read() legge UN carattere e che prima di leggere il successivo DEVI di nuovo verificare che sia disponibile.

La Serial.read() NON si ferma ad aspettare che arrivi un carattere ... se c'è te lo da, altrimenti restituisce un valore fisso che è -1 che ... in molti casi può non creare problemi (se lo si tratta come carattere da scartare), ma in altri (es. quando ci si scambia dati binari) sicuramente non va bene e crea problemi. La cosa migliore è quindi SEMPRE verificare la disponibilità di caratteri in ingresso prima di leggere.

Spero sia chiaro ... :)

Guglielmo

Ora va meglio perche i dati li ricevo sempre e con regolarità ma solo se tolgo la parte di sketch che compila il TFT
Questo è lo sketch che funziona

Temperature_stanze_con_soglie_time_e_seriale.ino (6.58 KB)

prova_dialogo_bus_sketch_di_esempio_master.ino (467 Bytes)

Temperature_stanze_con_lcd_soglie_e_time.ino (7.91 KB)

  1. Quale TFT stai usando (dammi un link per vedere le caratteristiche) ?

  2. Quale libreria TFT stai usando (di nuovo, dammi il link per esaminarla) ?

Guglielmo

Allora:

Lo schermo e della DF ROBOT ed è il DFR0241. Per quanto riguarda lo sketch invece, io non ho usato una libreria specifica ma mi sono basato sugli sketch di esempio di arduino, quindi arduino, esempi, TFT_TOUCH.

Cerco di non usare librerie perch√® vorrei capire come funziona il programma visto che poi lo dovr√≤ esporre all'esame di maturit√† :cold_sweat: :cold_sweat: e poi anche perch√® finora mi sono limitato a fare una schermata che mi serviva a vedere le temperature senza andare ogni volta sulla seriale. Ora sto cominciando a buttare gi√Ļ qualcosa di specifico per lo schermo visto che il resto funziona abbastanza bene.