#include <16F877.h>
#FUSES XT,NOWDT,NOPROTECT,PUT,NOBROWNOUT,NOLVP
#use delay(clock=4M)
#include <lcd.c>
#use fast_io(a)
#use fast_io(b)
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_C6,RCV=PIN_C7)
//***************************manejo del hc-sr04 *******************************
#define pin_tigger pin_a5
#define pin_echo pin_a4
#define NoDetect_mili 38
#define Nodetect_micro 38000
//*******************declaracion de variables globales*************************
float temperatura_ambiente= 20.0; //se guardara la temperatura medida por el sensor Lm 35, global.
int input=1;
//************************declaracion de funciones*****************************
//***********************control de interrupciones*****************************
//*****************************Funcion principal*******************************
void main(){ //funcion principal.
set_tris_a(0x10); //a4 como entrada(echo sensor ultrasonico) resto como salida.
output_low(pin_tigger); //se asegura que no comenzara encendido el sensor de distancia.
set_tris_b(0x00); //puerto b todo como salida(display lcd ).
lcd_init(); //incializa el lcd.
printf(LCD_PUTC, "\f Iniciando.\n");
delay_ms(20000); //Tiempo hasta que SIM800L tome señal
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); //configura timer 1: modo reloj con paso de 1 micro seg a 4MHZ.
disable_interrupts(GLOBAL); //deshabilito interrupción.
//******************************Ciclo infinito*********************************
int16 tiempo_micro; //variable que guarda la captura del timer 1 en microseg(tiempo de ida y vuelta del eco).
float tiempo_mili; //variable que guarda la captura del timer 1 en miliseg(tiempo de ida y vuelta del eco).
while(true){ //ciclo infinito principal.
//adbvierte si es true que el mensaje de error ya si imprimio.
while(true){ //ciclo infinito 2.
output_high(pin_tigger); //manda pulso de 10 micro segundos para exitar al sensor.
delay_us(10); //
output_low(pin_tigger); //termina pulso de excitacion.
//******************detecta error del sensor hc-sr04**************************
set_timer1(1); //tiempo de espera al sensor maximo: antes de declarar error.
while(!input(pin_echo) && get_timer1() <10000) {} //solo saldra de este ciclo si: el senso puso la salida en alto o si termino el tiempo estimado para lo anteior.
if(input(pin_echo)) break; //cambio el pin_echo a alto(sensor funcionando) salta a la primera linea despues del ciclo infinito actual.
else {
printf(LCD_PUTC, "\f sensor digital\n"); //si: imprime falla en el sensor.
printf(LCD_PUTC, "No resp...\n"); //
printf(LCD_PUTC, "tiempo agotado!"); //
delay_ms(100); } //
} //fin ciclo infinito 2.
//****************************************************************************
//get_timer1(); //detiene el timer 1.
set_timer1(0); //cambio: carga el tmr1 y comienza una nueva cuenta.
while(input(pin_echo)) {} //espere a que el pin echo cambie a bajo(retorno del eco).
tiempo_micro = get_timer1(); //guarda el tiempo que duro en regresar el pulso(reloj timer 1) en la variable: tiempo_rebote.
float distancia; //guarda el valor del timer 1 en la medida del rebote ultrasonico por el hc-sr04
//calculamos la distancia:
distancia =90-((((tiempo_micro * 0.000001)*(331.4 + (0.61 * temperatura_ambiente)))/2)*1000);
//se divide entre dos por que la distancia sera el doble ya que la señal tendra que retornar.
tiempo_mili = tiempo_micro * 0.001; //convierte micro a milisegundos(comentar para dejar en microseg y cambiar abajo por micro).
if(tiempo_mili >= NoDetect_mili){ //fuera de rango?
printf(lcd_putc, "\f Sensor Digital\n"); //si: imprime mensaje fuera de rango.
printf(LCD_PUTC, "Tiempo= %f ms\n",tiempo_mili); //muestra el tiempo.
printf(LCD_PUTC, "Dist= NO"); //
delay_ms(200); //
continue; } //vuelve a la iteraccion principal(while).
printf(lcd_putc, "\f Sensor Digital\n");
printf(LCD_PUTC, "Lluvia= %f mm ",distancia);
delay_ms(200);
if(input==1)
{
delay_ms(500);
delay_ms(5000);
char sms[20];
sprintf(sms,"%f",distancia);
printf("AT+CMGF=1\r\n"); // Seleccionor modo texto
delay_ms(500);
// Enviar SMS al numero
printf("AT+CMGS=\"xxxxxxxxxx\"\r\n");
delay_ms(500);
// Con el texto
printf("Lluvia caida -> %s mm \n\n --> AGRODATA <-- \r\n",sms);
delay_ms(500);
// Se envia el SMS
putchar(0x1a);
delay_ms(3000);
printf("AT+CMGF=1\r\n"); // Seleccionor modo texto
delay_ms(500);
// Enviar SMS al numero
printf("AT+CMGS=\"xxxxxxxxxx\"\r\n");
delay_ms(500);
// Con el texto
printf("Lluvia caida -> %s mm \n\n --> AGRODATA <-- \r\n",sms);
delay_ms(500);
// Se envia el SMS
putchar(0x1a);
delay_ms(500);
printf("\r\n");
input++;
}
delay_ms(80);
}
}