#include <pruebav003.h>
#include <string.h>
#int_RDA
void RDA_isr(void)
{
USART_buffer
[USART_nextRec
]=fgetc(SIM900
);if(USART_buffer[USART_nextRec]!=0x0A)USART_nextRec++;
if(USART_nextRec==bytes_for_USART_buffer)USART_nextRec=0;
}
//Rutinas de usuario
void inicializo_buffer_USART(void){ //Borra el contenido del buffer
USART_nextRec=0; // Inicializo el contador de datos entrantes.
for(i=0; i<=bytes_for_USART_buffer; i++){ // Borro el contenido del buffer de datos.
USART_buffer[i]='\0';}
}
int8 respuesta_CMD_SIM900(int8 *buffer[],char *cmd,int8 cmd_len){
// Variable local.
short respuesta=0x00;
ptr
=strstr(buffer
,cmd
); // Busca el comando OK en el buffer. if(strncmp(ptr
,cmd
,cmd_len
)==0) // Si lo encuentra.. {respuesta=0x01;} // respuesta válida --> 0x01.
else{respuesta=0x00;} // Si no lo encuentra, respuesta errónea --> 0x00.
return(respuesta); // Retornamos con la respusta al comando.
}
int8 SIM900_ON(void){
// Variables locales.
int8 checksum[5]="";
int8 resp=0x00;
// Habilitamos interrupciones.
enable_interrupts(int_RDA);
POWERKEY_OFF; // SIM900 -> Apagado.
delay_ms(5); // Esperamos 5ms.
delay_ms(100); // Esperamos 100ms.
POWERKEY_ON; // SIM900 -> Enciende.
delay_ms(1500); // Esperamos 1,5 seg.
POWERKEY_OFF; // PRWKEY=0;
delay_ms(40000); // Esperamos 40 segundos el Call Ready.
// Inicializamos el buffer de la UART.
inicializo_buffer_USART();
fprintf(SIM900
,"AT\r"); // CMD: Comando de verificación. delay_ms(500); // Esperamos 500ms la respuesta del módulo.
checksum[0]=respuesta_CMD_SIM900(USART_buffer,"OK",2); // Si la respuesta es OK, el comando se confirma.
inicializo_buffer_USART(); // Limpiamos el buffer de recepción.
fprintf(SIM900
,"ATE0\r"); // CMD: Eco OFF. delay_ms(500); // Esperamos 500ms la respuesta del módulo.
checksum[1]=respuesta_CMD_SIM900(USART_buffer,"OK",2); // Si la respuesta es OK, el comando se confirma.
inicializo_buffer_USART(); // Limpiamos el buffer de recepción.
fprintf(SIM900
,"AT+CMGF=1\r"); // CMD: Configuramos modo texto. delay_ms(500); // Esperamos 500ms la respuesta del módulo.
checksum[2]=respuesta_CMD_SIM900(USART_buffer,"OK",2); // Si la respuesta es OK, el comando se confirma.
inicializo_buffer_USART(); // Limpiamos el buffer de recepción.
fprintf(SIM900
,"AT+CPMS=\"SM\",\"SM\"\r"); // CMD: Selecciono la mememoria SIM para recibir y leer SMS. delay_ms(500); // Esperamos 500ms la respuesta del módulo.
checksum[3]=respuesta_CMD_SIM900(USART_buffer,"OK",2); // Si la respuesta es OK, el comando se confirma.
inicializo_buffer_USART(); // Limpiamos el buffer de recepción.
fprintf(SIM900
,"AT+CNMI=2,2,0,0,0\r"); // CMD: Los mensajes de texto, una vez recibidos son enviados directamente al buffer de la USART. delay_ms(500);
checksum[4]=respuesta_CMD_SIM900(USART_buffer,"OK",2); // Si la respuesta es OK, el comando se confirma.
inicializo_buffer_USART(); // Limpiamos el buffer de recepción.
// Comprobamos si respondió bien a todos los comandos.
resp=checksum[0]+checksum[1]+checksum[2]+checksum[3]+checksum[4];
if(resp==0x05){LED_ERROR_OFF LED_OK_ON}
else{resp=0x00; LED_ERROR_ON LED_OK_OFF}
return(resp);
}
void procesa_sms(int8 *buffer[],char *cmd,int8 cmd_len);
void main()
{int b=0;
setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
setup_wdt(WDT_OFF);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
if(SIM900_ON()==0x05)
{RELAY1_ON;
delay_ms(1500);
RELAY1_OFF;
}
while(TRUE)
{
delay_ms(500);
procesa_sms(USART_buffer,"r1on",4);
}
}
void procesa_sms(int8 *buffer[],char *cmd,int8 cmd_len)
{
{
RELAY1_ON;
delay_ms(2500);
RELAY1_OFF;
RELAY2_ON;
delay_ms(2500);
RELAY2_OFF;
}
inicializo_buffer_USART();
}