'{$STAMP BS2p} '{$PBASIC 2.5} '-------------------------------------------------------------------------- ' ' ' ----------[ Title ]------------------------------------------------------ ' ' File........... F2T.bs2 ' Author......... Thomas Charveriat ' E-mail......... tc262@columbia.edu ' Co-author...... Frank Plant ' E-mail......... plantlife@compuserve.net ' WWW............ http://www.island6.org ' Date........... March 2007 ' ' ----------[ Program Description ]---------------------------------------- ' 'This program demonstrates how to communicate with the Siemens M20T GSM module. 'The program constantly reads the SIM card of the GSM module for incoming SMS 'messages. In case of a reception, the microcontroller will send back a confirmation of 'good reception to the user, send a copy as an email for archival purposes, and trigger 'a database search of pre-programmed EEPROM in order to match strings. The program will 'then communicate to an MP3 player in order to trigger a matching version in rap of the 'previously received SMS. The matching rap lyric will be then printed in order for the user 'to keep a physical copy of the lyrics. ' ' ' ----------[ Diagram ]---------------------------------------------------- ' ' __________ ' SER TX <-| 1 24 |-- PWR ' SER RX ->| 2 23 |-- (PWR) GND ' SER ATN ->| 3 22 |-- RESET ' SER GND --| 4 21 |-- +5V ' SOLENOID (HANDS&BODY) I/O 0 <-| 5 20 |-- I/O X15 N/C ' SOLENOID (HANDS&BODY) I/O 1 <-| 6 19 |-- I/O X14 N/C ' SOLENOID (HANDS&BODY) I/O 2 <-| 7 18 |-- I/O X13 N/C ' SOLENOID (HANDS&BODY) I/O 3 <-| 8 17 |-- I/O X12 N/C ' SOLENOID (HANDS&BODY) I/O 4 <-| 9 16 |-- I/O X11 N/C ' SOLENOID (HANDS&BODY) I/O 5 <-| 10 15 |-- I/O X10 N/C ' N/C I/O 6 --| 11 14 |-- I/O X9 N/C 'QV502 MP3_PlAYER(TXD) I/O 7 ->| 12 13 |-- I/O X8 N/C 'QV502 MP3_PlAYER(RXD) I/O 8 <-| 13 28 |-- I/O X7 N/C 'SIEMENS_M20T GSM(TXD) I/O 9 ->| 14 27 |-- I/O X6 N/C 'SIEMENS_M20T GSM(RXD) I/O 10 --| 15 26 |-- I/O X5 N/C ' LED_display I/O 11 <-| 16 25 |-- I/O X4 N/C 'EPSON TM-T88III(privat)I/O 12 <-| 17 24 |-- I/O X3 N/C ' 4x20 LCD module I/O 13 <-| 18 23 |-- I/O X2 N/C ' N/C I/O 14 --| 19 22 |-- I/O X1 N/C ' N/C I/O 15 --| 20 21 |-- I/O X0 N/C ' |__________| ' ' BS2p40-IC ' ' **********CHINA: 13816126809 *********** ' ' ================================ ' [ QUADRAVOX QV502 RS232 PROTOCOL ] ' ================================ '0x00-0x7F: one of 128 directly addressed sounds [0 to 127] '0x80-0xB8: sets volume of both channels TO one of 56 levels (0 is mute) [128 to 184] '0xC0-0xCF: set balance left (right channel is attenuated 0-15 levels) [192 TO 207] '0xD0-0xDF: set balance right (left channel is attenuated 0-15 levels) [208 TO 223] '0xE0: play file 0-255, with the file number defined by the NEXT transmitted Byte '0xE1: play file 256-511, with the file number (-256) defined by the NEXT transmitted Byte '0xE4: RETURN the hardware revision number '0xE5: RETURN the software revision number '0xE7: retrieve file. The second Byte contains a coded representation of the file name '0xE8: pop phrase '0xE9: push phrase '0xEA: unmute left channel [234] '0xEB: mute left channel [235] '0xEC: unmute right channel [236] '0xED: mute right channel [237] '0xEE: set extended balance; the second Byte is +/- 56. Negative = left. '0xEF: RETURN the number of files detected, modulo 256 '0xF0: STOP instantly '0xF1: clear LOOP mode; play in progress will complete '0xF2: increment volume '0xF3: decrement volume '0xF4: set LOOP mode '0xF5: GET status '0xF6: GET errors '0xF7: S/W reset '0xF8: PAUSE [248] '0xF9: resume [249] ' ================================ ' [ EPSON TM-T88III ] ' ================================ 'DSW1 '| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | '|OFF|OFF|ON |OFF|OFF|OFF|ON |OFF| 'DSW2 '| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | '|OFF|OFF|OFF|OFF|OFF|OFF|OFF|OFF| ' '| DB9 | DB25 | (Stamp to Epson Printer) '================ '| 1 | 8 | brown '| 2 | 2 | red '| 3 | 3 | orange '| 4 | 6 | yellow '| 5 | 7 | green '| 6 | 20 | blue '| 7 | 5 | violet '| 8 | 4 | grey '| 9 | 22 | black ' 27,64:initialize printer; 28,112,1,48:print NV bit image;27,45,49:turns underline ON;10:CR; ' 29,107,73,11,123,66,109,111,110,116,99,97,100,97,53:prints montcada5 in barcode format ' 29,86,66,255:line feed&paper cut ' =========================================================================== ' [ Constants ] ' =========================================================================== 'Baudrate equivalence: B9600 CON 16624 B2400 CON 17405 B9600B CON 240 'LCD: CLR CON 12 Light_ON CON 14 ' LCD commands Light_OFF CON 15 ' LCD commands 'General: SOLENOID1 CON 0 SOLENOID2 CON 1 SOLENOID3 CON 2 SOLENOID4 CON 3 SOLENOID5 CON 4 SOLENOID6 CON 5 From_MP3 CON 7 To_MP3 CON 8 From_M20T CON 9 To_M20T CON 10 LED_display CON 11 Epson_Printer_Private CON 12 To_LCD CON 13 ' =========================================================================== ' [ Variables ] ' =========================================================================== TrackNumber VAR Byte n VAR Byte 'from 0 to 255,needs to be a byte! won't work otherwise SerString VAR Byte(19) ' Make a 15-byte array. counter VAR Byte ' general purpose counter m VAR Nib 'Nib from to 0 to 15 MessageNumber VAR Nib 'from to 0 to 15 ErrorCounter VAR Nib GeneralDelay VAR Byte 'SOLENOID_TIME VAR Byte solenoid_loop VAR Byte ' =========================================================================== ' [ Initialization ] ' =========================================================================== 'PAUSE 1000 'SEROUT LED_display, B9600,[2,2] 'STOP TrackNumber=26 MessageNumber=1 GeneralDelay=1 'SOLENOID_TIME= 100 'time between "ON" and "OFF" of the solenoid 'SOLENOID_DELAY=500 'time between two solenoid move solenoid_loop=28 init: MAINIO PAUSE 1500 SEROUT Epson_Printer_Private,B9600,[10,"***RESET***",10] PAUSE 10 SEROUT To_MP3,B9600B,[247] 'SW reset for the MP3 PAUSE 1000 SEROUT To_MP3,B9600B,[184] 'set volume to maximum PAUSE 1000 PAUSE 18000 'wait for the m20T to be ready GOSUB Delete_All_SMS '!!!!!14 THEN 'for message#1 to 15 default=15, 5 to speedup !!!!!!MessageNUmber is a Nib,the total memory of the M20T is 25 messages GOTO Check_Signal ENDIF SEROUT To_M20T,B2400,["at+cmgr=",DEC MessageNumber,13] ' send the AT hayes command: READ SMS to the M20T GSM module PAUSE 10 'could be removed SERIN From_M20T,B2400,2000,Message_Empty,[WAIT("$"),STR SerString\15\"$"] 'if no answer then it's empty IF Serstring(7)="0" THEN 'corresponds to an empty message GOTO Message_Empty ENDIF SEROUT Epson_Printer_Private,B9600,[10,"******not empty*******"] PAUSE 10 ' ================= Message_Full: SEROUT Epson_Printer_Private,B9600,["msg#",DEC MessageNumber,"is Full:",10] PAUSE 10 GetMessage: SEROUT To_M20T,B2400,["at+cmgr=",DEC MessageNumber,13] 'read SMS PAUSE 10 SERIN From_M20T,B2400,3000,Stuck,[WAIT(",,"),SKIP 24,STR SerString\20\"$"] 'get message PAUSE 10 SEROUT Epson_Printer_Private,B9600,["Msg:",STR SerString,10] GetPhoneNumber: SEROUT To_M20T,B2400,["at+cmgr=",DEC MessageNumber,13] 'read SMS PAUSE 10 SERIN From_M20T,B2400,3000,Stuck,[WAIT(","),SKIP 1,STR SerString\12] 'get phone number PAUSE 10 SEROUT Epson_Printer_Private,B9600,["#:",STR SerString,10] TrackNumber=(SerString(10)-48)*10+(SerString(11)-48) MAX 100 TrackNumber=(TrackNumber/3)-3 TrackNumber=TrackNumber MIN 1 MAX 30 MoveBody: MAINIO SEROUT To_MP3,B9600B,[TrackNumber] 'plays the corresponding MP3 track AUXIO 'DEBUG? Tracknumber IF Tracknumber=1 THEN 'DEBUG "=1",CR solenoid_loop=28 GOTO general_track_man ENDIF IF Tracknumber=2 THEN 'DEBUG "=2",CR solenoid_loop=38 GOTO general_track_man ENDIF IF Tracknumber=3 THEN solenoid_loop=23 GOTO general_track_man ENDIF IF Tracknumber=4 THEN solenoid_loop=30 GOTO general_track_man ENDIF IF Tracknumber=5 THEN solenoid_loop=30 GOTO general_track_man ENDIF IF Tracknumber=6 THEN solenoid_loop=30 GOTO general_track_man ENDIF IF Tracknumber=7 THEN solenoid_loop=74 GOTO general_track_man ENDIF IF Tracknumber=8 THEN solenoid_loop=22 GOTO general_track_man ENDIF IF Tracknumber=9 THEN solenoid_loop=18 GOTO general_track_man ENDIF IF Tracknumber=10 THEN solenoid_loop=26 GOTO general_track_man ENDIF IF Tracknumber=11 THEN solenoid_loop=38 GOTO general_track_man ENDIF IF Tracknumber=12 THEN solenoid_loop=50 GOTO general_track_both ENDIF IF Tracknumber=13 THEN solenoid_loop=48 GOTO general_track_both ENDIF IF Tracknumber=14 THEN solenoid_loop=50 GOTO general_track_pussies ENDIF IF Tracknumber=15 THEN solenoid_loop=85 GOTO general_track_pussies ENDIF IF Tracknumber=16 THEN solenoid_loop=50 GOTO general_track_pussies ENDIF IF Tracknumber=17 THEN solenoid_loop=80 GOTO general_track_pussies ENDIF IF Tracknumber=18 THEN solenoid_loop=70 GOTO general_track_pussies ENDIF IF Tracknumber=19 THEN PAUSE 5000 'track starts with a silence solenoid_loop=58 GOTO general_track_man ENDIF IF Tracknumber=20 THEN PAUSE 17000 'starts with a silence solenoid_loop=28 GOTO general_track_pussies ENDIF IF Tracknumber=21 THEN solenoid_loop=40 GOTO general_track_man ENDIF IF Tracknumber=22 THEN PAUSE 12000 solenoid_loop=35 GOTO general_track_man ENDIF IF Tracknumber=23 THEN solenoid_loop=40 GOTO general_track_man ENDIF IF Tracknumber=24 THEN solenoid_loop=40 GOTO general_track_man ENDIF IF Tracknumber=25 THEN PAUSE 7000 solenoid_loop=30 GOTO general_track_man ENDIF IF Tracknumber=26 THEN solenoid_loop=53 GOTO general_track_both ENDIF IF Tracknumber=27 THEN solenoid_loop=42 GOTO general_track_both ENDIF IF Tracknumber=28 THEN solenoid_loop=42 GOTO general_track_man ENDIF IF Tracknumber=29 THEN PAUSE 5000 solenoid_loop=40 GOTO general_track_both ENDIF IF Tracknumber=30 THEN PAUSE 3000 solenoid_loop=55 GOTO general_track_both ENDIF SEROUT Epson_Printer_Private,B9600,["do not correspondtracknumber",10] 'the tracknumber is not correct GOTO Delete_SMS '*************************************** general_track_man: 'DEBUG "_track_man" FOR counter=1 TO solenoid_loop RANDOM n IF n<50 THEN GOSUB ian_righthand IF n>=50 AND n<100 THEN GOSUB ian_mic IF n>=100 AND n<150 THEN GOSUB nothing IF n>=150 AND n<200 THEN GOSUB nothing IF n>=200 THEN GOSUB ian_body NEXT GOTO Delete_SMS general_track_pussies: FOR counter=1 TO solenoid_loop RANDOM n IF n<50 THEN GOSUB pussy_left IF n>=50 AND n<100 THEN GOSUB pussy_center IF n>=100 AND n<150 THEN GOSUB nothing IF n>=150 AND n<200 THEN GOSUB nothing IF n>=200 THEN GOSUB pussy_right NEXT GOTO Delete_SMS general_track_both: FOR counter=1 TO solenoid_loop RANDOM n IF n<30 THEN GOSUB ian_righthand IF n>=30 AND n<60 THEN GOSUB ian_mic IF n>=60 AND n<90 THEN GOSUB nothing IF n>=90 AND n<120 THEN GOSUB nothing IF n>=120 AND n<150 THEN GOSUB ian_body IF n>=150 AND n<180 THEN GOSUB pussy_left IF n>=180 AND n<210 THEN GOSUB pussy_center IF n>=210 THEN GOSUB pussy_right NEXT GOTO Delete_SMS Delete_SMS: MAINIO SEROUT Epson_Printer_Private,B9600,[10,"DEL#",DEC MessageNumber,10] PAUSE 500 SEROUT To_M20T,B2400,["at+cmgd=",DEC MessageNumber,13] PAUSE 300 GOTO Check_SMS ' =========================================================================== ' [ PHONE SUBROUTINES ] ' =========================================================================== String_Erase: FOR n=0 TO 19 SerString(n)=0 NEXT RETURN ' ================= Stuck: ErrorCounter=ErrorCounter+1 'counts the number of errors, used counter because no more space available IF ErrorCounter>5 THEN ErrorCounter=0 '********* SEROUT Epson_Printer_Private,B9600,["stuck too many times...",10] 'new!!!! '********* GOSUB Delete_SMS GOTO Check_Signal ENDIF SEROUT Epson_Printer_Private,B9600,["*error*"] PAUSE 10 PAUSE 3000 GOTO Check_Signal Message_Empty: ' SEROUT Epson_Printer_Private,B9600,["*Msg#",DEC MessageNumber,"=empty*"] MessageNumber=MessageNumber+1 GOTO Check_SMS Delete_All_SMS: FOR MessageNumber=1 TO 15 '!!!!! Nib from to 0 to 15 SEROUT To_M20T,B2400,["at+cmgd=",DEC MessageNumber,13] PAUSE 200 'a pause is probably a good idea to make sure it is well erased 'SEROUT Epson_Printer_Private,B9600,["Msg#",DEC MessageNumber," deleted*"] 'too fast to see it anyway PAUSE 500 NEXT RETURN Send_SMS: '?necessary? SEROUT To_M20T,B2400,["AT+CMGS=",34,"13248261528",34,13] '213 is the number for telefonica PAUSE 500 ' SEROUT To_M20T,B2400,["Welcome to F2T, your message is being processed",26]'space is necessary for telefonica to discern bet. email and mess. PAUSE 100 SEROUT Epson_Printer_Private,B9600,["MSG SENT",10] RETURN '********************subroutines:******************************** nothing: AUXIO PAUSE 600 RETURN ian_righthand: 'DEBUG "ian",CR AUXIO HIGH 3:PAUSE 100:LOW 3 PAUSE 500 RETURN ian_mic: AUXIO HIGH 4:PAUSE 100:LOW 4 PAUSE 500 RETURN ian_body: AUXIO HIGH 5:PAUSE 100:LOW 5 PAUSE 500 RETURN pussy_left: AUXIO HIGH 0:PAUSE 100:LOW 0 PAUSE 500 RETURN pussy_center: AUXIO HIGH 1:PAUSE 10:LOW 1 PAUSE 500 RETURN pussy_right : AUXIO HIGH 2:PAUSE 100:LOW 2 PAUSE 500 RETURN