Autor Tema: Encender un Led con un celular - "RING"  (Leído 2491 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Encender un Led con un celular - "RING"
« en: 28 de Enero de 2014, 23:48:05 »

         // El programa lee el "RING" de una llamada entrante y enciende un led.                                                                    VMMC



         #include <18F4550.h>
         #fuses XT,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,VREGEN,FCMEN,PUT,NOVREGEN,NOPBADEN
         #use delay (clock=4000000) 
         #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
         
         #include <stdlib.h>
         #include <string.h>
         
         int rx=0,z=0;
         char comand[5]="RING";
         
         #int_rda
         void serial_isr()
         { comand[5]=getc(); rx++; }
         

         void main()
         {
         setup_adc(ADC_OFF);
         enable_interrupts(int_rda);
         enable_interrupts(global);
         
         while(true)
         {
         if(rx>20){ delay_ms(100); for( z=0;z<rx;z++) output_high(pin_A0); rx=0;z=0; }   
         }
         }


         Si alguien me puede ayudar, ahora lo que pretendo es conocer el numero de la llamada entrante, se que se hace con el comando "AT+CLIP=1" solo que no se como implementarlo.



Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Encender un Led con un celular - "RING"
« Respuesta #1 en: 29 de Enero de 2014, 21:10:37 »
No puedes asignarle un valor a comand[5] porque no existe, solo del puedes del 0 hasta el 4. Ademas, no veo que hagas algo con esa variable y por el contrario solo usas un contador para saber que llego RING, cosa que no da seguridad de nada.

De esta forma, es mejor usar las funciones de comparacion de la libreria stdlib para estas cosas, al menos yo lo hago asi cuando la rom del pic me lo permite (como en tu caso).

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Re: Encender un Led con un celular - "RING"
« Respuesta #2 en: 30 de Enero de 2014, 00:31:33 »
Por favor, podridas compartir tu código?. Yo así lo implemente. Comparte por favor..

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Re: Encender un Led con un celular - "RING"
« Respuesta #3 en: 24 de Febrero de 2014, 21:52:49 »
Su ayuda!!

Este programa lee un RING de llamada y enciende un led por tres segundos. Lo que no hace es iniciar nuevamente la rutina, es decir, si vuelvo a llamar para que detecte el RING y realice todo nuevamente. No hace nada. Alguien me podría ayudar?. Ya he intentado haciendo el goto pero ni así se clica el código nuevamente.


      
         #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)
         #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 segundos,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)
         { int i; for(i=0;i<buffer_size;i++){ buffer=0x00; restart_wdt(); } xbuff=0x00; }
            
         void main()
         {
         enable_interrupts(int_rda);
         enable_interrupts(INT_TIMER0);
         setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
         set_timer0(18660);
         enable_interrupts(global);
        
        
         while (true)
         {
         if(buffer[2]=='R' && buffer[3]=='I' && buffer[4]=='N' && buffer[5]=='G') { delay_ms(100); start=1;}   // Si lee RING, se hace el arranque del tmr0 con la bandera star=1
         if (start==1 && desbordamiento==1) { disable_interrupts(int_rda); desbordamiento=0; segundos++;   // Si arranca desabilitamos int_rda para que no siga recibiendo mas RING e iniciamos el contador
         if (segundos<=3){ output_high(pin_a0);}                                                                                          // pin_a0 en alto de 0 a 3 segundos
         if (segundos>=4 && segundos<=48){ output_low(pin_a0); }                                                              // pin_a0 en bajo de los 4 a los 48 segundos
         if (segundos==49){ segundos=0; start=0; enable_interrupts(int_rda); inicbuff();}                               // a los 49 segundos reinicia el contador, start y habilita la interrupcion rda
         }
         }        
         }
        
« Última modificación: 24 de Febrero de 2014, 22:25:23 por mariacontenis »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Encender un Led con un celular - "RING"
« Respuesta #4 en: 25 de Febrero de 2014, 12:02:03 »
porque empiezas a comparar desde buffer[2]?
tu primer caracter se guardaría en el elemento 0 de tu arreglo.

trata de ordenar un poco mas tu código para que sea mas legible
"Nada es imposible, no si puedes imaginarlo"

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Re: Encender un Led con un celular - "RING"
« Respuesta #5 en: 23 de Marzo de 2014, 13:34:38 »
Saludos amigos del foro

Pues resulta que ya termine el código para abrir un portón por medio de llamada celular y detectando el RING que genera la llamada. Con el RING activo una salida (pin_a0) durante 2 segundos para cerrar un relevador posteriormente. Y el programa se vuelve a ciclar correctamente quedando listo para abrirlo nuevamente.


Lo que le quiero anexar es que se habrá solamente con el numero de llamada entrante, esto por que de vez en cuando las compañías celular hablan para ofrecer promocionales y quisiera evitar eso. Se que con el comando AT+CLIP=1  aparece el numero de llamada entrante. Solo que no se como capturar el numero y hacer la comparación para que el portón se habrá solo con ese numero celular.

Aquí pongo el código; espero me ayuden con su opinión o desarrollo para completar la parte que quiero anexar.


Código: C
  1. #include <18F4550.h>
  2.          #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,PROTECT,NOSTVREN,NOCPB,NOWRT      
  3.          #use delay(clock=48000000,RESTART_WDT)
  4.          #include <lcd4x20.c>
  5.          #use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, bits=8,restart_wdt)
  6.          #byte porta = 0xF80 #byte portb = 0xF81 #byte portc = 0xf82 #byte portd = 0xf83 #byte porte = 0xf84
  7.          #priority rda      
  8.          
  9.          #define BUFFER_SIZE 60                          
  10.          char buffer[BUFFER_SIZE];                      
  11.          char b=0x00;                                    
  12.          int  xbuff=0x00;
  13.          unsigned int16 seg=0;
  14.          int1 desborde=0,star=0;
  15.          
  16.          #INT_RTCC                                    
  17.          void clock_isr()
  18.          { set_timer0(19531); desborde=1; }
  19.          
  20.          #int_RDA
  21.          RDA_isr() { if(kbhit()){ b=getc(); buffer[xbuff++]=b; } return 0; clear_interrupt(int_rda); }
  22.          
  23.          void inicbuff(void)
  24.          { int i; for(i=0;i<buffer_size;i++){ buffer[i]=0x00; restart_wdt(); } xbuff=0x00; }            
  25.          
  26.          void main()
  27.          {
  28.          lcd_init();        
  29.          inicbuff();
  30.          setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256 );
  31.          set_timer0(19531);        
  32.          enable_interrupts(INT_RTCC);
  33.          enable_interrupts(INT_RDA);
  34.          enable_interrupts(GLOBAL);
  35.          star=0; desborde=0;
  36.          
  37.          while (true)
  38.          {
  39.          lcd_gotoxy(2,1); printf(lcd_putc,"%02lu",seg);
  40.          if (buffer[2]=='R' && buffer[3]=='I' && buffer[4]=='N' && buffer[5]=='G') { printf("AT+CHUP"); delay_ms(100); inicbuff(); star=1;}  
  41.          if (star==1 && desborde==1) {desborde=0; seg++;}      
  42.          if (seg>=1 && seg <=3) {output_high(pin_a0);}                                                              
  43.          if (seg>=4 && seg<=15) {output_low(pin_a0);}
  44.          if (seg==16) {seg=0; star=0;}                                                                        
  45.          }        
  46.          }
       
        
         El modem que utilizo el es WAVECOM. Anexo el diagrama en proteus




« Última modificación: 23 de Marzo de 2014, 15:27:24 por MGLSOFT, Razón: Para ver codigo bien »


 

anything