#include <16F877a.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4M)
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
#define DQ PIN_E1 //sensor temp
#include <lcd.c>
int8 BT=0, temp, hr;
int16 cont=0;
int8 n=0;
#include "DHT11.c"
////////////////////// Interrupcion Timer 0 ///////////////////////////////////
#INT_TIMER0
void interruption()
{
set_timer0(6);
cont++;
}
///////////////////////////////////////////////////////////////////////////////
//////////////////////////////// Sensor Temperatura /////////////////////////
void ow_reset(void)
{
output_low(DQ);
delay_us(500);
output_float(DQ);
delay_us(500);
}
int8 read_bit(void)
{
output_low(DQ);
delay_us(1);
output_float(DQ);
delay_us(12);
return(input(DQ));
}
int8 read_byte(void)
{
int8 i;
int8 val = 0;
for(i=0 ; i<8 ; i++)
{
if(read_bit()) val |= (0x01 << i);
delay_us(120);
}
return val;
}
void write_byte(int8 val, int8 power_on)
{
int i;
for(i=0; i<8; i++)
{
output_low(DQ);
delay_us( 2 );
output_bit(DQ, shift_right(&val,1,0));
delay_us(60);
if((i == 7) && (power_on == 1))
{
output_high(DQ);
}
else
{
output_float(DQ);
delay_us( 2 );
}
}
}
////////////////////////// Interrupcion BT //////////////////////////////////
#int_rda //Vector de interrupcion de la recepcion de datos
void interrupcion_rx()
{
char respaldo;
respaldo = getc();
if(respaldo == 'x')
{BT=1;
}
}
/////////////////////////////// Guardado Eeprom ////////////////////////////////
void guardar_dato_eeprom()
{
WRITE_EEPROM(n,temp);
n=n++;
WRITE_EEPROM(n,hr);
n=n++;
}
//////////////////////////////////////////////////////////////////////////////
///////////////////////////////// LCD ///////////////////////////////////////
Void Lcd_()
{
// ******************************************************************
lcd_gotoxy(11, 1);
printf(lcd_putc,"Hr= %%"); // %% -> simbolo %
lcd_gotoxy(1,1);
printf(lcd_putc,"Temp: \337C"); // \337 -> simbolo °
// ******************************************************************
}
///////////////////////////////////////////////////////////////////////////////
void main()
{
setup_timer_0(rtcc_internal|rtcc_div_256);
set_timer0(1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
enable_interrupts(int_rda);
lcd_init();
lcd_gotoxy(1,1);
printf(LCD_PUTC, " BIENVENIDOS ");
delay_ms(3000);
printf(lcd_putc,"\f");
lcd_gotoxy(1,2);
printf(lcd_putc, " Iniciando ");
delay_ms(1000);
lcd_gotoxy(1,2);
printf(lcd_putc, " Iniciando. ");
delay_ms(1000);
lcd_gotoxy(1,2);
printf(lcd_putc, " Iniciando.. ");
delay_ms(1000);
lcd_gotoxy(1,2);
printf(lcd_putc, " Iniciando... ");
delay_ms(1000);
printf(lcd_putc,"\f");
lcd_();
DHT11_init();
while(true)
{
/////////////////////////// Sensor Temperatura /////////////////////////////
int8 i;
signed int16 temperature;
int8 scratch[9];
output_float(DQ);
ow_reset();
write_byte(0xCC, 0);
write_byte(0x44, 1);
delay_ms(750);
ow_reset();
write_byte(0xCC, 0);
write_byte(0xBE, 0);
for(i=0; i < 8; i++)
{
scratch[i] = read_byte();
}
ow_reset();
temperature = (signed int16) make16(scratch[1],scratch[0]);
if(temperature >= 0)
temperature = (temperature + 8)/16;
else
temperature = (temperature - 8)/16;
lcd_gotoxy(6,1);
printf(lcd_putc,"%2ld",temperature);
temp=temperature;
//////////////////////////////////////////////////////////////////////////////
///////////////////////// Sensor Hr //////////////////////////////////////////
unsigned char state = 0;
state = get_data();
lcd_gotoxy(14,1);
printf(lcd_putc,"%2u", values[0]);
hr=values[0];
//////////////////////// Envio a la App ////////////////////////////////////////
if(BT==1)
{
int temperatura,humedad,j=0;
temperatura=read_eeprom(j);
humedad=read_eeprom(j);
printf("%i,%i",temperatura, humedad);
printf("\n");
delay_ms(500);
BT=0;
}
/////////////////////////////////////// Timer0 ///////////////////////////////
if (cont==200) //
{
guardar_dato_eeprom();
cont=0;
}
////////////////////////////////////////////////////////////////////////////////
}
}