Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
IMPLEMENTACIÓN UNO
Se realiza la implementación del algoritmo mediante el uso de CCS así:
#include <16F877.h> //pic empleado
#device adc=10 //bits del resultado de convercion
#FUSES HS,NOWDT //datos del programador
#use delay(clock=20000000) //frecuencia empleada
#include <LCD.C> //incluimos libreria de la lcd
#byte portc = 0x07 //direcciones de memoria para los puertos
#byte trisc = 0x87
#byte portb = 0x06
#byte trisb = 0x86
#use fast_io(c) //manejo del puerto c
int i,x; // declaramos las variables
int16 q;
float z;
#INT_EXT //atención a interrupción por cambio de RB0
ext_isr(){
if(i==0)
{bit_set(portc,0); i=1;} //enciende la luz del lcd
else
{bit_clear(portc,0); i=0;}} //apaga la luz del lcd
void main() {
trisc=0; //puerto c salida
trisb=255; //puerto d entrada
portc=0; //limpio puerto c
setup_adc_ports(AN0); //Canales 0 analógico
setup_adc(ADC_CLOCK_DIV_32); //Fuente de reloj 32
enable_interrupts(int_ext); //habilita int por RB0
Ext_int_edge(L_TO_H); //flanco de subida
enable_interrupts(global); //habilita int global
lcd_init(); //inicio de lcd
LCD_GOTOXY(1,1); //ubicación en la lcd
printf(lcd_putc,"**DIGITAL-TEMP**"); //imprimimos el texto en la lcd
LCD_GOTOXY(1,2); //ubicación en la lcd
printf(lcd_putc,"ESPERE"); //imprimimos el texto en la lcd
delay_ms(200); //retardo
for(x=7;x<15;x++) //imprimo tiempo de espera
{LCD_GOTOXY(x,2); //ubicación en la lcd
printf(lcd_putc,"*"); //imprimimos el texto en la lcd
delay_ms(400); } //retardo
bit_clear(portc,0); //apago luz del lcd
bit_clear(portc,1); //apago alarma de fuera de rango
printf(lcd_putc,"\f"); //borro la lcd
while(1) //ciclo infinito
{
delay_us(200); //tiempo de espera
set_adc_channel(0); //Habilitación canal 0
delay_us(200); //tiempo de espera
q = read_adc(); //Lectura canal0
z=((q-10)/6.82)+1.03; //conversión a grados + ajuste del valor digital
if(z>=0 && z<=50) //condición de trabajo
{
LCD_GOTOXY(1,1); //ubicamos el cursor en la posición 1.1 de la lcd
printf(lcd_putc," TEMPERATURA ACT"); //imprimimos el texto en la lcd
LCD_GOTOXY(1,2); //ubicamos el cursor en la posición 1.2 de la lcd
printf(lcd_putc, " => %3.3f *C <=",z); //imprimimos el promedio de la temperatura
}
else
{LCD_GOTOXY(1,1); //ubicación en la lcd
printf(lcd_putc,"\f TEMP NO DISP."); //imprimimos el texto en la lcd
LCD_GOTOXY(1,2); //ubicación en la lcd
printf(lcd_putc,"** RANGO OUT. **"); //imprimo texto en la lcd
bit_set(portc,1); //alarman de temperatura baja
delay_ms(100); //retardo
bit_clear(portc,1); //imprimimos el texto en la lcd
printf(lcd_putc,"\f"); //borro la lcd
}}}
IMPLEMENTACIÓN DOS
SENSOR DE TEMPERATURA
Siguiendo con estos pasos lo primero es determinar el sensor, en este caso como es simulado
y no se cuenta con el sensor clínico PR222J2 se seleccionó la NTC activa la cual se le dieron
los parámetros:
ADECUADOR DE SEÑAL
Cuya corriente de salida se ve afectada por el valor de la resistencia NTC la cual al ser este
un amplificador inversor cuya fórmula está dada por:
Con los valores usados, estimando la NTC a una impedancia media a 38° C de 1301Ω ,
conectando a R1 con un valor de 50k Ω a una fuente de 5v y seria:
AMPLIFICADOR
Como la salida de la etapa anterior es negativa y está en el orden de los 100 mV, es necesario
amplificar esta señal diez veces con otro amplificador inversor cuya salida sea ahora positiva,
La figura muestra esta etapa amplificadora.
Es asi que gracias al ajuste de Rv2 se puede determinar el mínimo de temperatura y con el
ajuste de ganancia el máximo de temperatura a medir para que sea proporcional una salida
de cero a 5v en esta escala.
FILTRO PASABAJAS
El espectro de la señal térmica del cuerpo humano, va desde DC hasta 5 Hz. Se emplea el
filtro pasa bandas con frecuencia de corte a 10 Hz y atenuación de 20 dB/década, para
eliminar ruidos de 60 Hz inducidos por la red de potencia eléctrica y ruidos de 120 Hz
inducidos por rectificadores de onda completa de las fuentes de alimentación. En la banda
pasante del filtro Vo3(T) es igual a .La figura muestra el circuito del filtro pasa bajas.
CIRCUITO MICROCONTROLADO
En este caso, la salida del filtro pasa bajas, se conecta a un microcontrolador PIC16F877A a
su entrada del convertidor análogo/digital de alta resolución (10 bits), el cual cuenta con una
pantalla GLCD grafica de 128 * 64 pixeles, cuenta con leds conectados para indicar cuando
se encuentre en estado normal de temperatura, hipertermia e hipotermia, Buzzer para alarmar
estos estados.
Programación del microcontrolador
#device adc=10
#use delay (clock = 20000000)
#include "HDM64GS12.c"
#include "graphics.c"
#include <math.h>
#use standard_io (ALL)
#define Ledrojo pin_B3
#define Ledverde pin_B6
#define Ledamarillo pin_B7
#define Buzer Pin_C1
float s; //dato dacimal conversor AD
float t;// dato convertido a voltaje
float temp;//dato para la temperatura
float tempant;
Int statusled = 0;
Int timer=0;
Int stl=0;
CHAR mens [ ] = " ";
CHAR Mens2 [ ] = "Hipotermia";
CHAR Mens3 [ ] = "Hipertermia";
CHAR Mens4 [ ] = "Normal";
//------- funcion para despliegue de imagen de portada cuatro bloques por ser 16f877 que
tiene menos ram q un 18f 4550
//del 0 al 16
const int8 imagen[16][16] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x
FF,
0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x1C,0x88,0xC1,0x8C,0xF9,0xC6,0x38,0x41
,
0x80,0x00,0x01,0xC1,0xF0,0x38,0x00,0x00,0x08,0xC9,0x21,0x8C,0x81,0x26,0x48,0xE1,
0x80,0x00,0x03,0xE1,0xF0,0x7C,0x00,0x00,0x08,0xA9,0x01,0xDC,0x81,0x26,0x40,0xA
1,
0x80,0x00,0x03,0xE1,0xF0,0x7C,0x00,0x00,0x08,0xA8,0xC1,0x54,0xF1,0x26,0x41,0xB1
,
0x80,0x00,0x03,0xE0,0xE0,0x7C,0x00,0x00,0x08,0xA8,0x21,0x34,0x81,0x26,0x41,0x11,
0x80,0x01,0xC1,0xC0,0x00,0x38,0x70,0x00,0x08,0x99,0x21,0x24,0x81,0x26,0x49,0xF1,
0x80,0x03,0xE0,0x00,0x00,0x00,0xF8,0x00,0x1C,0x88,0xC9,0x24,0xF9,0xC6,0x39,0x11,
0x80,0x03,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x03,0xE0,0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
};
void glcd_imagen()
{
char i,j;
signed char k;
for( i = 0 ; i < 16 ; i ++ )
{
for( j = 0 ; j < 16 ; j ++)
{
for(k=7;k>-1;k--)
{
if( bit_test(imagen[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
}
}
}
}
// del 16 al 32
const int8 imagen2[16][16] = {
0x80,0x01,0xC0,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x07,0xFF,0xFF,0x01,0xFF,0xFF,0xFF,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x07,0xFF,0xFF,0x01,0xFF,0xFD,0xFF,0x81,0x80,0xFF,0x03,0xFF,0xF8,0x00,0x01
,
0x80,0x03,0xFF,0xFE,0x00,0xFF,0xF9,0xFF,0x81,0x80,0xFF,0x03,0xFF,0xFE,0x00,0x01
,
0x80,0x00,0xFF,0xF8,0x00,0x3F,0xE1,0xFF,0xC1,0x81,0xFF,0x83,0xFF,0xFF,0x00,0x01
,
0x80,0x00,0x7F,0xF0,0x00,0x0F,0xC1,0xFF,0xE1,0x81,0xFF,0x83,0xFF,0xFF,0x00,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x0F,0x81,0xFF,0xE1,0x83,0xFF,0xC3,0xF8,0xFF,0x80,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x81,0xBF,0xF1,0x83,0xFF,0xC3,0xF8,0x3F,0x80,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x9F,0xF9,0x83,0xE7,0xC3,0xF8,0x1F,0xC0,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x9F,0xF9,0x87,0xE7,0xE3,0xF8,0x1F,0xC0,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x8F,0xFD,0x87,0xE7,0xE3,0xF8,0x1F,0xC0,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x87,0xFF,0x8F,0xE7,0xF3,0xF8,0x1F,0xC0,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x87,0xFF,0x8F,0xC3,0xF3,0xF8,0x1F,0xC0,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x83,0xFF,0x8F,0xC3,0xF3,0xF8,0x1F,0xC0,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x81,0xFF,0x9F,0xFF,0xFB,0xF8,0x1F,0xC0,0x01
,
};
void glcd_imagen2()
{
char i,j;
signed char k;
for( i = 16 ; i < 32 ; i ++ )
for(k=7;k>-1;k--)
{
if( bit_test(imagen2[i][j] ,7-k ))
glcd_pixel( j*8+k,i, ON );
//del 32 al 48
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x81,0xFF,0x9F,0xFF,0xFB,0xF8,0x3F,0xC0,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x80,0xFF,0xBF,0xFF,0xFB,0xF8,0xFF,0x80,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x80,0x7F,0xBF,0xFF,0xFF,0xFF,0xFF,0x80,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x80,0x3F,0xBF,0xFF,0xFF,0xFF,0xFF,0x00,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x80,0x3F,0xBF,0x00,0xFF,0xFF,0xFE,0x00,0x01
,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x01,0x80,0x1F,0xFF,0x00,0xFF,0xFF,0xFC,0x00,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x07,0xE0,0x0F,0xFE,0x00,0x7F,0xFF,0xF0,0x00,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x07,0x00,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x0F,0x80,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x0F,0x80,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x7C,0x00,0x00,0x00,0x0F,0x80,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x38,0x38,0x00,0x07,0x07,0x00,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x00,0x7C,0x1C,0x0F,0x80,0x00,0x01,
0x80,0x00,0x3F,0xE0,0x00,0x07,0x00,0x00,0x00,0x00,0x7C,0x3E,0x0F,0x80,0x00,0x01,
};
void glcd_imagen3()
{
char i,j;
signed char k;
for( i = 32 ; i < 48 ; i ++ )
for(k=7;k>-1;k--)
glcd_pixel( j*8+k,i, ON );
//del 32 al 64
0x80,0x00,0x3F,0xE0,0x00,0x0F,0x00,0x00,0x00,0x00,0x7C,0x3E,0x0F,0x80,0x00,0x01,
0x80,0x00,0x1F,0xF0,0x00,0x0F,0x00,0x00,0x00,0x00,0x38,0x3E,0x07,0x00,0x00,0x01,
0x80,0x00,0x1F,0xF0,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x01,
0x80,0x00,0x0F,0xF8,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0x80,0x00,0x0F,0xFC,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x10,0x00,0x01,
0x80,0x00,0x07,0xFF,0x01,0xF8,0x3C,0x00,0x00,0x00,0x00,0x40,0x19,0x20,0x80,0x01,
0x80,0x00,0x03,0xFF,0xFF,0xF0,0x18,0x00,0x00,0x00,0x10,0x00,0x25,0x00,0x00,0x01,
0x80,0x00,0x01,0xFF,0xFF,0xC0,0x19,0xAB,0xE6,0x78,0xDB,0x5C,0x21,0x2E,0x9B,0x
81,
0x80,0x00,0x00,0x3F,0xFF,0x80,0x1A,0xB2,0xA9,0x55,0x52,0x44,0x21,0x2A,0xA0,0x8
1,
0x80,0x00,0x00,0x07,0xFE,0x00,0x1B,0x22,0xA9,0x55,0x92,0x5C,0x21,0x2A,0xA3,0x8
1,
0x80,0x00,0x00,0x00,0x00,0x00,0x1A,0x22,0xA9,0x55,0x12,0x54,0x35,0x2A,0xB2,0x81
,
0x80,0x00,0x00,0x00,0x00,0x00,0x19,0xA2,0xA6,0x54,0xCA,0x5A,0x19,0x2A,0x9B,0x4
1,
0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x
FF
};
void glcd_imagen4()
char i,j;
signed char k;
for( i = 48 ; i < 64 ; i ++ )
for(k=7;k>-1;k--)
void med_ir ()
{
setup_adc_ports (AN0);//setup_adc_ports (ALL_ANALOG);
delay_ms (300);
setup_adc (ADC_OFF);
setup_adc_ports (NO_ANALOGS );
delay_ms (100);
temp=temp/1000;
Void led_s ()
If (statusled==0)
output_Low (Ledrojo);
output_High (Ledverde);
output_Low (Ledamarillo);
timer=0;
stl=0;
}
If (timer <= 2 && stl==0)
If (statusled==1)
output_high (Ledrojo);
output_low (Ledverde);
output_low (Ledamarillo);
If (statusled==2)
output_Low (Ledrojo);
output_low (Ledverde);
output_High (Ledamarillo);
timer ++;
delay_ms(10);
if (timer>2)
stl=1;
timer = 0;
}
If (timer <= 2 && stl==1)
output_low (Ledrojo);
output_low (Ledverde);
output_low (Ledamarillo);
timer ++;
delay_ms(10);
if (timer>2)
stl=0;
timer = 0;
///////////////////////////termina lo da la pantala//////////////////////////////
void main ()
glcd_imagen2();
glcd_imagen3();
glcd_imagen4();
delay_ms(3000);
output_low (Ledrojo);
output_low (Ledverde);
output_low (Ledamarillo);
output_low (Buzer);
while (true)
tempant= temp;
med_ir();
If (temp>38)
{
Statusled =1;
output_high (buzer);
If (temp<36)
Statusled =2;
output_high (buzer);
Statusled =0;
output_low (buzer);
led_s ();
}
BIBLIOGRAFIA
https://www.polibits.gelbukh.com/2005_31/Diseno%20de%20un%20Termometro%
20Digital%20para%20Analisis%20Clinico%20en%20Animales%20de%20Trabajo.
https://uvadoc.uva.es/bitstream/10324/13320/1/TFG-P-274.pdf. Recuperado el 04
de abril de 2019.