Go Down

Topic: Problemi con programmino semplice (Read 2503 times) previous topic - next topic

9six4

Code: [Select]
#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.

PaoloP

Hai dimenticato:
Code: [Select]
lcd.begin(16, 2);

Serve per inizializzare il LCD e specificare colonne e righe.

9six4

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

Code: [Select]
#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?

leo72

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.

9six4

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?

leo72

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

9six4

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

leo72


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.

Quote

Esiste l'equivalente di println con write?

Non ho capito.

lesto



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: http://it.wikipedia.org/wiki/Ascii
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

9six4

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

9six4

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

Code: [Select]

#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 <CR> e line feed. Come posso fare in modo che il programma riconosca automaticamente i comandi <CR> 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

lesto

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
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

9six4

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"?

lesto

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

9six4

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:

Quote

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?

Go Up