Temperature and Humidity Data Logger using Arduino

Temperature and Humidity Data Logger using Arduino

In this project, we are going to make a temperature and relative humidity data logger. Arduino is the brain of this project. DHT22 sensor is used for sensing temperature and relative humidity. Arduino Uno is programmed to read temperature, humidity values from DHT22 sensor and save it to a file in an SD Card. So whenever required we can take the SD Card for viewing data. Here we will take data from SD card and import it to excel to plot graphs.

Components Required

  • Arduino Uno
  • SD Card Module
  • DHT22 Temperature and Humidity Sensor
  • SD Card (Higher than 8GB)
  • Breadboard
  • Connecting wires

Circuit Diagram

Temperature Data Logger using Arduino - Circuit Diagram

Temperature Data Logger using Arduino – Circuit Diagram

Explanation

Micro SD Card Reader Module - Pinout

Micro SD Card Reader Module – Pinout

First of all, we will connect the SD Card module to the Arduino. Arduino can do read write operations on SD Card via SPI protocol. So we need to connect the SD card module to SPI pins of Arduino, which are pins 13, 12, 11 and 10. Since it is using SPI protocol, it won’t work if we connect SD card module to normal digital IO pins. So make connections as below.

  • SD Card Module Ground to Arduino Ground
  • VCC of the module to 5V output of Arduino
  • MISO of module to pin 12 of Arduino
  • MOSI of module to pin 11 of Arduino
  • SCK of module to pin 13 of Arduino
  • CS of module to pin 10 of Arduino

Then we can connect the DHT22 to the Arduino.

  • Connect VCC of DHT22 to 5V output of Arduino
  • Ground to ground of Arduino
  • Data pin of DHT22 to pin 8 of Arduino
Temperature Data Logger with SD Card

Temperature Data Logger with SD Card

Program

#include <SD.h>
#include <SPI.h>
#include "DHT.h"

#define DHTPIN 8
#define DHTTYPE DHT22

long seconds=00;
long minutes=00;
long hours=00;

int CS_pin = 10;

DHT dht(DHTPIN, DHTTYPE);
File sd_file;

void setup()  {
  Serial.begin(9600);
  pinMode(CS_pin, OUTPUT);
  dht.begin();
  // SD Card Initialization
  if (SD.begin())  {
    Serial.println("SD card is initialized. Ready to go");
  } 
  else  {
    Serial.println("Failed");
    return;
  }

  sd_file = SD.open("data.txt", FILE_WRITE);

  if (sd_file)  {
    Serial.print("Time");
    Serial.print(",");
    Serial.print("Humidity");
    Serial.print(",");
    Serial.print("Temperature_C");
    Serial.print(",");
    Serial.print("Temperature_F");
    Serial.print(",");
    Serial.println("Heat_index");

    sd_file.print("Time");
    sd_file.print(",");
    sd_file.print("Humidity");
    sd_file.print(",");
    sd_file.print("Temperature_C");
    sd_file.print(",");
    sd_file.print("Temperature_F");
    sd_file.print(",");
    sd_file.println("Heat_index");
  }
  sd_file.close(); //closing the file
} 

void loop()  {
  sd_file = SD.open("data.txt", FILE_WRITE);
  if (sd_file)  {
    senddata();
  }
  // if the file didn't open, print an error:
  else  {
    Serial.println("error opening file");
  }
  delay(1000);
}

void senddata()  {
  for(long seconds = 00; seconds < 60; seconds=seconds+2)  {
    float temp = dht.readTemperature(); //Reading the temperature as Celsius and storing in temp
    float hum = dht.readHumidity();     //Reading the humidity and storing in hum
    float fah = dht.readTemperature(true);
    float heat_index = dht.computeHeatIndex(fah, hum);

    sd_file.print(hours);
    sd_file.print(":");
    sd_file.print(minutes);
    sd_file.print(":");
    sd_file.print(seconds);
    sd_file.print(",  ");
    sd_file.print(hum);
    sd_file.print(",    ");
    sd_file.print(temp);
    sd_file.print(",      ");
    sd_file.print(fah);
    sd_file.print(",      ");
    sd_file.println(heat_index);

    Serial.print(hours);
    Serial.print(":");
    Serial.print(minutes);
    Serial.print(":");
    Serial.print(seconds);
    Serial.print(",  ");
    Serial.print(hum);
    Serial.print(",    ");
    Serial.print(temp);
    Serial.print(",       ");
    Serial.print(fah);
    Serial.print(",      ");
    Serial.println(heat_index);

    if(seconds>=58)  {
      minutes= minutes + 1;
    }

    if (minutes>59)  {
      hours = hours + 1;
      minutes = 0;
    }

    sd_file.flush(); //saving the file

    delay(2000);
  }
  sd_file.close();   //closing the file
}

DHT22 Library

You need to manually add DHT library to Arduino IDE as it is not included by default. You can ignore it if you already added it. Otherwise you can do following steps for that.


  • Download DHT Library from here : DHT Sensor Library.
  • Open Arduino IDE.
  • Go to Sketch >> Include Library >> Add .ZIP Library
  • Select the downloaded ZIP file and press open.

Explanation

First of all, we have added libraries required for this project. Then we defined the DHT sensor type and pin to which it is connected.

#include <SD.h>       // Including SD Card Library
#include <SPI.h>      // Including SPI Library
#include "DHT.h"      // Including DHT Sensor Library

#define DHTPIN 8      // Declaring the pin to which DHT data pin is connected
#define DHTTYPE DHT22 // Selecting the type of DHT sensor used in this project

long seconds=00;      // For storing second
long minutes=00;      // For storing minute
long hours=00;        // For storing hour 

int CS_pin = 10;      // Chip select pin of SD card module

DHT dht(DHTPIN, DHTTYPE); // Declaring DHT object
File sd_file;             // Declaring File object

In the setup function, we initialized the serial communication at 9600 baudrate. Here serial communication is used only for displaying logs in the Arduino Serial Monitor. The dht.begin() function will initialize the Arduino for reading data from DHT sensor. Similarly sd.begin() function will initialize the Arduino for write data to SD card module. After that we will open the file “data.txt” from SD card using sd.open() function. Then we will write titles ‘Time’, ‘Humidity’, ‘Temperature_C’, ‘Temperature_F’ and ‘Heat_index’ in it. After that we will close the connection to save the file.

void setup()  {
  Serial.begin(9600);
  pinMode(CS_pin, OUTPUT);
  dht.begin(); // Initialize the Arduino for reading data from DHT sensor
  // SD Card Initialization
  if (SD.begin())  {
    Serial.println("SD card is initialized. Ready to go");
  } 
  else  {
    Serial.println("Failed");
    return;
  }

  sd_file = SD.open("data.txt", FILE_WRITE);

  if (sd_file)  {
    Serial.print("Time");
    Serial.print(",");
    Serial.print("Humidity");
    Serial.print(",");
    Serial.print("Temperature_C");
    Serial.print(",");
    Serial.print("Temperature_F");
    Serial.print(",");
    Serial.println("Heat_index");

    sd_file.print("Time");
    sd_file.print(",");
    sd_file.print("Humidity");
    sd_file.print(",");
    sd_file.print("Temperature_C");
    sd_file.print(",");
    sd_file.print("Temperature_F");
    sd_file.print(",");
    sd_file.println("Heat_index");
  }
  sd_file.close(); //closing the file
} 

In the loop function, we will open the SD card “data.txt” file again. If it is opened successfully we will call senddata() function, otherwise it will show ‘error opening file’ in the serial monitor.

void loop()  {
  sd_file = SD.open("data.txt", FILE_WRITE);
  if (sd_file)  {
    senddata();
  }
  // if the file didn't open, print an error:
  else  {
    Serial.println("error opening file");
  }
  delay(1000);
}

In the senddata() function, we have made a loop which will count the time. Then we have read the temperature, humidity from DHT22 sensor and heat index is calculated. After storing these values in the variables, we will write these values to the SD card file. After that we will call sd_file.flush() to ensure that all data is stored in the SD card. These steps are repeated with a delay of 2 seconds.

void senddata()  {
  for(long seconds = 00; seconds < 60; seconds=seconds+2)  {
    float temp = dht.readTemperature(); //Reading the temperature as Celsius and storing in temp
    float hum = dht.readHumidity(); //Reading the humidity and storing in hum
    float fah = dht.readTemperature(true);
    float heat_index = dht.computeHeatIndex(fah, hum);

    sd_file.print(hours);
    sd_file.print(":");
    sd_file.print(minutes);
    sd_file.print(":");
    sd_file.print(seconds);
    sd_file.print(",  ");
    sd_file.print(hum);
    sd_file.print(",    ");
    sd_file.print(temp);
    sd_file.print(",      ");
    sd_file.print(fah);
    sd_file.print(",      ");
    sd_file.println(heat_index);

    Serial.print(hours);
    Serial.print(":");
    Serial.print(minutes);
    Serial.print(":");
    Serial.print(seconds);
    Serial.print(",  ");
    Serial.print(hum);
    Serial.print(",    ");
    Serial.print(temp);
    Serial.print(",       ");
    Serial.print(fah);
    Serial.print(",      ");
    Serial.println(heat_index);

    if(seconds>=58)  {
      minutes= minutes + 1;
    }

    if (minutes>59)  {
      hours = hours + 1;
      minutes = 0;
    }

    sd_file.flush(); //saving the file

    delay(2000);
  }
  sd_file.close(); //closing the file
}

Importing Logs to Excel

For viewing or evaluating the logged data, you can take the SD card from the module and connect it to a PC via a SD card reader.

  1. Open Microsoft Excel
  2. Press Office button or File
  3. Click Open
  4. Select the file from the SD card and open it.
Importing SD Card Logs File to Excel

Importing SD Card Logs File to Excel

After opening the file, all data will be shown on the screen. Now we can plot graphs by using these values.

Imported Values from SD Card - Excel

Imported Values from SD Card – Excel

Generating a Graph

  • Go to Insert tab
  • Click on Line option
  • Select 2D Line
Generating Graph with Excel Data

Generating Graph with Excel Data

The graph will look like this. You can also customize this graph by using other options.

Graphs Generated with Excel using SD Card Logs

Graphs Generated with Excel using SD Card Logs

Video

Share this post

Comments (12)

  • MR SHITAL CHAWRE

    Arduino: 1.8.1 (Windows 7), Board: “Arduino/Genuino Uno”

    In file included from C:UsersLabDocumentsArduinolibrariesDHT-sensor-library-masterDHT_U.cpp:22:0:

    C:UsersLabDocumentsArduinolibrariesDHT-sensor-library-masterDHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory

    #include

    ^

    compilation terminated.

    exit status 1
    Error compiling for board Arduino/Genuino Uno.

    July 24, 2017 at 4:53 pm
  • yotrickmaza

    its giving error – exit status 1
    Error compiling for board Arduino/Genuino Uno.

    Please Help Me..

    September 2, 2017 at 9:37 pm
  • Tarun Nagisetti

    did u get the solution for this

    October 28, 2017 at 4:00 pm
  • yotrickmaza

    yes Bro..

    October 28, 2017 at 4:11 pm
  • Adrian Lahsene

    did you solve this problem?

    January 30, 2018 at 11:01 am
  • MR SHITAL CHAWRE

    no pls help me

    May 11, 2018 at 12:52 pm
  • MR SHITAL CHAWRE

    how to control led or relay from internet using html or any other sources from esp8266 with arduino programming ??

    May 30, 2018 at 3:58 pm
  • Saint Skinny

    Make sure all your Libraries are in the right place. It looks like the program was unable to find the adafruit sensor library. Did you download it?

    May 31, 2018 at 5:23 pm
  • Swati Parihar

    how can we connect the soil sensor in this so that we are able to see the moisture content of the soil also?

    July 13, 2018 at 10:25 am
  • Saint Skinny

    I’d like to have the arduino take the Temp and RH% values and convert them to VPD, how would I do that?

    August 3, 2018 at 11:37 pm
  • TImo

    You have to use the first version of the lib
    😀

    February 23, 2019 at 1:22 am
  • Daygen Naickerr

    Good day, what can I add to this code to control a relay to close when the humidity exceeds 30%

    July 23, 2019 at 4:46 pm

Leave a Reply

Your email address will not be published. Required fields are marked *