Invio flag da Arduino a display

Salve a tutti

Sto cercando di effettuare una comunicazione seriale tra arduino ed un display della 4d System.
Attualmente sono riuscito a far leggere dei dati inviati dal display ad arduino attraverso la libreria SoftwareSerial in Arduino e attraverso l’istruzione serout() all’interno dell’IDE di programmazione del display.

Il problema che ho adesso è quello inverso, ovvero inviare dei dati (dei flag in particolare) da arduino al display sempre attraverso la comunicazione seriale.
L’istruzione da utilizzare con l 'IDE del display è in questo caso serin(), ovvero una istruzione che legge i caratteri che vengono inviati su seriale e restituisce un numero compreso tra 0 e 255 se legge il carattere, altrimenti se non legge caratteri restituisce -1.
Il problema che ho è proprio questo…non riesco ad inviare i flag al display…
Ho provato facendo cosi

#include SoftwareSerial.h
#include <SdFat.h>

SdFat sd;
SoftwareSerial Display(2,3);

void setup()
{
Display.begin(9600);

if (!sd.begin(4, SPI_HALF_SPEED))
{
if(Display.available())
// se l'sd non si carica invia un byte cosi serin restituisce -1
byte var = 01010101;
Display.print(var);
} else
{ 
// se la sd si carica allora invia il carattere cosi serin legge il carattere
if(Display.available())
char con = 'c';
Display.print(con);
}
}

void loop()
{
}

Come potete notare ho fatto una condizione adoperando la libreria SdFat (per motivi di scelta).
Potete darmi qualche aiuto gentilmente? :slight_smile:

byte var = 01010101;

questo è sbagliato il codice legge 1010101 come numero decimale superiore a 255 perchè lo registri come byte quindi tagliato

o metti var=85; o metti var=0x55; o metti var=B01010101;

Il problema persiste......secondo me cè un problema di sincronizzazione tra i due dispositivi

va bene però quello era sbagliato

grazie

La classe Serial è fatta in modo tale da restituire proprio -1 se si va a laggere un buffer di stream che non contiene dati. Questo significa che non hai dati. Quindi l’errore è da altre parti.

Ho provato a formattare automaticamente con la funzione apposita dell’IDE il tuo codice, e questo è quanto è venuto fuori:

#include SoftwareSerial.h
#include <SdFat.h>

SdFat sd;
SoftwareSerial Display(2,3);

void setup()
{
  Display.begin(9600);

  if (!sd.begin(4, SPI_HALF_SPEED))
  {
    if(Display.available())
      // se l'sd non si carica invia un byte cosi serin restituisce -1
      byte var = 01010101;
    Display.print(var);
  } 
  else
  { 
    // se la sd si carica allora invia il carattere cosi serin legge il carattere
    if(Display.available())
      char con = 'c';
    Display.print(con);
  }
}

void loop()
{
}

Come vedi, senza parentesi nei blocchi if, io credo che il compilatore interpreti male ciò che vuoi fare. Ad esempio, dopo Display.available, solo l’assegnazione a con viene eseguita, mentre Display.print dovrebbe essere eseguita sempre. Sistema un pò meglio perché credo che il problema sia qui

#include <SoftwareSerial.h>
#include <SdFat.h>


SoftwareSerial Display(2,3);

SdFat sd;

void setup()
{
  Serial.begin(9600);
Display.begin(9600);
  
    if (!sd.begin(4, SPI_HALF_SPEED)) {
        
      if(Display.available())
      {
        char con = 0x55;
        Display.write(con);
        Serial.println(F("no"));
        return;
      }
    }
  else {
        if(Display.available())
        {
          char con = 'c';
          Display.write(con);
          Serial.println("ok");
  }
  
}

}
void loop () 
{

}

Prova questo leo :slight_smile:

Sono a lavoro, non posso provare. Dimmi tu se funziona :wink:

non funge :(

Purtroppo non so piu che cosa pensare.....ho provato a forzare tra virgolette una sincronizzazione tra i due dispositivi ma non va bene

Suggerisco di iniziare dalle cose semplici…
se invii al display un carattere e provi a farlo stampare dal display (senza if ed altro), funziona?

e’ esattamente quello che sto facendo paulus ma non ci riesco…
Spiego cosa sto combinando: Se si tenta di fare una comunicazione da display ad Arduino (per cui Arduino in RX e display in TX) si fa cosi (magari puo essere da aiuto a qualcuno):

#include <SoftwareSerial.h>

SoftwareSerial Display(2,3); // io ho bisogno del pin 2 e 3 per TX ed RX

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

if(Display.available())

char c = Display.read(); // in questo modo leggo i caratteri dal display
Serial.print(c); // stampo i caratteri provenienti dal display su monitor serial
}


void loop()
{
}

nel mio caso necessito di inviare dei flag al display. Utilizzando sempre la libreria SoftwareSerial sto tentando di utilizzare la funzione Display.print(); per inviare i flag sul display, ma non funge…sono molto confuso per ora perche non so se l’errore che sto facendo è nella stesura del codice su arduino o sul display

Bene. Se ora metti un delay(2000) dopo le inizializzazioni delle seriali e magari un delay(1000) prima e sposti il resto nel loop, questo ti funziona? Ovvero... se programmi il display in modo da inviare qualcosa quando tocchi lo schermo, magari qualcosa che cambia a seconda della zona che tocchi o metti dei bottoni... insomma... ci siamo capiti... ad ogni tuo tocco corrisponde un carattere?

Se così funziona, allora la comunicazione è corretta. A questo punto dobbiamo provare la comunicazione inversa. Qui occorre vedere come stai programmando il display. Facci vedere anche il codice che usi lì.

Si si... Ho una tastiera progettata sul display...ad ogni tocco sul display corrisponderanno una stampa sul display (con una istruzione putch('a') se ad esempio premo il pulsante a e cosi via per gli altri caratteri), ed una istruzione serout('a') che inviera su seriale il carattere (e quindi ad arduino) una volta che è stato premuto. Arduino attraverso la SoftwareSerial e nello specifico attraverso l'istruzione

SoftwareSerial display(2,3);
....
.....

char c = Display.read();

legge correttamente i caratteri inviati dal display. Per cui la comunicazione è corretta.

A questo punto la mia necessita è quella di stampare delle stringhe sul display, possibilmente inviate da arduino....ad esempio se ho un istruzione che stampo su monitor seriale del tipo Serial.print(F("ciao")), vorrei che questa stringa venga stampata sul display, ma non è possibile da quanto ho capito ( o forse non ci riesco io)....

A questo punto ho deciso di scrivere le stringhe direttamente nel codice del display e di abilitare la visualizzazione di queste stringhe attraverso dei flag inviati da Arduino ovviamente attraverso seriale. il display in questione è un uLCD-70-DT della 4Dsystem che ho programmato in VISI (per cui codice 4DGL) e non in VISI-GENIE (piu utilizzato). Tra le varia istruzioni del 4DGL esiste serin(), che è una funzione che legge caratteri. Se legge un carattere, da come risultato un numero compreso tra 0 e 255, mentre se nn legge il carattere resituisce -1...il codice che ho scritto è il seguente:

var char;
.....

com_SetBaud(COM0,960);    // settaggio comunicazione a 9600 (in 4DGL si scrive BaudRate/10)

if(com_Count())       // sarebbe come l'available in Arduino

char := serin();

if(char != -1) // leggo un carattere

print("inizializzazione corretta");

else // non leggo il carattere

print("inizializzazione non corretta");

endif
endif

A questo punto passando su Arduino bisogna inviare un carattere se l'inizializzazione è corretta, altrimenti si invia un altro tipo di dato ad esempio un byte per fargli resituire -1.

Ok ci sono riuscito.... Ho inviato delle stringhe scritte semplicmente con DIsplay.print("stringa") al display

Bene! Mi sembrava strano che fosse impossibile inviare stringe :grin:

non è impossibile ma ti assicuro che è abbastanza incasinato scrivere del buon codice funzionante in 4DGL per la stampa di stringhe provenienti da un host