PIC – LM35 + LCD Display + PIC 16F887 ( un mic termometru digital )

Cu ajutorul acestei aplicatii ( proiect ) vom utiliza convertorul analog-digital al microcontroller-ului PIC16F887 ( in general al oricarui tip de microcontroller ).

Ca senzor de temperatura folosesc LM35 ( ieftin si se gasesc oriunde ) ( datasheet ). Acest senzor va scoate pe iesire o tensiune proportionala cu temperatura, iar gama de masurare a temperaturii este: -55 – 150 grade Celsius. Pentru mai multe detalii consultati datasheet-ul .

Pentru afisearea temperaturii vom folosi un display LCD 2×16 ( doua randuri a cate 16 caractere ).

Inainte de a incepe trebuie sa facem o scurta ( foarte scurta ) introducere in ceea ce inseamna convertorul analog-digital ( ADC ).
-un ADC este un circuit electronic care converteste o marime analogica ( tensiune, curent,…etc ) de intrare intr-o marime digitala de iesire.
semnal-analog

O caracteristica importanta a unui ADC este rezolutia acestuia, adica numarul de valori pe care poate sa-l furnizeze convertorul la iesirea sa in intervalul de masura. Lucrand cu date binare , rezolutia se va masura in biti.

Ex: daca rezolutia ADC-ului este pe 10 biti, convertorul poate furniza 1024 valori diferite la iesire.

Sa facem cateva calcule pe exemplul nostru:

  •  LM35 – iesirea se modifica cu 10mV la fiecare grad celsius.
  • ADC-ul microcontrollerului nostru este pe 10 biti
  • Tensiunea de referinta Vref = 5V
  • ADCrez = 5V/1024 = 0,004882=4,88mV

Consideram temperatura ambientala 25,5 grade C si stim ca iesirea lui LM35 se modifica cu 10mV /grad C, in aceste conditii va rezulta ca pentru o temperatura de 25,5 tensiunea pe iesirea senzorului ( LM35 ) va fi:

25,5 * 10mV = 255mV=0,255V.

Cunoscand aceasta tensiune putem sa calculam ce valoare va avea ADC-ul la iesire astfel:

VALadc = 0,255 V / 0,004882 V = 52,22950.

Dupa ce am calculat VALadc putem sa calculam si tempratura :

Temp = VALadc *ADCrez (V) / 10 (mV/C ) = 52,22950 * 0,004882 (V) / 0,01 ( V/C ) =  25,5 C

Stiind toate acestea formula Temp va fi folosita si in programul nostru pentru microcontroller.

Schema proiectului :

schema

Codul sursa:

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

char message1[] = “Temperatura:”;

char tempC[15];

unsigned int tempinC;
float temp_value=0;

void main()
 {
ANSEL = 0x04;     // Selectare port AN2 ca fiind analog
ADCON1=0X80;
TRISA = 0x04;
ANSELH=0;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,1,message1);
Lcd_Chr(2,6,223);
Lcd_Chr(2,15,223);
Lcd_Chr(2,7,’C’);

do {
tempinC = ADC_Read(2);
temp_value = tempinC*0.4882;           // formula de calcul a temperaturii

FloatToStr(temp_value,tempC);  // conversia in char a valorii lui temp_value

Lcd_Out(2, 1, tempC);

Delay_ms(1000);
 } while(1);
}

Un mic filmulet demonstrativ: