PDA

View Full Version : Sencillo ejemplo de Alarma PIC-modem GSM ENFORA



martintorres
- 15th May 2014, 15:05
Comunicacion serial "PIC - Modem GSM ENFORA".
Dentro de la gran variedad de modem GSM / GPRS que hay en el mercado, el modem enfora a mi parecer es uno de los modem mas completo y rusticos que hay dando vuelta.
El equipo cuenta con un puerto de entradas y salidas configurables para empleo multiproposito:

2 puertos de entrada convertidores analogicos digital (ADC)
1 puerto de salida convertidor digital analogico (DAC)
4 puertos digitales configurables como I/O
Tambien esta la opcion de poder configurar los tres primeros mencionados como entradas o salidas digitales

7344


Me olvidaba mencionar que el mismo equipo, cuenta tambien con un puerto de sonido incorporado, donde nosotros podemos introducir un microfono y auricular para establecer comunicacion como con cualquier otro celular...

Los comandos AT son genericos, asi que no varia mucho el control de este modem, con cualquier otro, esceptuando el control de los puertos y o, por ahi, la configuracion para internet es un poco engorrosa y distinta a otros modem, pero con unsa horas de pruebas falla / error, se aca adelante estos temas.
Les muestro un sencillo ejemplo de comunicacion con este modem (solo envio de SMS)



Inicio:
gosub ELIMINAR
serout PORTC.6,N9600,["AT+CMGR=1",10,13]
pause 100

loop:
if PORTB.0=0 then mensaje1:
pause 50
goto loop

mensaje1:
gosub ENVIO_1
serout PORTC.6,N9600,["ALARMA Z1",26,10,13]
GOTO INICIO

ENVIO_1:
pause 2000
SEROUT PORTC.6,N9600,["at+cmgf=1",10,13]
pause 1000
SEROUT PORTC.6,N9600,["at+cmgs=",34,"+54297XXXXXXX",34,10,13]
pause 5000
return

ELIMINAR:
PAUSE 100
SEROUT PORTC.6,N9600,["at+cmgd=1",10,13]
pause 1000
return

Vallamos a un ejemlpo mas interesante... una alarma con teclado, display lcd y comunicacion gsm

7345




include "modedefs.bas"
define OSC 4

ADCON1 = %00001111 ;el puerto A.0 es conversor los demás Digitales
TRISA = %00001111
TRISB = %00011111
TRISC = %10000000
TRISD = %00000011
TRISE = %00000000
;*************** DISPLAY LCD ****************
DEFINE LCD_DREG PORTD
DEFINE LCD_BITS 4 ;DB4-PORTD.4
DEFINE LCD_DBIT 4 ;DB7-PORTD.7
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2 ;RS-PORTD.2
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3 ;E-PORTD.3
DEFINE LCD_LINES 2 ;LCD DE 2 LINEAS
POS1 var Byte
POS2 var Byte
POS3 var Byte
POS4 var Byte
POS1 = $C0 ' Ver figura 6.13
POS2 = $C1 '
POS3 = $C2 '
POS4 = $C3
LCDOUT $FE,$40,$00,$00,$10,$0F,$0F,$0D,$18,$10 ' Palabra 0 de la CGRAM
LCDOUT $FE,$48,$04,$0E,$1F,$1C,$1C,$1C,$06,$05 ' Palabra 1 de la CGRAM
LCDOUT $FE,$50,$00,$00,$10,$0F,$0F,$0D,$04,$06 ' Palabra 2 de la CGRAM
LCDOUT $FE,$58,$04,$0E,$1F,$1C,$1C,$1C,$08,$18 ' Palabra 3 de la CGRAM
LCDOUT $FE,$60,$04,$0E,$1F,$07,$07,$07,$02,$03 ' Palabra 4 de la CGRAM
LCDOUT $FE,$68,$00,$00,$01,$1E,$1E,$16,$04,$0C ' Palabra 5 de la CGRAM
LCDOUT $FE,$70,$04,$0E,$1F,$07,$07,$07,$0C,$14 ' Palabra 6 de la CGRAM
LCDOUT $FE,$78,$00,$00,$01,$1E,$1E,$16,$03,$01 ' Palabra 7 de la CGRAM

;**************** TECLADO ******************
UNO VAR PORTB.1 ;nombres para los pines de las columnas
DOS VAR PORTB.2
TRES VAR PORTB.3
CUATRO VAR PORTB.4
A VAR PORTB.5 ;nombres para los pines de las filas
B VAR PORTB.6
C VAR PORTB.7
D VAR PORTC.0

;*************** SALIDAS ********************
LEDROJO VAR PORTE.0
LEDVERDE VAR PORTE.1
SIRENA VAR PORTE.2
SONIDO VAR PORTA.5
;*************** VARIABLES ******************
BANDERA VAR BYTE
BANDERA1 VAR BYTE
BANDERA2 VAR BYTE
NUMERO VAR BYTE ;variable número para almacenar la tecla pulsada
R VAR BYTE ;variable r para hacer repeticiones
SET1 VAR BYTE
SET2 VAR BYTE
SET3 VAR BYTE
SET4 VAR BYTE
dato VAR WORD ;crear variable dato para guardar
seguridad_ON var byte

On Interrupt GoTo ZONA ' Define el vector de interrupción.
INTCON = %10010000 ' Activa el inspector de interrupciones y
' habilita la interrupción RB0/INT.
LCDOUT $FE,1
LCDOUT "INICIO SISTEMA"
LCDOUT $FE,$C2,"DE SEGURIDAD"
PAUSE 1000
GOSUB perroGUARDIAN
LCDOUT $FE,1
BANDERA = 0
INICIANDO:
FOR R=1 TO 2

HIGH LEDROJO:HIGH LEDVERDE:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW LEDVERDE:LOW SONIDO
PAUSE 100
NEXT

LCDOUT $FE,$C0, 0
;******************GUARDAR LA CLAVE EN LA MEMORIA EEPROM************************
EEPROM 0,[1,2,3,4]
;************************************************* ******************************

ARRANQUE:
PAUSE 500
LCDOUT $FE,1
LCDOUT "(*)S/N (#)Config"
LCDOUT $FE,$C0,"(0) PRUEBA GSM"
BANDERA = 0
;************************************************* ******************************
LOW A
IF UNO=0 THEN NUMERO=1:RETURN
IF DOS=0 THEN NUMERO=2:RETURN
IF TRES=0 THEN NUMERO=3:RETURN
HIGH A
;************************************************* ******************************
LOW B
IF UNO=0 THEN NUMERO=4:RETURN
IF DOS=0 THEN NUMERO=5:RETURN
IF TRES=0 THEN NUMERO=6:RETURN
HIGH B
;************************************************* ******************************
LOW C
IF UNO=0 THEN NUMERO=7:RETURN
IF DOS=0 THEN NUMERO=8:RETURN
IF TRES=0 THEN NUMERO=9:RETURN
HIGH C
;************************************************* ******************************
LOW D
IF UNO=0 THEN mensajeACTIVADO
IF DOS=0 THEN MODEM
IF TRES=0 THEN GRABAUNO
HIGH D
PAUSE 25
GOTO ARRANQUE

mensajeACTIVADO:
GOSUB perroGUARDIAN
LCDOUT $FE,1
LCDOUT $FE,2," SISTEMA ALARMA "
LCDOUT $FE,$C0," ACTIVADA "
PAUSE 2000
LCDOUT $FE,1
BANDERA = 1
GOTO RESETEO

RESETEO:
;LOW PUERTA
LCDOUT $FE,1
FOR R=1 TO 2
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
PAUSE 100
IF D=0 AND UNO=0 THEN RESETEO
NEXT

READ 0,SET1
READ 1,SET2
READ 2,SET3
READ 3,SET4

GOSUB TECLAUNO

GRABAUNO:
lcDout $FE,1
LCDOUT $FE,3,"INGRESE SU CLAVE":LCDOUT $FE,$C3,"ANTERIOR"
PAUSE 1000
GOSUB TCLAUNO
RETURN

TCLAUNO:
LCDOUT $FE,1
LCDOUT $FE,2,"CLAVE ANTERIOR:"
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET1 THEN GOSUB TCLADOS
GOTO FALSO

TCLADOS:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET2 THEN GOSUB TCLATRES
GOTO FALSO1

TCLATRES:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET3 THEN GOSUB TCLACUATRO
GOTO FALSO2

TCLACUATRO:
GOSUB BARRIDO
GOSUB PTECLA
IF NUMERO=SET4 THEN GOSUB GRABA_1
GOTO FALSO3

GRABA_1:
LCDOUT $FE,1
LCDOUT $FE,2,"INGRESE SU NUEVA":LCDOUT $FE,$C3,"CLAVE:"
LCDOUT $FE,$C5
GOSUB PTECLA:HIGH LEDROJO
GOSUB BARRIDO:GOSUB PTECLA
HIGH LEDROJO
WRITE 0,NUMERO

GRABADOS:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 1,NUMERO
GRABATRES:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 2,NUMERO

GRABACUATRO:

GOSUB BARRIDO:GOSUB PTECLA
GOSUB PTECLA:HIGH LEDROJO
HIGH LEDROJO
WRITE 3,NUMERO
LOW D
IF D=0 AND UNO=0 THEN RESETEO
HIGH D
PAUSE 500
LCDOUT $FE,1
LCDOUT $FE,2,"NUEVA CLAVE HA"
LCDOUT $FE,$C0,"SIDO CONFIGURADA"
PAUSE 2000
GOTO ARRANQUE

BARRIDO:
;************************************************* ******************************
LOW A
IF UNO=0 THEN NUMERO=1:RETURN
IF DOS=0 THEN NUMERO=2:RETURN
IF TRES=0 THEN NUMERO=3:RETURN
HIGH A
;************************************************* ******************************
LOW B
IF UNO=0 THEN NUMERO=4:RETURN
IF DOS=0 THEN NUMERO=5:RETURN
IF TRES=0 THEN NUMERO=6:RETURN
HIGH B
;************************************************* ******************************
LOW C
IF UNO=0 THEN NUMERO=7:RETURN
IF DOS=0 THEN NUMERO=8:RETURN
IF TRES=0 THEN NUMERO=9:RETURN
HIGH C
;************************************************* ******************************
LOW D
IF UNO=0 THEN GOSUB BORRAR
IF DOS=0 THEN NUMERO=0:RETURN
IF TRES=0 THEN GOSUB GRABAUNO
HIGH D
PAUSE 25
GOTO BARRIDO
;************************************************* ******************************

PTECLA:

HIGH LEDROJO:HIGH SONIDO
PAUSE 100
LOW LEDROJO:LOW SONIDO

ESPACIO:
IF UNO=0 THEN ESPACIO
IF DOS=0 THEN ESPACIO
IF TRES=0 THEN ESPACIO
PAUSE 25
RETURN

TECLAUNO:
LCDOUT $FE,2,"INTRODUCIR CLAVE"
GOSUB BARRIDO
LCDOUT $FE,$C5, "*"
GOSUB PTECLA
IF NUMERO=SET1 THEN TECLADOS
GOTO FALSO

TECLADOS:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET2 THEN TECLATRES
GOTO FALSO1

TECLATRES:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET3 THEN TECLACUATRO
GOTO FALSO2

TECLACUATRO:
GOSUB BARRIDO
LCDOUT "*"
GOSUB PTECLA
IF NUMERO=SET4 THEN ABRIR
GOTO FALSO3

ABRIR:
LCDOUT $FE,1
LCDOUT $FE,2," CLAVE CORRECTA"
;HIGH PUERTA
FOR R=1 TO 4
HIGH LEDVERDE:HIGH SONIDO
PAUSE 200
LOW LEDVERDE:LOW SONIDO
NEXT
PAUSE 500
LOW D
IF D=0 AND UNO=0 THEN BORRAR
HIGH D
PAUSE 25
GOTO mensajeDESACTIVADO

FALSO:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT $FE,$C5, "*"
FALSO1:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT "*"
FALSO2:
GOSUB BARRIDO:GOSUB PTECLA:LCDOUT "*"
FALSO3:
LCDOUT $FE,1
FOR R=1 TO 10
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
NEXT
IF D=0 AND UNO=0 THEN BORRAR

ALERTA:
LCDOUT $FE,2,"CLAVE INCORRECTA"
HIGH LEDROJO:HIGH SONIDO
PAUSE 200
LOW LEDROJO:LOW SONIDO
LOW D
IF D=0 AND UNO=0 THEN BORRAR
HIGH D
GOTO ALERTA

BORRAR:

LCDOUT $FE,1
GOSUB RESETEO
RETURN

mensajeDESACTIVADO:
PAUSE 1500
LOW SIRENA
BANDERA = 0
LCDOUT $FE,1
LCDOUT $FE,2," SISTEMA ALARMA "
LCDOUT $FE,$C0," DESACTIVADA "
PAUSE 2000
GOTO ARRANQUE

MODEM:
LCDOUT $FE,1
LCDOUT $FE,2,"PRUEBA MODEM GSM"
LCDOUT $FE,$C0," ACTIVADA "

PRUEBA1:
PAUSE 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGR=1"
serout PORTC.6,T9600,["AT+CMGR=1",10,13]
serin PORTC.7,T9600,900,PRUEBA2,["+"]
SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA2:
PAUSE 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGD=1"
SEROUT PORTC.6,T9600,["AT+CMGD=1",10,13]
serin PORTC.7,T9600,900,PRUEBA3,["+"]
SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA3:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGD=2"
SEROUT PORTC.6,T9600,["AT+CMGD=2",10,13]
serin PORTC.7,T9600,900,PRUEBA4,["+"]
SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA4:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"AT+CMGF=1"
SEROUT PORTC.6,T9600,["AT+CMGF=1",10,13]
serin PORTC.7,T9600,900,PRUEBA5,["+"]
SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA5:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"2976256173"
SEROUT PORTC.6,T9600,["AT+CMGS=",34,"2976256173",34,10,13]
serin PORTC.7,T9600,900,PRUEBA6,["+"]
SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA6:
pause 1000
LCDOUT $FE,1
LCDOUT $FE,2,"SMS: PRUEBA TEL"
SEROUT PORTC.6,T9600,["PRUEBA TEL",26,10,13]
serin PORTC.7,T9600,900,PRUEBA7,["+"]
SERIN PORTC.7,T9600,DATO
LCDOUT $FE,$C0,DEC DATO

PRUEBA7:
PAUSE 1500
LCDOUT $FE,1
LCDOUT $FE,2,"PRUEBA TERMINADA"
LCDOUT $FE,$C0," REINICIANDO "
PAUSE 2000
GOTO ARRANQUE

perroGUARDIAN:
LCDOUT $fe, 1 ' Limpia la pantalla LCD
LCDOUT $FE,POS1, 0 ' Muestra Palabra 0 en la LCD
LCDOUT $FE,POS2, 1 ' Muestra Palabra 1 en la LCD
Pause 300
LCDOUT $fe, 1 ' Limpia la pantalla LCD
LCDOUT $FE,POS3, 2 ' Muestra Palabra 2 en la LCD
LCDOUT $FE,POS4, 3 ' Muestra Palabra 3 en la LCD
Pause 300
' Aumentamos la posición de cada símbolo en la pantalla para dar el efecto
' de movimiento:
POS1 = POS1 + 3
POS2 = POS2 + 3
POS3 = POS3 + 3
POS4 = POS4 + 3
If POS4 > $CF Then RETRO ' Pregunta si llega al tope derecho de la LCD
' si POS4 = $CF salta a la etiqueta "RETRO"
goto perroguardian ' Salta a la etiqueta "inicio"
' Antes de retroceder nos aseguramos de que las figuras E,F,G y H tengan una
' posición inicial en la pantalla LCD:
RETRO:
POS1 = $CF
POS2 = $CE
POS3 = $CD
POS4 = $CC
RETROCEDE:
LCDOUT $fe, 1 ' Limpia la pantalla LCD
LCDOUT $FE,POS1, 7 ' Muestra Palabra 7 en la LCD
LCDOUT $FE,POS2, 6 ' Muestra Palabra 6 en la LCD
Pause 300
LCDOUT $fe, 1 ' Limpia la pantalla LCD
LCDOUT $FE,POS3, 5 ' Muestra Palabra 5 en la LCD
LCDOUT $FE,POS4, 4 ' Muestra Palabra 4 en la LCD
Pause 300
' Disminuimos la posición de cada símbolo en la pantalla para dar el efecto
' de movimiento en sentido contrario:
POS1 = POS1 - 3
POS2 = POS2 - 3
POS3 = POS3 - 3
POS4 = POS4 - 3
If POS4 < $C0 Then REINICIA ' Pregunta si llega al tope Izquierdo de la LCD
GoTo RETROCEDE
' Nos aseguramos de que las figuras A,B,C y D tengan una posición inicial en la
' pantalla LCD:
REINICIA:
POS1 = $C0
POS2 = $C1
POS3 = $C2
POS4 = $C3
return ' Se repite el proceso saltando a la etiqueta "inicio"


DISABLE

ZONA:
IF BANDERA = 1 THEN
HIGH SIRENA
BANDERA1 = BANDERA1 + 1
ELSE
LOW SIRENA
ENDIF

BANDERA1 = BANDERA1 + 1
IF BANDERA1 > 6 THEN BANDERA1 = 0
IF BANDERA = 1 AND BANDERA1 < 3 THEN
PAUSE 100
serout PORTC.6,T9600,["AT+CMGR=1",10,13]
PAUSE 500
SEROUT PORTC.6,T9600,["AT+CMGD=1",10,13]
pause 500
SEROUT PORTC.6,T9600,["AT+CMGD=2",10,13]
pause 500
SEROUT PORTC.6,T9600,["AT+CMGF=1",10,13]
pause 1000
SEROUT PORTC.6,T9600,["AT+CMGS=",34,"2976256173",34,10,13]
pause 1000
SEROUT PORTC.6,T9600,["DISPARO ALARMA",26,10,13]
PAUSE 100
ENDIF

INTCON = %10010000 ' Habilita las interrupciones (GIE=1)
' Habilita la interrupción RB0/INT (INTE=1)
' Inicializa la interrupción (INTF=0)
Resume ' GIE = 1 y retorna al punto donde había quedado
' antes de la interrupción.
Enable ' Habilita el inspector de interrupciones.
END

Nota: Tengo que solucionar un par de errores... El primero que tengo, es que no puedo visualizar en el display las respuestas que le hago al modem por que el delay que hay entre pregunta y respuesta es casi instantaneo y no da tiempo al micro a que lo lea, guarde e imprima... No encuentro en el manual donde se puede variar esto...La otra cosa ue tengo que hacer, es cambiar la instruccion SERIN para que pueda saltar correr el programa sin quedar en una linea esperando que entre los datos...
La opcion mas rapida que tengo y segura, es implementar otro microcontrolador solo para el manejo de la comunicacion con el modem y el 16F877, imlpementarlo para la alarma en si.
Asi como esta, funciona, pero tengo que mejorarla; Espero que les sea de utilidad