seriale su lcd 4x16

Buongiorno, sto mettendo insieme una stazione meteo per uso volo libero, i sensori sono su un traliccio in montagna, la parte che riceve è a casa mia a 16 km di distanza. La trasmissione avviene in seriale a 1200 baud su un canale di un ponte a microonde. Ho smandruppato lo sketch analog in serial out e sono riuscito a fare leggere 3 tensioni da 0 a 5 volt ed inviare in seriale i dati letti , ma non trovo il modo di visualizzarli da un altro arduino su un lcd a 4 x 16. Ho tentato di cannibalizzare lo sketch serial display, ma le stringhe che su monitor seriale sono tutte belle incolonnate, sul display appaiono in modo casuale confuso con in mezzo strani simboli.
Qualcuno di voi ha provato a fare un qualcosa di simile ?

ciao,

magari se posti lo sketch ci diamo un occhio...

EDIT: ed anche un link per verificare che LCD hai

Il file staz meteo è la parte che trasmette e funziona, la parte ricevente l’ho copiata dallo sketch serial display che c’è negli esempi e ho modificato il settaggio per 4 righe e 16 colonne.
Il display è un 16x4 hd44780.

SerialDisplay1.ino (1.84 KB)

staz-meteo.ino (2.06 KB)

Adesso sono fuori casa…quando rientro ci do un’occhiata

Nella parte di scrittura sul display non fai nessun controllo per vedere quando finisce una riga e devi passare alla successiva... Sei sicuro che i dati ti arrivino già "formattati" in modo da risultare incolonnati correttamente?

Poi mi sembra ci sia una graffa in più... e l'ultimo lcd.write finisce fuori dall'if.

A naso, direi che il mio problema è quello che hai addocchiato, cioè : non so come fare a fare il ritorno a capo tra una riga e l'altra. Il lato trasmissione scrive 4 righe ed invia un "ln" ogni riga, difatti su serial monitor oppure su hyperteminal di windows , tutto va bene, ma sul display è un macello !!
Dove manca la graffa ?

iw2buv:
... difatti su serial monitor oppure su hyperteminal di windows , tutto va bene, ma sul display è un macello !!

Il comportamento di un qualsiasi terminale seriale è ben diverso da quello di un qualsiasi display LCD.

Premesso questo, con gli LCD devi essere TU a definire le varie righe (NON va a capo a solo) ed ad inviarle, una ad una, tramite gli appositi comandi di posizionamento cursore, sulla riga giusta.

Guglielmo

P.S.: Anche perché, se ti studi il datasheet del HD44780 (... tanto quei display sono tutti compatibli), scoprirai che riga 1, riga 2, riga 3 e riga 4 nella memoria del LCD NON sono consecutive ma, in realtà, nella suddetta mappa di memoria mette riga 1 poi riga 3 poi riga 2 e poi riga 4 e calcolate sui 20 caratteri per riga ... quindi ... la cosa più semplice e posizionarsi al punto giusto e scrivere una singola riga.

Non ti voglio dare la pappa pronta, ma forse ti serve per capire ( Speriamo )

Quindi:

  1. modifica lo sketch staz-meteo così
  // print the results to the serial monitor:
  Serial.print("V");
  Serial.println(vel);
  Serial.print("D");
  Serial.println(direz);
  Serial.print("T");
  Serial.println(tempc);
  Serial.print("R");
  Serial.println(raff);

e come serial display, usa questo

/*
  Modified Example of processing incoming serial data without blocking.
  Author:   Nick Gammon
*/

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const unsigned int MAX_INPUT = 10;
char temperatura[6];
char direzione[6];
char velocita[6];
char raffiche[6];
unsigned long previousMillis ;

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

void process_data (const char * data)
{
  char valore = data[0];
  switch (valore) {
    case 'T':
      for ( int i = 0; i < 6; i++ ) {
        temperatura[i] = data[i + 1];
      }
      break;
    case 'D':
      for ( int i = 0; i < 6; i++ ) {
        direzione[i] = data[i + 1];
      }
      break;
    case 'V':
      for ( int i = 0; i < 6; i++ ) {
        velocita[i] = data[i + 1];
      }
      break;
    case 'R':
      for ( int i = 0; i < 6; i++ ) {
        raffiche[i] = data[i + 1];
      }
      break;
  }
}

void processIncomingByte (const byte inByte) {
  static char input_line [MAX_INPUT];
  static unsigned int input_pos = 0;

  switch (inByte)  {
    case '\n':   // fine del testo
      input_line [input_pos] = 0;
      process_data (input_line);
      input_pos = 0;
      break;
    case '\r':   // discard carriage return
      break;
    default:
      // keep adding if not full ... allow for terminating null byte
      if (input_pos < (MAX_INPUT - 1))
        input_line [input_pos++] = inByte;
      break;
  }
}

void loop()  {
  if (Serial.available () > 0)
    processIncomingByte (Serial.read ());

  if (millis() - previousMillis >= 1000) { // visualizza ogni secondo
    lcd.setCursor(0, 0);
    lcd.print ("Vel. Km/h      ");
    lcd.setCursor(11, 0);
    lcd.print (velocita);
    lcd.setCursor(0, 1);
    lcd.print ("Dir. gradi     ");
    lcd.setCursor(11, 1);
    lcd.print (direzione);
    lcd.setCursor(0, 2);
    lcd.print ("Temp.          ");
    lcd.setCursor(11, 2);
    lcd.print (temperatura);
    lcd.setCursor(0, 3);
    lcd.print ("Raffiche       ");
    lcd.setCursor(11, 3);
    lcd.print (raffiche);

    previousMillis = millis();
  }
}

Grazie mille per le risposte, procedo a sperimentare !!! Purtroppo, aimè, sono un uomo analogico, da 40 anni lavoro in RF, ponti radio, trasmettitori ricevitori e arnesi simili, la programmazione per me è una cosa misteriosa, ho già problemi con il timer della lavatrice !
La storia stazione meteo è cominciata una decina di anni fa, quando ho messo assieme anemometro e sonde varie gestite da un PIC16f877 (ovviamente il software non l'ho fatto io !!), il tutto montato a 1400 metri su un traliccio, tramite chiamata radio in UHF, risponde parlando con i dati meteo per il volo libero (direz. veloc. e temperat.). Adesso mi voglio evolvere e intendo mettere i dati su una pagina internet, essendo ignorante in materia, ho pensato di iniziare il percorso mettendo una bella telecamera ip che inquadra il display e tramite prot. FTP spedisce la foto. Lo so che qualcuno mi dirà che è una cosa animalesca, ma da qualche parte devo cominciare, poi con il tempo troverò il sistema di passare direttamente le stringhe seriali su pagina web.....

FANTASTICO !!! Funziona alla stragrande, grazie 2000 !!! Adesso cercherò di capire come funziona, non è poi proprio così banale ... Quanto prima sarà installato e vedremo i risultati.
Grazie ancora per il notevole aiuto !!