Datalogger Arduino LCD DHT11

Il progetto presentato lunedì scorso ti ha permesso di monitorare i temperatura ed umidità, se ci aggiungi una Keypad Lcd puoi ottenere il Datalogger Arduino LCD DHT11.

Datalogger Arduino LCD DHT11

Rispetto al Datalogger Arduino temperatura umidità l’agginta di un display LCD e dei relativi pulsanti ti evitano di dover interrompere il monitoraggio della tua casa per visualizzare i valori rilevati.

Grazie al display LCD 16×2 della Keypad LCD puoi visualizzare il dato istantaneo misurato e non perdere il salvataggio continuo del dato.

Quali componenti puoi acquistare per il Datalogger Arduino LCD DHT11 ?

Per realizzare il progetto ti occorrono i medesimi componenti visti nel precedente progetto:

  • n.1 arduino uno
  • n.1 RTC Shield
  • n.1 SD Card Shield
  • n.1 sonda DHT11 con relativo cavetto di connessione
  • n.1 Memory card SD da 2Gb max
  • n.3 cavetti per breadboard

a cui devi aggiungere la keypad lcd:

  • n.1 keypad lcd

Collegamenti del Datalogger Arduino LCD DHT11

I collegamenti non sono molto differenti dal precedente progetto a parte il pin OUTPUT della sonda DHT11 che dovrai collegare ad un pin digitale differente dai pin 4,5,6,7,8,9 utilizzati dalla Keypad LCD, io ho scelto il pin 15.

Non è un errore, i pin digitali arduino sono 13, tuttavia il pin A0 puoi utilizzarlo come 14 ed a seguire A1 = 15, A2 = 16 … A5 = 19

In questo progetto A0 è usato dalla Keypad LCD per i pulsanti ed A4-A5 sono utilizzati dalla RTC Shield per l’orologio, restano quindi liberi A1,A2,A4 rispettivamente 15,16,17.

Puoi usare anche i pin digitali 2 o 3, ho scelto di usare il pin 15 in quanto la keypad LCD ha un connettore a 3 contatti:

  • +5v
  • gnd
  • segnal

per tutti i pin oltre A0, che usa per i pulsanti, molto comodo per collegare il connettore in dotazione alla sonda DHT11.

Datalogger Arduino LCD DHT11 montaggio

Lo sketch del progetto

Il Datalogger Arduino LCD DHT11 ha uno sketch un po’ più complesso rispetto al precedente in quanto devi controllare il Display LCD 16×2 e i pulsanti.

#include <Wire.h>
#include "RTClib.h"
#include <SD.h>
#include <dht11.h>
#include <LiquidCrystal.h>

#define CS 10
#define DHT11_PIN 15
#define BUTTON A0

int SELECT[]  =  {720,760};
int LEFT[]    =  {480,520};
int RIGTH[]   =  {0,20};
int UP[]      =  {120,160};
int DOWN[]    =  {300,350};

RTC_DS1307 RTC;
dht11 DHT;
LiquidCrystal lcd(8,9,4,5,6,7);
char buffer[50];
char lcdBuffer[16];

File myFile;

void setup () {
    Serial.begin(57600);
    Serial.print("Initializing SD card...");
    pinMode(CS, OUTPUT);

    lcd.begin(16, 2);

    lcd.setCursor(0,0);
    lcd.print("DataLogger LCD ");
    lcd.setCursor(0,1);
    lcd.print("mauroalfieri.it");

    delay( 3000 );

    lcd.clear();  
    lcd.setCursor(0,0);
    lcd.print("Init SD Card...");
    lcd.setCursor(0,1);

    if (!SD.begin(CS)) {
      Serial.println("initialization failed!");
      lcd.print("... Failed   ");
      return;
    }
    Serial.println("initialization done.");
    lcd.print("... Ready    ");

    delay( 2000 );

    lcd.clear(); 
    Wire.begin();
    RTC.begin();
    RTC.sqw(0);		//0 Led off - 1 Freq 1Hz - 2 Freq 4096kHz - 3 Freq 8192kHz - 4 Freq 32768kHz
    if (! RTC.isrunning()) {
      Serial.println("RTC is NOT running!");
      RTC.adjust(DateTime(__DATE__, __TIME__));
    }
}

void loop () {
    DateTime now = RTC.now();

    lcd.clear(); 
    sprintf(lcdBuffer, "%02d/%02d/%04d", now.day(), now.month(), now.year() );
    lcd.setCursor(0,0);
    lcd.print(lcdBuffer);
    sprintf(lcdBuffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second() );
    lcd.setCursor(0,1);
    lcd.print(lcdBuffer);

    if ( now.minute() == 00 || now.minute() == 10 || now.minute() == 20 || now.minute() == 30 || now.minute() == 40 || now.minute() == 50 ) {
       saveData( now );
    }   

    if ( ctrlButton( analogRead( BUTTON ) ) != 0 ) {  
       readSensor( now );
    }

    delay( 1000 );
}

void readSensor( DateTime now ) {
    lcd.clear(); 
    lcd.setCursor(0,0);
    lcd.print("Lettura DHT11");
    lcd.setCursor(0,1);

    // -----------------------------------------------------------------------
    int chk;
    chk = DHT.read(DHT11_PIN);    // READ DATA
    switch (chk){
        case DHTLIB_OK:  
                Serial.print("OK,\t"); lcd.print("SUCCESS");
                break;
        case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); lcd.print("Checksum error");
                break;
        case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); lcd.print("Time out error");
                break;
        default: 
                Serial.print("Unknown error,\t"); lcd.print("Unknown error");
                break;
     }
     delay(1000);
    // -----------------------------------------------------------------------

    lcd.clear(); 
    lcd.setCursor(0,0);
    sprintf(lcdBuffer,  "%s %02d", "Humidty     ", DHT.humidity );
    lcd.print(lcdBuffer);
    lcd.setCursor(0,1);
    sprintf(lcdBuffer,  "%s %02d", "Temperatura ", DHT.temperature );
    lcd.print(lcdBuffer);

    delay( 3000 );
}

void saveData( DateTime now ) {
    int chk;
    chk = DHT.read(DHT11_PIN);    // READ DATA
    sprintf(buffer,  "%02d/%02d/%d %02d:%02d:%02d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), DHT.humidity, DHT.temperature );
    Serial.println( buffer );

    myFile = SD.open("dati.log", FILE_WRITE);
    if (myFile) {
      myFile.println(buffer);
      myFile.close();
    } else {
      Serial.println("error opening data.log");
      lcd.clear(); 
      lcd.setCursor(0,0);
      lcd.print("Err SD Write");
    }
    delay(1000);
}

int ctrlButton( int button ) {
  if ( SELECT[0] <= button && button <= SELECT[1] ) { return 1; }
  if ( LEFT[0] <= button && button <= LEFT[1] ) { return 2; }
  if ( RIGTH[0] <= button && button <= RIGTH[1] ) { return 3; }
  if ( UP[0] <= button && button <= UP[1] ) { return 4; }
  if ( DOWN[0] <= button && button <= DOWN[1] ) { return 5; }
  return 0;
}

riprendendo le principali modiche evito di ripeterti le stesse spiegazioni già descritte in passato:

linea 005: includi la libreria LiquidCrystal.h necessaria alla gestione del display LCD;

linea 007: cambia l’impostazione del pin a cui hai collegato la sonda DHT11, dal pin 4 al pin 15;

linea 009: definisci una costante a cui assegni il valore del pin su cui sono connessi i pulsanti della keypad lcd;

int SELECT[]  =  {720,760};
int LEFT[]    =  {480,520};
int RIGTH[]   =  {0,20};
int UP[]      =  {120,160};
int DOWN[]    =  {300,350};

linee 011-015: definisci un array di due elementi ( min,max ) per ciascun pulsante;

linea 019: definisci una istanza della classe LiquidCrystal impostando i pin a cui il display è connesso;

linea 021: definisci un buffer lcdBuffer di 16 caratteri in cui memorizzerai tutti i testi da visualizzare sul display;

    lcd.begin(16, 2);

    lcd.setCursor(0,0);
    lcd.print("DataLogger LCD ");
    lcd.setCursor(0,1);
    lcd.print("mauroalfieri.it");

    delay( 3000 );

linea 030: imposta il display per funzionare in modalità 16×2, 16 colonne e 2 righe;

linee 032-033: posiziona il cursore al primo carattere della prima riga e scrivi “Datalogger LCD”;

linee 034-035: posiziona il cursore al primo carattere della seconda riga e scrivi “mauroalfieri.it”;

linea 037: aspetta 3 secondi per permettere la lettura del messaggio;

linee 039-063: sono identiche a quanto presente nei precedenti articoli  a meno delle linee aggiunte per scrivere sul display;

La funzione loop() è notevolmente cambiata grazie all’introduzione di altre funzioni che semplificano il lavoro che deve svolgere:

void loop () {
    DateTime now = RTC.now();

    lcd.clear(); 
    sprintf(lcdBuffer, "%02d/%02d/04d", now.day(), now.month(), now.year() );
    lcd.setCursor(0,0);
    lcd.print(lcdBuffer);
    sprintf(lcdBuffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second() );
    lcd.setCursor(0,1);
    lcd.print(lcdBuffer);

    if ( now.minute() == 00 || now.minute() == 10 || now.minute() == 20 || now.minute() == 30 || now.minute() == 40 || now.minute() == 50 ) {
       saveData( now );
    }   

    if ( ctrlButton( analogRead( BUTTON ) ) != 0 ) {  
       readSensor( now );
    }

    delay( 1000 );
}

L’unica linea identica è la linea 066, a seguire:

linee 068-075: scrivi sul display la data e l’ora corrente;

Datalogger Arduino LCD DHT11 data ora

linee 077-080: controlla i minuti trascorsi e ogni 10 min ( 00,10,20,30,40,50 ) lancia la funzione saveData( now );

linee 082-084: verifica la pressione di uno qualsiasi dei pulsanti presenti sulla KeyPad LCD per richiamare la funzione readSensor( now ) il cui scopo, lo vedrai meglio dopo, è d leggere il valore di temperatura e umidità istantaneo e scriverlo sul display.

linea 086: imposta un attesa di 1sec per ogni ciclo di loop() in modo da non sovraccaricare Arduino ed ottenere un aggiornamento del display ogni secondo;

Passa alle funzioni nuove introdotte con il Datalogger Arduino LCD DHT11: readSensor(), saveData(), ctrlButton()

readSensor()

void readSensor( DateTime now ) {
    lcd.clear(); 
    lcd.setCursor(0,0);
    lcd.print("Lettura DHT11");
    lcd.setCursor(0,1);

    // -----------------------------------------------------------------------
    int chk;
    chk = DHT.read(DHT11_PIN);    // READ DATA
    switch (chk){
        case DHTLIB_OK:  
                Serial.print("OK,\t"); lcd.print("SUCCESS");
                break;
        case DHTLIB_ERROR_CHECKSUM: 
                Serial.print("Checksum error,\t"); lcd.print("Checksum error");
                break;
        case DHTLIB_ERROR_TIMEOUT: 
                Serial.print("Time out error,\t"); lcd.print("Time out error");
                break;
        default: 
                Serial.print("Unknown error,\t"); lcd.print("Unknown error");
                break;
     }
     delay(1000);
    // -----------------------------------------------------------------------

    lcd.clear(); 
    lcd.setCursor(0,0);
    sprintf(lcdBuffer,  "%s %02d", "Humidty     ", DHT.humidity );
    lcd.print(lcdBuffer);
    lcd.setCursor(0,1);
    sprintf(lcdBuffer,  "%s %02d", "Temperatura ", DHT.temperature );
    lcd.print(lcdBuffer);
}

linee 090-093: pulisci il display LCD e scrivi sulla prima riga “Lettura DHT11”;

Datalogger Arduino LCD DHT11 lettura success

linee 095-113: non sono differenti dalle precedenti descritte se non per l’aggiunta del comando lcd.print() con cui scrivi per ciascun codice di ritorno dalla sonda un messaggio sulla seconda llinea del display;

linee 115-121: scrivi sul monitor i valori relativi ad umidità e temperatura letti dal Datalogger Arduino LCD DHT11 sulle sue righe del display;

Datalogger Arduino LCD DHT11 temperatura umidita

saveData()

void saveData( DateTime now ) {
    int chk;
    chk = DHT.read(DHT11_PIN);    // READ DATA
    sprintf(buffer,  "%02d/%02d/%d %02d:%02d:%02d %d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), DHT.humidity, DHT.temperature );
    Serial.println( buffer );

    myFile = SD.open("dati.log", FILE_WRITE);
    if (myFile) {
      myFile.println(buffer);
      myFile.close();
    } else {
      Serial.println("error opening data.log");
      lcd.clear(); 
      lcd.setCursor(0,0);
      lcd.print("Err SD Write");
    }
    delay(1000);
}

tutta la funzione nel Datalogger Arduino LCD DHT11 non presenta differenze con il codice che già conosci.

ctrlButton()

int ctrlButton( int button ) {
  if ( SELECT[0] <= button && button <= SELECT[1] ) { return 1; }
  if ( LEFT[0] <= button && button <= LEFT[1] ) { return 2; }
  if ( RIGTH[0] <= button && button <= RIGTH[1] ) { return 3; }
  if ( UP[0] <= button && button <= UP[1] ) { return 4; }
  if ( DOWN[0] <= button && button <= DOWN[1] ) { return 5; }
  return 0;
}

puoi trovare la descrizione completa di questa funzione nell’articolo dedicato alla Keypad LCD o al Dolly.

Buon monitor domotico !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/datalogger-arduino-lcd-dht11.html

32 pings

Skip to comment form

  1. […] per realizzare in modo semplice progetti di raccolta dati con arduino simili al mio progetto: Datalogger Arduino LCD DHT11 che utilizza due shield, una come RTC e una per scrivere su SD […]

  2. […] sketch è identico a quello presentato e descritto nella versione uno del display, che […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.