Differences

This shows you the differences between two versions of the page.

random:parallax_propeller_basic_security_system [2012/01/14 21:52] (current)
grant created
Line 1: Line 1:
 +====== Parallax Propeller Basic Security System ======
 +<code>
 +{{
 +This code example simulates a very basic security system.
 +
 +Written by Grant Jenks
 +http://www.grantjenks.com/
 + 
 +DISCLAIMER
 +THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
 +LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
 +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
 +EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
 +ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
 +SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
 +SERVICING, REPAIR OR CORRECTION.
 + 
 +Copyright
 +This work is licensed under the
 +Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
 +To view a copy of this license, visit
 +http://creativecommons.org/licenses/by-nc-nd/3.0/
 +or send a letter to Creative Commons, 171 Second Street, Suite 300,
 +San Francisco, California, 94105, USA
 +
 +Pin map:
 +  0     red light
 +  1     yellow light
 +  2     green light
 +  16    button 1
 +  17    button 2
 +  18    button 3
 +  19    button 4
 +
 +File: BasicSecuritySystem.spin
 +
 +Exercises:
 +(1) The current code is 1 2 1. Change the code to 2 1 1.
 +(2) The current code is three button presses long, change the code to 5
 +        button presses.
 +(3) The board is wired for 3 buttons but the program recognizes only
 +        2 buttons. Add support for the third button and change the code
 +        to be 2 1 3.
 +(4) Currently, the system waits 30 seconds before sounding the alarm. Change
 +        the wait time to 15 seconds.          
 +}}
 +
 +CON                                                     'Global constants
 +
 +  STATUS_WAIT = 0
 +  STATUS_PASS = 1
 +  STATUS_FAIL = 2
 +
 +  DOOR     = 16                                         'Button pin maps
 +  BUTTON_1 = 17
 +  BUTTON_2 = 18
 +  BUTTON_3 = 19
 +  BUTT_MIN = 16
 +  BUTT_MAX = 19
 +
 +  LED_RED = 0                                           'LED pin maps
 +  LED_YEL = 1
 +  LED_GRE = 2
 +  LED_MIN = 0
 +  LED_MAX = 2
 +
 +  CODE_LEN = 3                                          'Length of security code
 +  
 +  _xinfreq = 6_250_000                                  'Printed on the oscillator
 +  _clkmode = xtal1 + pll16x                             'Will clock at 100MHz
 +  
 +VAR                                                     'Global variables
 +
 +  long stack[200]                                       'Stack space for cogs
 +  
 +  long cog_code                                         'Cog ids for code/wait routines
 +  long cog_wait
 +  
 +  long status                                           'Communicate between cogs
 +  long code[CODE_LEN]                                   'Store entered code
 +
 +OBJ
 +
 +  pst : "Parallax Serial Terminal"
 +
 +PUB BasicSecuritySystem
 +
 +  pst.Start(115200)
 +  pst.Str(String(pst#NL, "Security System Monitoring..."))
 +  
 +  dira[LED_MIN..LED_MAX]~~                              'Set LED pins for output
 +  dira[BUTT_MIN..BUTT_MAX]~                             'Set button pins for input
 +  outa[LED_MIN..LED_MAX]~                               'Turn LEDs off
 +  
 +  repeat
 +
 +    pst.Str(String(pst#NL, "Door is shut"))             'Note: the door must begin closed
 +    
 +    outa[LED_GRE] := 1                                  'Turn on green LED
 +  
 +    repeat while ina[DOOR] == 1                         'Do nothing while door shut
 +      waitcnt(clkfreq / 1000 + cnt)
 +
 +    pst.Str(String(pst#NL, "Door opened"))
 +
 +    outa[LED_GRE] := 0                                  'Turn off green LED
 +    outa[LED_YEL] := 1                                  'Turn on yellow LED
 +    
 +    status := STATUS_WAIT
 +
 +    cog_code := cognew(ReadCode, @stack[0])             'Start cogs
 +    cog_wait := cognew(Wait, @stack[100])
 +
 +    repeat while status == STATUS_WAIT                  'Wait for status change
 +      waitcnt(clkfreq/1000 + cnt)
 +
 +    cogstop(cog_code)                                   'Stop cogs
 +    cogstop(cog_wait)
 +    
 +    outa[LED_YEL] := 0                                  'Turn off yellow LED
 +    
 +    if status == STATUS_FAIL or ina[DOOR] == 0          'Sound alarm if status is fail or door is open
 +      quit
 +
 +  pst.Str(String(pst#NL, "Alert! Alert! Alert! Sound door alarm..."))
 +  
 +  outa[LED_RED] := 1                                    'Turn on red LED  
 +  repeat                                                'Loop forever doing nothing
 +
 +PUB ReadCode | pos, pressed
 +
 +  pst.Str(String(pst#NL, "Reading code..."))
 +  
 +  pos := 0                                              'Position in the code array
 +  pressed := 0                                          '0 if no button is pressed
 +
 +  'Note that "pressed" is used to eliminate the jitter that occurs with
 +  'button press/release. Because the jitter occurs at a frequency less
 +  'than 1KHz, we'll just sleep at the end of the loop and use "pressed"
 +  'to recognize the state change.
 +  
 +  repeat until pos == CODE_LEN
 +    
 +    if ina[BUTTON_1] == 1 and pressed == 0
 +    
 +      pst.Str(String(pst#NL, "Button 1 pressed"))
 +
 +      'Store the button press code, advance the position in the array and
 +      'indicate a pressed button
 +      
 +      code[pos] := 1
 +      pos := pos + 1
 +      pressed := 1
 +      
 +    elseif ina[BUTTON_2] == 1 and pressed == 0
 +    
 +      pst.Str(String(pst#NL, "Button 2 pressed"))
 +
 +      'Store the button press code, advance the position in the array and
 +      'indicate a pressed button
 +      
 +      code[pos] := 2
 +      pos := pos + 1
 +      pressed := 1
 +      
 +    elseif ina[BUTTON_1] == 0 and ina[BUTTON_2] == 0
 +    
 +      pressed := 0
 +
 +    'The buttons have a jitter that requires we sleep here before
 +    'sampling again.
 +      
 +    waitcnt(clkfreq/1000 + cnt)
 +
 +  if code[0] == 1 and code[1] == 2 and code[2] == 1
 +  
 +    pst.Str(String(pst#NL, "Code is correct!"))
 +    status := STATUS_PASS
 +    
 +  else
 +  
 +    pst.Str(String(pst#NL, "Code is incorrect!"))
 +    status := STATUS_FAIL      
 +
 +PUB Wait
 +
 +  waitcnt(clkfreq * 30 + cnt)                           'Wait 30 seconds
 +  pst.Str(String(pst#NL, "30 seconds have passed; sound alarm!"))
 +  status := STATUS_FAIL
 +</code>
random/parallax_propeller_basic_security_system.txt · Last modified: 2012/01/14 21:52 by grant