- How to Adjust X and Y Axis Scale in Arduino Serial Plotter (No Extra Software Needed)Posted 5 months ago
- Elettronici Entusiasti: Inspiring Makers at Maker Faire Rome 2024Posted 5 months ago
- makeITcircular 2024 content launched – Part of Maker Faire Rome 2024Posted 7 months ago
- Application For Maker Faire Rome 2024: Deadline June 20thPosted 8 months ago
- Building a 3D Digital Clock with ArduinoPosted 1 year ago
- Creating a controller for Minecraft with realistic body movements using ArduinoPosted 1 year ago
- Snowflake with ArduinoPosted 1 year ago
- Holographic Christmas TreePosted 1 year ago
- Segstick: Build Your Own Self-Balancing Vehicle in Just 2 Days with ArduinoPosted 1 year ago
- ZSWatch: An Open-Source Smartwatch Project Based on the Zephyr Operating SystemPosted 1 year ago
GSM Multifuction Alarm with SIM900
It’s small but packed with features. The GSM alarm we present today, sports a PIR motion sensor, can be battery operated and it’s capable to communicate via GSM. It can transmit alarm conditions and receive commands from remote. It’s also capable to indicate problems such as is insufficient voltage supply or tampering.
It’s not so conventional for antitheft system: to integrate a movement sensor, a PIR motion sensor and a temperature probe in a single appliance: all this accompanied by an SMS sending GSM / GPRS module. This circuit was born as a very versatile, ready to use, built-in alarm system: no installation is required, you can just drop it and it’s ready to work. It’s not by chance that is designed to be battery operated: it also features a battery state control to check the power.
Moreover, it has two digital inputs, one which was is set up to detect tension: with it, you could detect important conditions such as the state of a protection system or even other parameters of various kinds, simply by adding additional sensors.
The diagram
All is quite simple, since most of the tasks are managed by a PIC18F46K20 (U1), all is powered between 6 and 32 VDC (even unregulated), thanks to a DC / DC buck converter configuration that is present in the circuit.
The switching regulator is based on the MC34063 (U2), used in the classical configuration of a winding inductance series PWM regulator, whose output voltage depends on the energy stored in L1, the output voltage from the DC / DC is stabilized with reference to the potential demoted to pin CII by the resistive divider R3/R4.
The two components are designed to get 4 V in C8 and C9.
After power-on-reset, the microcontroller, initializes its I/O settings: RB0 reads the state of the motion sensor, RB1 and RB2 serve to detect the logical condition in inputs IN1 and IN2; RB3 reads the state of the P1 button and RB4 the logical condition of the output of the passive infrared radar PIR. The latter normally has zero on OUT and 5-volt pulses when detects something in its field of action. P1 button serves for the local management of the operation mode.
Note that both IN1 and IN2 are protected by a diode which prevents the application to RB1 and RB2 of voltages exceeding that with which the microcontroller is powered. In the case of PIC18F46K20, a voltage below 1 V or a short circuit of IN1 or IN2 corresponds to the low logic state, while the opening of said inputs or the application of a DC voltage of 1 to 5 V generates 1.
The AN0 line is an input assigned to the A / D converter contained in the microcontroller and reads the value of the voltage supply through the resistive divider formed by R1 and R2.
The RC0 line is initialized by the PIC as a bidirectional I / O, as it serves to communicate with the temperature sensor, which, in our case is a Dallas DS18B20. This sensor is very precise and it’s capable of measuring temperatures between -5 and 150 ° C with an accuracy of ± 0.5 ° C (in -10 ÷ 85 ° C), making them available over a serial line, in this case going to the RC0 pin of the microcontroller.
Let us now look to the outputs: RD6 and RD7, used to manage the lighting of the LD1 and LD2 LEDs .
Regarding the cellular module, this is an FT900M based on the SIMCOM SIM900. The microcontroller contains a UART that accessible from pins 44 (transmission) and 1 (reception): it’s used to communicate with the GSM module.
The set of I/Os is completed by RC5 and RD0: the first one controls the switching of the GSM (via a transistor arranged in the base) while the second line provides to phone reset when necessary; in any case after the initialization after resetting circuit.
BOM
[code]
R1: 10 kohm (0805)
R2: 1 kohm (0805)
R3: 2,2 kohm (0805)
R4: 1 kohm (0805)
R5: 0,1 ohm 1W (1206)
R6: 330 ohm (0805)
R7: 330 ohm (0805)
R8: 4,7 kohm (0805)
C1: 100 nF (0805)
C2: 470 µF 6,3 VL (X)
C3: 470 µF 6,3 VL (X)
C4: 100 nF (0805)
C5: 22 µF 25 VL (D)
C6: 100 nF (0805)
C7: 100 nF (0805)
C8: 470 µF 6,3 VL (D)
C9: 100 nF (0805)
C10: 100 nF (0805)
C11: 100 pF (0805)
C12: 22 µF 25 VL (D)
L1: 22 µH
U1: PIC18F46K20-I/PT
U2: MC34063AD
LD1: LED red 5 mm
LD2: LED green 5 mm
P1: Microswitch
GSM: Mini breakout SIM900 (FT900M)
D1: GF1M
D2: GF1M
D3: MBRA140TRPBF
MOV: Motion sensor
PIR: PIR sensor
TEMP: DS18B20+
[/code]
How it works
The system is designed to be configured via SMS and, when alarms are triggered, it sends one ore more SMS to the numbers stored in a secial list, to warn one or more persons.
Our system fires an alarm on the verification of one or more of the following conditions:
– the IN1 input changes state, moves at high or low state,
– the motion sensor detects a vibration
– the PIR sensor detects presence,
– the temperature goes out of a preset range
– the supply voltage drops below a certain value
When one of these events occurs, the circuit sends a text message to te contact list.
You can also set a custom message for each event.
RB2 is used to activate and deactivate the alarm: leaving it open or putting a high logic level, after an interval can be set between 0 and 59 seconds with the SMS command TATT, the circuit will be activated.
After activation of IN1, the green LED LD2 will flash until activation.
You can also ask the device to send a text message when activated.
You can define a sensors inhibition time thanks to the SMS command INI:xx, ( xx is the time in minutes). Inhibition time is to avoid multiple alarms for the same event. caused by something that produces more pulses (such as an unstable contact in IN2, an oscillating temperature around the threshold value etc..).
One particular feature of the circuit is the Sleep mode, useful to prolong the operating time when the circuit is battery powered: sending the SLEEP:xxx command the system goes to a sleep mode (low power) for xxx seconds. During this mode, the operation is minimal, ie, the circuit neither detects any alarm, nor it sends or reads i ncoming SMS. Sleep mode suspends every xxx seconds, when the circuit queries the phone to verify the arrival of messages and move on the execution of commands.
Sleep mode enables automatically only if the circuit is turned off, or if the IN1 is at a low logic level.
If the circuit is on sleep, but you need to read data you can awaken it momentarily in two ways: locally, by pressing the P1 button, or remotely, making a phone call to it. Upon awakening, we can send an SMS command to read the data we want, the circuit will respond and then will automatically go back to sleep.
Configuration
All circuit settings can be made by SMS: note that the system will only accept SMS from phone numbers stored in the approved numbers list, a maximum of 8. This list is the same to which the system will send the SMS to. Alternatively you must send commands accompanied by a password, which by default and following a reset (imposed by SMS).
The command to store a new number is the following (a SMS containing the text): NUMxnnnnnnnnnnnpwd, where x is the position (1 to 8) where to save the number amd pwd is the current password (required if the SMS command originates from a phone is not in the list and needed when you store the first number)
The pwd is due in any case if the position is already taken by another number. Each number can be up to 19 characters and must contain the national prefix.
You can also query the device to find all the numbers stored: just issue the command SMS NUM?;pwd.
Our device implements also an Easy Setup functionality: after switching on, keeps waiting for a phone call and then saves the caller’s phone number and enters the normal operation.
Once you stored the numbers in the list, you must define which ones to send SMS alarms. The command is SMSxxxxxxxx:ON or SMSxxxxxxxx:OFF, where xxxxxxxx is the position in the list where the numbers are stored.
For example, SMS1346: ON sets that the numbers in positions 1, 3, 4 and 6 will receive the SMS. OFF will than deactivate the corresponding SMS sending.
At the first start and after each reset, the tracker sends SMS to all numbers stored.
Certain commands can be executed only when accompanied by a password: the default password (reset after every hard reset of the system) is 12345, and you can replace it by issuing the command PWDnewpwd, pwd, where newpwd is the password to be stored and pwd is the current one.
A reset, which restores the default settings and clears phone numbers list is done thanks to the RESpwd command, where pwd is the current password.
You can send text messages containing multiple comma separated commands, and with a special command, you can disable answers to some of the commands by inputting the command RISP.
Let’s disuss of how to manage the alarm functions. Let’s start with the temperature. By sending the TEMPcommand you get the current temperature, by ALLMAX:YXX and ALLMIN:YXX (where y is the sign and xx corresponds to the Celsius degrees) you can set maximum and minimum temperatures (before issuing alarms).
Temperature settings can be reset by sending the command TRES. The ALL? command instead queries the system, which responds with the currently
set temperatures. Temperature alarms are activated by the SAT:1 command: to deactivate you can issue the SAT:0 command. The setting will be stored until reset.
Let’s look at the commands of the motion alarm: SAM:1 enables sensor, and SAM:0 disables it, settings are saved until hard reset.
The PIR sensor, is activated and deactivated via SAP:1, SAP:0 commands. The settings are kept until reset as well.
Command SAI:1 and SAI: 0 activate and deactivate control on the IN2 input line. The commands to define what the system should consider an alarm are the following: LIV:A makes the input sensitive to the logic high, LIV: B activates it with zero and LIV:V activates the alarm when there’s a change in the logic level. The LIV? command asks the system to send a text message containing the current setting for the IN2 alarm input.
Command: SAV:1 gives alarm if the battery voltage drops below 6 volts; with SAV: 0 we can disable this function.
To get an SMS when circuit is activated (meaning IN has been activated) you must send the command AVV:1; you can disable this feature with AVV:0.
CODE
'****************************************************************************** '* MF909 '* Sistema allarme gsm dotato di sensore di temperatura, movimento,PIR '* Il sistema è basato su un PIC18F46K20 '* by Boris Landoni '****************************************************************************** 'CONNECT 'HTTP/1.1 200 OK 'Content-Type: application/binary 'Content-Length: 25 'Date: Mon, 25 Oct 2010 13:15:43 GMT 'Expires: Mon, 25 Oct 2010 13:15:43 GMT 'Cache-Control: private, max-age=0 'X-Content-Type-Options: nosniff 'X-Frame-Options: SAMEORIGIN 'X-XSS-Protection: 1; mode=block 'Server: GSE 'Connection: close 'CONNECT 'HTTP/1.1 200 OK 'Content-Type: text/plain; charset=UTF-8 'Vary: Accept-Language 'Date: Mon, 25 Oct 2010 13:16:12 GMT 'Server: mafe 'Cache-Control: private, x-gzip-ok="" 'X-XSS-Protection: 1; mode=block 'Connection: close '200,8,"Via Adige, 21, 21013 Gallarate VA, Italia" 'CLOSED '+CMGL: 1,"REC UNREAD","+","","10/10/25,15:15:19+08" 'My Wind. Ti ho cercato alle 15:15 del 25/10. ' Info wind.it 'include "18F6722LANDO.BAS" DEFINE OSC 16 '@ DEVICE BOD_OFF 'disabilita il reset quando cala la tensione 'RCON.6=1 '@ DEVICE HS_OSC 'Configurazione usart 9600 define HSER_RCSTA 90h define HSER_TXSTA 24h define HSER_BAUD 115200 define HSER_CLROERR 1 DEFINE ADC_BITS 10 ' Set number of bits in result DEFINE ADC_CLOCK 3 ' Set clock source DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds 'DEFINE DEBUG_REG PORTB 'DEFINE DEBUG_BIT 4 'DEFINE DEBUG_BAUD 115200 'DEFINE DEBUG_MODE 0 'DEFINE ADC_BITS 8 ' Set number of bits in result 'DEFINE ADC_CLOCK 3 ' Set clock source 'DEFINE ADC_SAMPLEUS 5000 ' Set sampling time in microseconds SYMBOL POWERGSM =PORTC.5 'Alimentazione cellulare ON/OFF SYMBOL RESET =PORTD.0 'RESET GSM SYMBOL LD1 =PORTD.7 ' LED1 ROSSO SYMBOL LD2 =PORTD.6 ' LED3 VERDE SYMBOL PULS =PORTB.3 SYMBOL RING =PORTD.3 ' RING GSM SYMBOL INPIR =PORTB.4 ' PIR SYMBOL MOV =PORTB.0 ' MOVIMENTO SYMBOL SONDA =PORTC.0 ' DS18B20 SYMBOL ATTIVA =PORTB.1 ' INGRESSO 2 DI ATTIVAZIONE SISTEMA DI ALLARME APERTO ATTIVATO / CHIUSO DISATTIVATO SYMBOL IN1 =PORTB.2 ' IN1 SYMBOL STATO =PORTC.4 'STATO SYMBOL TXPC =PORTB.7 OUTPUT POWERGSM OUTPUT LD1 OUTPUT LD2 OUTPUT RESET INPUT PULS TMP VAR BYTE TMP1 VAR word TMP2 VAR BYTE TMP3 VAR BYTE TMPL VAR LONG TMPL1 VAR LONG TMPW VAR WORD TMPW1 VAR WORD TIMESLEEP VAR BYTE LEGGINUM VAR WORD LEGGINUM2 VAR WORD ADDRL2 VAR LONG ORA VAR BYTE[25] BUFF VAR BYTE[160] PWD VAR BYTE[6] NUMERO VAR BYTE[25] MITTENTE VAR BYTE[25] MITTENTEECHO VAR BYTE[25] POSIZIONE VAR BYTE LUNGNUM VAR BYTE LUNGMESS VAR BYTE LUNGMITT var byte LUNGMITTECHO var byte TROVATO VAR BIT PWDOK VAR BIT DATO VAR BYTE FRASE VAR BYTE ERR1 VAR BYTE ERR2 VAR BYTE 'INDEX VAR BYTE TENTATIVI VAR BYTE RISPOSTA VAR BYTE CERCAMITTENTE VAR BYTE MULTIMESS VAR BYTE POSMULTIMESS var byte POSPUNTI VAR BYTE PULSANTE VAR BYTE NONREGISTRATO VAR BYTE MINUTIGSM VAR BYTE SECONDIGSM VAR BYTE ORAGSM VAR BYTE GSMSECTOT VAR LONG GSMSEC VAR WORD GSMMIN VAR WORD GSMMINOLD VAR WORD GSMSECOLD VAR WORD VARSEC VAR BYTE VARMIN VAR BYTE ATTESAAZZERA VAR BYTE NUMERISMS VAR BYTE TEMPO VAR BYTE PCLATH_TEMP var byte STATUS_TEMP var byte W_TEMP var byte POSTROVATO VAR BYTE SQUILLO VAR BIT MCCS VAR BYTE[5] MNCS VAR BYTE[5] MCC VAR LONG MNC VAR LONG LAC VAR LONG CID VAR LONG CONV VAR BYTE TEMP VAR WORD TEMPW VAR WORD SONDAOK VAR BIT ATTIVATO VAR BIT TIMEINIBIZIONE1 VAR WORD TIMEINIBIZIONEP VAR WORD TIMEINIBIZIONEM VAR WORD TIMEINIBIZIONET VAR WORD TIMEINIBIZIONEV VAR WORD POSALL VAR BYTE ALLARME VAR BYTE STATOIN1 VAR BYTE 'MODULOON VAR BIT 'TEMPOSPEGNIMENTO VAR BYTE VARIAZIONEIN VAR BIT VARIAZIONEPIR VAR BIT VARIAZIONEMOV VAR BIT BATT VAR WORD BATTR VAR WORD VER CON 1 'MODIFICARE LA VERSIONE SE SI CAMBIA 'ADDBASE CON 40000 'ADDFIN CON 60000 ADCON0=%00000000 ADCON1=%00000000 ADCON2=%10000000 ANSEL=1 ANSELH=0 'INTCON=0 'INTCON2.7=0 'Abilita resistenze di pull-up 'INTCON3=0 INTCON = %11011000 'Abilita interrupt on GPIO change INTCON2 = %00000010 'Abilita resistenze di pull-up E INTERRUPT SU RB INTCON3 = 0 IOCB = %00010000 ' INTERRUPT SU RB4 CCP2CON=0 RCON.7=0 OSCCON.6=1 OSCCON.5=1 OSCCON.4=1 WPUB.4=0 ON INTERRUPT GOTO PULSANTI 'parametri ok MEMORIA1: EEPROM 370,[1] 'FORMATO MESS SMS 'EEPROM 371,[1] 'FORMATO MESS EMAIL 'EEPROM 372,[1] 'FORMATO MESS URL EEPROM 700,[0] ' GESTISCO L'INGRESSO 1 COME ALLARME EEPROM 701,[0] ' GESTISCO IL SENSORE PIR EEPROM 702,[0] ' GESTISCO IL MOVIMENTO EEPROM 703,[1] ' GESTISCO IL SENSORE TEMPERATURA EEPROM 704,[1] ' GESTISCO L'ALLARME DELLA BATTERIA EEPROM 705,[100] ' TENSIONE MINIMA DI ALLARME 10.0V EEPROM 710,["S"] ' INVIO I MESSAGGI a tutti gli utenti abilitati EEPROM 711,[30] ' TEMPO DI ATTIVAZIONE ALLARME EEPROM 712,[30] ' TEMPO STAND BY EEPROM 768,[60] 'SLEEP PER 60 SECCNDI.. OGNI 60 SEOCNDI VIENE LETTO SE C'è UN SMS.. 'DA 730 A 750 SALVO L'IMEI 'DA 751 A 767 SALVO IL NOME EEPROM 751,["F","T","9","0","9"] 'DA 770 A 899 SALVO LE AREE GEOFENCE 'GEO:1/I-O/NOMEAREA/LAT1/LON1/LAT2/LON2 'LATITUDINE LONGITUDINE IN/OUT NOME12CAR 'PER OGNI AREA CI SONO 43 CARATTERI 'LL LLLL lll llll I NOME '770÷801 area 1 '801÷832 area2 ' 832÷863 area3 'EEPROM 900,[0] 'DA 900 A 1000 SALVO L'ULTIMO PUNTO VALIDO EEPROM 1000,[0] 'ECHO DISABILITATO EEPROM 1001,["1","2","3","4","5"] 'PASSWORD DI DEFAULT EEPROM 1006,[0] 'SE 0 PRIMA ACCENSIONE EEPROM 1007,[10] 'TEMPERATURA MINIMA DI ALLARME EEPROM 1008,[25] 'TEMPERATURA MASSIMA DI ALLARME EEPROM 1009,[0] 'abilita il mess all'avvio EEPROM 1010,[127] 'TEMPERATURA MINIMA RAGGIUNTA EEPROM 1011,[255] 'TEMPERATURA MASSIMA RAGGIUNTA EEPROM 1012,[0] 'SE DURANTE IL TEMPO DI INIBIZIONE L'INGRESSO 1 TORNA NELLO STATO STABILE, NON AZZERARE IL TEMPO EEPROM 1014,[1] 'TEMPO OSSERVAZIONE INGRESSO 1 (00÷59 SEC) EEPROM 1016,[5] 'TEMPO INIBIZIONE INGRESSO EEPROM 1017,[5] 'TEMPO INIBIZIONE VOLTAGE EEPROM 1018,[0] 'LIVELLO DI ALLARME PER L'INGRESSO 1 (PRESENZA TENSIONE) EEPROM 1021,[255] 'SMS ABILITATO SU TUTTI I NUMERI 'EEPROM 1022,[255] 'EMAIL ABILITATA SU TUTTE LE EMAIL EEPROM 1023,[0] 'QUI SALVO I NUMERI CHE HANNO CHIESTO LE COORDINATE CON SQUILLO 'ADDBASE CON 60160 'memorizzo gli 8 indirizzi email ATTENZIONE: SCRIVE NELLA PARTE ALTA $10000 + 60160 'ADDFIN CON 61000 'parametri di prova 'EEPROM 201,[0] 'MEMORIZZO NELLA LOCAZIONE 201 SE è LA PRIMA ACCENSIONE, 0=PRIMA 'EEPROM 702,[3] 'SE 1 I DATI DELLE COORDINARE VERRANNO INVIATI IN GRADI DECIMALI PER TUTTOCITTA' ALTRIMENTI IN GRADI MINUTI SECONDI PER FUGAWI 'EEPROM 703,[1] 'INVIO IN POLLING ATTIVATO 'EEPROM 704,[0] 'ORE TEMPO POLLING 'EEPROM 705,[1] 'MINUTI TEMPO POLLING 'EEPROM 206,[1] 'GPS NORMALMENTE acceso 'EEPROM 700,[1] 'NORMALMENTE INVIO email 'EEPROM 210,["1","2","3","4","5"] 'PASSWORD DI DEFAULT LOW LD1 LOW LD2 FOR TMP=0 TO 3 TOGGLE LD1 TOGGLE LD2 PAUSE 100 NEXT TMP STATOIN1=IN1 'TMP=0 'WHILE TMP<200 ' IF P1=0 THEN ' HIGH LD1 ' TMP=0 ' ELSE ' LOW LD1 ' ENDIF ' IF P2=0 THEN ' HIGH LD2 ' TMP=0 ' ELSE ' LOW LD2 ' ENDIF ' IF P3=0 THEN ' HIGH LD3 ' TMP=0 ' ELSE ' LOW LD3 ' ENDIF ' TMP=TMP+1 ' PAUSE 10 'WEND 'gosub GSM_OFF 'LOOP: ' GOSUB LEGGIGPS ' PAUSE 2000 'GOTO LOOP 'MEMORIA DA 100 A 200 MEMORIZZO IL NUMERO DELL'EMAIL E L'EMAIL SEPARATE DALLA VIRGOLA E TERMINANI COL ; ''PROCEDURA DI ACCENSIONE: ''ALTO RESET ''ALTO POWER ''BASSO RESET 'pause 100 'SEROUT P2,2,["FT596 Versione Pic18F2620 V4",10,13] CLEAR INTCON3.0=0 INTCON3.1=0 INTCON.1=0 INTCON.0=0 'DEBUG "SYS UP DATI 1.0",13,10 'LOW RTS HIGH POWERGSM 'SUL PIN HO UN LIVELLO LOGICO BASSO HIGH RESET 'LO TENGO RESETTATO SUL PIN HO UN LIVELLO LOGICO BASSO START: SEROUT2 TXPC,6,["-SYS UP V. ",#ver,13,10 ] 'READ 703,TMP 'IF TMP=1 THEN ' SE C'è IL POLLING VADO A CARICARE IL TEMPO ' 'SEROUT2 TXPC,6,["-POLLING CONTINUO ATTIVATO",13,10 ] ' POLLTIMEC=0 ' READ 704,POLLTIMECh 'RILEGGO IL TEMPO IMPOSTATO ' READ 705,POLLTIMECl ' 'POLLTIMEC=POLLTIMEC+GSMSECTOT ' POLLTIMEC=((ORAIMP*60)*60)+(MINUTIIMP*60) 'ENDIF 'READ 712,TMP 'IF TMP=1 THEN ' SE C'è IL POLLING VADO A CARICARE IL TEMPO ' 'SEROUT2 TXPC,6,["-POLLING CONTINUO ATTIVATO",13,10 ] ' READ 713,ORAIMP 'RILEGGO IL TEMPO IMPOSTATO ' READ 714,MINUTIIMP ' POLLTIMEM=((ORAIMP*60)*60)+(MINUTIIMP*60) 'ENDIF FOR ADDRL2=200 TO 300 WRITE ADDRL2,0 'SEGNO CHE HO INVIATO TUTTI I MESS NEXT ADDRL2 'High LD1 'For TMP=0 TO 5 ' Toggle LD1 ' Pause 500 'Next TMP 'HIGH LD1 'PAUSE 1000 GOSUB ON_OFF 'FOR TMP=0 TO 10 ' TOGGLE LD1 ' PAUSE 500 'NEXT TMP 'LOW LD1 'FOR TMP=0 TO 10 ' TOGGLE LD2 ' PAUSE 500 'NEXT TMP 'LOW LD2 ''PAUSE 2000 GOSUB SETUP READ 1006,TMP IF TMP=0 THEN 'SEROUT2 P2,6,[ "PRIMA ACCENSIONE",13,10 ] FOR TMP=0 TO 160 WRITE TMP,255 NEXT TMP FOR tmp = 0 TO 24 ' Count from 0 to 5 LOOKUP tmp,["ALLARME!! INGRESSO 1 ALTO"],TMP1 ' Get character number B0 from string to variable B1 buff[tmp]=tmp1 'SEROUT 0,N2400,[B1] ' Send character in B1 to Pin0 serially NEXT tmp ' Do next character lungnum=24 POSIZIONE=1 GOSUB MEMOMESS FOR tmp = 0 TO 25 ' Count from 0 to 5 LOOKUP tmp,["ALLARME!! INGRESSO 1 BASSO"],TMP1 ' Get character number B0 from string to variable B1 buff[tmp]=tmp1 'SEROUT 0,N2400,[B1] ' Send character in B1 to Pin0 serially NEXT tmp ' Do next character lungnum=25 POSIZIONE=2 GOSUB MEMOMESS FOR tmp = 0 TO 36 ' Count from 0 to 5 LOOKUP tmp,["ALLARME!! SUPERATA SOGLIA TEMPERATURA"],TMP1 ' Get character number B0 from string to variable B1 buff[tmp]=tmp1 'SEROUT 0,N2400,[B1] ' Send character in B1 to Pin0 serially NEXT tmp ' Do next character lungnum=36 POSIZIONE=3 GOSUB MEMOMESS FOR tmp = 0 TO 36 ' Count from 0 to 5 LOOKUP tmp,["ALLARME!! SUPERATA SOGLIA TEMPERATURA"],TMP1 ' Get character number B0 from string to variable B1 buff[tmp]=tmp1 'SEROUT 0,N2400,[B1] ' Send character in B1 to Pin0 serially NEXT tmp ' Do next character lungnum=36 POSIZIONE=4 GOSUB MEMOMESS FOR tmp = 0 TO 28 ' Count from 0 to 5 LOOKUP tmp,["ALLARME!! RILEVATA INTRUSIONE"],TMP1 ' Get character number B0 from string to variable B1 buff[tmp]=tmp1 'SEROUT 0,N2400,[B1] ' Send character in B1 to Pin0 serially NEXT tmp ' Do next character lungnum=28 POSIZIONE=5 GOSUB MEMOMESS FOR tmp = 0 TO 27 ' Count from 0 to 5 LOOKUP tmp,["ALLARME!! RILEVATO MOVIMENTO"],TMP1 ' Get character number B0 from string to variable B1 buff[tmp]=tmp1 'SEROUT 0,N2400,[B1] ' Send character in B1 to Pin0 serially NEXT tmp ' Do next character lungnum=27 POSIZIONE=6 GOSUB MEMOMESS FOR tmp = 0 TO 13 ' Count from 0 to 5 LOOKUP tmp,["SYSTEM STARTUP"],TMP1 ' Get character number B0 from string to variable B1 buff[tmp]=tmp1 'SEROUT 0,N2400,[B1] ' Send character in B1 to Pin0 serially NEXT tmp ' Do next character lungnum=13 POSIZIONE=7 GOSUB MEMOMESS write 1006,1 ENDIF For POSIZIONE=1 TO 7 gosub LEGGIMESS NEXT POSIZIONE gosub leggisms MEMOMASTER: READ 0,TMP IF TMP=255 THEN 'SE NON è PRESENTE IL MASTER VADO CICLICAMENTE IN CHIAMA PER UN TOTALE DI 3 MINUTI E FACCIO LAMPEGGIARE IL LED ROSSO SEROUT2 TXPC,6,["ASPETTO MASTER",13,10] FOR TMPW=0 TO 720 '60 * 3 SECONDI = 180 SECONDI = 3MINUTI IF RING=0 THEN SEROUT2 TXPC,6,[ "CHIAMATA",13,10 ] FOR TMP=0 TO 10 PAUSE 100 TOGGLE LD1 NEXT TMP GOSUB CHIAMATA POSIZIONE=1 FOR TMP=0 TO LUNGMITT numero[tmp]=MITTENTE[TMP] NEXT TMP LUNGNUM=LUNGMITT GOSUB MEMONUMERO FOR TMP=0 TO 20 TOGGLE LD1 PAUSE 100 NEXT TMP 'CLEAR ' GOSUB DORMI low ld1 GOTO MAIN1 ENDIF PAUSE 250 HIGH LD1 'DURANTE L'ATTESA DELLA CHIAMATA IL LD1 LAMPEGGIA OGNI 3 SECONDI NEXT TMPW ENDIF low LD1 MAIN1: CLEAR GOSUB STARTTIME 'COSì VARSECTOT=0 'GOSUB PIR 'GOSUB TEMPERATURA 'COSì VEDO SE C'è IL SENSORE 'GOSUB VERIFICAINGRESSI SONDAOK=1 'DICO CHE LA SONDA C'è TMP=0 OWOUT sonda, 1, [$CC, $44] OWIN sonda, 4, [CONV] TMP=TMP+1 PAUSE 3 IF TMP=250 THEN SEROUT2 txpc,6,[ "SONDA NON PRESENTE",13,10] SONDAOK=0 ' LA SONDA NON C'è NON VENIRE A LEGGERLA PIù... ENDIF READ 1009,TMP IF TMP=1 THEN RISPOSTA=1 POSIZIONE=1 gosub legginumeri FOR TMP3=0 TO LUNGNUM MITTENTE[TMP3]=NUMERO[TMP3] NEXT TMP3 LUNGMITT=LUNGNUM IF LUNGMITT<>0 AND LUNGMITT<>255 THEN frase=19 GOSUB INVIOSMS ENDIF ENDIF MAIN: ' HSEROUT ["AT+CGATT?",13] ' HSERIN 2000,EXITIMPOSTAGPRS,[wait ("+CGATT: "),TMP] ' PAUSE 500 ' IF TMP="1" THEN ' HSEROUT ["AT+CGATT=0",13] ' ENDIF ' PAUSE 500 'sleep 10 ' IF LOWPOWER=0 THEN ' INTCON3.5=0 'SEROUT2 TXPC,6,["ON OFF ",#MODULOON,13,10] 'IF MODULOON=1 THEN 'SE IL GMS è ACCESO HSEROUT ["AT+CSQ",13] HSERIN 2000,CHIAMANO,[wait ("+CSQ: "),STR BUFF\5\13] PAUSE 100 HSEROUT ["AT+CGREG?",13] '+CREG: 2,1,271C,998D PAUSE 100 HSEROUT ["AT+COPS?",13] '+COPS: 0,2,"22210" FOR TMP=0 TO 5 MNCS[TMP]=0 NEXT TMP HSERIN 2000,CHIAMANO,[WAIT ("+COPS: "),TMP,TMP,TMP,TMP,TMP,MCCS[0],MCCS[1],MCCS[2],STR MNCS\5\34] PAUSE 50 MCC=0 FOR TMP=0 TO 2 MCC=(MCC*10)+(MCCS[TMP]-48) NEXT TMP MNC=0 FOR TMP=0 TO 6 IF MNCS[TMP]<>0 THEN MNC=(MNC*10)+(MNCS[TMP]-48) ELSE TMP=7 ENDIF NEXT TMP HSEROUT ["AT+CREG?",13] HSERIN 2000,CHIAMANO,[WAIT ("+CREG: "),TMP1,TMP,TMP2,TMP,HEX4 LAC,TMP,HEX4 CID] PAUSE 100 '+CREG: 2,1,271C,998D IF TMP1<>"2" OR (TMP2<>"1" AND TMP2<>"5") THEN '5 SE è IN ROAMING 'attenzione al 2= richiedo anche le celle ' HSEROUT ["AT+CREG=1",13] ' PAUSE 1000 SEROUT2 TXPC,6,["NO ",#NONREGISTRATO,32,STR BUFF\5,13,10] NONREGISTRATO=NONREGISTRATO+1 IF NONREGISTRATO=15 THEN NONREGISTRATO=0 GOTO START ENDIF 'HIGH LD2 'PAUSE 50 'LOW LD2 else NONREGISTRATO=0 SEROUT2 TXPC,6,["REG ",STR BUFF\5,13,10] SEROUT2 TXPC,6,["MCC ",DEC MCC,13,10] 'NUMERO SEROUT2 TXPC,6,["MNC ",DEC MNC,13,10] 'NUMERO SEROUT2 TXPC,6,["LAC ",DEC LAC,13,10] 'NUMERO SEROUT2 TXPC,6,["CID ",DEC CID,13,10] 'NUMERO ENDIF GOSUB LEGGISMS ' SELECT CASE PULSANTE ' CASE 10 'PRESSIONE BREVE DI P1 ' SEROUT2 TXPC,6,["INVIO SOS",13,10] ' NOTIFICASQUILLO=1 'verificare ' MOTIVOCOORD=5 ' 'RITENTA=1 'IMPOSTANDO RITENTA=1 INVIA LE COORDINATE FINO A QUANDO NON SAREANNO DISPONIBILI ' PULSANTE=0 ' 'gosub inviocoordinate ' 'gosub REVERSEGEO ' CASE 11 'PRESSIONE LUNGA DI P1 ' 'SEROUT2 TXPC,6,["BHO",13,10] ' PULSANTE=0 ' END SELECT IF RING=0 THEN SQUILLO=1 GOTO CHIAMANO ENDIF ' IF RING=0 THEN ' SQUILLO=1 ' GOTO CHIAMANO ' ENDIF CHIAMANO: IF SQUILLO=1 or ring=0 THEN ' SEROUT2 TXPC,6,[ "CHIAMATA",13,10 ] ' GOSUB SVEGLIA GOSUB CHIAMATA SQUILLO=0 ENDIF 'ELSE 'IF PULS=0 and MODULOON=0 THEN ' IF PULS=0 THEN ' GOSUB RIAVVIA ' ENDIF 'ENDIF 'IF SE GSM è ACCESO ' READ 1020,TMP ' IF TMP=1 THEN ' MODULOON=1 ' ELSE 'SE DEVO SPEGNERE IL MODULO ' IF MODULOON=1 AND TEMPOSPEGNIMENTO=0 THEN 'SE IL MODULO è ACCESO ' READ 712,TEMPOSPEGNIMENTO ' SEROUT2 TXPC,6,[ "TEMPOSPEGNIMENTO ",#TEMPOSPEGNIMENTO,13,10 ] ' ENDIF ' ENDIF GOSUB INGRESSOATTIVAZIONE IF ATTIVATO=1 THEN INTCON = %11011000 'Abilita interrupt on GPIO change INTCON2 = %00000010 'Abilita resistenze di pull-up E INTERRUPT SU RB READ 700,TMP IF TMP=1 THEN GOSUB VERIFICAINGRESSI endif READ 701,TMP IF TMP=1 THEN GOSUB PIR endif READ 702,TMP IF TMP=1 THEN GOSUB SENSOREMOV ENDIF READ 704,TMP IF TMP=1 THEN GOSUB VERIFICABATT ENDIF 'SEROUT2 TXPC,6,[ "SONDAOK ",#SONDAOK,13,10] READ 703,TMP IF TMP=1 THEN IF SONDAOK=1 THEN GOSUB TEMPERATURA 'POSALL=5 POS 3 E 4 endif HIGH LD2 ELSE INTCON = 0 'Disabilita interrupt INTCON2 = 0 'Disabilita interrupt LOW LD2 VARIAZIONEIN=0 VARIAZIONEMOV=0 VARIAZIONEPIR=0 ENDIF 'IF TIMEINIBIZIONE1>0 OR TIMEINIBIZIONET>0 OR TIMEINIBIZIONEP>0 OR TIMEINIBIZIONEM>0 OR TEMPOSPEGNIMENTO>0 THEN IF TIMEINIBIZIONE1>0 OR TIMEINIBIZIONET>0 OR TIMEINIBIZIONEP>0 OR TIMEINIBIZIONEM>0 OR TIMEINIBIZIONEv>0 THEN GOSUB time ENDIF READ 768,TMP FOR TIMESLEEP=0 TO (tmp/2) 'diviso due perchè in realtà lo sleep dura circa 2 sec 'SEROUT2 TXPC,6,[ "TIMESLEEP ",#TIMESLEEP," TMP",#TMP,13,10] sleep 1 'PAUSE 100 IF PULS=0 OR ATTIVA=1 THEN TIMESLEEP=900 'COSì ESCO ENDIF 'IF RING=0 AND MODULOON=1 THEN IF RING=0 THEN SEROUT2 TXPC,6,[ "CHIAMATA",13,10] HSEROUT ["AT",13] pause 500 GOSUB CHIAMATA TMPW=900 'COSì VADO A VEDERE SE ERA UN SMS ENDIF NEXT TIMESLEEP GOTO MAIN RIAVVIA: SEROUT2 TXPC,6,[ "ACCENDO GSM",13,10 ] GOSUB ON_OFF GOSUB SETUP RETURN CHIAMATA: ' INTCON3.5=0 ' CHIAMA=0 SEROUT2 TXPC,6,[ "CHIAMATA",13,10] HIGH LD1 HSERIN 10000,EXITCHIAMATA,[WAIT ("+CLIP: ",34),STR MITTENTE\20] 'SE DOPO 10 SECONDI NON ARRIVA LA CHIAMATA REINVIO I SETTAGGI - IN TMP METTO IL +39 '***** FINE PROVA HIGH LD1 HIGH LD2 FOR TMP=0 TO 20 TMP1=MITTENTE[TMP] IF TMP1=34 THEN LUNGMITT=TMP-1 'SEROUT2 TXPC,6,[ "LUNGMITT1: ",#LUNGMITT,13,10] TMP=35 ENDIF NEXT TMP 'MITTENTE[0]="+" SEROUT2 TXPC,6,[ "CHIAM DA: "] FOR TMP=0 TO LUNGMITT SEROUT2 TXPC,6,[ MITTENTE[TMP]] NEXT TMP SEROUT2 TXPC,6,[ 13,10] SEROUT2 TXPC,6,[ "LUNGMITT ",#LUNGMITT,13,10 ] hserout["ATH",13] pause 1000 FOR TMP=0 TO 10 TOGGLE LD1 PAUSE 200 NEXT TMP LOW LD1 SEROUT2 TXPC,6,[ "-CHIAMATA DA: "] FOR TMP=0 TO LUNGMITT SEROUT2 TXPC,6,[ MITTENTE [TMP]] NEXT TMP SEROUT2 TXPC,6,[ 13,10] ' HSEROUT ["AT&V",13] ' PAUSE 1000 CERCAMITTENTE=1 GOSUB CERCANUMERO 'VERIFICO SE è PRESENTE 'GOSUB GESTCHIAMATA IF TROVATO=1 THEN ENDIF EXITCHIAMATA: HSEROUT ["AT",13] 'CONTROLLO CHE NON DIA L'ERRORE HSERIN 3000,RIAVVIA,[WAIT ("OK"),tMP] RETURN LEGGISMS: 'INTCON3.5=0 FOR TMP=0 TO 160 BUFF[TMP]=13 NEXT TMP ' SEROUT2 TXPC,6,[ "SMS",13,10 ] RISPOSTA=1 HSEROUT ["AT+CMGL=",34,"ALL",34,13] HSERIN 1000,EXITSMS,[SKIP 10,WAIT (34,",",34),STR MITTENTE\25\44] HSERIN 1000,EXITSMS,[SKIP 1,WAIT (34,",",34),STR ora\25\34] HSERIN 1000,LEGGISMS,[WAIT (10),STR BUFF\160\10] LOW LD1 FOR TMP=0 TO 10 TOGGLE LD1 PAUSE 200 NEXT TMP LOW LD1 SEROUT2 TXPC,6,["AT+CCLK=",34,STR ORA,34,13,10] 'ORA AZZERATA HSEROUT ["AT+CCLK=",34,STR ORA,34,13] 'ORA AZZERATA FOR TMP=0 TO 25 TMP1=MITTENTE[TMP] IF TMP1=34 THEN LUNGMITT=TMP 'SEROUT2 TXPC,6,[ "LUNGMITT1: ",#LUNGMITT,13,10 ] TMP=35 ENDIF NEXT TMP LUNGMITT=LUNGMITT-1 '****PROVA PER SPAGNA ' FOR TMP=0 TO LUNGMITT ' MITTENTE[TMP]=MITTENTE[TMP+3] ' NEXT TMP ' LUNGMITT=LUNGMITT-3 '**** FINE PROVA PER SPAGNA 'SEROUT2 TXPC,6,[ "LUNGMITT: ",#LUNGMITT,13,10 ] ' IF LOWPOWER=1 THEN ' GOSUB SVEGLIA ' ENDIF SEROUT2 TXPC,6,[ "-MITTENTE: " ] FOR TMP=0 TO LUNGMITT SEROUT2 TXPC,6,[ MITTENTE[TMP] ] NEXT TMP SEROUT2 TXPC,6,[ 13,10 ] FOR TMP=0 TO 160 'TMP1=BUFF[TMP] IF BUFF[TMP]=13 THEN LUNGMESS=TMP TMP=170 ENDIF NEXT TMP 'SEROUT2 TXPC,6,[ "LUNGMESS : ",#LUNGMESS,13,10 ] 'SEROUT2 TXPC,6,[ "BUFF[0]: ",BUFF[0],13,10 ] SEROUT2 TXPC,6,[ "-MESSAGGIO: " ] FOR TMP=0 TO LUNGMESS SEROUT2 TXPC,6,[ BUFF[TMP] ] NEXT TMP SEROUT2 TXPC,6,[ 13,10 ] FOR TMP1=0 TO 4 PWD[TMP1]=0 'AZZERO LA PASSWORD NEXT TMP1 FOR TMP=0 TO LUNGMESS 'METTO IN PWD[X] LA PASSWORD IF BUFF[TMP]=";" THEN 'SEROUT2 TXPC,6,[ "PUNTO E VIRGOLA",13,10 ] TMP=TMP+1 FOR TMP1=0 TO 4 PWD[TMP1]=BUFF[TMP+TMP1] NEXT TMP1 TMP=200 ENDIF NEXT TMP SEROUT2 TXPC,6,[ "-PWD: " ] FOR TMP=0 TO 4 SEROUT2 TXPC,6,[ PWD[TMP]] NEXT TMP SEROUT2 TXPC,6,[ 13,10 ] 'GOSUB VERIFICASMS ' SEROUT2 TXPC,6,[ "VERIFICASMS",13,10 ] CANCELLASMS: 'PAUSE 3000 ' SEROUT2 txpc,6,[ "-CANC TUTTO",13,10 ] HSEROUT ["AT+CMGD=0,4",13] 'CANCELLO TUTTI I MESSAGGI HSERIN 10000,EXITCANCELLASMS,[wait ("OK")] PAUSE 1000 EXITCANCELLASMS: CERCAMITTENTE=1 GOSUB CERCANUMERO ' IF TROVATO=0 THEN ' SEROUT2 TXPC,6,[ "-NO NUMERO",13,10 ] ' ENDIF GOSUB VERIFICAPWD IF TROVATO=1 OR PWDOK=1 THEN 'SE IL NUMERO è IN MEMORIA O LA PASSWORD è OK VADO AVANTI O IL FILTRO SU SMS è DISABILITATPO 'SEROUT2 TXPC,6,[ "TROVATO=1 OR PWDOK=1",13,10 ] MULTIMESS=1 WHILE MULTIMESS=1 ' SEROUT2 TXPC,6,[ "-MULTI",13,10] IF LUNGMITT>1 THEN GOSUB ANALIZZASMS 'pause 3000 ' RETURN ELSE MULTIMESS=0 ENDIF WEND ELSE 'SE LA PWD è KO E IL NUMERO NON è IN MEMO CONTROLLO SE HO ABILITATO L'ECHO READ 1000,TMP IF TMP<>0 THEN GOSUB INVIOECHO ENDIF ENDIF EXITSMS: 'PAUSE 200 ' SEROUT2 TXPC,6,[ "EXIT SMS",13,10 ] 'HSEROUT ["AT+CMGL=",34,"ALL",34,13] 'CONTROLLO CHE NON DIA L'ERRORE SULLA LETTURA DEL MESSAGGIO 'HSERIN 3000,RIAVVIASMS,[WAIT ("OK"),TMP] PAUSE 200 'HSEROUT ["AT+CCLK=",34,"01/01/01,",DEC2 ORAGSM,58,DEC2 MINUTIGSM,58,DEC2 SECONDIGSM,"+00",34,13] 'RIPRISTINO L'ORA PER EVITARE PROBLEMI DI TIMING 'INTCON3.5=1 RETURN 'RIAVVIASMS: ' GOSUB ON_OFF '' low LED ' GOSUB SETUP ' PAUSE 5000 'RETURN ANALIZZASMS: SEROUT2 TXPC,6,["-ANALIZZA SMS ",BUFF[0],13,10] IF BUFF[0]<>"?" THEN 'SE C'è IL ? VUOL DIRE CHE è UN MESS TIPO TR102 E ALLORA NON PUò ESSERE UN MULTIMESS FOR TMP=0 TO LUNGMESS IF BUFF[TMP]="," THEN MULTIMESS=1 POSMULTIMESS=TMP TMP=200 SEROUT2 TXPC,6,["MULTI",13,10 ] 'pause 1000 ELSE MULTIMESS=0 'SEROUT2 TXPC,6,["NON MULTIMESSAGGIO",13,10 ] ENDIF NEXT TMP ELSE MULTIMESS=0 ENDIF FRASE=0 SELECT CASE BUFF[0] CASE "A","a" SELECT CASE BUFF[1] CASE "V","v" IF BUFF[3]<>"?" THEN SEROUT2 TXPC,6,[ "MESS INIZIALE",13,10 ] TMP=BUFF[3]-48 WRITE 1009,TMP ENDIF FRASE=9 CASE "L","l" FRASE=14 SELECT CASE BUFF[3] CASE "M","m" 'allmin allmax TEMP=0 IF BUFF[7]="-" THEN TEMP.7=1 ENDIF TEMP=TEMP+((BUFF[8]-48)*10)+(BUFF[9]-48) SEROUT2 TXPC,84,[ "TEMPERATURA DI ALLARME ",#TEMP,13,10] SELECT CASE BUFF[5] CASE "N","n" 'min WRITE 1007,TEMP CASE "X","x" 'max WRITE 1008,TEMP END SELECT CASE "V","v" ' ALLVOLT:xxx BATT=((BUFF[8]-48)*100)+((BUFF[9]-48)*10)+(BUFF[10]-48) SEROUT2 TXPC,84,[ "TENSIONE DI ALLARME ",#BATT,13,10] WRITE 705,BATT END SELECT END SELECT CASE "E","e" 'ECHO:0 ECHO DISABILITATO ECHO:2 ECHO ABILITATO VERSO IL NUMERO 2 ECHO? CHIEDE COME è MESSO... IF BUFF[4]<>"?" THEN SEROUT2 TXPC,6,[ "ECHO",13,10 ] TMP=BUFF[5]-48 WRITE 1000,TMP ENDIF FRASE=24 CASE "I","i" 'INI:xx IF BUFF[3]<>"?" THEN TMP=(BUFF[4]-48)*10+(BUFF[5]-48) IF TMP>=0 AND TMP<=59 THEN SEROUT2 TXPC,6,[ "TEMPO INIB ",#TMP,13,10 ] WRITE 1016,TMP TIMEINIBIZIONE1=TMP ELSE SEROUT2 TXPC,6,[ "TEMPO NON VALIDO ",#TMP,13,10 ] ENDIF ENDIF FRASE=4 CASE "L","l" 'LIV:A IF BUFF[3]<>"?" THEN SELECT CASE BUFF[4] CASE "A","a" WRITE 1018,0 CASE "B","b" WRITE 1018,1 CASE "V","v" WRITE 1018,2 END SELECT ENDIF FRASE=4 CASE "N","n" SELECT CASE BUFF[1] CASE "U","u" SEROUT2 TXPC,6,[ "-NUM",13,10 ] POSIZIONE=BUFF[3]-48 'NUMx+393355760937;12345 PER LA SPAGNA MEMORIZZO ANCHE IL, +34 IF BUFF[4]="+" THEN 'SE IL MESSAGGIO è NUMx+39... TMP1=((POSIZIONE-1)*19) read tmp1,tmp IF TMP=255 OR PWDOK=1 THEN ' SE IN QUELLA POSIZIONE NON C'è NESSUN NUMERO O LA PASSOWRD è CORRETTA ALLORA MEMROIZZO IL MESS SEROUT2 TXPC,6,["-CANC POS ",#POSIZIONE,13,10 ] FOR TMP=0 TO 18 TMP1=((POSIZIONE-1)*19+TMP) WRITE TMP1,255 NEXT TMP FOR TMP=4 TO LUNGMESS 'SEROUT2 TXPC,6,[ "TMP ",#TMP,13,10 ] IF BUFF[TMP]="," OR BUFF[TMP]=";" OR TMP=LUNGMESS THEN 'SE TROVO IL ; O FINISCO IL MESS VUOL DIRE CHE IL MESS è FINITO E SLAVO IL NUMERO LUNGNUM=TMP-1-4 'SEROUT2 TXPC,6,["-LUNGNUM ",#lungnum,13,10 ] GOSUB MEMONUMERO FRASE=2 TMP=200 'SERVE PER USCIR DAL CICLO DI FOR ELSE NUMERO[TMP-4]=BUFF[TMP] SEROUT2 TXPC,6,[ NUMERO[TMP-4] ] ENDIF NEXT TMP ELSE FRASE=1 ENDIF ELSE FRASE=2 if BUFF[3]<>"?" then 'SE IL MESSAGGIO è NUMx SEROUT2 TXPC,6,["-CANC POS ",#POSIZIONE,13,10 ] FOR TMP=0 TO 18 TMP1=((POSIZIONE-1)*19+TMP) WRITE TMP1,255 NEXT TMP endif ENDIF CASE "A","a" 'NAME SEROUT2 TXPC,6,["NOME ",13,10 ] IF BUFF[4]=":" THEN FOR TMP=0 TO 30 tmp2=tmp+5 IF BUFF[TMP2]="," OR BUFF[TMP2]=";" OR TMP2=LUNGMESS THEN 'SE TROVO IL ; O FINISCO IL MESS VUOL DIRE CHE IL MESS è FINITO E SLAVO IL NUMERO WRITE 751+TMP,"#" tmp=31 ELSE WRITE 751+TMP,BUFF[TMP2] SEROUT2 TXPC,6,[BUFF[TMP2]] ENDIF NEXT TMP ENDIF FRASE = 23 END SELECT CASE "P","p" SELECT CASE BUFF[1] CASE "W","w" SEROUT2 TXPC,6,["-PWD"] IF PWDOK=1 THEN 'SEROUT2 TXPC,6,[ "-CAMBIO PWD",13,10] FOR TMP=0 TO 4 WRITE (1001+TMP),BUFF[3+TMP] ' SEROUT2 TXPC,6,[ BUFF[3+TMP]] NEXT TMP ' SEROUT2 TXPC,6,[ 13,10 ] FRASE=3 ELSE FRASE=1 ENDIF END SELECT CASE "R","r" 'RES SELECT CASE BUFF[1] CASE "E","e" 'VERIFICARE if PWDOK=1 then SEROUT2 TXPC,6,[ "-RESET",13,10 ] WRITE 1001,"1" WRITE 1002,"2" WRITE 1003,"3" WRITE 1004,"4" WRITE 1005,"5" WRITE 1006,0 WRITE 1007,1 WRITE 1021,255 WRITE 1023,0 WRITE 700,0 WRITE 709,"S" WRITE 710,"S" WRITE 703,0 WRITE 704,14 WRITE 705,100 WRITE 712,30 frase=20 ELSE FRASE=1 endif CASE "I","i" 'rips ' if BUFF[2]="P" OR BUFF[2]="p" THEN ' IF BUFF[3]<>"?" THEN ' SEROUT2 TXPC,6,[ "-RIPRISTINO",13,10 ] ' TMP=BUFF[3]-48 ' WRITE 1009,TMP ' ENDIF ' ELSE SEROUT2 TXPC,6,[ "-NO RISP",13,10 ] RISPOSTA=0 ' ENDIF END SELECT CASE "O","o" 'OSS:XX IF BUFF[3]<>"?" THEN TMP=(BUFF[4]-48)*10+(BUFF[5]-48) IF TMP>=0 AND TMP<=59 THEN SEROUT2 TXPC,84,[ "TEMPO OSS ",#TMP,13,10 ] WRITE 1014,TMP ENDIF ENDIF FRASE=4 CASE "S","s" 'SMS 'SPIR SMOV STEM SING 'IF BUFF[1]="M" or BUFF[1]="m" THEN 'SMs select case buff[2] case "S","s" FRASE=2 SEROUT2 TXPC,6,[ "-SMS",13,10] FOR TMP=0 TO LUNGMESS IF BUFF[TMP]=":" THEN POSPUNTI=TMP TMP=200 SEROUT2 TXPC,6,[ ": ",#POSPUNTI,13,10 ] pause 1000 ELSE FRASE=0 'SEROUT2 TXPC,6,[ "NON MULTIMESSAGGIO",13,10] ENDIF NEXT TMP READ 1021,TMP3 GOSUB CALCOLANUM WRITE 1021,TMP3 FRASE=2 case "E","e" 'SLeEP:xxx FRASE=8 TMP=(BUFF[6]-48)*100+(BUFF[7]-48)*10+(BUFF[8]-48) write 768,tmp CASE "I","i" ' SAi TMP=BUFF[4]-48 WRITE 700,TMP FRASE=6 TIMEINIBIZIONE1=0 CASE "P","p" ' SAp:0 TMP=BUFF[4]-48 WRITE 701,TMP FRASE=6 VARIAZIONEPIR=0 TIMEINIBIZIONEP=0 CASE "M","m" ' SAm TMP=BUFF[4]-48 WRITE 702,TMP FRASE=6 VARIAZIONEMOV=0 TIMEINIBIZIONEM=0 CASE "B","b" ' SAb TMP=BUFF[4]-48 WRITE 704,TMP FRASE=6 TIMEINIBIZIONEV=0 CASE "T","t" ' SAt TMP=BUFF[4]-48 WRITE 703,TMP FRASE=6 TIMEINIBIZIONET=0 CASE "L","l" 'SAl PER RICHIEDERE COME SONO MESSI I SENSORI FRASE=6 END SELECT CASE "T","t" SELECT CASE BUFF[1] CASE "A","a" 'TATT TMP=(BUFF[5]-48)*10+(BUFF[6]-48) write 711,tmp FRASE=7 ' CASE "D","d" 'TDEA ' TMP=(BUFF[5]-48)*10+(BUFF[6]-48) ' write 712,tmp ' FRASE=7 CASE "E","e" 'TEMPERATURA FRASE=11 CASE "R","r" 'TRES RESET MIN E MAX WRITE 1010,127 'TEMPERATURA MINIMA RAGGIUNTA WRITE 1011,255 'TEMPERATURA MASSIMA RAGGIUNTA FRASE=12 ' CASE "L","l" 'TLO ' POSIZIONE=1 ' FOR TMP=4 TO LUNGMESS ' 'SEROUT2 P2,84,[ "TMP ",#TMP,13,10 ] ' IF BUFF[TMP]=";" OR TMP=LUNGMESS THEN 'SE TROVO IL ; O FINISCO IL MESS VUOL DIRE CHE IL MESS è FINITO E SLAVO IL NUMERO ' LUNGNUM=TMP-4 ' SEROUT2 TXPC,84,[ "LUNGNUM ",#lungnum,13,10 ] ' 'POSIZIONE=1 ' FOR TMP=LUNGNUM TO 250 ' BUFF[TMP]=255 ' NEXT TMP ' GOSUB MEMOMESS ' FRASE=15 ' TMP=200 'SERVE PER USCIR DAL CICLO DI FOR ' ELSE ' BUFF[TMP-4]=BUFF[TMP] ' SEROUT2 TXPC,84,[ BUFF[TMP-4] ] ' ENDIF ' NEXT TMP ' CASE "H","h" 'THI ' POSIZIONE=2 ' FOR TMP=4 TO LUNGMESS ' 'SEROUT2 P2,84,[ "TMP ",#TMP,13,10 ] ' IF BUFF[TMP]=";" OR TMP=LUNGMESS THEN 'SE TROVO IL ; O FINISCO IL MESS VUOL DIRE CHE IL MESS è FINITO E SLAVO IL NUMERO ' LUNGNUM=TMP-4 ' SEROUT2 TXPC,84,[ "LUNGNUM ",#lungnum,13,10 ] ' 'POSIZIONE=1 ' FOR TMP=LUNGNUM TO 250 ' BUFF[TMP]=255 ' NEXT TMP ' GOSUB MEMOMESS ' FRASE=15 ' TMP=200 'SERVE PER USCIR DAL CICLO DI FOR ' ELSE ' BUFF[TMP-4]=BUFF[TMP] ' SEROUT2 TXPC,84,[ BUFF[TMP-4] ] ' ENDIF ' NEXT TMP CASE "I","i" 'TIN TIZ SELECT CASE BUFF[2] CASE "N","n" POSIZIONE=0 SELECT CASE BUFF[3] CASE "1" 'TINI1H TINI1L IF BUFF[4]="H" OR BUFF[4]="h" THEN POSIZIONE=1 ELSE POSIZIONE=2 ENDIF CASE "P","p" 'TINPIR POSIZIONE=5 CASE "M","m" 'TINMOV POSIZIONE=6 CASE "T","t" 'TINTEh IF BUFF[5]="H" OR BUFF[5]="h" THEN POSIZIONE=3 ELSE POSIZIONE=4 ENDIF END SELECT IF POSIZIONE<>0 THEN FOR TMP=7 TO LUNGMESS 'SEROUT2 TXPC,6,[ "TMP ",#TMP,10,13 ] IF BUFF[TMP]=";" OR TMP=LUNGMESS THEN 'SE TROVO IL ; O FINISCO IL MESS VUOL DIRE CHE IL MESS è FINITO E SLAVO IL NUMERO LUNGNUM=TMP-6 SEROUT2 TXPC,6,[ "LUNGNUM ",#lungnum,13,10 ] 'POSIZIONE=1 FOR TMP=LUNGNUM TO 250 BUFF[TMP]=255 NEXT TMP GOSUB MEMOMESS FRASE=15 TMP=200 'SERVE PER USCIR DAL CICLO DI FOR ELSE BUFF[TMP-6]=BUFF[TMP] SEROUT2 TXPC,6,[ BUFF[TMP-6] ] ENDIF NEXT TMP ENDIF FRASE=15 CASE "Z","z" 'TIZ:0 IF BUFF[3]<>"?" THEN TMP=BUFF[4]-48 WRITE 1012,TMP ENDIF FRASE=4 end select CASE "S","s" 'TSU FOR TMP=4 TO LUNGMESS 'SEROUT2 P2,84,[ "TMP ",#TMP,13,10 ] IF BUFF[TMP]=";" OR TMP=LUNGMESS THEN 'SE TROVO IL ; O FINISCO IL MESS VUOL DIRE CHE IL MESS è FINITO E SLAVO IL NUMERO LUNGNUM=TMP-4 SEROUT2 TXPC,84,[ "LUNGNUM ",#lungnum,13,10 ] POSIZIONE=7 FOR TMP=LUNGNUM TO 250 BUFF[TMP]=255 NEXT TMP GOSUB MEMOMESS FRASE=15 TMP=200 'SERVE PER USCIR DAL CICLO DI FOR ELSE BUFF[TMP-4]=BUFF[TMP] SEROUT2 TXPC,84,[ BUFF[TMP-4] ] ENDIF NEXT TMP FRASE=15 END SELECT CASE "V","v" SELECT CASE BUFF[1] CASE "E","e" 'VER? IF BUFF[3]="?" THEN FRASE=29 ENDIF CASE "O","o" 'VOLT? GOSUB TENS FRASE=21 END SELECT END SELECT ' IF POS=0 THEN ' GOSUB INVIOSMS ' POS=0 ' ENDIF IF RISPOSTA=1 AND FRASE<>0 THEN 'SE RICHIEDO LA RISPOSTA INVIO SMS SE LA FRASE=0 NON INVIO WRITE 200+FRASE,1 ' SCRIVO IN MEMORIA CHE DEVO RISPONDERE ' SEROUT2 TXPC,6,[ "SALVO IN MEMORIA L'INVIO DELLA FRASE ",#FRASE,13,10 ] IF MULTIMESS=0 THEN 'SE HO FINITO I MULTIMESSAGGI VADO A RISPONDERE GOSUB PREPARAINVIOSMS ENDIF ENDIF IF MULTIMESS=1 THEN FOR TMP=0 TO LUNGMESS BUFF[TMP]=BUFF[TMP+POSMULTIMESS+1] NEXT TMP SEROUT2 TXPC,6,[ "-MESSAGGIO: " ] FOR TMP=0 TO LUNGMESS SEROUT2 TXPC,6,[ BUFF[TMP] ] NEXT TMP SEROUT2 TXPC,6,[ 13,10 ] ENDIF RETURN 'RILEGGIIMP: ' POLLTIMEC=0 ' READ 704,POLLTIMECh 'RILEGGO IL TEMPO IMPOSTATO ' READ 705,POLLTIMECl ' POLLTIMEC=POLLTIMEC+GSMSECTOT ' SEROUT2 TXPC,6,[ "POLLTIMEC ",#POLLTIMEC,13,10] ' IF POLLTIMEC>=86399 THEN 'SE SFORO LE 23:59:59 ALLORA RIAZZERO ' POLLTIMEC=POLLTIMEC-86399 ' OVERDAYC=1 ' ENDIF 'RETURN PREPARAINVIOSMS: 'SEROUT2 TXPC,6,[ "PREPARAINVIOSMS",13,10] FOR ADDRL2=200 TO 300 'VERIFICO DALLA LOCAZIONE 200 ALLA 400 QUALI MESSA DEVO INVIARE READ ADDRL2,TMP IF TMP=1 THEN 'HO TROVATO IL MESS FRASE=ADDRL2-200 ' SEROUT2 TXPC,6,[ "TROVATO NELLA LOCAZIONE ",#ADDRL2," LA FRASE ",#FRASE,13,10] IF FRASE=99 THEN 'GOSUB INVIOCOORDINATE ELSE GOSUB INVIOSMS ENDIF ENDIF NEXT ADDRL2 'SEROUT2 TXPC,6,[ "CANCELLO LA MEMORIA",13,10 ] FOR ADDRL2=200 TO 300 WRITE ADDRL2,0 'SEGNO CHE HO INVIATO TUTTI I MESS NEXT ADDRL2 RETURN VERIFICAPWD: SEROUT2 TXPC,6,[ "VERIFICAPWD",13,10] PWDOK=0 ERR1=0 For TMP=0 TO 4 READ (1001+TMP),DATO SEROUT2 TXPC,6,[ "PWD ",DATO, " PWDR ",PWD[TMP],13,10] IF PWD[TMP]<>DATO THEN ERR1=1 EndIF Next TMP IF ERR1=0 Then PWDOK=1 ENDIF RETURN CALCOLANUM: 'SEROUT2 TXPC,6,[ "-NUMERI LETTI ",BIN TMP3,13,10 ] 'SEROUT2 TXPC,6,[ "-BUFF3 ",BUFF[3],13,10] FOR TMP=3 TO POSPUNTI IF BUFF[TMP]>48 AND BUFF[TMP]<57 THEN 'PORTO AD UNO IL BIT PERTANTO è COME SE FOSSE ON TMP1=BUFF[TMP]-48-1 'TOLGO 48 PER TRASFORMARLO IN UN NUMERO E TOLGO 1 PER PERCHè CONTO DA 0 'SEROUT2 TXPC,6,[ "-TMP1 ",#TMP1,13,10] TMPW=%00000001 FOR TMP2=1 TO TMP1 TMPW=TMPW<<1 NEXT TMP2 'SEROUT2 TXPC,6,[ "-TMPW ",BIN TMPW,13,10 ] TMP3 = TMP3 | TMPW ' Set bit TMPW of TMP 'PORTO AD 1 IL BIT 'SEROUT2 TXPC,6,[ "-NUMERI ON ",BIN TMP3,13,10 ] 'SEROUT2 TXPC,6,[ "-ON OFF ",BUFF[POSPUNTI+2],13,10 ] IF BUFF[POSPUNTI+2]="F" OR BUFF[POSPUNTI+2]="f" THEN 'VERIFICO SE è OFF 'SE OFF RIPORTO A ZERO IL BIT TMP3 = TMP3 ^ TMPW 'SEROUT2 TXPC,6,[ "-NUMERI OFF ",BIN TMP3,13,10 ] ENDIF ENDIF NEXT TMP RETURN LEGGINUMERI: SEROUT2 TXPC,6,["LEGGI NUMERI ",13,10] FOR TMPL=0 TO 19 NUMERO[TMPL]=0 NEXT TMPL 'SEROUT2 TXPC,6,[ "1 NUMERO -$GPRMC",STR D\75,13,10 ] FOR TMPL=0 TO 19 TMPL1=((POSIZIONE-1)*20+TMPL) READ TMPL1,DATO IF DATO<>255 THEN NUMERO[TMPL]=DATO ELSE LUNGNUM=TMPL-1 'SEROUT2 TXPC,6,[ "LUNGNUM ",#LUNGNUM,13,10] RETURN TMPL=25 ENDIF NEXT TMPL RETURN INVIOECHO: SEROUT2 TXPC,84, ["Echo on number: "] FOR TMP3=0 TO LUNGMITT 'METTO IN MITTENTEECHO CHI HA INVIATO L'SMS MITTENTEECHO[TMP3]=MITTENTE[TMP3] NEXT TMP3 LUNGMITTECHO=LUNGMITT read 1000,POSIZIONE gosub LEGGINUMERI SEROUT2 TXPC,84, ["Pos",#POSIZIONE," ",STR NUMERO\LUNGNUM+1,13] FOR TMP3=0 TO LUNGNUM MITTENTE[TMP3]=NUMERO[TMP3] NEXT TMP3 LUNGMITT=LUNGNUM IF LUNGMITT<>0 AND LUNGMITT<>255 THEN FRASE=25 GOSUB INVIOSMS ENDIF RETURN INVIOSMSALLARME: ' HIGH LED read 1021,NUMERISMS SEROUT2 TXPC,84,[ "TMP ",BIN NUMERISMS,13,10] TMPW=%00000001 for tmp1=0 to 7 tmp2 = NUMERISMS & tmpw ' Isolate bit TMP1 of TMP SEROUT2 TXPC,84,[ "NUMERI ISOLATO ",BIN TMP2,13,10 ] IF TMP2<>0 THEN POSIZIONE=TMP1+1 gosub legginumeri FOR TMP3=0 TO LUNGNUM MITTENTE[TMP3]=NUMERO[TMP3] NEXT TMP3 LUNGMITT=LUNGNUM IF LUNGMITT<>0 AND LUNGMITT<>255 THEN GOSUB INVIOSMS ENDIF ENDIF TMPW=TMPW<<1 NEXT TMP1 RETURN INVIOSMS: ' SEROUT2 TXPC,6,[ "INVIOSMS INTCON ",bin8 INTCON,13,10 ] ' SEROUT2 TXPC,6,[ "INVIOSMS INTCON2 ",bin8 INTCON2,13,10 ] ' SEROUT2 TXPC,6,[ "INVIOSMS INTCON3 ",bin8 INTCON3,13,10,13,10 ] 'HSEROUT ["AT+CNMI=3,0,0,0",13] TENTATIVI=0 REINVIOSMS: ' SEROUT2 TXPC,6,[ "INVIO FRASE ",#FRASE,13,10 ] HIGH LD1 hserout ["ATE0",13] SEROUT2 TXPC,6,[ "ECHO OFF",13,10 ] PAUSE 2000 ' SEROUT2 TXPC,6,[ "REINVIOSMS INTCON ",bin8 INTCON,13,10 ] ' SEROUT2 TXPC,6,[ "REINVIOSMS INTCON2 ",bin8 INTCON2,13,10 ] SEROUT2 TXPC,6,[ "INVIO SMS A ",STR MITTENTE\(LUNGMITT+1),13,10 ] hserout ["AT+CMGS=",34,STR MITTENTE\(LUNGMITT+1),34,13] HSERIN 2000,EXITINVIOSMS,[wait (">")] PAUSE 200 CAMBIOFRASE: SELECT CASE FRASE CASE 0 hserout ["Wrong SMS"] CASE 1 hserout ["Insert PWD"] CASE 2 IF PWDOK=1 THEN TMPW=%00000001 FOR POSIZIONE=1 TO 8 gosub LEGGINUMERI READ 1021,TMP tmp2 = tmp & tmpw ' Isolate bit TMP1 of TMP 'SEROUT2 TXPC,6,[ "-NUMERI ISOLATO ",BIN TMP2,13,10] IF TMP2<>0 THEN tmp3="S" else tmp3=32 ENDIF TMPW=TMPW<<1 hserout ["Pos",#POSIZIONE," ",TMP3," ",STR NUMERO\LUNGNUM+1,13] NEXT POSIZIONE ELSE FRASE=1 GOTO CAMBIOFRASE ENDIF CASE 3 hserout ["PWD modified"] CASE 4 hserout ["IN 1:",13,"Allarm "] read 1018,tmp SELECT CASE TMP CASE 0 hserout ["on voltage presence",13] CASE 1 hserout ["on voltage absence",13] CASE 2 hserout ["on variation",13] end select read 1016,tmp hserout ["T ini ",#tmp," min",13] READ 1012,TMP IF TMP=0 THEN hserout ["Reset T ini OFF",13] ELSE hserout ["Reset T ini ON",13] ENDIF read 1014,tmp hserout ["T oss ",#tmp," sec",13] CASE 5 POSIZIONE=POSALL SEROUT2 TXPC,6,[ "POSIZIONE ",#POSIZIONE,13,10 ] GOSUB LEGGIMESS CASE 6 READ 700,TMP hserout ["Input "] if tmp=0 then hserout ["off ",13] else hserout ["on ",13] endif READ 701,TMP hserout ["PIR "] if tmp=0 then hserout ["off ",13] else hserout ["on ",13] endif READ 702,TMP hserout ["Move "] if tmp=0 then hserout ["off ",13] else hserout ["on ",13] endif READ 703,TMP hserout ["Temperature "] if tmp=0 then hserout ["off ",13] else hserout ["on ",13] endif READ 704,TMP hserout ["Voltage "] if tmp=0 then hserout ["off ",13] else hserout ["on ",13] endif CASE 7 read 711,tmp hserout ["Activation time ",#tmp," sec",13] 'read 712,tmp 'hserout ["Disactivation time ",#tmp," sec",13] CASE 8 READ 768,TMP hserout ["Sleep time: ",#tmp," sec"] CASE 9 READ 1009,TMP if tmp=0 then hserout ["Startup message disabled"] else hserout ["Startup message enabled"] endif CASE 10 CASE 11 gosub temperatura hserout ["Temperature "] IF TEMP.7=0 THEN hserout [ "+"] ELSE hserout [ "-"] ENDIF hserout [#TmpW1,",",DEC2 TMPw," C",13] hserout [ "MIN Temperature "] READ 1010,TMP IF TMP.7=0 THEN hserout [ "+"] ELSE hserout [ "-"] ENDIF TMP.7=0 hserout [#TMP,13 ] hserout [ "MAX Temperature "] READ 1011,TMP IF TMP.7=0 THEN hserout [ "+"] ELSE hserout [ "-"] ENDIF TMP.7=0 hserout [#TMP,13 ] case 12 'gosub temperatura hserout ["LOW VOLTAGE",13] hserout ["Power voltage: ",#BATT," mV"] case 13 'gosub temperatura hserout ["Temperature stored, deleted",13] CASE 14 hserout ["Temperature alarm ",13] hserout [ "MIN "] READ 1007,TMP IF TMP.7=0 THEN hserout [ "+"] ELSE hserout [ "-"] ENDIF TMP.7=0 hserout [#TMP,13 ] hserout [ "MAX "] READ 1008,TMP IF TMP.7=0 THEN hserout [ "+"] ELSE hserout [ "-"] ENDIF TMP.7=0 hserout [#TMP,13 ] hserout ["Voltage alarm ",13] READ 705,TMP hserout [#(tmp/10)] hserout ["."] hserout [#tmp-((tmp/10)*10)] hserout ["mV"] CASE 15 hserout ["Message stored",13] CASE 16 hserout ["GPRS parameters:",13,"APN: "] FOR TMP=0 TO 30 READ 500+TMP,TMP1 IF TMP1<>"#" AND TMP1<>255 THEN HSEROUT [TMP1] ELSE TMP=31 ENDIF NEXT TMP IF PWDOK=1 THEN hserout [13,"Username: "] FOR TMP=0 TO 30 READ 530+TMP,TMP1 IF TMP1<>"#" AND TMP1<>255 THEN HSEROUT [TMP1] ELSE TMP=31 ENDIF NEXT TMP hserout [13,"Password: "] FOR TMP=0 TO 30 READ 560+TMP,TMP1 IF TMP1<>"#" AND TMP1<>255 THEN HSEROUT [TMP1] ELSE TMP=31 ENDIF NEXT TMP else hserout [13,"To view GPRS parameters, enter the password"] endif case 19 posizione=7 'indica la posizione da cui leggere il messaggio GOSUB LEGGIMESS CASE 20 hserout ["Reset"] CASE 21 hserout ["Power voltage: ",#BATT," mV"] CASE 22 hserout ["GSM IMEI: "] FOR TMP=0 TO 20 READ 730+TMP,TMP1 IF TMP1<>"#" AND TMP1<>255 THEN HSEROUT [TMP1] ELSE TMP=31 ENDIF NEXT TMP CASE 23 hserout ["Name: "] FOR TMP=0 TO 20 READ 751+TMP,TMP1 IF TMP1<>"#" AND TMP1<>255 THEN HSEROUT [TMP1] ELSE TMP=31 ENDIF NEXT TMP CASE 24 IF PWDOK=1 THEN hserout ["Echo on number: "] read 1000,POSIZIONE gosub LEGGINUMERI hserout ["Pos",#POSIZIONE," ",STR NUMERO\LUNGNUM+1,13] ELSE FRASE=1 GOTO CAMBIOFRASE ENDIF CASE 25 hserout ["Echo",13,"Sender:",13] FOR TMP3=0 TO LUNGMITTECHO HSEROUT [MITTENTEECHO[TMP3]] NEXT TMP3 hserout ["Text:",13] FOR TMP=0 TO LUNGMESS HSEROUT [ BUFF[TMP] ] NEXT TMP CASE 28 hserout ["ATTENTION!!! SOS MESSAGE!!!"] CASE 29 hserout ["Ver Firmware ",#VER] ' next POSIZIONEGEO CASE 30 IF BUFF[3]<>0 THEN 'CONTROLLO ANCHE CHE BUFF NON SIA VUOTO SEROUT2 TXPC,6,["Probable position: ",STR BUFF\100] HSEROUT ["Probable position: ",STR BUFF\100] ENDIF END SELECT hserout [26] ' TENTATIVI=TENTATIVI+1 ' IF TENTATIVI=3 THEN ' PAUSE 3000 ' GOTO EXITINVIOSMS ' ENDIF hserin 10000,EXITINVIOSMS,[WAIT("O"),TMP] 'hserin 10000,REINVIOSMS,[WAIT("OK")] SEROUT2 TXPC,6,["-SMS INVIATO",13,10 ] TENTATIVI=5 PAUSE 1000 EXITINVIOSMS: TENTATIVI=TENTATIVI+1 IF TENTATIVI<3 THEN REINVIOSMS TENTATIVI=0 hserout ["ATE1",13] SEROUT2 TXPC,6,[ "ABILITO L'ECHO",13,10 ] LOW LD1 'SEROUT2 TXPC,6,[ "1 EXITINVIOSMS -$GPRMC",STR DAT\75,13,10 ] RETURN SCELTAFORMATO: 'S SMS E Email U URL 3 SMS+Email 4 SMS+URL 5 Email+URL 9 SMS+Email+URL SELECT CASE TMP CASE "S","s" 'SMS hserout ["SMS"] CASE "E","e" 'EMAIL hserout ["EMAIL"] CASE "3" 'SMS & EMAIL hserout ["SMS & EMAIL"] CASE "M","m" 'rispondi al mittente hserout ["CALLER"] CASE ELSE hserout ["Not defined"] END SELECT RETURN MEMONUMERO: SEROUT2 TXPC,6,[ "-MEM POS ",#POSIZIONE,13,10] FOR TMP=0 TO LUNGNUM TMP1=((POSIZIONE-1)*20+TMP) WRITE TMP1,NUMERO[TMP] NEXT TMP ' SEROUT2 TXPC,6,[ "-NUMERO SALVATO "] ' FOR TMP=0 TO 20 ' TMP1=((POSIZIONE-1)*20+TMP) ' READ TMP1,TMPW ' SEROUT2 TXPC,6,[TMPW] ' NEXT TMP ' SEROUT2 TXPC,6,[13,10] RETURN CERCANUMERO: IF CERCAMITTENTE=1 THEN FOR TMP=0 TO LUNGMITT NUMERO[TMP]=MITTENTE[TMP] NEXT TMP LUNGNUM=LUNGMITT CERCAMITTENTE=0 ENDIF SEROUT2 TXPC,6,["-Cerca NUMERO "] FOR TMP=0 TO (LUNGNUM+1) SEROUT2 TXPC,6,[numero[tmp]] NEXT TMP SEROUT2 TXPC,6,[13,10] TROVATO=0 POSTROVATO=99 For TMP1=0 TO 100 Read TMP1,DATO 'DEBUG"DATO ",DATO," POS ",#TMP1,13,10 IF DATO=numero[0] Then POSTROVATO=TMP1/20 For TMP2=0 TO LUNGNUM TMPW=TMP2+TMP1 Read TMPW,DATO 'DEBUG "DATO LETTO ",DATO," NUMERO ",NUMERO[TMP2],13,10 IF DATO<>numero[TMP2] Then POSTROVATO=99 GoTo SALTA EndIF Next TMP2 SEROUT2 TXPC,6,["TROVATO IN ",#POSTROVATO,13,10] TROVATO=1 Return EndIF SALTA: Next TMP1 RETURN LEGGIMASTER: SEROUT2 TXPC,6,["-LEGGO MASTER",13,10] FOR TMP=0 TO 20 READ TMP,DATO IF DATO<>255 THEN MITTENTE[TMP]=DATO ELSE LUNGMITT=TMP-1 TMP=21 ENDIF NEXT TMP SEROUT2 TXPC,6,[ "-MASTER: "] FOR TMP=0 TO LUNGMITT SEROUT2 TXPC,6,[ MITTENTE [TMP]] NEXT TMP SEROUT2 TXPC,6,[ 13,10] RETURN 'LEGGIEMAIL: ' ' SEROUT P2,2,["LEGGO MAIL",13,10] ' FOR TMP=100 TO 200 ' READ TMP,DATO ' IF DATO<>"," THEN ' MITTENTE[TMP-100]=DATO ' ELSE ' LUNGMITT=TMP-101 ' TMP=201 ' ENDIF ' NEXT TMP 'RETURN STARTTIME: 'SERVE PER RESETTARE LE VARIABILE DEL TIME GOSUB TIME PAUSE 1000 GOSUB TIME 'gosub RILEGGIIMP RETURN TIME: HSEROUT ["AT+CCLK?",13] 'ORA +CCLK: "01/01/01,00:08:34+00" HSERIN 2000,EXITTIME,[WAIT (": "),SKIP 7,WAIT (","),DEC2 ORAGSM,TMP,DEC2 MINUTIGSM,TMP,DEC2 SECONDIGSM] HSERIN 2000,EXITTIME,[WAIT ("OK")] GSMSECTOT=((ORAGSM*60)*60)+(MINUTIGSM*60)+SECONDIGSM SEROUT2 txpc,6,[ "GSMSECTOT=",#GSMSECTOT,13,10] GSMSEC=(MINUTIGSM*60)+SECONDIGSM GSMMIN=(ORAGSM*60)+MINUTIGSM VARSEC=0 VARMIN=0 IF GSMSEC>GSMSECOLD THEN VARSEC=GSMSEC-GSMSECOLD ENDIF IF GSMMIN>GSMMINOLD THEN VARMIN=GSMMIN-GSMMINOLD ENDIF GSMSECOLD=GSMSEC GSMMINOLD=GSMMIN 'IF TIMEINIBIZIONE1>0 OR TIMEINIBIZIONET>0 OR TIMEINIBIZIONEP>0 OR TIMEINIBIZIONEM>0 or TEMPOSPEGNIMENTO>0 THEN IF TIMEINIBIZIONE1>0 OR TIMEINIBIZIONET>0 OR TIMEINIBIZIONEP>0 OR TIMEINIBIZIONEM>0 OR TIMEINIBIZIONEv>0 THEN GOSUB GESTINIBIZIONE ENDIF EXITTIME: RETURN PIR: IF VARIAZIONEPIR=1 THEN VARIAZIONEPIR=0 IF TIMEINIBIZIONEP=0 THEN SEROUT2 txpc,6,[ "PIR",13,10] ' if MODULOON=0 THEN ' SEROUT2 TXPC,6,[ "ACCENDO GSM",13,10 ] '' GOSUB ON_OFF '' GOSUB SETUP ' ENDIF PAUSE 500 POSALL=5 GOSUB STARTTIME READ 1016,TIMEINIBIZIONEP SEROUT2 TXPC,6,[ "TIMEINIBIZIONEP ",#TIMEINIBIZIONEP,13,10] frase=5 GOSUB INVIOSMSALLARME LOW LD1 ENDIF ENDIF RETURN SENSOREMOV: IF VARIAZIONEMOV=1 THEN VARIAZIONEMOV=0 IF TIMEINIBIZIONEM=0 THEN SEROUT2 TXPC,6,[ "MOVIMENTO",13,10 ] ' if MODULOON=0 THEN ' SEROUT2 TXPC,6,[ "ACCENDO GSM",13,10 ] '' GOSUB ON_OFF '' GOSUB SETUP ' ENDIF PAUSE 500 POSALL=6 GOSUB STARTTIME READ 1016,TIMEINIBIZIONEM SEROUT2 TXPC,6,[ "TIMEINIBIZIONEM ",#TIMEINIBIZIONEM,13,10] frase=5 GOSUB INVIOSMSALLARME LOW LD1 ENDIF ENDIF RETURN INGRESSOATTIVAZIONE: IF ATTIVA=0 THEN IF ATTIVATO=1 THEN 'SE PREMO L'INGRESSO E è ATTIVATO L'ALLARME ATTIVATO=0 ' READ 711,TEMPO ' FOR TMP=0 TO TEMPO ' IF ATTIVA=1 THEN ' SEROUT2 txpc,6,[ "RESET FOR",13,10] ' ATTIVATO=1 ' TMP=TEMPO ' ENDIF ' TOGGLE LD2 ' PAUSE 500 ' SEROUT2 txpc,6,[ "TEMPO PER DISATTIVAZIONE ",#TMP," TO TEMPO ",#TEMPO,13,10] ' NEXT TMP for tmp=0 to 5 TOGGLE LD2 PAUSE 200 NEXT TMP LOW LD2 SEROUT2 txpc,6,[ "ALLARME DISATTIVATO",13,10] PAUSE 500 ENDIF ELSE IF ATTIVATO=0 THEN 'SE APRO L'INGRESSO E L'ALLARME è DISATTIVATO ATTIVATO=1 READ 711,TEMPO FOR TMP=0 TO TEMPO IF ATTIVA=0 THEN SEROUT2 txpc,6,[ "RESET FOR",13,10] ATTIVATO=0 TMP=TEMPO ENDIF TOGGLE LD2 PAUSE 500 SEROUT2 txpc,6,[ "TEMPO PER ATTIVAZIONE ",#TMP," TO TEMPO ",#TEMPO,13,10] NEXT TMP IF ATTIVATO=1 THEN SEROUT2 txpc,6,[ "ALLARME ATTIVATO",13,10] ELSE SEROUT2 txpc,6,[ "ALLARME DISATTIVATO",13,10] ENDIF PAUSE 500 ENDIF ENDIF RETURN VERIFICABATT: GOSUB TENS READ 705,TMP BATTR=BATT/100 IF BATTR<TMP and TIMEINIBIZIONEv=0THEN GOSUB STARTTIME READ 1016,TIMEINIBIZIONEV SEROUT2 TXPC,6,[ "TIMEINIBIZIONEV ",#TIMEINIBIZIONEV,13,10] frase=12 GOSUB INVIOSMSallarme ENDIF RETURN VERIFICAINGRESSI: 'ROUTINE PER LA VERIFICA DEGLI INGRESSI, L'INGRESSO DU Eè SOLO PER L'ATTIVAZIONE DEL SISTEMA ALLARME=0 IF VARIAZIONEIN=1 THEN VARIAZIONEIN=0 SEROUT2 TXPC,6,["VARIAZIONE IN1 ",#IN1,13,10] READ 1018,TMP IF IN1=TMP OR (TMP=2 AND IN1<>STATOIN1 ) THEN IF TIMEINIBIZIONE1=0 THEN HIGH LD1 SEROUT2 TXPC,6,["IN1 ",#IN1," STATOIN1 ",#STATOIN1,13,10] STATOIN1=IN1 READ 1014,TMP1 'LEGGO TEMPO OSSERVAZIONE WHILE TMP1>0 AND IN1=STATOIN1 PAUSE 1000 TMP1=TMP1-1 SEROUT2 TXPC,6,["TEMPO DI OSSERVAZIONE1 ",#TMP1,13,10] WEND IF TMP1=0 AND IN1=STATOIN1 THEN IF IN1=0 THEN 'MEMORIZZO LA CONDIZIONE CHE HA DATO L'ALLARME POSALL=1 ELSE POSALL=2 ENDIF ALLARME=1 'MEMORIZZO CHE A DARE L'ALLARME è STATO L'INGRESSO 1 SEROUT2 TXPC,6,["ALLARME1",13,10] ELSE LOW LD1 ENDIF STATOIN1=IN1 ENDIF ELSE READ 1012,TMP IF TMP=1 THEN TIMEINIBIZIONE1=0 ENDIF ENDIF IF ALLARME<>0 THEN ' if MODULOON=0 THEN ' SEROUT2 TXPC,6,[ "ACCENDO GSM",13,10 ] ' 'GOSUB ON_OFF ' 'GOSUB SETUP ' ENDIF GOSUB STARTTIME READ 1016,TIMEINIBIZIONE1 SEROUT2 TXPC,6,[ "TIMEINIBIZIONE1 ",#TIMEINIBIZIONE1,13,10] frase=5 GOSUB INVIOSMSALLARME LOW LD1 ENDIF ENDIF RETURN TENS: adcin 0,TMPW SEROUT2 TXPC,6,["TMPW ",#TMPW,13,10 ] BATT=tmpw*41 SEROUT2 TXPC,6,["TENSIONE ",#BATT,13,10 ] 'PAUSE 1000 return TEMPERATURA: SONDAOK=1 'DICO CHE LA SONDA C'è TMP=0 OWOUT sonda, 1, [$CC, $44] CONVER0: OWIN sonda, 4, [CONV] TMP=TMP+1 PAUSE 3 IF TMP=250 THEN SEROUT2 txpc,6,[ "SONDA NON PRESENTE",13,10] SONDAOK=0 ' LA SONDA NON C'è NON VENIRE A LEGGERLA PIù... ENDIF IF CONV = 0 THEN GOTO CONVER0 'Se la conversione non e' finita ENDIF OWOUT sonda, 1, [$CC, $BE] 'OWIN sonda, 0, [TMP2, TMP1,skip 7] OWIN sonda, 0, [Temp.LOWBYTE,Temp.HIGHBYTE,skip 7] 'SEROUT2 TXPC,6,[ "TEMPERATURA BIN ",BIN16 TEMP,13,10 ] '***togliere IF Temp.bit15 = 0 THEN ' Check for temp below 0°C 'Sign = "+" TMPW1 = 0 TmpW1 = (Temp >> 4) tmpw=1000/(160/(TEMP & %0000000000001111)) IF (TEMP & %0000000000001111)=%1111 THEN TMPW=0 TmpW1=TmpW1+1 ENDIF 'SEROUT2 TXPC,6,["1Temp = +", DEC TmpW1,".", DEC2 TmpW, "C ",13,10] TEMP=0 TEMP=TMPW1 ELSE tmpw=1000/(160/(TEMP & %0000000000001111)) IF (TEMP & %0000000000001111)=%1111 THEN TMPW=0 TMP3=TMP3+1 ENDIF TMPW1 = 0 TMPW1 = 65535 - TEMP 'OTTENGO IL VALORE COME SE FOSSE POSITIVO 'TMPW1 = 0 TmpW1 = (TMPW1 >> 4) tmpw=1000/(160/(TMPW1 & %0000000000001111)) IF (TMPW1 & %0000000000001111)=%1111 THEN TMPW=0 TmpW1=TmpW1-1 ENDIF ' TmpW1 = (TEMP & %0000011111111111) ' TMPW1 = TMPW1 ^ %0000011111111111 ' TMPW1 = TmpW1 >> 4 'SEROUT2 TXPC,6,["1Temp = -", DEC TmpW1,".", DEC2 TmpW, "C ",13,10] TEMP=0 TEMP=TMPW1 TEMP.7=1 ENDIF TEMPW=(TMPW1*10)+(TMPW/10) ' SEROUT2 TXPC,6,["TempW =", #TEMPW,"C ",13,10] SEROUT2 txpc,6,[ "TEMPERATURA DEC "] ' TEMP=0 IF TEMP.7=0 THEN SEROUT2 txpc,6,[ "+"] ELSE SEROUT2 txpc,6,[ "-"] ENDIF SEROUT2 txpc,6,[#TmpW1,",",DEC2 TMPw," GRADI",13,10 ] ' TMP3 =0 ' TMP3.6=TMP1.2 ' TMP3.5=TMP1.1 ' TMP3.4=TMP1.0 ' TMP3.3=TMP2.7 ' TMP3.2=TMP2.6 ' TMP3.1=TMP2.5 ' TMP3.0=TMP2.4 ' TMP4 =0 ' TMP4.0=TMP2.0 ' TMP4.1=TMP2.1 ' TMP4.2=TMP2.2 ' TMP4.3=TMP2.3 ' 'SEROUT2 TXPC,6,[ "TMP4 ",#TMP4,13,10 ] ' tmpw=1000/(160/tmp4) ' IF TMP4=15 THEN ' TMPW=0 ' TMP3=TMP3+1 ' ENDIF ' SEROUT2 TXPC,6,[#TMP3,",",DEC2 TMPw," GRADI",13,10 ] ' TEMP=TEMP+TMP3 PAUSE 1000 SEROUT2 txpc,6,[ "TEMPERATURA MIN "] READ 1010,TMP IF TEMP.7=0 THEN 'TEMPERATURE LETTE POSITIVE IF TMP.7=0 THEN 'TEMPERATURE MEMORIZZATE POSITIVE IF TEMP<TMP THEN 'SALVO LA MINIMA WRITE 1010,TEMP ENDIF ELSE 'TEMPERATURE MEMORIZZATE 'WRITE 1012,TEMP ENDIF ELSE 'TEMPERATURE LETTE NEGATIVE IF TMP.7=1 THEN 'TEMPERATURE MEMORIZZATE NEGATIVE IF TEMP>TMP THEN 'SALVO LA MINIMA WRITE 1010,TEMP ENDIF ELSE 'TEMPERATURE MEMORIZZATE POSITIVE (LA RILEVATA è NEGATIVA) WRITE 1010,TEMP ENDIF ENDIF READ 1010,TMP IF TMP.7=0 THEN SEROUT2 txpc,6,[ "+"] ELSE SEROUT2 txpc,6,[ "-"] ENDIF TMP.7=0 SEROUT2 txpc,6,[#TMP,13,10 ] SEROUT2 txpc,6,[ "TEMPERATURA MAX "] READ 1011,TMP IF TEMP.7=0 THEN 'TEMPERATURE LETTE POSITIVE IF TMP.7=0 THEN 'TEMPERATURE MEMORIZZATE POSITIVE IF TEMP>TMP THEN 'SALVO LA MASSIMA WRITE 1011,TEMP ENDIF ELSE 'TEMPERATURE MEMORIZZATE NEGATIVE WRITE 1011,TEMP ENDIF ELSE 'TEMPERATURE LETTE NEGATIVE IF TMP.7=1 THEN 'TEMPERATURE MEMORIZZATE NEGATIVE IF TEMP<TMP THEN 'SALVO LA MINIMA WRITE 1011,TEMP ENDIF ELSE 'TEMPERATURE MEMORIZZATE POSITIVE (NON MEMORIZZO NIENTE) ENDIF ENDIF READ 1011,TMP IF TMP.7=0 THEN SEROUT2 txpc,6,[ "+"] ELSE SEROUT2 txpc,6,[ "-"] ENDIF TMP.7=0 SEROUT2 txpc,6,[#TMP,13,10 ] 'GEST ALL TEMP ALLARME=0 READ 703,TMP 'SEGGO SE C'è L'ALLARME SU TEMPERATURA O NO IF TIMEINIBIZIONET=0 AND TMP=1 THEN READ 1007,TMP 'LEGGO LA TEMPERATURA MIN DI ALLARME 'SEROUT2 TXPC,6,[ "TEMP ATTUALE ",#TEMP,13,10 ] IF TMP.7=0 THEN SEROUT2 TXPC,6,[ "TEMP ALL MIN +",#TMP,13,10 ] else TMP1=TMP TMP1.7=0 SEROUT2 TXPC,6,[ "TEMP ALL MIN -",#TMP1,13,10 ] ENDIF 'SEROUT2 TXPC,6,[ "TEMPERATURA MIN "] IF TEMP.7=0 THEN 'TEMPERATURE LETTE POSITIVE IF TMP.7=0 THEN 'TEMPERATURE MEMORIZZATE POSITIVE IF TEMP<TMP THEN 'SALVO LA MINIMA SEROUT2 TXPC,6,[ "ALLARME MIN 1 ",13,10 ] ALLARME=4 ENDIF 'ELSE 'TEMPERATURE MEMORIZZATE 'SEROUT2 TXPC,6,[ "ALLARME MIN 2 ",13,10 ] 'ALLARME=1 ENDIF ELSE 'TEMPERATURE LETTE NEGATIVE IF TMP.7=1 THEN 'TEMPERATURE MEMORIZZATE NEGATIVE IF TEMP>=TMP THEN 'SALVO LA MINIMA SEROUT2 TXPC,6,[ "ALLARME MIN 3 ",13,10 ] ALLARME=4 ENDIF ELSE 'TEMPERATURE MEMORIZZATE POSITIVE (NON MEMORIZZO NIENTE) SEROUT2 TXPC,6,[ "ALLARME MIN 2 ",13,10 ] ALLARME=4 ENDIF ENDIF 'GOSUB TEMPERATURA READ 1008,TMP 'LEGGO LA TEMPERATURA MAX DI ALLARME 'SEROUT2 TXPC,6,[ "TEMP ATTUALE ",#TEMP,13,10 ] IF TMP.7=0 THEN SEROUT2 TXPC,6,[ "TEMP ALL MAX +",#TMP,13,10 ] else TMP1=TMP TMP1.7=0 SEROUT2 TXPC,6,[ "TEMP ALL MAX -",#TMP1,13,10 ] ENDIF 'SEROUT2 TXPC,6,[ "TEMPERATURA MAX "] IF TEMP.7=0 THEN 'TEMPERATURE LETTE POSITIVE IF TMP.7=0 THEN 'TEMPERATURE MEMORIZZATE POSITIVE IF TEMP=>TMP THEN 'SALVO LA MASSIMA SEROUT2 TXPC,6,[ "ALLARME MAX 1 ",13,10 ] ALLARME=3 ENDIF ELSE 'TEMPERATURE MEMORIZZATE NEGATIVE SEROUT2 TXPC,6,[ "ALLARME MAX 2 ",13,10 ] ALLARME=3 ENDIF ELSE 'TEMPERATURE LETTE NEGATIVE IF TMP.7=1 THEN 'TEMPERATURE MEMORIZZATE NEGATIVE IF TEMP<TMP THEN 'SALVO LA MINIMA SEROUT2 TXPC,6,[ "ALLARME MAX 3 ",13,10 ] ALLARME=3 ENDIF ELSE 'TEMPERATURE MEMORIZZATE POSITIVE (NON MEMORIZZO NIENTE) ENDIF ENDIF ENDIF IF ALLARME<>0 THEN POSALL=ALLARME GOSUB STARTTIME READ 1016,TIMEINIBIZIONET SEROUT2 TXPC,6,[ "TIMEINIBIZIONET ",#TIMEINIBIZIONET,13,10] frase=5 GOSUB INVIOSMSALLARME LOW LD1 ENDIF RETURN GESTINIBIZIONE: IF TIMEINIBIZIONE1>0 THEN 'GOSUB TIME if TIMEINIBIZIONE1<= VARMIN then TIMEINIBIZIONE1=0 else TIMEINIBIZIONE1=TIMEINIBIZIONE1-VARMIN 'PER ENTRARE IN QUESTA ROUTINE PASSANO CIRCA 2 SECONDI ENDIF SEROUT2 TXPC,6,[ "TIMEINIBIZIONE1= ",#TIMEINIBIZIONE1,13,10 ] ENDIF IF TIMEINIBIZIONET>0 THEN 'GOSUB TIME if TIMEINIBIZIONET<= VARMIN then TIMEINIBIZIONET=0 else TIMEINIBIZIONET=TIMEINIBIZIONET-VARMIN 'PER ENTRARE IN QUESTA ROUTINE PASSANO CIRCA 2 SECONDI ENDIF SEROUT2 TXPC,6,[ "TIMEINIBIZIONET= ",#TIMEINIBIZIONET,13,10 ] ENDIF IF TIMEINIBIZIONEM>0 THEN 'GOSUB TIME if TIMEINIBIZIONEM<= VARMIN then TIMEINIBIZIONEM=0 else TIMEINIBIZIONEM=TIMEINIBIZIONEM-VARMIN 'PER ENTRARE IN QUESTA ROUTINE PASSANO CIRCA 2 SECONDI ENDIF SEROUT2 TXPC,6,[ "TIMEINIBIZIONEM= ",#TIMEINIBIZIONEM,13,10 ] ENDIF IF TIMEINIBIZIONEP>0 THEN 'GOSUB TIME if TIMEINIBIZIONEP<= VARMIN then TIMEINIBIZIONEP=0 else TIMEINIBIZIONEP=TIMEINIBIZIONEP-VARMIN 'PER ENTRARE IN QUESTA ROUTINE PASSANO CIRCA 2 SECONDI ENDIF SEROUT2 TXPC,6,[ "TIMEINIBIZIONEP= ",#TIMEINIBIZIONEP,13,10 ] ENDIF IF TIMEINIBIZIONEV>0 THEN 'GOSUB TIME if TIMEINIBIZIONEV<= VARMIN then TIMEINIBIZIONEV=0 else TIMEINIBIZIONEV=TIMEINIBIZIONEV-VARMIN 'PER ENTRARE IN QUESTA ROUTINE PASSANO CIRCA 2 SECONDI ENDIF SEROUT2 TXPC,6,[ "TIMEINIBIZIONEV= ",#TIMEINIBIZIONEV,13,10 ] ENDIF ' IF TEMPOSPEGNIMENTO>0 and TIMEINIBIZIONE1=0 and TIMEINIBIZIONET=0 and TIMEINIBIZIONEP=0 and TIMEINIBIZIONEM=0 THEN ' IF TIMEINIBIZIONE1=0 and TIMEINIBIZIONET=0 and TIMEINIBIZIONEP=0 and TIMEINIBIZIONEM=0 THEN ' 'GOSUB TIME ' if TEMPOSPEGNIMENTO<= VARSEC then ' TEMPOSPEGNIMENTO=0 ' GOSUB SPEGNIMODULO ' else ' TEMPOSPEGNIMENTO=TEMPOSPEGNIMENTO-VARSEC 'PER ENTRARE IN QUESTA ROUTINE PASSANO CIRCA 2 SECONDI ' ENDIF ' SEROUT2 TXPC,6,[ "TEMPOSPEGNIMENTO= ",#TEMPOSPEGNIMENTO,13,10 ] ' ENDIF RETURN 'EXITSVEGLIA: ' GOSUB ON_OFF ' GOSUB SETUP '' LOWPOWER=0 ''INTCON3.5=1 'RETURN 'SPEGNIMODULO: ' 'HSEROUT ["AT+CPOWD=0",13] 'spengo il modulo ' 'HSEROUT ["AT+CFUN=4",13] 'spengo il modulo ' pause 5000 ' MODULOON=0 ' TEMPOSPEGNIMENTO=0 'RETURN SETUP: SEROUT2 TXPC,6,[ "SETUP",13,10 ] HSEROUT ["AT&F",13] HSERIN 5000,ERRORE,[WAIT ("OK")] PAUSE 1000 HSEROUT ["AT+IPR=115200",13] HSERIN 5000,ERRORE,[WAIT ("OK")] PAUSE 200 HSEROUT ["AT+CMEE=2",13] 'AT+CMEE=0 Mobile Equipment Error Code HSERIN 2000,ERRORE,[WAIT ("OK")] PAUSE 200 HSEROUT ["AT+CGSN",13] 'richiedi imei HSERIN 2000,SETUP,[SKIP 5,WAIT (10),STR BUFF\20\13] SEROUT2 TXPC,6,[ "IMEI ",STR BUFF,13,10 ] FOR TMP=0 TO 20 if BUFF[tmp]=0 then WRITE 730+TMP,"#" 'FINE STRINGA tmp=21 else WRITE 730+TMP,BUFF[TMP] ENDIF NEXT TMP PAUSE 200 'HSEROUT ["AT+CMGF?",13] 'Set message format Text mode 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 1000 'HSEROUT ["AT+QSIMDET?",13] 'Set message format Text mode 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 1000 'HSEROUT ["AT+QSIMDET=0",13] 'Set message format Text mode 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 20000 HSEROUT ["AT+CMGF=1",13] 'Set message format Text mode HSERIN 2000,ERRORE,[WAIT ("OK")] PAUSE 200 HSEROUT ["AT+CLIP=1",13] 'Request calling line identification HSERIN 2000,ERRORE,[WAIT ("OK")] PAUSE 200 HSEROUT ["AT+CFUN?",13] 'Request calling line identification HSERIN 2000,ERRORE,[WAIT ("OK")] PAUSE 200 HSEROUT ["AT+CFUN=?",13] pause 200 'HSEROUT ["AT+CFUN=1",13] 'pause 2000 HSEROUT ["AT+CSMINS=1",13] pause 200 HSEROUT ["AT+CRC=1",13] ' HSERIN 2000,SETUP,[wait ("O")] PAUSE 500 'HSEROUT ["AT+COPS?",13] 'PAUSE 1000 HSEROUT ["AT+COPS=0,2",13] PAUSE 500 HSEROUT ["AT+CREG=2",13] PAUSE 500 'HSEROUT ["AT#CAP=0",13] 'Request calling line identification 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 1000 'HSEROUT ["AT#CAP?",13] 'Request calling line identification 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 1000 'HSEROUT ["AT+CLVL?",13] 'Request calling line identification 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 1000 HSEROUT ["AT+CSCLK=2",13] 'Request calling line identification HSERIN 2000,ERRORE,[WAIT ("OK")] PAUSE 200 HSEROUT ["AT&V",13] 'Request calling line identification HSERIN 2000,ERRORE,[WAIT ("OK")] PAUSE 200 'HSEROUT ["AT&D",13] 'Request calling line identification 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 1000 'HSEROUT ["AT&K",13] 'Request calling line identification 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 1000 'HSEROUT ["AT&W",13] 'Request calling line identification 'HSERIN 2000,ERRORE,[WAIT ("OK")] 'PAUSE 1000 'MODULOON=1 'IL MODULO è ACCESO RETURN ON_OFF: SEROUT2 TXPC,84,[ "ON/OFF",13,10 ] SEROUT2 TXPC,6,[ "H POWERGSM",13,10 ] HIGH POWERGSM 'accendi il modulo SEROUT2 TXPC,6,[ "H RESET",13,10 ] HIGH RESET 'RESETTA IL MODULO PAUSE 200 SEROUT2 TXPC,6,[ "L RESET",13,10 ] LOW RESET PAUSE 2100 SEROUT2 TXPC,6,[ "L POWERGSM",13,10 ] LOW POWERGSM PAUSE 2000 for TMP=0 TO 30 PAUSE 100 SEROUT2 TXPC,6,[ "STATO ",#STATO,13,10 ] IF STATO=0 THEN TMP=31 ENDIF NEXT TMP IF STATO=1 THEN SEROUT2 TXPC,6,[ "RIAVVIO",13,10 ] ' LOW LED PAUSE 2000 GOTO ON_OFF ENDIF ' INPUT VEXTGSM ' SEROUT2 TXPC,84,[ "VEXTGSM ",#VEXTGSM,13,10 ] ' IF VEXTGSM=1 THEN FOR TMP=0 TO 10 PAUSE 500 TOGGLE LD1 NEXT TMP ' HIGH DTRGSM 'FORZA L'AUTOBAUD ' PAUSE 2200 ' LOW DTRGSM ' PAUSE 1000 LOW LD1 FOR TMP=0 TO 2 HSEROUT ["A"] PAUSE 100 HSEROUT ["T"] PAUSE 100 HSEROUT [13] PAUSE 100 NEXT TMP 'HSERIN 2000,ERRORE,[WAIT ("OK")] PAUSE 3000 ' ELSE ' SEROUT2 TXPC,84,[ "SCARICO I CONDENSATORI ",13,10 ] ' LOW VEXTGSM 'SCARICO I CONDENSATORI ' PAUSE 2000 ' ENDIF RETURN 'ON_OFF: 'SEROUT2 TXPC,6,[ "ON/OFF",13,10 ] ' SEROUT2 TXPC,6,[ "H POWERGSM",13,10 ] ' HIGH POWERGSM 'accendi il modulo ' SEROUT2 TXPC,6,[ "H RESET",13,10 ] ' HIGH RESET 'RESETTA IL MODULO ' PAUSE 200 ' SEROUT2 TXPC,6,[ "L RESET",13,10 ] ' LOW RESET ' PAUSE 2100 ' SEROUT2 TXPC,6,[ "L POWERGSM",13,10 ] ' LOW POWERGSM ' PAUSE 2000 '' for TMP=0 TO 30 '' PAUSE 100 '' SEROUT2 TXPC,6,[ "STATO ",#STATO,13,10 ] '' IF STATO=0 THEN '' TMP=31 '' ENDIF '' NEXT TMP '' IF STATO=1 THEN '' SEROUT2 TXPC,6,[ "RIAVVIO",13,10 ] ''' LOW LED '' PAUSE 2000 '' GOTO ON_OFF '' ENDIF '' INPUT VEXTGSM '' SEROUT2 TXPC,6,[ "VEXTGSM ",#VEXTGSM,13,10 ] '' IF VEXTGSM=1 THEN ' FOR TMP=0 TO 10 ' PAUSE 500 ' TOGGLE LD1 ' NEXT TMP '' HIGH DTRGSM 'FORZA L'AUTOBAUD '' PAUSE 2200 '' LOW DTRGSM '' PAUSE 1000 ' LOW LD1 ' FOR TMP=0 TO 2 ' HSEROUT ["A"] ' PAUSE 100 ' HSEROUT ["T"] ' PAUSE 100 ' HSEROUT [13] ' PAUSE 100 ' NEXT TMP ' 'HSERIN 2000,ERRORE,[WAIT ("OK")] ' PAUSE 1000 '' ELSE '' SEROUT2 TXPC,6,[ "SCARICO I CONDENSATORI ",13,10 ] '' LOW VEXTGSM 'SCARICO I CONDENSATORI '' PAUSE 2000 '' ENDIF 'RETURN ERRORE: SEROUT2 TXPC,6,[ "ERRORE",13,10] HSEROUT ["AT+CPOWD=0",13] 'spengo il modulo pause 5000 GOTO START END MEMOMESS: SEROUT2 TXPC,6,["MEMOMESS",13,10] FOR TMP=0 TO 192 'leggo 160 CELLE DALLA MEMORIA PROGRAMMA TMPW1=60160+((POSIZIONE-1)*192+TMP) READCODE TMPW1,TMP2 'SEROUT2 P2,6,[ TMP2] IF TMP2<>255 THEN SEROUT2 TXPC,6,[ #TMP2,32 ] ELSE tmp=200 ENDIF NEXT TMP SEROUT2 TXPC,6,[10,13 ] FOR TMP=0 TO 190 'leggo 160 CELLE DALLA MEMORIA PROGRAMMA TMPW1=60160+((POSIZIONE-1)*192+TMP) ERASECODE TMPW1 'SEROUT2 P2,6,[ "CANCELLO LA POS ",#TMPW1,10,13 ] 'SEROUT2 P2,6,[ TMP2] 'SEROUT2 P2,6,[ #TMP2,32 ] NEXT TMP 'SEROUT2 P2,6,[10,13 ] SEROUT2 TXPC,6,[ "POI MEM POS ",#POSIZIONE,10,13 ] SEROUT2 TXPC,6,[ "MEMORIZZO LA FRASE ",#TMP3] FOR TMP=0 TO LUNGNUM SEROUT2 TXPC,6,[BUFF[TMP]] NEXT TMP SEROUT2 TXPC,6,[10,13] 'SEROUT2 P2,6,[ "PRIMA CANCELLO LA POS: ",#POSIZIONE,10,13 ] 'LUNGNUM=LUNGNUM+1 'SEROUT2 P2,6,[ "POI MEM POS ",#POSIZIONE,10,13 ] WHILE ((lungnum+1)//8)<>0 'se non scrivo almeno 8 caratteri ricalcola la lunghezza perchè ciò avvenga LUNGNUM=LUNGNUM+1 BUFF[LUNGNUM]=255 SEROUT2 TXPC,6,["LUNGNUM : ",#LUNGNUM,10,13] WEND TMPW1=60160+((POSIZIONE-1)*192) SEROUT2 TXPC,6,[ "TMPW1 ",#TMPW1,10,13 ] WHILE ((TMPW1)//8)<>0 TMPW1=TMPW1+1 SEROUT2 TXPC,6,["inizio : ",#TMPW1,10,13] WEND FOR TMP=0 TO LUNGNUM SEROUT2 TXPC,6,[ "POSIZIONE ",#TMPW1," DATO ",BUFF[TMP],10,13] WRITECODE TMPW1,BUFF[TMP] TMPW1=tmpw1+1 NEXT TMP WRITECODE TMPW1,255 'AGGIUNTO SEROUT2 TXPC,6,[ "MESS SALVATO " ] FOR TMP=0 TO LUNGNUM TMPW1=60160+((POSIZIONE-1)*192+TMP) READCODE TMPW1,TMP2 SEROUT2 TXPC,6,[ "POSIZIONE ",#TMPW1," DATO ",TMP2,10,13] IF TMP2<>255 THEN SEROUT2 TXPC,6,[ TMP2] ENDIF NEXT TMP SEROUT2 TXPC,6,[ 10,13 ] RETURN LEGGIMESS: SEROUT2 TXPC,6,["LEGGIMESS POS ",#POSIZIONE,13,10] ' FOR TMP=0 TO 192 'leggo 160 CELLE DALLA MEMORIA PROGRAMMA ' TMPW1=60160+((POSIZIONE-1)*192+TMP) ' READCODE TMPW1,TMP2 ' 'SEROUT2 P2,6,[ TMP2] ' SEROUT2 P2,6,[ TMP2,32 ] ' NEXT TMP ' SEROUT2 P2,6,[10,13 ] FOR TMP=0 TO 192 TMPW1=60160+((POSIZIONE-1)*192+TMP) READCODE TMPW1,TMP2 IF TMP2<>255 THEN SEROUT2 TXPC,6,[ TMP2] HSEROUT [TMP2] ELSE GOTO EXITLEGGIMESS ENDIF NEXT TMP EXITLEGGIMESS: SEROUT2 TXPC,6,[ 10,13 ] RETURN 'BASE64CONV: ''INTCON3.5=0 ' 'SEROUT2 TXPC,6,["LUNGNUM PRIMA ",#LUNGNUM,13,10] ' WHILE (LUNGNUM+1)//3<>0 ' LUNGNUM=LUNGNUM+1 ' BUFF[LUNGNUM]=0 ' WEND ' 'SEROUT2 TXPC,6,["LUNGNUM DOPO ",#LUNGNUM,13,10] ' FOR TMP=0 TO LUNGNUM-TMP4 ' TMP1=BUFF[TMP] ' TMP=TMP+1 ' TMP2=BUFF[TMP] ' TMP=TMP+1 ' TMP3=BUFF[TMP] ' SEROUT2 TXPC,6,[TMP1,TMP2,TMP3,32] ' 'SEROUT2 TXPC,6,[BIN8 TMP1,32,BIN8 TMP2,32,BIN8 TMP3,13,10] ' TMPL=TMP1>>2 ' 'SEROUT2 TXPC,6,[BIN6 tmpl,32] ' GOSUB BASE64ABB ' SEROUT2 TXPC,6,[tmpl1] ' HSEROUT [tmpl1] ' TMPL=TMP2>>4 ' tmpl.4=tmp1.0 ' tmpl.5=tmp1.1 ' 'SEROUT2 TXPC,6,[BIN6 tmpl,32] ' GOSUB BASE64ABB ' SEROUT2 TXPC,6,[tmpl1] ' HSEROUT [tmpl1] ' IF TMP2<>0 THEN ' tmpl=tmp2<<4 ' tmpl.3=tmp3.7 ' tmpl.2=tmp3.6 ' tmpl=tmpl>>2 ' 'SEROUT2 TXPC,6,[BIN6 tmpl,32] ' GOSUB BASE64ABB ' SEROUT2 TXPC,6,[tmpl1] ' HSEROUT [tmpl1] ' ELSE ' SEROUT2 TXPC,6,["="] ' HSEROUT ["="] ' ENDIF ' IF TMP3<>0 THEN ' tmpl=tmp3 & %00111111 ' 'SEROUT2 TXPC,6,[BIN6 tmpl,32] ' GOSUB BASE64ABB ' SEROUT2 TXPC,6,[tmpl1] ' HSEROUT [tmpl1] ' ELSE ' SEROUT2 TXPC,6,["="] ' HSEROUT ["="] ' ENDIF ' SEROUT2 TXPC,6,[13,10] ' NEXT TMP ' SEROUT2 TXPC,6,[13,10] ' HSEROUT [13,10] 'RETURN 'BASE64ABB: ' LOOKUP tmpl,["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"],tmpl1 ''INTCON3.5=1 'RETURN ' Rilevato pulsante premuto Disable 'PULSANTI: '' IF LOWPOWER=1 THEN '' GOSUB SVEGLIA '' ENDIF ''asm '' movwf _W_TEMP ; Salvo W in W_TEMP '' swapf STATUS,W ; Metto STATUS in W '' clrf STATUS ; Seleziono banco 0, indipendentemente dal banco corrente. '' ; Clears IRP, RP1, RP0 '' movwf _STATUS_TEMP ; metto STATUS (contenuto in W) in STATUS_TEMP '' movf PCLATH,W ; Salvo PCLATH '' movwf _PCLATH_TEMP ; in PCLATH_TEMP '' clrf PCLATH ; seleziono la pagina 0 ''endasm ''STATUS_TEMP= STATUS ''PCLATH_TEMP= PCLATH ' 'SEROUT2 TXPC,6,[ "INTCON ",bin8 INTCON,13,10 ] ' 'SEROUT2 TXPC,6,[ "INTCON2 ",bin8 INTCON2,13,10 ] ' 'SEROUT2 TXPC,6,[ "INTCON3 ",bin8 INTCON3,13,10 ] ' 'pause 5000 ' IF INTCON3.0=1 THEN 'IL PULSANTE 1 INVIA LE MAIL CON LE COORDINATE '' INTCON 01010001 '' INTCON2 00000010 '' INTCON3 11111001 ' SEROUT2 TXPC,6,[ "-P1 PREMUTO",13,10 ] '' SEROUT2 TXPC,6,[ "ABILITO INTERRUPT SU RB",13,10 ] '' INTCON = %10011000 ' RITENTA=1 'IMPOSTANDO RITENTA=1 INVIA LE COORDINATE FINO A QUANDO NON SAREANNO DISPONIBILI ' PULSOUT LD1,10000 ' INTCON3.0=0 ' ENDIF ' IF INTCON.1=1 THEN '' INTCON 01010011 '' INTCON2 00000010 '' INTCON3 11111000 ' SEROUT2 TXPC,6,[ "-P2 PREMUTO",13,10 ] ' PULSOUT LD1,10000 '' HSEROUT ["AT+CCLK=",34,"01/01/01,00:00:00+00",34,13] 'ORA '' PAUSE 500 '' READ 703,TMP '' IF TMP=0 THEN '' SEROUT2 TXPC,6,[ "ATTIVO IL POLLING",13,10 ] '' WRITE 703,1 'ATTIVO IL POLLING '' ELSE '' SEROUT2 TXPC,6,[ "DISATTIVO IL POLLING",13,10 ] '' WRITE 703,0 'DISATTIVO IL POLLING '' ENDIF ' INTCON.1=0 ' ENDIF ' IF INTCON3.1=1 THEN '' INTCON 01010001 '' INTCON2 00000010 '' INTCON3 11111010 ' SEROUT2 TXPC,6,[ "-P3 PREMUTO",13,10 ] ' PULSOUT LD1,10000 '' READ 705,TMP '' IF TMP=2 THEN '' WRITE 705,30 '' FOR TMP=1 TO 10 '' TOGGLE LD1 '' PAUSE 200 '' NEXT TMP '' ELSE '' WRITE 705,2 '' FOR TMP=1 TO 3 '' TOGGLE LD1 '' PAUSE 200 '' NEXT TMP '' ENDIF ' INTCON3.1=0 ' ENDIF ' IF INTCON3.2=1 THEN ' SEROUT2 TXPC,6,[ "-SENSORE",13,10 ] ' PULSOUT LD1,10000 ' SENSORE=1 '' SEROUT2 TXPC,6,[ "DISABILITO INTERRUPT SU RB",13,10 ] '' INTCON = %10010000 ' INTCON3.2=0 ' INTCON3.5=0 'disabilito il sensore ' ENDIF ' 'INTCON = %10010000 ' Tacita interrupt flag ' 'INTCON3 = %11111000 ''ASM ''movf _PCLATH_TEMP,W ; Recupero PCLATH ''movwf PCLATH ; ''swapf _STATUS_TEMP,W ; Recupero STATUS (cioè riseleziono i banchi come erano prima) ''movwf STATUS ; ''swapf _W_TEMP,F ; Recupero W ''swapf _W_TEMP,W ; ''ENDASM ''STATUS= STATUS_TEMP ''PCLATH= PCLATH_TEMP 'Resume disable PULSANTI: PULSANTE=0 ' IF INTCON3.0=1 THEN 'INT1 ' SEROUT2 TXPC,6,[ "INGRESSO 2",13,10 ] ' INTCON3.0=0 ' ENDIF IF INTCON3.1=1 THEN 'INT2 SEROUT2 TXPC,6,[ "INT INGRESSO 1",13,10 ] VARIAZIONEIN=1 INTCON3.1=0 TIMESLEEP=900 'COSì ESCO ENDIF IF INTCON.1=1 THEN 'INT1 SEROUT2 TXPC,6,[ "INT MOVIMENTO",13,10 ] VARIAZIONEMOV=1 INTCON.1=0 TIMESLEEP=900 'COSì ESCO ENDIF IF INTCON.0=1 THEN 'INT1 SEROUT2 TXPC,6,[ "INT PORTB (PIR)",13,10 ] VARIAZIONEPIR=1 INTCON.0=0 TIMESLEEP=900 'COSì ESCO ENDIF Resume Enable
Where to buy
The GSM alarm is available in the store.
Pingback: GSM Multifuction Alarm with SIM900 | Make, Electronics projects, electronic Circuits, DIY projects, Microcontroller Projects - makeelectronic.com
Pingback: GSM Multifuction Alarm with SIM900 | Daily Maga...