DHT11 + libreria su display LCD 16x2

Spero che quanto segue possa servire a qualcuno.

Ho provato svariati codici per far funzionare un DHT11 con un display 16x2 e finalmente ci sono riuscito.

Utilizzando la porta seriale il sensore funziona regolarmente ma quando cercavo di visualizzare la temperatura su un display LCD 16x2 non c’era verso…

#include <LiquidCrystal.h> //Libreria per pilotare il display LCD
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 8


LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //Inizializzazione della libreria con i pin del display LCD
const int ledPin = 12;

void setup() {
  lcd.begin(16, 2); //Impostazione del numero di colonne e righe del display LCD
  lcd.setCursor(2, 0); //Sposto il cursore sulla prima riga (riga 0) e sulla prima colonna
  lcd.print("Temperatura:"); //Stampo il messaggio 'Temperatura:' sulla prima riga
pinMode(12, OUTPUT);

digitalWrite(ledPin, HIGH);
  lcd.setCursor(13, 1);
  lcd.print("OFF");
}

  
void loop() {

  DHT11.read(DHT11PIN);
  lcd.setCursor(6, 1); //Sposto il cursore sulla prima colonna e sulla seconda riga
  lcd.print((float)(DHT11.temperature), 0); //Stampo sul display LCD la temperatura con ",1" imposto il numero di decimali dopo la virgola
  lcd.print(" C"); //Stampo uno spazio e il carattere 'C' sul display


  if((float)(DHT11.temperature)>30)
  
 {digitalWrite(ledPin, HIGH);
  lcd.setCursor(13, 1);
  lcd.print("OFF");}

else if((float)(DHT11.temperature)<25)

{digitalWrite(ledPin, LOW);
 lcd.setCursor(13, 1);
 lcd.print(" ON");}

delay(1000);
}

nello sketch c’è anche la gestione di un relè che comanda una resistenza affinché nell’ambiente venga mantenuta una temperatura compresa tra i 25° e i 30°

in allegato troverete la libreria del DHT11 che ho usato.

dht11.zip (2.58 KB)

EDIT: un ringraziamento a nabla che mi ha suggerito la parte di codice per gestire il relè

Il sensore DHT11 è economico, ma anche piuttosto impreciso.

La temperatura ha un range di 0-50°C, una accuratezza di +/- 2°C ed una risoluzione di 1°C.

Quindi la temperatura letta di 25°C potrebbe essere in realtà 23°C o 27°C.

Non serve a nulla usare una variabile float con una misura del genere.

si ma è l'unica che ha funzionato tra tutte quelle che provate...

so che il DHT11 non è un granchè come sensore in fatto di precisione ma per il mio uso è più che sufficiente..

Il problema risiede nel fatto che DHT11.temperature) è un intero, mentre tu vuoi visualizzarlo come float.

Ma la cosa è inutile per i motivi che ti ho esposto.

lcd.print((float)(DHT11.temperature), 0);

Se invece fai:

lcd.print(DHT11.temperature);

ottieni lo stesso risultato.

Stessa cosa per i confronti:

if (DHT11.temperature >= 30)… // da 30°C in sù

else if (DHT11.temperature <= 25)… // da 25°C in giù

proverò questa modifica grazie!