Está en la página 1de 7

Monitor del sensor de temperatura LM35 mediante una interfaz de usuaria en PC

Oscar Leonardo Mosquera Dussan 20111002006.


Juan Guillermo Paez 20111002007.
Alejandro Landazaval 20111002004.
Darwin Alexander Vargas 20111002013.

Presentado al Ingeniero
Julian Camargo

Universidad Distrital Francisco Jos de Caldas


Facultad de Ingeniera
Esp. Bioingeniera
Nivelatorio Electrnica bsica Digitales
2011

La seal entregada por el sensor LM35 , es amplificada por un amplificador operacional no inversor de
ganancia 5, de tal forma que el rango de temperatura corresponda en voltaje de la siguiente forma
0 0v , 100 5v.

La seal obtenida del amplificador operacional (simulada por un potencimetro) es digitalizada a 8


bits, para ello utilizamos el microcontrolador PIC16F877A , mediante el canal AN0 del modulo
conversor analogo digital llevamos a cabo la conversion y posteriormente mediante el modulo de
comunicaciones seriales del pic realizamos la comunicacin con el PC a traves de la norma RS232, La
cual fue definida para conectar un ordenador a un modem. Adems de transmitirse los datos de una
forma serie asncrona son necesarias una serie de seales adicionales, que se definen en la norma. Las
tensiones empleadas estn comprendidas entre +15/-15 voltios.

El chip max232 permite adaptar los niveles RS232 y TTL, permitiendo conectar un PC con un
microcontrolador. Slo es necesario este chip y 4 condensadores electrolticos de 22 micro-faradios. El
esquema es el siguiente:

El cdigo implementado en el microcontrolador es el siguiente:


#include <16f877a.h>
#fuses XT, NOWDT, NOPROTECT
#use delay (clock=4M)
#define Tx PIN_C6 // PIN de Transmisin
#define Rx PIN_C7 // PIN de Recepcin
#use rs232(baud=9600, xmit=Tx, rcv=Rx, bits=8)
#use fast_io(B)
char dato=0;
void main()
{
set_tris_a(0xff);//configuramos el puerto A como entradas
set_tris_b(0x00);//portb salidas
setup_adc_ports(ALL_ANALOG); //todas analogas
setup_adc(ADC_CLOCK_DIV_8);
while(1) //bucle infinito para leer constantemente la temperatura del sensor.
{ set_adc_channel(0);
dato=read_adc();
output_b(dato); //Visualizamos la conversin ADC en los 8 bits del puerto B.
putc(dato); //escribimos mediante Tx la variable que contiene la conversin ADC
delay_ms(100);
}
}
En el PC se desarrollo una aplicacin que nos permitiera monitorear y graficar la temperatura actual del
sensor atravez del tiempo, el programa desarrollado en C++ Borland Builder cuenta con una alarma

sonora y visual para cuando la temperatura supera un valor humbral entre 0 - 100 establecido por el
usuario, el programa autoguarda la grafica y los valores numericos de temperatura, tambien se puede
realizar un guardado independiente y cargar una imagen previamente guardada .

El codigo desarrollado en c++ Builder correspondiente a los objetos de la interfas es el siguiente:


//--------------------------------------------------------------------------#include <vcl.h>
#pragma hdrstop
#include <mmsystem.h>
#include "Unit1.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma link "ComPort"
#pragma resource "*.dfm"
TForm1 *Form1;
bool abrir,alimg=false;
int x=0,y,l=0,j=0,w=340,e=0,r=184,t=0;
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
CP->ConfigDialog();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)


{
while(w!=40)
{w=w-60;e=e+20;Canvas->TextOut(165, w,StrToInt(e)); }
while(r!=784)
{r=r+50;t=t+5;Canvas->TextOut(r, 345,StrToInt(t)); }
if(abrir==false)
{abrir=true;
Timer1->Enabled=true;
CP->Open();
Button2->Caption="Cerrar Puerto";
if(CP->Active==true)
ShowMessage("Puerto activo!");
else
ShowMessage("Error al abrir el puerto");
}
else
{abrir=false;
Timer1->Enabled=false;
CP->Close();
Button2->Caption="Abrir Puerto";
if(CP->Active==false)
ShowMessage("Puerto inactivo");
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender)
{
{CP->EnumComDevicesFromRegistry(ComboBox1->Items);
ComboBox1->ItemIndex = 0;
CP->DeviceName = "\\\\.\\" + ComboBox1->Text;}
Image1->Picture->LoadFromFile("grilla.bmp");
Image1->Canvas->Pen->Color=0x0000FF;Image1->Canvas->MoveTo(0,300);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Salida1Click(TObject *Sender)
{
Form1->Close();
}
//--------------------------------------------------------------------------void __fastcall TForm1::CPRxChar(TObject *Sender)
{
Timer1->Interval=10;
}

//--------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender)


{
if(x==Image1->Width)
{x=0;l++;
Image1->Picture->SaveToFile("img"+IntToStr(l)+".bmp");
Memo1->Lines->SaveToFile("doc"+IntToStr(l)+".txt");
Image1->Picture->Graphic=NULL;
Memo1->Clear();
Image1->Picture->LoadFromFile("grilla.bmp");ciclo->Caption=IntToStr(l);
Image1->Canvas->Pen->Color=0x0000FF;Image1->Canvas->MoveTo(0,300);}
else
{x++;
y = CP->ReadByte();
Label2->Caption=y;
y=1.1764705882352941176470588235294*(y);
Image1->Canvas->LineTo(x,300-y);
y=0.33333333333333333333333333333333*(y);
Memo1->Lines->Add(IntToStr(y));
if(y>=StrToInt(umbral->Text))
{Timer2->Interval=1000;Timer3->Interval=500;}
else
{Timer2->Interval=0;Timer3->Interval=0;Image2->Visible=false;Image3->Visible=false;}
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
CP->DeviceName = "\\\\.\\" + ComboBox1->Text;
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button4Click(TObject *Sender)
{
Timer1->Interval=0;Timer1->Enabled=false;
CP->Close();
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button5Click(TObject *Sender)
{
CP->Open();
Timer1->Enabled=true;Timer1->Interval=10;
}
//--------------------------------------------------------------------------void __fastcall TForm1::Cargar1Click(TObject *Sender)
{
if (OPD1->Execute())

{Image1->Picture->LoadFromFile(OPD1->FileName);}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Guardar1Click(TObject *Sender)
{
if (SPD1->Execute())
{Image1->Picture->SaveToFile(SPD1->FileName+".bmp");}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Info1Click(TObject *Sender)
{
ShowMessage("MonitoreoDeTemperatura 1.0.5.0.\n"
"Realizado por:\n"
"Edna Carolina Moriones 2004200596 \n"
"Oscar Leonardo Mosquera 2005100830 \n");
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer2Timer(TObject *Sender)
{PlaySound("attention.wav", 0,
SND_FILENAME | SND_ASYNC);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer3Timer(TObject *Sender)
{
if(alimg==false)
{Image3->Visible=false;Image2->Visible=true;alimg=true;}
else
{Image2->Visible=false;Image3->Visible=true;alimg=false;}
}
//--------------------------------------------------------------------------Conclusiones

Es necesario a la hora de establecer una comunicacin serial asncrona entre un PC y un


microcontrolador hacer la conversin de niveles de TTL y RS232 para el correcto
funcionamiento del sistema.

La lectura de las conversiones debe estar constantemente hacindose para detectar cambios en
la seal anloga de la entrada, sin embargo los intervalos de tiempo de adquisicin de los
mismos se realizan cada 100ms para evitar que haya una acumulacin grande de datos en el
buffer.

Los tiempos de transmisin y recepcin de la informacin se realiza en tiempos y canales


distintos. La transmisin por el canal TX y la recepcin por el canal RX.

También podría gustarte