Esempio LCD scroll

Ciao a tutti, negli sketch esempio , facendo prove con lo scroll lcd e usando un display hitachi a 8 colonne e 2 righe , non capisco perché se superò un certo numero di caratteri cominciano a mischiarsi le parole tra di loro e tra le 2 righe , come faccio ad ovviare il problema?
Grazie mille in anticipo

stai usando scrollDisplayLeft o cos'altro?

Si si , esatto eppure ho impostato LCD begin(8,2) ma fa uguale, ma bisogna sommare le colonne col testo che devi scrivere? Grazie

Inoltre vorrei in una riga visualizzare una temperatura e l'altra far scorrere scritte , ma si mischia anche la temperatura Ora ho cancellato la parte di sketch riguardante alla temperatura per capire bene il problema dello scroll LCD..

vediamo una cosa alla volta :)

Lo scroll è un pò una gatta da pelare. Questo è quanto riporta il datasheet del controller HD44780 di Hitachi:

For a 2-line display, the cursor automatically moves from the first to the second line after the 40th digit of the first line has been written. Thus, if there are only 8 characters in the first line, the DDRAM address must be again set after the 8th character is completed. (See Table 13.) Note that the display shift operation is performed for the first and second lines. In the example of Table 13, the display shift is performed when the cursor is on the second line. However, if the shift operation is performed when the cursor is on the first line, both the first and second lines move together. If the shift is repeated, the display of the second line will not move to the first line. The same display will only shift within its own line for the number of times the shift is repeated.

La miglior cosa sarebbe uno scrolling tuo. Ti crei una variabile buffer (che diventa un vero e proprio buffer video) che contiene un'immagine di ciò che è rappresentato sul display e lì scrivi, cancelli, sposti, posizioni tutto il testo. Ad intervalli regolari, spedisci il buffer video al display. Così lo spostamento lo fai tu semplicemente scorrento la riga o quello che ti serve di muovere.

Grazie mille , be io sono un novizio, avete qualche esempio?

No, non ho esempi a portata di mano. Però non è difficile. Ti crei un array di char con tante righe quante sono quelle del tuo display e poi ci scrivi lì invece che sul display reale. Ad intervalli regolari spedisci i dati al display (magari usando un timer o una funzione chiamata tramite controllo su millis).

leo72: No, non ho esempi a portata di mano. Però non è difficile. Ti crei un array di char con tante righe quante sono quelle del tuo display e poi ci scrivi lì invece che sul display reale. Ad intervalli regolari spedisci i dati al display (magari usando un timer o una funzione chiamata tramite controllo su millis).

differenza fra creare un array di char e una stringa? :)

Che un array è a più dimensioni, una stringa è monodimensionale ;)

All'array gli dai più dimensioni, ognuna per una riga del display. Quindi quando scrivi nell'elemento (0,0) sai che stai scrivendo nel corrispondente elemento del display.

Ci son riuscito facendo più passaggi , cioè mettendo un pezzo di frase per ogni funzione scroll.

Il problema rimane che non riesco a far una temperatura sulla seconda riga.., stasera vi posto lo sketc

leo72: Che un array è a più dimensioni, una stringa è monodimensionale ;)

All'array gli dai più dimensioni, ognuna per una riga del display. Quindi quando scrivi nell'elemento (0,0) sai che stai scrivendo nel corrispondente elemento del display.

Sìsì capisco, ma intendevo, c'è un qualche motivo (es. occupa meno memoria ecc) per cui dovrei preferire un array di char a una stringa per riga del display?

Lo scroll ti serve solo nel caso tu aggiungi una riga sul display?

Oppure vuoi comandare lo scroll tramite pulsanti, per scorrere su e già una lista ad esempio?

Ciao.

Vedendo "scrollLeft" immagino che lui faccia scorrere una scritta, altrimenti sarebbe stato scrollUp o scrollDown.

Vedendo "scrollLeft" immagino che lui faccia scorrere una scritta, altrimenti sarebbe stato scrollUp o scrollDown.

mmm.. si è vero, comunque se posta il codice che ha usato è meglio.

Ciao.

ciao ragazzi scusatemi per la lunga attesa ,ero un po incasinato… :grin:

ecco il codice:

#include <OneWire.h>
#include <LiquidCrystal.h>

#define BUTTON A0

int DS18B20_Pin = 8;

OneWire ds(DS18B20_Pin);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup(void) {
 Serial.begin(9600);
 lcd.begin(8, 2);
}

void loop(void) { 
lcd.print("prova scroll lcd hitachi.. ecc ecc ..  ");
 // scroll 13 positions (string length) to the left 
 // to move it offscreen left:
 for (int positionCounter = 0; positionCounter < 15; positionCounter++) {
   // scroll one position left:
   lcd.scrollDisplayLeft(); 
   // wait a bit:
   delay(300); 
 
 float temperature = getTemp();
 Serial.println(temperature);

 lcd.clear(); 
 lcd.setCursor(6,1);
 lcd.print("C'");
 lcd.setCursor(0,1);
 lcd.print(temperature);
 delay(1000); //just here to slow down the output so it is easier to read
} 
  
float getTemp(){
 //returns the temperature from one DS18B20 in DEG Celsius
 byte data[12];
 byte addr[8];
 if ( !ds.search(addr)) {
     //no more sensors on chain, reset search
     ds.reset_search();
     return -1000;
 }

 if ( OneWire::crc8( addr, 7) != addr[7]) {
     Serial.println("CRC is not valid!");
     return -1000;
 }

 if ( addr[0] != 0x10 && addr[0] != 0x28) {
     Serial.print("Device is not recognized");
     return -1000;
 }

 ds.reset();
 ds.select(addr);
 ds.write(0x44,1); // start conversion, with parasite power on at the end

 byte present = ds.reset();
 ds.select(addr);    
 ds.write(0xBE); // Read Scratchpad

 for (int i = 0; i < 9; i++) { // we need 9 bytes
   data[i] = ds.read();
 }

 ds.reset_search();
 byte MSB = data[1];
 byte LSB = data[0];
 float tempRead = ((MSB << 8) | LSB); //using two's compliment
 float TemperatureSum = tempRead / 16;
 return TemperatureSum;
}

dopo svariate prove non riesco ad uscirne

Lcd ha un buffer hardware di 40 caratteri per rigo. Anche se hai un diplay da 8 caratteri avrai sempre 40 caratteri scritti nelle rispettive celle del lcd. Se scrolli, crolli tutta la memoria, e ciò che è a fine rigo 1 va su rigo 2. Quindi hai due strade percorribili, hw e sw. Quella hw è di fare scroll della giusta lunghezza, coniderando correttamente il discorso dei 40caratteri suddetti. Quella sw è di non usare i comandi scroll e fare tutto in sw come dice leo. Se devi fare cose semplici lo croll hw basta

grazie mille per le info, sono riuscito a far scrollare tutto quello che dovevo far scorrere sul display facendo qualche ""passaggio"" in più con la funzione scroll.

il problema rimane che, se nella seconda riga del display aggiungo un controllo di temperatura mi si accavallano nuovamente le scritte.... , se passassi ad usare un display del 5110 ovvierei il problema? eppure mi serve un display molto piccolo come quello che sto usando ora visto che va montato su un aviomodello ;D

grazie mille in anticipo!!

Il problema deriva dal fatto che tu scrivi in continuazione la temperatura in una posizione fissa, mentre il testo lo scrivi solo una volta. Una possibile soluzione veloce, giusto per far pratica, è di calcolare quanto impiega a scrollare la scritta. MettiaMo che ci mette 5 secondi, tu stampa solo ogni 5 secondi la temperatura. In questo modo la temp scorrerà insieme al testo