Tuesday, June 17, 2014

First project - Arduino Binary Thermometer with LM35

Hello folks! 

   As a first project post I will show you the steps I take to develop a binary thermometer with a LM35 temperature sensor. It is a bit similar to this one from instructables, but mine is arduino-powered. My intention on this project was simply to test the power of arduino (UNO R3) on handling one of its ports (6 bits) at a time, and also the efficacy of the LM35 digital temperature sensor.

The prototype schematic

   The schematic I created was drawn in Fritzing. My code (also available below) can be found in GitHub ( here). It is important to notice that the limits of temperatures that can be read are NOT the ones of the LM35, instead they are limited by the Arduino power supply voltage (0 +5V): so you are able to read  temperatures between +2 and +150 degrees Celsius.

// Arduino timer CTC interrupt example (timer), from www.engblaze.com
// This example is a binary meter - shows a analog value in a binary (6-bit) output
// Modified by Clovis Fritzen, to fit as a binary thermomter (in may/2014)
 
// avr-libc library includes
#include < avr/io.h >
#include < avr/interrupt.h >
 
int sensorPin = A0;    // select the input pin for the potentiometer
int sensorValue = 0;  // variable to store the value coming from the sensor (LM35)
byte binaryValue= B00000000; // initialize port value as zeros

void setup()
{
    DDRB = DDRB | B00111111; // set 6 pins in port B as outputs
    
    // initialize Timer1
    cli();          // disable global interrupts
    TCCR1A = 0;     // set entire TCCR1A register to 0
    TCCR1B = 0;     // same for TCCR1B
 
    // set compare match register to desired timer count:
    OCR1A = 15624; // for temperature
    // turn on CTC mode:
    TCCR1B |= (1 << WGM12);
    // Set CS10 and CS12 bits for 1024 prescaler:
    TCCR1B |= (1 << CS10);
    TCCR1B |= (1 << CS12);
    // enable timer compare interrupt:
    TIMSK1 |= (1 << OCIE1A);
    // enable global interrupts:
    sei();
}
 
void loop()
{
    // You would put another stuff program here
}
 
ISR(TIMER1_COMPA_vect)
{
  // read the value from the sensor  :
  sensorValue = analogRead(sensorPin);
  //digitalValue= sensorValue;
  binaryValue= byte(sensorValue/2);
  PORTB = binaryValue; 
}




   Some notes:
- The LM35 sensor is connected to the analog input A0;
- I put three colors of leds only to give an impression of "the warmer the color, the warmer the ambient (since the MSB is a red led, connected to pin 13 of arduino);
- I have only tested it indoors so far, and it showed to be accurate enough for a sensor like that, when compared to a DTH11 temperature sensor. 

I hope you have liked it, and I promised I will try to put some videos of the actual circuits working, for the next experiments. 

No comments:

Post a Comment