#include <nuevointento.h>
#include <string.h>
#int_RDA
#define RELAY1_ON output_high(RELAY1);
#define RELAY2_ON output_high (RELAY2);
#define RELAY1_OFF output_low(RELAY1);
#define RELAY2_OFF output_low (RELAY2);
#define POWERKEY_ON output_high(POWERKEYGSM);
#define POWERKEY_OFF output_low(POWERKEYGSM);
#define LED_OK_ON output_high(LED1);
#define LED_OK_OFF output_low(LED1);
#define LED_ERROR_ON output_high(LED2);
#define LED_ERROR_OFF output_low(LED2);
// Variables utilizadas.
int d;
int const lenbuff=4; // Tamaño del buffer de recepción
int8 cbuff[lenbuff]; // Buffer de recepcion de datos serie
#define bytes_for_USART_buffer 140 // Tamaño del buffer de la USART [140 bytes].
volatile int8 USART_buffer[bytes_for_USART_buffer]; // Buffer de la USART.
#define bytes_for_USART_AUX 20 // Tamaño del buffer auxiliar [30 bytes].
volatile int8 USART_AUX[bytes_for_USART_AUX]; // Buffer auxiliar.
volatile int8 USART_nextRec=0; // Contador de caracteres recibidos.
int8 i=0x00; // Variable auxiliar.
char *ptr; // Puntero auxiliar.
char ok[2]={'O','K'},pal[4]={'r','1','o','n'};
// Declaro funciones utilizadas.
void configurar_parametros(void); // Configuramos parámetros principales.
void inicializo_buffer_USART(void); // Borramos el buffer de recepción.
void leer_sms(void);
void borrar_todos_sms();
// Desarrollo de funciones de usuario.
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;
d=0;
cbuff[0]=cbuff[1];
cbuff[1]=cbuff[2];
cbuff[2]=cbuff[3];
cbuff[3]=d;
}
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(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\n"); // 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\n"); // 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\n"); // 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\",\"SM\",\r\n"); // 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\n"); // 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 inicializo_buffer_USART(void){
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';}
}
void main()
{
setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
SIM900_ON();
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(TRUE)
{
if (strncmp(USART_buffer
,pal
,4)==0) {
LED_OK_ON;
RELAY1_ON;
delay_ms(2000);
LED_OK_OFF;
RELAY1_OFF;
}
//TODO: User Code
}
}