////////////////////////////////////////////////////////////////////////////////
// CONTROLADOR PARA HELADERA //
// AUTOR: PABLO PARABA NUÑEZ //
// FECHA: 12-JUN-2021 //
////////////////////////////////////////////////////////////////////////////////
#include <16F877A.h>
#device adc=10 /*Configura el tamaño de retorno read_adc.
Por ejemplo, si usa un PIC con un A / D de 10 bits,
puede usar 8 o 10 para xx- 8 devolverá el byte más significativo,
10 devolverá la lectura A / D completa de 10 bits.*/
#fuses HS,NOWDT,NOLVP,PUT,NOBROWNOUT,NOPROTECT
#use delay(clock = 20000000)
//DEFINO LOS PINES DE LA LCD
#define LCD_DATA_PORT getenv("SFR:pORTB") //datos d4_d7
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_ENABLE_PIN PIN_B3
#include <lcd_16x4_selg.c> //libreria de la lcd
#include <math.h>
#byte PORTA=5 //direccion portA(ver datashet)
#byte PORTB=6 //direccion portB(ver datashet)
#byte PORTD=8 //direccion portD(ver datashet)
#define motor PORTD,0
#define on 1
#define off 0
const char grados[8]= //dibuja un caracter
{0b01100,
0b10010,
0b10010,
0b01100,
0b00000,
0b00000,
0b00000,
0b00000
};
float vref=5.0; //tension de referancia 5v
float res_fija= 10000.0 ; //resistenci auxiliar fija
float res_ntc_fija=10000.0; //resistencia del sensor a 25º
float beta=3977.0; // ganancia del sensor cuando la resistencia es infinita
float tension_in;
float res_ntc_actual;
float temperatura_k;
float temperatura_c;
int16 prom,muestras[10];
float set_point,histeresis;
int control_set;
char mensaje[]={"servicios electronicos y electricos "}; //mensaje
char asigna_sms[17]={""}; //asigna el mensaje a mostrar
int8 i,j,cont,col=16;
float v1;
void lectura_analogica(x,y);
void set_point_alcanzado();
void main()
{
setup_adc_ports(ALL_ANALOG); //sentencia del compilador para entrada de puertos analogicos(a0 y a7)ver tabla
setup_adc(adc_clock_internal); //habilita el módulo a / d
set_tris_a(0b00000001); //configura el pin_a0 como entrada
set_tris_b(0); //salidas
set_tris_d(0); //salidas
portd=0; //salidas en bajo
portb=0;
lcd_init();
CGRAM_x(1); //para escribir caracteres
for(j=0;j<=7 ;j++) lcd_send_byte(1,grados[j]); //envia los datos del caracter a la lcd
lcd_gotoxy(4,1);
lcd_putc("SELTRONIC");
delay_ms(100);
cont=0;
while(cont<36)
{
for(i=0;i<16;i++)
{
asigna_sms=mensaje[i+cont];
}
lcd_gotoxy(1,2);
printf(lcd_putc,"%s",asigna_sms);
cont++;
delay_ms(300);
}
lcd_putc('\f');
set_point=0.0;
control_set=off; //controla si alcazó el set_point
histeresis=6.0;
while(true) //bucle principal
{ lectura_analogica(1,1); //lee e imprime
if(temperatura_c<set_point) set_point_alcanzado(); //si alcanzo el set point
}
}
void lectura_analogica(x,y)
{ for(i=0;i<10;i++)
{
set_adc_channel(0); //prepara el canal a ser leído
muestras=read_adc(); //lee
delay_ms(10);
}
prom=muestras[0]+muestras[1]+muestras[2]+muestras[3]+muestras[4]+muestras[5]+muestras[6]+muestras[7]+muestras[8]+muestras[9];
prom=prom/10;
tension_in=(vref / 1024.0)*prom ; //tension de entrada
res_ntc_actual = res_fija / ((vref/tension_in)-1);
temperatura_k = beta/(log(res_ntc_actual/res_ntc_fija)+(beta/298.0));
temperatura_c=(temperatura_k-273.15); //cnvierte a grados cel
lcd_gotoxy(x,y);
printf(lcd_putc,"Temp:%2.1f",temperatura_c); //imprime la temperatura actual
CGRAM(1);
lcd_putc("C");
lcd_putc(" ");
lcd_gotoxy(col,2);
lcd_putc("Elmar Paraba ");
col--;
delay_ms(500);
lcd_putc(" ");
if(col==4)
{
col=16;
lcd_gotoxy(4,2);
lcd_putc(" ");
}
}
void set_point_alcanzado()
{
while(histeresis>temperatura_c) //
{
bit_set(motor); //apaga motor
lectura_analogica(1,1); //muestra la temp
lcd_gotoxy(1,2); //
lcd_putc("off");
delay_ms(250);
lcd_gotoxy(1,2);
lcd_putc(" ");
delay_ms(250);
if(temperatura_c>=histeresis)
{
lcd_putc('\f'); //borra la pantalla
}
}
if(temperatura_c>histeresis)
{ lectura_analogica(1,1); //muestra la temp
bit_clear(motor); //prende motor
lcd_gotoxy(1,2); //
lcd_putc("on");
delay_ms(500);
}
}