Problema display lcd 16x2

Ciao a tutti, nn so spiegarmi se ho danneggiato il display lcd (quello che era nel kit di arduino) o se è la libreria o se ho sbagliato qualche dato nello sketch, praticamente nel display su 16 caratteri me ne mostra solo 8 nn so come fare per vedere il tutto, è passato qualche mese da quando ci avevo messo le mani, e ricordo che si vedevano tutti i caratteri, suggerimenti per capire dove sta il problema?

prova a postare lo sketch e le foto dei collegamenti... altrimenti è dura capirci qualcosa...

i collegamenti sono quelli del progetto sfera di cristallo preso dal libro, modificato un po' il tutto per il mio progetto, cmq vi posto lo sketch

#include <IRremote.h>
#include <IRremoteInt.h>
#include "DHT.h"
#include <LiquidCrystal.h>


#define DHTPIN 8
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

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

byte termometro[8] = //icona per termometro sotto i 15°
{
     B00100,
     B01010,
     B01010,
     B01010,
     B01010,
     B11111,
     B11111,
     B01110
};

byte termometro1[8] = //icona per termometro sopra i 15°
 {
     B00100,
     B01010,
     B01010,
     B01110,
     B01110,
     B11111,
     B11111,
     B01110
 };
 
byte termometro2[8] = //icona per termometro sopra i 25°
 {
     B00100,
     B01010,
     B01110,
     B01110,
     B01110,
     B11111,
     B11111,
     B01110
 };
 
 byte termometro3[8] = //icona per termometro sopra i 30°
 {
     B00100,
     B01110,
     B01110,
     B01110,
     B01110,
     B11111,
     B11111,
     B01110
 };

byte umidita[8] = //icona per umidità
 {
     B00100,
     B00100,
     B01010,
     B01010,
     B10001,
     B10001,
     B10001,
     B01110,
 };

int tasto = LOW;

//Sistema IR 
int RECV_PIN = 6;  //IR connessione ricevitore pin 6
 
//Mappatura codici dei tasti del telecomando 
 
/*-----COMANDI------*/
const long ledlcd = 0x83227689;  //spegne e accende retro illuminazione lcd
const long mute = 0x83226E91;     //comandi per la lettura dei sensori nel terrario 
const long ritorno = 0x83228E71;  //porta alla funzionalita del messaggio iniziale sempre attivo
/*-----FINE COMANDI------*/
 
IRrecv irrecv(RECV_PIN);  //initialize IR library on RECV_PIN
decode_results results;   //received data will be stored here

void setup() {
  // put your setup code here, to run once:
  pinMode (7, OUTPUT); //retro illuminazione lcd
  pinMode (9, OUTPUT); //comando relè luce rossa
  pinMode (10, OUTPUT); //comando relè luce UVB
  pinMode (13, OUTPUT); //comando relè cavo riscaldante
  
  digitalWrite (7, HIGH);
  digitalWrite (9, LOW);
  digitalWrite (10, LOW);
  digitalWrite (13, LOW);
  
  lcd.begin(16, 2);
      lcd.setCursor(0, 0);
        lcd.print("SISTEMA REBECCA");
      lcd.setCursor(0, 1);
        lcd.print("IN FUNZIONE");

dht.begin();
   lcd.createChar(1, termometro);
   lcd.createChar(2, termometro1);
   lcd.createChar(3, termometro2);
   lcd.createChar(4, termometro3);
   lcd.createChar(5, umidita); 
       
 irrecv.enableIRIn();  // Start the receiver
}

void loop() {
  // put your main code here, to run repeatedly:
 if (irrecv.decode(&results)) {
    switch(results.value){  //fetch received data
     
//Caso creato per accendere manualmente la retro illuminazone del lcd
      case ledlcd:
        if (digitalRead(7) == HIGH) {
              digitalWrite(7, LOW);
              }
          else { 
                 digitalWrite(7, HIGH); 
             }
         delay(100);    
       break;
       
//Caso creato per accedere alle funzionalità del terriario.
    case mute:    
    lcd.clear();
      digitalWrite(7, HIGH); 
        lcd.print("Sistema Terrario"); 
          Terrario();      
           delay(500); 
     break;  
}

 irrecv.resume(); // Receive the next value
 }
}

void Terrario() { 
  while (Terrario){
  delay (1000);
  
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  float f = dht.readTemperature(true);
  
  if (isnan(h) || isnan(t) || isnan(f)) {
    lcd.setCursor(0, 0);
      lcd.print("Lettura fallita del sensore DHT");
    return;
  }
  
  float hi = dht.computeHeatIndex(f, h);
  
  if (t <= 15) {
    lcd.setCursor(0, 1);
     lcd.print((char) 1);
        lcd.print(t); 
         lcd.print((char)223); 
          lcd.print("C ");
    digitalWrite (9, HIGH);
  }
  
  if (t >= 20) {
   lcd.setCursor(0, 1);
     lcd.print((char) 2);
        lcd.print(t); 
         lcd.print((char)223); 
          lcd.print("C ");
   }
   
   if (t >= 25) {
     lcd.setCursor(0, 1);
     lcd.print((char) 3);
        lcd.print(t); 
         lcd.print((char)223); 
          lcd.print("C ");
     digitalWrite (9, LOW);
      digitalWrite (13, HIGH);
    }
    
    if (t >= 35) {
      lcd.setCursor(0, 1);
     lcd.print((char) 4);
        lcd.print(t); 
         lcd.print((char)223); 
          lcd.print("C ");
    }
    
    lcd.setCursor(7, 1);      
      lcd.print((char) 5);
         lcd.print(h);
           lcd.print("%");
           
    
   }
}

ne vorrei approfittare per chiedervi come faccio ad uscire dal ciclo while per tornare al loop? Ho dovuto metterlo sotto il ciclo while perché il sensore di temperatura nn aggiornava da solo la temperatura quando varia però ora con un altro tasto vorrei tornare al ciclo loop

ma l' esempio http://www.arduino.cc/en/Tutorial/HelloWorld funziona?

In quali posizioni viengono visualizzati i carattrei?

Ciao Uwe

fino alla lettera w compare tutto, nella seconda riga invece ci sono i millisecondi che avanzano, come detto vengono visualizzati solo 8 caratteri invece che 16

mi manca una delle librerie e non riesco a provare lo sketch...

però per l'lcd mi sembra che il codice sia corretto. se qualcosa vedi probabilmente anche i collegamenti sono corretti...

per il resto:

  • dichiari la variabile tasto ma non la usi da nessuna parte...
  • nella condizione del while c'è "terrario" che credo dovrebbe essere una variabile, ma non l'hai né dichiarata né inizializzata...
  • per uscire dal while devi portare a falso la condizione che testi... quindi se vuoi uscire alla pressione di un tasto devi mettere nel while un controllo sul tasto del tipo
  while (digitalRead(PIN_TASTO) == LOW) {
  
    // codice da eseguire

  }

ovviamente il pin del tasto deve essere inizializzato in INPUT.

-la variabile tasto mi era rimasta da una precedente prova :stuck_out_tongue: ora la elimino
-ho messo while(terrario) perché volevo che ciclasse dentro il void terrario fino alla pressione del tasto che imposto per uscire, e la partentesi nn potevo lasciarla vuota.
-se il tasto lo deve leggere tramite il telecomando quindi tramite il riconoscimento IR del codice del tasto devo cmq inizializzarlo?

il codice che ho messo io si riferisce ad un normale tasto collegato ad un pin di arduino.
purtroppo non ho mai usato un telecomando con arduino, quindi non so dirti il codice esatto da usare. però la logica non cambia.
il ciclo while deve continuare fino alla pressione del tasto, quindi nel while testi il valore che arriva dal telecomando.
in alternativa, se non è agevole testare la condizione nel while potresti usare questa variante:

  while (TRUE) {  // condizione sempre vera

    // codice da eseguire

    // prima della fine del while controlli se è stato premuto il tasto
    if (tasto premuto) {
      break;  // forzi l'uscita dal while
    }

  }

i puritani del C mi odieranno per questo... ma a volte semplifica la vita a chi è alle prime armi...

sembra tutto logico però mi presenta 2 errori :stuck_out_tongue:

  1. se nn premo il pulsante dove entra nel void terrario nn si aggiorna il valore della temperatura rilevata

  2. nn esce dal while quando premo il tasto

  1. è corretto che sia così... o meglio, è il codice che hai scritto che fa questo. per come è strutturato lo sketch l'aggiornamento dell'LCD lo fai nella funzione terrario() e terrario la chiami solo quando arriva il valore "mute". quindi finché non arriva quel valore è giusto che non faccia niente.

  2. posta il codice che vedo se riesco a capirci qualcosa.

se però chiamo while (Terrario) il valore del sensore lo aggiorna automaticamente senza dover premere il pulsante

questo è il codice prima dei tuoi suggerimenti

//Librerie include
#include <IRremote.h>
#include <IRremoteInt.h>
#include "DHT.h"
#include <LiquidCrystal.h>

//Librerie define
#define DHTPIN 8
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

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

//Mostra simboli in byte 
byte termometro[8] = //icona per termometro sotto i 15°
{
     B00100,
     B01010,
     B01010,
     B01010,
     B01010,
     B11111,
     B11111,
     B01110
};

byte termometro1[8] = //icona per termometro sopra i 15°
 {
     B00100,
     B01010,
     B01010,
     B01110,
     B01110,
     B11111,
     B11111,
     B01110
 };
 
byte termometro2[8] = //icona per termometro sopra i 25°
 {
     B00100,
     B01010,
     B01110,
     B01110,
     B01110,
     B11111,
     B11111,
     B01110
 };
 
 byte termometro3[8] = //icona per termometro sopra i 30°
 {
     B00100,
     B01110,
     B01110,
     B01110,
     B01110,
     B11111,
     B11111,
     B01110
 };

byte umidita[8] = //icona per umidità
 {
     B00100,
     B00100,
     B01010,
     B01010,
     B10001,
     B10001,
     B10001,
     B01110,
 };

//Variabili
//unsigned long time;

//Sistema IR 
int RECV_PIN = 6;  //IR connessione ricevitore pin 6
 
//Mappatura codici dei tasti del telecomando 
 
/*-----COMANDI------*/
const long ledlcd = 0x83227689;  //spegne e accende retro illuminazione lcd
const long mute = 0x83226E91;     //comandi per la lettura dei sensori nel terrario 
const long ritorno = 0x83228E71;  //porta alla funzionalita del messaggio iniziale sempre attivo
/*-----FINE COMANDI------*/
 
IRrecv irrecv(RECV_PIN);  //initialize IR library on RECV_PIN
decode_results results;   //received data will be stored here

void setup() {
  // put your setup code here, to run once:
  pinMode (7, OUTPUT); //retro illuminazione lcd
  pinMode (9, OUTPUT); //comando relè luce rossa
  pinMode (10, OUTPUT); //comando relè luce UVB
  pinMode (13, OUTPUT); //comando relè cavo riscaldante
  
  digitalWrite (7, HIGH);
  digitalWrite (9, LOW);
  digitalWrite (10, LOW);
  digitalWrite (13, LOW);
  
  lcd.begin(16, 2);
      lcd.setCursor(0, 0);
        lcd.print("SISTEMA REBECCA");
      lcd.setCursor(0, 1);
        lcd.print("IN FUNZIONE");

dht.begin();
   lcd.createChar(1, termometro);
   lcd.createChar(2, termometro1);
   lcd.createChar(3, termometro2);
   lcd.createChar(4, termometro3);
   lcd.createChar(5, umidita); 
       
 irrecv.enableIRIn();  // Start the receiver
}

void loop() {
  // put your main code here, to run repeatedly:
 if (irrecv.decode(&results)) {
    switch(results.value){  //fetch received data
     
//Caso creato per accendere manualmente la retro illuminazone del lcd
      case ledlcd:
        if (digitalRead(7) == HIGH) {
              digitalWrite(7, LOW);
              }
          else { 
                 digitalWrite(7, HIGH); 
             }
         delay(100);    
       break;
       
//Caso creato per accedere alle funzionalità del terriario.
    case mute:    
    lcd.clear();
      digitalWrite(7, HIGH); 
        lcd.print("Sistema Terrario"); 
          Terrario();      
           delay(500); 
     break;  
}

 irrecv.resume(); // Receive the next value
 }
}

void Terrario() { 
  while (Terrario) {
    delay (1000);
  
 /* time = millis();
  if (time == 50) {
  digitalWrite (7, LOW);
  }*/
  
  int h = dht.readHumidity();
  int t = dht.readTemperature();
  float f = dht.readTemperature(true);
  
  if (isnan(h) || isnan(t) || isnan(f)) {
    lcd.setCursor(0, 0);
      lcd.print("Lettura fallita del sensore DHT");
    return;
  }
  
  float hi = dht.computeHeatIndex(f, h);
  
  if (t <= 15) {
    lcd.setCursor(0, 1);
     lcd.print((char) 1);
        lcd.print(t); 
         lcd.print((char)223); 
          lcd.print("C ");
    digitalWrite (9, HIGH);
  }
  
  if (t >= 20) {
   lcd.setCursor(0, 1);
     lcd.print((char) 2);
        lcd.print(t); 
         lcd.print((char)223); 
          lcd.print("C ");
    }
   
   if (t >= 25) {
     lcd.setCursor(0, 1);
     lcd.print((char) 3);
        lcd.print(t); 
         lcd.print((char)223); 
          lcd.print("C ");
     digitalWrite (9, LOW);
    }
    
    if (t >= 35) {
      lcd.setCursor(0, 1);
     lcd.print((char) 4);
        lcd.print(t); 
         lcd.print((char)223); 
          lcd.print("C ");
    }
    
    lcd.setCursor(7, 1);      
      lcd.print((char) 5);
         lcd.print(h);
           lcd.print("%");
           
   
  }
}

onestamente faccio fatica a capire... nel loop() controlli solo cosa arriva dal telecomando.

se non arriva niente non fai niente.

se arriva ledlcd accendi la retroilluminazione.

se arriva mute chiami la funzione terrario() e rimani sempre in quella funzione perché non c'è una condizione di uscita.

infatti devo creare la condizione di uscita che mi riporta al loop() dove viene mostrato un messaggio, per adesso mi serve che funzioni così... E cmq in futuro questa scheda di arduino sarà uno slave quindi dovrà mandare i pacchetti dei valori del sensore al master perché l'lcd andrà interfacciata col master

quindi siamo tornati al post #5... invece di while (Terrario) devi mettere una condizione che faccia uscire dal ciclo...

come già premesso prima non ho mai usato un telecomando, quindi non posso verificare che funzioni...
prova così:

boolean uscita = false;

do {  // ciclo a condizione finale

  // fai tutto quello che devi fare
  // fai tutto quello che devi fare
  // fai tutto quello che devi fare

  // leggi il nuvo valore dal telecomando
  irrecv.resume(); // Receive the next value

  // verifichi se il valore è quello di uscita
  if (irrecv.decode(&results) && (results.value == "quello che vuoi")) {
    uscita = true;
  }

} while (!uscita);

Erik84:
fino alla lettera w compare tutto, nella seconda riga invece ci sono i millisecondi che avanzano, come detto vengono visualizzati solo 8 caratteri invece che 16

Quando dai aliemnatzione al display (scollegando i pin dati) vengono visualizzati in una delle due righe dei blocchi neri per tutta la riga?
Se sí il LCD funziona bene, Se no é rotto.

Ciao Uwe

fratt:

  // verifichi se il valore è quello di uscita

if (irrecv.decode(&results) && (results.value == "quello che vuoi")) {
   uscita = true;
 }

} while (!uscita);

quando qui dici "quello che vuoi" intendi che devo inserire il codice del telecomando? ho provato a metterlo, però nn lo legge, ho un auto aggiornamento del sensore come volevo ma nn esce del void terrario

uwefed:
Quando dai aliemnatzione al display (scollegando i pin dati) vengono visualizzati in una delle due righe dei blocchi neri per tutta la riga?
Se sí il LCD funziona bene, Se no é rotto.

Ciao Uwe

quali sono i pin dati? i pin D4-D7?

probabilmente io e te abbiamo difficoltà di comunicazione...

dentro il void Terrario() prova a mettere questo codice

// preparo una variabile per la condizione di uscita
boolean uscita = false;

do {  // ciclo a condizione finale = esegue il ciclo almeno la prima volta e poi controlla la condizione

  // qui metti il codice che c'era prima dentro il while
  // ovvero leggi la temperatura e aggiorni l'LCD

  // prima di valutare la condizione devi leggere il valore del telecomando
  // ho sparato alcune istruzioni guardando il tuo codice, ma devi verificare che siano corrette

  // qui devi leggere il nuovo valore dal telecomando
  irrecv.resume(); // Receive the next value

  // poi verifichi se il valore è quello di uscita
  // ovviamente al posto di "quello che vuoi" devi mettere il valore che ti aspetti dal telecomando
  if (irrecv.decode(&results) && (results.value == "quello che vuoi")) {
    uscita = true;
  }

} while (!uscita);

ci sono pure i commenti, si dovrebbe capire...

ma veramente era tutto chiaro, rispetto a quello che dici ho messo la variabile boolean in alto nello sketch dopo le define e prima del void setup, dove si definiscono le variabili in ogni programma.

dove tu hai messo (results.value == "quello che vuoi")) io ho scritto (results.value == ritorno)) che nn è altro che il tasto del telecomando che vado a premere per uscire dal void terrario e tornare al loop. quindi teoricamente quando vado a spingere il pulsante del telecomando "ritorno" dovrebbe uscire e tornare al loop mostrando il messaggio iniziale che si vede quando avvio arduino la prima volta, questo nn avviene

  1. le variabili puoi dichiararle all'inizio (prima del setup) così sono variabili globali. ma puoi dichiararle anche in altri posti se non serve che siano visibili in tutto lo sketch

  2. il messaggio iniziale

lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("SISTEMA REBECCA");
lcd.setCursor(0, 1);
lcd.print("IN FUNZIONE");

lo visualizzi nel setup e non nel loop, quindi è normale che quando torni nel loop non lo visualizzi.