lcd 1602 ma 3 righe da scrivere

Ciao a tutti,

Grazie al vostro aiuto sono riuscito ad andare avanti con il mio progetto, ma mi trovo davanti ad un dilemma per il quale non trovo soluzioni online.

Ho il solito schermo arduino lcd 1602, ma avrei bisogno di scriverci 3 righe e non 2, come posso fare?
Potrei aggiungere un tasto per fa comparire un altra riga?
O addirittura un'altra pagina di due righe? (perché adesso rilevo solo 3 dati, ma ne aggiungerò man mano).
Pensavo quindi a 1 pulsante per andare avanti, o magari anche 2, uno per andare avanti e l'altro per tornare indietro.

Come dovrei procedere?

Se avete altre soluzioni ben venga!!

questo è il mio sketch

#include <dht11.h>                         //For DHT11
#include <OneWire.h>                       //For DS18B20
#include <LiquidCrystal.h>

const byte DHT11_PIN = 4;                  //DHT11 Signal pin on digital 4
const byte DS18B20_Pin = 2;                //DS18B20 Signal pin on digital 2

dht11 DHT;
OneWire ds(DS18B20_Pin);                  // on digital pin 4
float temperature;                        //For DS18B20
int chk;                                  //For DHT11
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);


void setup()
{
  Serial.begin(9600); 
  //Serial.println("DHT TEST PROGRAM ");   //DHT11
  //Serial.print("LIBRARY VERSION: ");
  //Serial.println(DHT11LIB_VERSION);
  Serial.println();
  //Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
  lcd.begin(16, 2);
}
 
void loop()
{
                                           //Start DHT11
  chk = DHT.read(DHT11_PIN);               // READ DATA DHT11
  switch (chk){
    case DHTLIB_OK:  
                 //Serial.print("OK,\t ");
                  Serial.print("Umidita dentro casa : \t ");   // DISPLAT DATA
                  Serial.print((float)DHT.humidity,1);
                  Serial.println(" %");
                  lcd.setCursor(0, 0);
                  lcd.print("Umid casa ");
                  lcd.print((float)DHT.humidity,1);
                  lcd.println(" %");
  
                  Serial.print("Temp. dentro casa : \t ");
                  Serial.print((float)DHT.temperature,1);
                  Serial.println(" c");
                  lcd.setCursor(0,1);
                  lcd.print("Temp casa ");
                  lcd.print((float)DHT.temperature,1);
                  lcd.println(" c");                 
                break;
    case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); 
                break;
    case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); 
                break;
    default: 
                Serial.print("Unknown error,\t"); 
                break;
  }                                      //End DHT11
 
 
                 float temperature = getTemp();     //Start DS18B20
                 Serial.print("Temp. acqua :            ");
                 Serial.print(temperature);
                 Serial.println(" c");
                 Serial.println(" ");
                 //lcd.setCursor(0,1);
                 //lcd.print("Temp acq  ");
                 //lcd.print(temperature);
                 //lcd.println("c");
 
 delay(1000);                                       //just to slow down the output it's easier to read
 
}


float getTemp()
{
 //returns the temperature from one DS18S20 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;                       //End DS18B20
 
}
  1. intemittenza
  2. scorrimento
  3. pulsanti
  4. display 4x16 o 2x20

Ciao Uwe

La soluzione più semplice è ovviamente quella di usare un display da 4 righe x 20 caratteri.

Dal punto di vista software, invece, bisogna adottare una tecnica particolare che memorizza le righe su un vettore char da 16 caratteri ciascuno e tanti elementi quante le righe richieste.

Sarà poi una routine di visualizzazione a far apparire sulle righe del display le righe "virtuali" giuste: inizialmente solo le righe del vettore 0 ed 1, ma premendo il pulsante "avanti" le righe 1 e 2 e così via.
Ovviamente sarà necessario anche il pulsante "indietro" che decrementerà il contatore.