Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
#include <16F877A.h>
#device adc=10
#use delay(clock=4000000)
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#define LCD_ENABLE_PIN PIN_B3
#define LCD_RS_PIN PIN_B2
#define LCD_RW_PIN PIN_B1
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
#include <LCD.c>
#include <ds1307.c>
#include <stdint.h> //Libreria estándar para definir tipos de datos enteros
uint8_t dia=21,mes=6,anio=17,dow=0,hora=15,minuto=52,segundo=0;
float temp_c;
float temp_f;
float l_v;
uint16_t luz_lux,luz_wcm2;
uint8_t contador=0; //Para controlar el bucle de ajustes si llega a hasta 10 sale del bucle
void main()
{
while(1){
set_adc_channel(0); //Se selecciona canal AN0
delay_ms(1);
l_v=(float)read_adc()*5000/1023; //En milivoltios a la salida del LDR
luz_lux=25*l_v/(5000-l_v)-6;
luz_wcm2=luz_lux*79; //0.0079W/m2 eficiencia solar aproximada
set_adc_channel(1); //Se selecciona canal AN0
delay_ms(1);
temp_c=((float)read_adc()*5000/1023)/10; //Temperatura del LM35 en Celcius
temp_f=temp_c*9/5+32;
ds1307_get_date(dia,mes,anio,dow); //Obtiene la fecha
ds1307_get_time(hora,minuto,segundo); //Obtiene la hora
lcd_gotoxy(1,1);
printf(lcd_putc,"%02u/%02u/20%02u\n",dia,mes,anio); //Imprime en el display la fecha
printf(lcd_putc,"%02u:%02u:%02u",hora,minuto,segundo); //Imprime en el display la hora
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,1);
printf(lcd_putc,"T=%uC T=%uF\n",(uint8_t)temp_c,(uint8_t)temp_f); //Imprime en el display la temperatura
printf(lcd_putc,"L=%luL %luW/cm2",luz_lux,luz_wcm2); //Imprime en el display la intensidad de luz
delay_ms(500);
lcd_putc("\f");
}
contador=0;
lcd_putc("\f"); //Desde aqui ya no se puede cancelar
lcd_gotoxy(1,2); //Solo esperar a que se guarden los cambios
printf(lcd_putc,"Guardando.");
delay_ms(500);
lcd_gotoxy(1,2);
printf(lcd_putc,"Guardando..");
delay_ms(500);
ds1307_set_date_time(dia,mes,anio,dow,hora,minuto,segundo); //Con esta función se guardan los cambios
lcd_gotoxy(1,2);
printf(lcd_putc,"Guardando...");
delay_ms(500);
lcd_putc("\f");
lcd_gotoxy(1,2);
printf(lcd_putc,"Listo"); //mesaje de que se guardaron los cambios satisfactoriamente
lcd_putc("\f");
}
Para el funcionamiento del reloj se esta haciendo uso 3 funciones las cuales son:
ds1307_set_date_time(dia,mes,anio,dow,hora,minuto,segundo)
ds1307_get_date(dia,mes,anio,dow)
ds1307_get_time(hora,minuto,segundo)
Las cuales están definidas en la librería <ds1307.c> y usan la interfaz serial I2C. La primera
función nos sirve para configurar fecha y hora colocando en cada variable el valor que
corresponda (dow será siempre=0). La segunda y tercera función nos obtiene datos de
fecha y tiempo las cuales se guardan en las variables que tienen como argumento dichas
funciones.
Inicialmente se establece datos iniciales para la fecha y la hora los cuales son:
dia=21,mes=6,anio=17,dow=0,hora=15,minuto=52,segundo=0
Seguidamente viene un bucle infinito donde se imprime primero datos del reloj, en la
primera fila la fecha en formato dd/mm/aa y en la segunda fila el tiempo en formato de
HH/mm/ss de 24horas. Luego de medio segundo se imprimen datos de temperatura y luz.
Esto se repite hasta que se presione el pulsador puls1 el cual está conectado al pin RA4
Después de guardar los cambios se regresa al bucle principal donde se repite nuevamente
todo. Para salir del bucle de ajustes o configuración hay una variable llamada contador que
se incrementa cada 300ms cuando llega hasta 10 indicando que ha pasado los 3 segundos
para cancelar los cambios, de no haber hecho caso no habrá marcha atrás y saldrá del
bucle. Pasado segundo y medio saldrá del bucle no sin antes haber guardado los cambios.
Ya teniendo el valor en milivoltios y como cada 10mv del sensor LM35 equivale a 1°C. Por
tanto el valor en milivoltios obtenido es dividido entre 10 y asi se consigue convertir a
grados Celsius y se guarda en la variable temp_c. En la variable temp_f se guarda en
Fahrenheit usando la equivalencia “C/5=(F-32)/9” encontrada en los libros de física.
Estas dos variables son del tipo float pero son impresas en el Display LCD en formato %02u
que es para tipos “unsigned short int” (8 bits).
Como el LDR solo nos proporciona una resistencia variable, entonces hay que usarla junto
con una resistencia en configuración de un divisor de tensión, tal y como se observa en el
esquemático que se hizo anteriormente.