Monday, June 23, 2014

Second project - Temperature + humidity + LCD!

Hello coders, hackers, makers and curious visitors!

   The second project I worked on is a "temperature and humidity sensor with a LCD display" based on Arduino, the DHT11 serial temperature/humidity sensor, the LM35 linear temperature sensor and a 16x2 LCD screen. The project is similar to this one and features readings of temperature and humidity that are shown in a LCD display and sent via Arduino (USB- serial) to any PC terminal. Below I show a picture of the project working:

The prototype, when compared to Google Weather (upper right corner)

   The serial console (on arduino IDE) can be seen below, capturing successive readings from Arduino serial:

Screenshot of data captured through serial

   The complete schematic of this prototype is in the picture below; it was developed using Fritzing; You can download the schematic here



   The project was coded inside the Arduino IDE using some third-part codes, which I put together and made it work. The original codes are: DHT11 Library and LiquidCrystal . My code is available in the box below, as well as in this Github link.

/*
 Modified by Clovis Fritzen in June 11th, 2014:
 - The original program read the serial temperature/humidity sensor DHT11 (which is still part of this program); 
 - "Delay" function substituted by a counter (when the counter overflows the program enters the serial routine)
 - Added the LM35 (10mV/C temperature sensor) reading via serial, to compare both sensors
 */
/*
  Board           int.0   int.1   int.2   int.3   int.4   int.5
 Uno, Ethernet   2   3
 Mega2560   2   3   21   20   19   18
 Leonardo   3   2   0   1
 Due           (any pin, more info http://arduino.cc/en/Reference/AttachInterrupt)
 
 This example, as difference to the other, make use of the new method acquireAndWait()
 */
 
#include 
#include 

int idDHT11pin = 2; //Digital pin for comunications
int idDHT11intNumber = 0; //interrupt number (must be the one that use the previus defined pin (see table above)
long count= 0; // counter for spacing the serial writings
long AcqPeriod= 0;
int sensorPin = A5; // input pin for LM35 (10mV/C)
int sensorValue = 0; // variable to store the LM35 temperature
int led= 13;


//declaration
void dht11_wrapper(); // must be declared before the lib initialization

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(9, 8, 5, 4, 3, 6);

// Lib instantiate
idDHT11 DHT11(idDHT11pin,idDHT11intNumber,dht11_wrapper);

void setup()
{
  pinMode(led, OUTPUT);   
  Serial.begin(9600);
  Serial.println("DHT11 temp/humidity sensor - Example program");
  Serial.print("Lib version: ");
  Serial.println(IDDHT11LIB_VERSION);
  Serial.println("modified by Clovis Fritzen");
  Serial.println("---------------");
  
   // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print(" DHT:|LM35:|HUM:");
}
// This wrapper is in charge of calling 
// mus be defined like this for the lib work
void dht11_wrapper() {
  DHT11.isrCallback();
}
void loop()
{
  
  AcqPeriod= 400000; // set here the interval in which data is sent into serial 
  
  if (count < AcqPeriod) // Still need to make sure what this number represents in terms of
                      // seconds or cycles of clock
  {
  count= count++;
  
  if (count < (AcqPeriod/2)) // just a routine to blink a led :)
  {
    digitalWrite(led, HIGH);
  } else{
    digitalWrite(led, LOW);
  }
 }
else
{
  
  //Serial.print("\nRetrieving information from sensor: ");
  Serial.print("\nRead sensor: ");
  //delay(100);
 count= '0';
 
 sensorValue = analogRead(sensorPin);
 sensorValue= sensorValue/2;
  
  int result = DHT11.acquireAndWait();
  switch (result)
  {
  case IDDHTLIB_OK: 
    Serial.println("done"); 
    break;
  case IDDHTLIB_ERROR_CHECKSUM: 
    Serial.println("Error\n\r\tChecksum error"); 
    break;
  case IDDHTLIB_ERROR_ISR_TIMEOUT: 
    Serial.println("Error\n\r\tISR time out error"); 
    break;
  case IDDHTLIB_ERROR_RESPONSE_TIMEOUT: 
    Serial.println("Error\n\r\tResponse time out error"); 
    break;
  case IDDHTLIB_ERROR_DATA_TIMEOUT: 
    Serial.println("Error\n\r\tData time out error"); 
    break;
  case IDDHTLIB_ERROR_ACQUIRING: 
    Serial.println("Error\n\r\tAcquiring"); 
    break;
  case IDDHTLIB_ERROR_DELTA: 
    Serial.println("Error\n\r\tDelta time to small"); 
    break;
  case IDDHTLIB_ERROR_NOTSTARTED: 
    Serial.println("Error\n\r\tNot started"); 
    break;
  default: 
    Serial.println("Unknown error"); 
    break;
  }
  
  lcd.setCursor(7, 1);
  // print the number of seconds since reset:
  lcd.print(sensorValue);
  
  Serial.print("Humidity (%): ");
  Serial.println(DHT11.getHumidity(), 0); // ", 0" represents the number of decimal positions after the comma

  Serial.print("DHT11 Temp (oC): ");
  Serial.println(DHT11.getCelsius(), 0); // ", 0" represents the number of decimal positions after the comma
  
  lcd.setCursor(13, 1);
  // print the number of seconds since reset:
  lcd.print(DHT11.getHumidity(), 0);
  
  Serial.print("LM35 Temp (oC): ");
  Serial.println(sensorValue);
  

  //Serial.print("Temperature (oF): ");
  //Serial.println(DHT11.getFahrenheit(), 2);

  //Serial.print("Temperature (K): ");
  //Serial.println(DHT11.getKelvin(), 2);

  //Serial.print("Dew Point (oC): ");
  //Serial.println(DHT11.getDewPoint());

  //Serial.print("Dew Point Slow (oC): ");
  //Serial.println(DHT11.getDewPointSlow());
  
   // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(1, 1);
  // print the number of seconds since reset:
  lcd.print(DHT11.getCelsius(),0);
  
   }
  
  }

   I just want to share some notes with you:
- Both the DHT11 and LM35 have a "step" (or resolution) of one degree Celsius, meaning they cannot read something like "26.3"; They a only capable of reading numbers with no decimal (e.g: "26").
- The contrast of the LCD screen can be adjusted by means of the potentiometer; Its backlight is always on (last two pins of the LCD on the schematic above).
- The circuit works independently on the presence of the USB cable on Arduino; it means that it will work on batteries for example!. in this case only the serial readings will be missing.
- The is a blinking led on pin 13 of Arduino (which is assemble on the board); That one is there just for fun.

   I hope you guys are enjoying my posts so far, and trying to validate my projects by doing it yourselves. If you have any suggestions/ recommendations or critics, please feel free to talk to me on Twitter, Google Plus and Facebook, as well as in the comments below. See you all next time!.

No comments:

Post a Comment