Uso de un celular GSM con PIC o PC

Este es el código.
Código:
#include ".....\SMS\sms.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LED  PIN_C0
 
char NUMERO[]="123456789";
int buffer[80];
char ok[]="OK";
char clave[]="ON";
 
#int_rda
void rda_isr(void){
if(kbhit()!=0)
{
//buffer[i++]=getc();
gets(buffer);
DatoRx=1;
}
}
 
 
void leer()
{
printf("AT+CMGL=");
putchar(0x22);
printf("REC UNREAD");
putchar(0x22);
putchar(0X0D);
 
 
if(DatoRx==1){
   if(strstr(buffer,clave)!=null&&strstr(buffer,NUMERO)!=NULL)
   { 
   lcd_putc("\fALARMA ON");
    output_high(STATUS_LED);
    init_buffer();
    delay_ms(500);
      DatoRx=0;
    flac=0;
    activado=1;
    }
}
 
 
void main()
{ 
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(Global);
   enable_interrupts(INT_RDA);
printf("AT+CMGF=1");
putchar(0X0D);
delay_ms(500);
printf("AT+CNMI=1,2,0,0,0");
putchar(0X0D);
 
  while (TRUE) 
    {       
         leer_sms();
      if(activado==1)
       {
         output_high(LED);
       }
 
   }
 
}

Lo que necesito es recabar la información de los mensajes recibidos pero no leídos.

Buenas amigo. Esta semana empecé un proyecto igual que el tuyo para activar y desactivar una alarma.

Puedo enviar mensajes desde el pic sin problemas. Pero al momento de recibir un mensaje en el pic y querer darle una función al pic se me pega sin respuesta.

Por favor si solucionaste me puedes decir como lo hiciste. Seria de gran ayuda.

EStoy usando el pic16f877a, un modulo gsm SIM900 y programo con CCS Compiler.

un ejemplo de una función al leer el mensaje.

while (true){
IF (kbhit () ){ //Detecto si hay un carácter en la entrada
gets(dato); //Leer Mensaje de llegada después del enter que envía el SIM900
}

if(dato[1]== 'R' &&dato[2]== 'I' &&dato[3]=='N' &&dato[4]=='G'){ //Detecta si
//el mensaje dice RING
delay_ms(100);
puts("ATH"); //Tranco la llamada
delay_ms(300);
putchar(0x0d); //Envió un enter por acaso
printf("ATZ\r"); //Restauro el SIM900
delay_ms(2000);
output_high(pin_E2); //Pongo en alto el pin E2 para activar la alarma
lcd_init();
}


Saludos
 
buenas si alguien me puede ayudar estuve todo el dia con esto, tengo un pic18f4550 y un cel nokia 3220. la comunicacion con el nokia y la pc atraves de virtual terminal no tengo problemas pero no logro comunicar el nokia con el pic. programo en c18 estos son los comandos que utilizo para enviar:

Código:
putsUSART(dato1);         //dato1="AT\r\n";

    Delay10KTCYx(256);    
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);

    putsUSART(dato2);                 //dato2=AT+CMGF=1\r\n"
    Delay10KTCYx(256);
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);

    putsUSART(dato3);                  //dato3="AT+CMGS=\"2995510765\"\r\n";
    Delay10KTCYx(256);
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);
    Delay10KTCYx(256);
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);

    putsUSART(dato4);                 //dato4="Esto es una prueba";
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);

    putcUSART(0x1A);              //ese comando es ctl +z
       putsUSART(dato5);          //"\r\n"
    Delay10KTCYx(256);
    Delay10KTCYx(256);    
    Delay10KTCYx(256);           
    Delay10KTCYx(256);

    CloseUSART();            //cierra el puerto

por favor diganme cual es el error
 
bueno me contesto yo solo jaj, me faltaba el comando del enter. y todabia no lo probe pero mando los comandos letra por letra no como string, me resultaba mas facil verlos en el osciloscopio. ademas ahi me di cuenta que tenia mal identificado los cables, eso fue porque pense que el conector al cel empezaba en una rendija cuando en realidad empezaba en la siguiente jaj. ahora estoy viendo como mandar un string del micro (c18) al visual basic (c#) por medio de un textbox
 


Este programa lo que hace es detectar un RING cuando llamas por celular y después de ello inicia un contador descendente de 30 segundos a 0. De los 29 a los 27 segundos enciende un led y después de ello lo apaga (este led es para activar una carga por 2 segundos). El problema es que si lo hace pero solo una vez y después de hacer todo el ciclo ya no lo vuelve ah realizar, es decir marco al numero y ya no lo hace otra vez. alguien me puede orientar o dar su opinión.

Código:
#include <18F4550.h>
         #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,PROTECT,NOSTVREN,NOCPB,NOWRT      
         #use delay(clock=48000000) 
         //#include <lcd4x20.c>
         #use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, bits=8)
         #byte porta = 0xF80 #byte portb = 0xF81 #byte portc = 0xf82 #byte portd = 0xf83 #byte porte = 0xf84
         #priority rda       
         
         #define BUFFER_SIZE 60 //Buffer size you can adjust this size
         char buffer[BUFFER_SIZE];            // buffer
         char b=0x00;                     // Last characters recived
         int  xbuff=0x00;
         int i; 
          
         int segundos=30,start=0;
         int1 desbordamiento=0;
         
         #INT_TIMER0
         void retardo_trm0 (void)
         {
         set_timer0(18660); desbordamiento=1;
         }        
         
         #int_RDA  
         RDA_isr() { if(kbhit()){b=getc();buffer[xbuff++]=b;}return 0;}
           
         void inicbuff(void)
         {for(i=0;i<buffer_size;i++){ buffer[i]=0x00; restart_wdt(); } xbuff=0x00; }
            
         void main()
         { 
         //lcd_init();
         inicbuff(); 
         enable_interrupts(int_rda); 
         enable_interrupts(INT_TIMER0);
         setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
         set_timer0(18660);
         enable_interrupts(global);
         
         
         while (true)
         {//lcd_gotoxy(2,1); printf(lcd_putc,"%02u",segundos);
         if(buffer[2]=='R' && buffer[3]=='I' && buffer[4]=='N' && buffer[5]=='G') { delay_ms(100); start=1;}  
         if (start==1 && desbordamiento==1) { desbordamiento=0; segundos--; }       
         if (segundos<=29 && segundos>=27){ output_high(pin_a0);}                                                               
         if (segundos<=26 && segundos>=1){ output_low(pin_a0); 
         if (segundos==0){ segundos=30; start=0; inicbuff(); }}                                                                         
         }         
         }



El PDF adjunto les indica como recibir sms. Bien explicado espero les sea de gran ayuda.
 

Adjuntos

  • 135868878-Control-Gsm.pdf
    785.8 KB · Visitas: 194
Última edición por un moderador:
ya viste si se tiene que reiniciar alguna bandera en la interrupcion RDA.

estuve viendo y podria ser esta:
bit 3 SSPIF: Master Synchronous Serial Port Interrupt Flag bit
1 = The transmission/reception is complete (must be cleared in software)
0 = Waiting to transmit/receive
 
Última edición:
Que tal amigo, gracias por responder. Lo que yo había hecho hera desabilitar la interrupción rda después del if que detectaba el RING y la volvía a habilitar cuando segundos= 0. Pero un flag como bandera no lo hice. Donde podría ir?
 
aqui:

#int_RDA
RDA_isr() { if(kbhit()){b=getc();buffer[xbuff++]=b;}return 0;pir1.3=0;}

el registro es el pir1 y el bit es el 3, no se que compilador utilizas por eso pongo pir1.3 pero podria ser otra manera de llamarlo.
 
Ok, lo voy aplicar y posteó el código cuando este haciendo lo requerido. Gracias por tu cooperar
En el foro todopic no me contestó nadie.

De cualquier manera cualquier ayuda es bienvenida. Gracias amigos del foro.
 
Bien, pues ya logré encender un led con una llamada a celular.
Después de detectar un RING enciende un led durante 2 segundos y lo apaga.

Aquí se los dejo. Dios les bendiga hnos.

Código:
#include <18F4550.h>
         #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,PROTECT,NOSTVREN,NOCPB,NOWRT      
         #use delay(clock=48000000,RESTART_WDT) 
         //#include <lcd4x20.c>
         #use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, bits=8,restart_wdt)
         #byte porta = 0xF80 #byte portb = 0xF81 #byte portc = 0xf82 #byte portd = 0xf83 #byte porte = 0xf84
         #priority rda       
         
         #define BUFFER_SIZE 60                          
         char buffer[BUFFER_SIZE];                      
         char b=0x00;                                    
         int  xbuff=0x00;
         unsigned int16 seg=0;
         int1 desborde=0,star=0;
         
         #INT_RTCC                                    
         void clock_isr() 
         { set_timer0(19531); desborde=1; } 
         
         #int_RDA
         RDA_isr() { if(kbhit()){ b=getc(); buffer[xbuff++]=b; } return 0; clear_interrupt(int_rda); }
         
         void inicbuff(void)
         { int i; for(i=0;i<buffer_size;i++){ buffer[i]=0x00; restart_wdt(); } xbuff=0x00; }            
         
         void main()
         { 
         //lcd_init();
         inicbuff();
         setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 );
         set_timer0(19531);        
         enable_interrupts(INT_RTCC);
         enable_interrupts(INT_RDA); 
         enable_interrupts(GLOBAL);
         star=0; desborde=0;
         
         while (true)
         {
         //lcd_gotoxy(2,1); printf(lcd_putc,"%02lu",seg);
         if (buffer[2]=='R' && buffer[3]=='I' && buffer[4]=='N' && buffer[5]=='G') { printf("AT+CHUP");delay_ms(100); inicbuff(); star=1;}  
         if (star==1 && desborde==1) {desborde=0; seg++;}       
         if (seg>=1 && seg <=3) {output_high(pin_a0);}                                                               
         if (seg>=4 && seg<=15) {output_low(pin_a0);}
 
Última edición:
Hola. ¿Qué tal?
Tengo un shield GSM/GPRS SIM900 y un Arduino Mega 2560.
Lo único que logré hacer hasta ahora, es que la placa envíe mensajes de texto y también llame a un celular.

Lo que no me funciona es recibir mensajes o llamadas desde un celular.
Adjunto el código para recibir SMS desde el celular porque la verdad no sé por qué no me funciona.

El programa debería de encender un LED conectado al pin 13 de la Mega 25560 cada vez que se manda un SMS desde un celular hacia la placa GSM.

PHP:
#include <SoftwareSerial.h>
SoftwareSerial SIM900(7, 8);

char incoming_char=0;

void setup()
{
  Serial.begin(19200); // for serial monitor
  SIM900.begin(19200); // for GSM shield
  SIM900power();  // turn on shield
  delay(20000);  // give time to log on to network.

  SIM900.print("AT+CMGF=1\r");  // set SMS mode to text
  delay(100);
  SIM900.print("AT+CNMI=2,2,0,0,0\r"); 
  // blurt out contents of new SMS upon receipt to the GSM shield's serial out
  delay(100);
}

void SIM900power()
// software equivalent of pressing the GSM shield "power" button
{
  digitalWrite(9, HIGH);
  delay(1000);
  digitalWrite(9, LOW);
  delay(7000);
}

void loop()
{
  // Now we simply display any text that the GSM shield sends out on the serial monitor
  if(SIM900.available() >0)
  {
    incoming_char=SIM900.read(); //Get the character from the cellular serial port.
    Serial.print(incoming_char); //Print the incoming character to the terminal.
    analogWrite(13,255);
    delay(2000);
    analogWrite(13,0);
    delay(2000);
  }
}
 
Última edición por un moderador:
Hola compañeros tengo una duda con los comandos AT
Cuando estoy configurando la preferencia de almacenado
AT+CPMS=\"SM\",\"SM\"\r" . Yo mando el comando al módem y el módem me
responde OK MS:5,30,5,30.
Entiendo que el módem comprendio lo enviado por que me devuelve el OK
pero eso números (5,30,5,30.) que significan.
El módem es un SIM900
 
Última edición:
Hola compañeros tengo una duda con los comandos AT
Cuando estoy configurando la preferencia de almacenado
AT+CPMS=\"SM\",\"SM\"\r" . Yo mando el comando al módem y el módem me
responde OK MS:5,30,5,30.
Entiendo que el módem comprendio lo enviado por que me devuelve el OK
pero eso números (5,30,5,30.) que significan.
El módem es un SIM900

Hola...En la actualidad tenes 5 mensajes almacenados de 30 posibles de capacidad.
Puedes consultar aquí o en la pagina del fabricante tiene unos lindos archivos PDF con toda la información y comandos.
Saludos.

Ric.
sim.jpg
 
Hola nelsonr:
El modem devuelve el estado de los almacenamientos preferidos seleccionados....

Del numero total de mensajes que puede almacenar la tarjeta SIM (esa en concreto 30) :
5 del total de 30 están utilizados como leídos, para leer o para borrar.
5 del total de 30 están utilizados como mensajes para enviar o enviados.

Salu2.

Hola compañeros tengo una duda con los comandos AT
Cuando estoy configurando la preferencia de almacenado
AT+CPMS=\"SM\",\"SM\"\r" . Yo mando el comando al módem y el módem me
responde OK MS:5,30,5,30.
Entiendo que el módem comprendio lo enviado por que me devuelve el OK
pero eso números (5,30,5,30.) que significan.
El módem es un SIM900
 
Hola. ¿Qué tal? Encontré este modem entre mis cosas del trabajo.
¿Alguien que me diga qué aplicación le puedo dar, o si ya están descontinuados?
Gracias.
 

Adjuntos

  • 20160824_105420.jpg
    20160824_105420.jpg
    48 KB · Visitas: 7
Última edición por un moderador:
Hola compañeros tengo una consulta yo estoy usando el kbhit() para atrapar cadenas que lleguen a mi Pic por el #use rs232.
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=COM1)
Este puerto lo tengo conectado a un módem GSM sim900 con el fin es de recibir mensajes SMS y enviar la cadena al Pic y poderlos procesar. Si la cadena que llega del módem producto del sms llega al pic con el símbolo !, Me debe tomar el resto de la cadena ignorando el simbolo de !.
De esta manera se hace para distintas cadenas que lleguen con caracteres específicos al PIC por medio del kbhit().
Cada cadena que llegue al PIC con esta característica debe hacer algo en particular en el programa .
Pero mi problema esta en que hay veces que funciona todo bien sin problemas pero hay veces que no responde cuando le mando un sms al módem sim900

Mi pregunta es, en ISIS de Proteus hay alguna forma que yo pueda mandarle datos al Pic para emullar una cadena enviada por el moden esto con el fin de saber si es que estoy dejando alguna variable que no cumpla con lo necesario al momento de que entre al el dato al kbhit().
O la intermitencia que tengo es producto de que necesito algo mas para poder acoplar correctamente el pic con mi modem sim900.
Cuando estoy emulando mi proyecto en proteus 7 no encuentro donde puedo ver los valores que están tomando las variables en ejecución.
Les agradezco los comentario de ante mano.
Nota estoy usando un pic16f877a , pic ccs compiler y proteus 7
 
hola a todos una pregunta, yo quiero tomar un sms que tengo guardado en la sim y enviarlo a un numero x via sms, pero no estoy claro de como seria el método apropiado si primero tengo que cargar el mensaje en el buffer o hay alguna forma de enviarlo sin cargarlo.
Les agradezco el tiempo dedicado.
 
Atrás
Arriba