//LCD module connections
#define LCD_RS_PIN PIN_B0
#define LCD_RW_PIN PIN_B1
#define LCD_ENABLE_PIN PIN_B2
#define LCD_DATA4 PIN_B3
#define LCD_DATA5 PIN_B4
#define LCD_DATA6 PIN_B5
#define LCD_DATA7 PIN_B6
//End LCD module connections
#include <16F877a.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)
#USE standard_io(b)
#include <lcd.c>
#define trig pin_c4
#define echo pin_c5
#define DQ PIN_E1 //sensor temp
#USE standard_io(c)
char lluvia_mm[20]; //dato de lluvia caida
char dato_recibido[19],numero1[10]; // Buffer de recepción
int x,num,con_recepcion=0;
float recipiente=126.41;
signed int16 temperature;
char respaldo=0;
float tiempo,distancia;
int flag=0,flagg=0,flaggg=0,flag1=0;
void envio_sms_Dato_Lluvia()
{
if(distancia<=0)
{ // Enviar SMS al numero
printf("AT+CMGS=\"%s\"\r\n",numero1);
// Con el texto
printf("Lluvia caida -> 0.00 mm \n");
delay_ms(100);
// Se envia el SMS
putchar(0x1a);
delay_ms(100);
printf("\r\n");
}
else
{
printf("AT+CMGS=\"%s\"\r\n",numero1);
delay_ms(100);
// Con el texto
printf("Lluvia caida -> %s mm\n",lluvia_mm);
delay_ms(100);
// Se envia el SMS
putchar(0x1a);
delay_ms(100);
printf("\r\n");
printf("AT+CMGDA=DEL ALL\r\n"); //BORRAMOS SMS
delay_ms(1500);
}
}
void envio_sms_Drenar()
{
// Enviar SMS al numero
printf("AT+CMGS=\"%s\"\r\n",numero1);
delay_ms(100);
// Con el texto
printf("Se dreno pluviometro \n Lluvia caida -> %s mm \r\n",lluvia_mm);
delay_ms(100);
// Se envia el SMS
putchar(0x1a);
delay_ms(100);
printf("\r\n");
printf("AT+CMGDA=DEL ALL\r\n"); //BORRAMOS SMS
delay_ms(1500);
}
void envio_sms_lluvia()
{
// Enviar SMS al numero
printf("AT+CMGS=\"%s\"\r\n",numero1);
delay_ms(100);
// Con el texto
printf("Comenzo a llover \r\n");
delay_ms(100);
// Se envia el SMS
putchar(0x1a);
delay_ms(100);
printf("\r\n");
}
void envio_sms_Temp()
{
// Enviar SMS al numero
printf("AT+CMGS=\"%s\"\r\n",numero1);
delay_ms(100);
// Con el texto
printf("Temp -> %4Ld °C ",temperature);
delay_ms(100);
// Se envia el SMS
putchar(0x1a);
delay_ms(100);
printf("\r\n");
}
void envio_sms_drenaje()
{
// Enviar SMS al numero
printf("AT+CMGS=\"%s\"\r\n",numero1);
delay_ms(100);
// Con el texto
printf("Pluviometro se dreno, llego a 90 mm \r\n");
delay_ms(100);
// Se envia el SMS
putchar(0x1a);
}
void envio_sms_1()
{
// Enviar SMS al numero
printf("AT+CMGS=\"9999999999\"\r\n");
delay_ms(100);
// Con el texto
printf("Num1 -> %s",numero1);
delay_ms(100);
// Se envia el SMS
putchar(0x1a);
}
void open_valvula()
{
output_low(pin_c3);
printf(lcd_putc, "\f");
delay_ms(25000);
output_high(pin_c3);
lcd_init();
}
void decodificar()
{
if(dato_recibido[2] == 'u' && dato_recibido[7] == '1') //SMS *numero1:#
{
flag1=1;
con_recepcion = 0;
}
if(dato_recibido[2] == 'a' && dato_recibido[3] == 't') // SMS *Dato#
{
flag=1;
con_recepcion = 0;
}
if(dato_recibido[2] == 'r' && dato_recibido[3] == 'e') //SMS *Drenar#
{
flagg=1;
con_recepcion = 0;
}
if(dato_recibido[2] == 'e' && dato_recibido[3] == 'm') //SMS *Temp#
{
flaggg=1;
con_recepcion = 0;
}
}
void borrar_dato_recibido() //Borrar buffer dato_recibido
{
for(x=0;x<=19;x++)
{
dato_recibido[x]=0;
delay_ms(10);
}
}
void borrar_numero1()
{
for(num=0;num<=9;num++)
{
numero1[num]=0;
delay_ms(10);
}
}
void ow_reset(void)
{
output_low(DQ);
delay_us(500); // Min. 480uS
output_float(DQ);
delay_us(500); // Wait for end of timeslot
}
int8 read_bit(void) // Read bit on one wire bus
{
output_low(DQ);
delay_us(1);
output_float(DQ);
delay_us(12); // Read within 15uS from start of time slot
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); // To finish time slot
}
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 );
}
}
}
#int_rda //Vector de interrupcion de la recepcion de datos
void interrupcion_rx() //por el usart
{
respaldo = getc();
if(respaldo == '*')
{con_recepcion = 0;}
dato_recibido[con_recepcion] = respaldo;
if(respaldo == '#')
{decodificar();}
con_recepcion++;
if(con_recepcion == 19)
{con_recepcion=0;}
}
///////////////////////////////////////////////////////////////////////////////
void main()
{
lcd_init();
lcd_gotoxy(1,1);
printf(LCD_PUTC, "\f WELCOME ");
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(global);
enable_interrupts(int_rda);
set_tris_a (0x00);
set_tris_b (0b11100010);
delay_ms(5000);
lcd_gotoxy(1,2);
printf(LCD_PUTC, " Iniciando. ");
delay_ms(3000);
lcd_gotoxy(1,2);
printf(LCD_PUTC, " Iniciando.. ");
delay_ms(3000);
lcd_gotoxy(1,2);
printf(LCD_PUTC, " Iniciando...");
delay_ms(5000);
printf("AT+CMGF=1\r\n"); //Habilita el modo texto de los sms
delay_ms(15);
printf("AT+CNMI=2,2,0,0,0\r\n"); //Los sms se envían directamente al puerto serie
delay_ms(15);
printf("AT+CMGDA=DEL ALL\r\n"); //Se borran todos los SMS
delay_ms(15);
borrar_dato_recibido(); //Borramos buffer de recepcion
borrar_numero1(); //Borramos buffer de almacenamiento de numero movil
while(true)
{
output_high(trig);
delay_us(10);
output_low(trig);
while(!input(echo))
{}
set_timer1(0);
while(input(echo))
{}
tiempo=get_timer1();
distancia= (recipiente)-(((tiempo/2)/(29.15))*10); //Calculo matematico de la cantidad de agua que hay en el recipiente.
lcd_gotoxy(1,2);
printf(lcd_putc, " -Agrodata- ");
delay_ms(1000);
if(distancia<=0)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fLluvia = 0.00 mm");
}
if(distancia>=0)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"\fLluvia = %f mm",distancia);
}
if(distancia>=90) //Drena cuando llegue a 90 mm
{
envio_sms_drenaje();
open_valvula();
}
if(flag==1) // sms dato de lluvia
{
sprintf(lluvia_mm,"%f",distancia); //pasamos variable int a char
envio_sms_Dato_Lluvia();
flag=0;
borrar_dato_recibido();
}
if(flagg==1) // sms drenar valvula
{
sprintf(lluvia_mm,"%f",distancia); //pasamos variable int a char
envio_sms_drenar();
open_valvula();
flagg=0;
borrar_dato_recibido();
}
if(flag1==1) // sms numero1
{
numero1[0]=dato_recibido[9]; //3
numero1[1]=dato_recibido[10]; //5
numero1[2]=dato_recibido[11]; //3
numero1[3]=dato_recibido[12]; //4
numero1[4]=dato_recibido[13]; //1
numero1[5]=dato_recibido[14]; //4
numero1[6]=dato_recibido[15]; //9
numero1[7]=dato_recibido[16]; //5
numero1[8]=dato_recibido[17]; //9
numero1[9]=dato_recibido[18]; //9
flag1=0;
envio_sms_1();
borrar_dato_recibido();
}
}
}