Problemi con programmino semplice

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  Serial.begin(1200);
}

void loop() {
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial.write (inByte); 
    lcd.println(inByte);
  }
}

Salve a tutti,
sto usando questo semplice programmino per leggere dei dati da seriale e visualizzarli su serial monitor.
Volevo stamparli a video ma purtroppo, non riesco. Ho testato il circuito LCD con lo sketch di esempio "hello world" e funziona, ma se uso lo sketch qui sopra non visualizza altro che una riga completamente nera, una bianca, una nera e una bianca.
Ho provato anche a mettere l' lcd.print fuori dall' if ma il risultato non cambia. Dove sbaglio?
La stringa in ingresso da seriale è un stringa ASCII di 32 caratteri.
Grazie a tutti quelli che vorranno aiutarmi.

Hai dimenticato:

 lcd.begin(16, 2);

Serve per inizializzare il LCD e specificare colonne e righe.

Si Paolo hai ragione,
l'ho riscritto talmente tante volte che mi è scappato... però purtroppo mettendolo non risolve.
Ora mi appaiono tutta una serie di numeri: '8'32'72'105'32'13'10

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  lcd.begin(20,4);
  Serial.begin(1200);
}

void loop() {
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial.write (inByte); 
    lcd.println(inByte);
  }
}

Ciò che entra su Rx (pin 0) sono stringe ASCII 32 caratteri... che sia quello l'inghippo?

Se spedisci un numero come stringa, poi lo ricevi come tale e lo stampi come tale.
Ossia se spedisci "32" trasmetti "3" + "2" e come tali li ristampi. Devi spedire un byte di valore 32 per poter scrivere sul display il carattere ASCII 32 oppure riconvertire i valori ricevuti in un unico codice ASCII.

Grazie Leo,
allora questo è il mio problema: su Rx mi entra una volta al secondo una stringa ASCII di 32 caratteri che su serial monitor mi visualizza così:"kT1 26.3 Lo 26.3 Hi 26.3"
Sullo sketch dichiaro questa stringa int inByte.
Se non ho capito male quindi, lcd.println(inByte); non si può fare direttamente, ma devo tradurre la stringa?

Prova ad usare il metodo lcd.write per scrivere il valore in formato byte.

Ora li scrive giusti, grazie. Mi spieghi la differenza?
Esiste l'equivalente di println con write?

9six4:
Ora li scrive giusti, grazie. Mi spieghi la differenza?

Come nel Serial, print "traduce" i valori in formato "console" quindi se hai un byte lo stampa trasformandolo in stringa mentre write stampa il corrispondente carattere ASCII.

Esiste l'equivalente di println con write?

Non ho capito.

leo72:

9six4:
Esiste l'equivalente di println con write?

Non ho capito.

ho capito che non ha capito

la println non è altro che la write, ma che prima trasforma i valori passando dalla tabella ascii: ASCII - Wikipedia

Si scusate, mi son spiegato male. Semplicemente chiedevo se anche write dava la possibilità di andare a capo automaticamente al termine dell'istruzione.

Allora... usando questo sketch scrive le cose giuste però purtroppo scrive tutto di seguito e quindi alla fine non si capisce molto:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  lcd.begin(20,4);
  Serial.begin(1200);
}

void loop() {
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial.write (inByte); 
    lcd.write(inByte);
  }
}

La stringa ASCII che mi invia lo strumento però è comprensiva di e line feed. Come posso fare in modo che il programma riconosca automaticamente i comandi e line feed e li esegua anche quando invio il dato ad LCD? Su serial monitor il dato appare perfetto, va a capo automaticamente e salta una riga. Per fare un confronto devo usare il loro codice decimale?
Grazie

ricordati che se scrivi una lettera tra apici singolo (es: 'a') il compilatore la valuta secondo il valore numerico: quindi dato che CR LF corrisponde a "\r\n" puoi dire che se incontri '\n' vai a capo

Grazie lesto era proprio quello che volevo sapere.
Il problema successivo però è quello che avevo postato ieri, esprimendomi male, ovvero: mentro con la funzione "print" se voglio che al termine della stampata vada a capo basta che gli dia il comando "println", come faccio ad ottenere la stessa cosa con la funzione "write"?

write('\n') :grin:

Scusate se vi rompo le scatole per certe cavolate ma io ci provo anche a cercare in giro ma niente... ho letto in giro sul reference book ma il mio caso non l'ho trovato.
Questo vale per ogni supporto? Ovvero sia per LCD, che per stampante o memorizzazione su SD?

Dubbio:

if (Serial.available()) {
int inByte = Serial.read();
Serial.write (inByte);
lcd.write(inByte);

Su uno sketch cosi quando sapendo che il penultimo carattere della mia stringa è sempre "/n", in teoria quando esegue lcd.write(inByte) ed inByte assume il valore "/n" non dovrebbe andare a capo automaticamente?

hai perfettamente ragione. Ma stai parlando un LCD, non di un computer. lui non sa "andare a capo", è fatto solo per mostrare una stringa, quindi sei tu che devi programmare l'atmega in modo da far credere all'utente che il LCD vada a capo et fronzoli vari

quindi io potrei fare una cosa del genere:

if (inByte = '/n'){
lcd.write('/n');
}else if (inByte = '/r'){
lcd.write('/r');
}

confermi?

no, LCD NON sa cosa farsene dei tuoi a capo. Lui è fatto per essere usato come a battaglia navale, dando le coordinate X e Y, non sa niente di righe o menate varie, il massimo della sua intelligenza è andare di seguito se gli passi più valori (ma nnon penso nemmeno che sia l'LCD, mi sa che è la libreria). Quindi in pratica se ricevi un \r\n (in windows) un \n (in linux) o un \n\r (in mac) devi dire all'lcd di posizionarsi alla riga successiva usando il gioco della battaglia navale col cursore.

Perfetto, ho risolto grazie!
Questo è lo sketch finale:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  lcd.begin(20,4);
  Serial.begin(1200);
}

void loop() {
  
  if (Serial.available()) {
    char inByte = Serial.read(); 
    switch (inByte) {
    case '\n':
      lcd.setCursor(0,0);
      break;
    case 'L':
      lcd.setCursor(0,1);
      lcd.write("L");
      break;
    case 'H':
      lcd.setCursor(0,2);
      lcd.write("H");
      break;
    case '\r':
      break;
    default: 
      Serial.write(inByte);
      lcd.write(inByte);
      }
  }
}

Cosi facendo ho eliminato anche il problema della stringa che eccedeva la lunghezza dell'LCD quindi quando mi da la temperatura max (Hi) e min (Lo) vado su una nuova riga.
Ora devo trovare il modo di stampare tutto questo su carta... il problema è, non so perchè, che quando inserisco un comando di tipo printer.write(); non legge più la stringa ASCII ma mi da tutta una serie di 00X30 05X30 ecc ecc che in teoria dovrebbe essere un'altra forma di lettura del carettere ASCII giusto?

Problemino divertente: nel case ho distinto varie operazioni nel caso in cui entrino i caratteri 'L' 'H' '\n' e'\r'... la cosa divertente è che lui compie quelle operazioni anche se li vede come 72 74 10 o 13 ovvero i loro corrispettivi decimali! Come faccio per evitare questa cosa?
Per capirci voglio che vada a capo solo quando legge \r e non 13 perchè la mia stringa ASCII è alfanumerica e quindi sarebbe un disastro.
Grazie