Wednesday, August 2, 2017

Interfacing PIC16F887 with LM35 temperature sensor

PIC16F887 with LM35 sensor hardware circuit 
A thermometer can easily be implemented using the low cost analog temperature sensor LM35. The LM35 temperature sensor is three pin device (VCC, OUT and GND) with an output voltage linearly related to Centigrade temperature. Since the LM35 output varies with dependent to the temperature we need ADC (Analog-to-Digital Converter) module to measure this voltage. The ADC module converts analog data into digital data.
The LM35 output has linear +10mV/°C scale factor means the following:
If the output voltage =   10mV ---> temperature =   1°C
If the output voltage = 100mV ---> temperature = 10°C
If the output voltage = 200mV ---> temperature = 20°C
If the output voltage = 370mV ---> temperature = 37°C
and so on.
This article shows the interfacing of the LM35 temperature sensor with PIC16F887 microcontroller.
The PIC16F887 microcontroller has one 10-bit ADC module with up to 14 channels. In this example one channel for the LM35 output is needed.
Hardware Required:
  • PIC16F887 microcontroller
  • LM35 temperature sensor  -- datasheet
  • 16x2 LCD screen
  • 10K ohm variable resistor
  • Breadboard
  • 5V voltage source
  • Jumper wires
Interfacing PIC16F887 with LM35 temperature sensor circuit:
Interfacing PIC16F887 with LM35 temperature sensor circuit diagram
In this project the PIC16F887 microcontroller uses its internal oscillator which is set in the C code and MCLR pin function is disabled.
Interfacing PIC16F887 with LM35 temperature sensor CCS C code:
Reading voltage quantity using the ADC gives us a number between 0 and 1023 (10-bit resolution), 0V is represented by 0 and 5V is represented by 1023. Converting back the ADC digital value is easy and we can use the following equation for that conversion:
Voltage (in Volts) = ADC reading * 5 / 1023
Multiplying the previous result by 100 (LM35 scale factor is 10mV/°C = 0.01V/°C) will gives the actual temperature:
Temperature(°C) = ADC reading * 0.489
where 0.489 = 500 / 1023
/* Interfacing PIC16F887 with LM35 analog temperature sensor CCS C code
   The LM35 sensor has linear +10mV/°C scale factor
   Internal oscillator used @ 8MHz

//LCD module connections
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#define LCD_DATA4 PIN_D3
#define LCD_DATA5 PIN_D4
#define LCD_DATA6 PIN_D5
#define LCD_DATA7 PIN_D6
//End LCD module connections

#include <16F887.h>
#device ADC = 10
#use delay(clock = 8MHz)
#include <lcd.c>

char temperature[] = " 00.0 C";
unsigned int16 temp;
void main(){
  setup_oscillator(OSC_8MHZ);                    // Set the internal oscillator to 8MHz
  setup_adc(ADC_CLOCK_INTERNAL);                 // ADC Module uses its internal oscillator
  setup_adc_ports(sAN0);                         // Configure AN0 pin as analog
  set_adc_channel(0);                            // Select channel 0 (AN0)
  lcd_init();                                    // Initialize LCD module
  lcd_putc('\f');                                // Clear LCD
  lcd_gotoxy(3, 1);                              // Go to column 3 row 1
  printf(lcd_putc, "Temperature:");
    temp = read_adc() * 0.489;                   // Read analog voltage and convert it to degree Celsius (0.489 = 500/1023)
    if (temp > 99)
      temperature[0]  = 1 + 48;                  // Put 1 (of hundred)
      temperature[0]  = ' ';                     // Put space
    temperature[1]  = (temp / 10) % 10  + 48;
    temperature[2]  =  temp % 10  + 48;
    temperature[5] = 223;                        // Degree symbol
    lcd_gotoxy(5, 2);                            // Go to column 5 row 2
    printf(lcd_putc, temperature);               // Display LM35 temperature result
The following small video shows simulation of PIC16F887 with LM35 sensor using Proteus:

Proteus simulation file can be downloaded from the following URL: