November 01, 2024, 12:32:58 AM

News:

You can now use Vixen to program your Prop-1 and Prop-2 controllers!  Get started quickly and easily, without having to learn PBASIC.  Details in the Library forum.


Holiday Lighting

Started by JonnyMac, November 09, 2007, 09:56:27 AM

Previous topic - Next topic

JonnyMac

November 09, 2007, 09:56:27 AM Last Edit: November 09, 2007, 10:09:18 AM by JonnyMac
Last year I made an electronic Hanukkah Menorah for a friend using the BS2 (this was before the Prop-2) -- you can read about it in Nuts & Volts:

-- http://www.parallax.com/Portals/0/Downloads/docs/cols/nv/vol7/col/NV140.pdf

Since we're coming up on that season again I thought I'd post the code; those of you with the Prop-2 can probably learn something from it and if you've got a bunch of WickLeds you can build a Menorah for yourself or a friend.

Note: I updated the program since the article.  With the SETUP on P15 you can reset the start of the day -- this lets you play with the project beforehand, and reset it before you get to Hanukkah.


' =========================================================================
'
'   File...... Hanukkah_Menorah.BS2
'   Purpose... Electronic Hannuka Menora
'   Author.... Jon Williams, EFX-TEK (www.efx-tek.com)
'   E-mail.... jwilliams@efx-tek.com
'   Started...
'   Updated... 09 NOV 2007
'
'   {$STAMP BS2}
'   {$PBASIC 2.5}
'
' =========================================================================


' -----[ Program Description ]---------------------------------------------
'
' Simulates the lighting of a Hanukkah Menorah.  At the end of each day
' the program self updates to point to the next day of the cycle.


' -----[ Revision History ]------------------------------------------------


' -----[ I/O Definitions ]-------------------------------------------------

Restart         PIN     15                      ' SETUP = DN

Candles         VAR     OUTS                    ' P0..P8
Shamash         PIN     4                       ' center candle


' -----[ Constants ]-------------------------------------------------------

Yes             CON     1
No              CON     0


' -----[ Variables ]-------------------------------------------------------

idx             VAR     Nib                     ' loop controller
dyNum           VAR     Nib                     ' current day
cycle           VAR     Byte                    ' controls lighting cycle
delay           VAR     Byte                    ' delay for flickering
addr            VAR     Word                    ' address of daily sequence
mask            VAR     Word                    ' maks for lit candles
timer           VAR     Word                    ' flicker timer
wicks           VAR     Word                    ' lit wicks


' -----[ Initialization ]--------------------------------------------------

Reset:
  IF (Restart = Yes) THEN
    WRITE Day, 1                                ' reset to first day
    DO
      TOGGLE Shamash                            ' blink Shamash
      PAUSE 500
    LOOP
  ELSE
    READ Day, dyNum                             ' get current day
    DIRS = $01FF                                ' P0..P8 are outputs
  ENDIF


' -----[ Program Code ]----------------------------------------------------

Main:                                           ' light candles for day
  LOOKUP dyNum-1, [Wicks1, Wicks2, Wicks3,      ' get address of sequence
                   Wicks4, Wicks5, Wicks6,
                   Wicks7, Wicks8], addr

Light_Candles:
  FOR cycle = 0 TO (dyNum * 2) STEP 2           ' light candles for this day
    READ addr + cycle, Word mask                ' get lit candles mask
    GOSUB Flicker                               ' update candle wicks
  NEXT

Update_Day:
  dyNum = dyNum // 8 + 1                        ' point to next day
  WRITE Day, dyNum                              ' save to EEPROM

  DO
    GOSUB Flicker                               ' stay lit until shutdown
  LOOP


' -----[ Subroutines ]-----------------------------------------------------

' Flicker lit candles for one second
' -- pass mask value for lit candles

Flicker:
  timer = 0                                     ' clear timer
  DO
    FOR idx = 1 TO 3                            ' tumble random value
      RANDOM wicks
    NEXT
    Candles = wicks & mask                      ' "light" selected candles
    delay = wicks // 26 + 25                    ' random delay, 25 to 50 ms
    PAUSE delay
    timer = timer + delay                       ' update timer
  LOOP UNTIL (timer >= 1000)                    ' done? if not, keep going
  RETURN


' -----[ EEPROM Data ]-----------------------------------------------------

Day             DATA    1                       ' current day


'                                 +------- Shamash candle
'                                 |
Wicks1          DATA    Word %000010000
                DATA    Word %000010001

Wicks2          DATA    Word %000010000
                DATA    Word %000010010
                DATA    Word %000010011

Wicks3          DATA    Word %000010000
                DATA    Word %000010100
                DATA    Word %000010110
                DATA    Word %000010111

Wicks4          DATA    Word %000010000
                DATA    Word %000011000
                DATA    Word %000011100
                DATA    Word %000011110
                DATA    Word %000011111

Wicks5          DATA    Word %000010000
                DATA    Word %000110000
                DATA    Word %000111000
                DATA    Word %000111100
                DATA    Word %000111110
                DATA    Word %000111111

Wicks6          DATA    Word %000010000
                DATA    Word %001010000
                DATA    Word %001110000
                DATA    Word %001111000
                DATA    Word %001111100
                DATA    Word %001111110
                DATA    Word %001111111

Wicks7          DATA    Word %000010000
                DATA    Word %010010000
                DATA    Word %011010000
                DATA    Word %011110000
                DATA    Word %011111000
                DATA    Word %011111100
                DATA    Word %011111110
                DATA    Word %011111111

Wicks8          DATA    Word %000010000
                DATA    Word %100010000
                DATA    Word %110010000
                DATA    Word %111010000
                DATA    Word %111110000
                DATA    Word %111111000
                DATA    Word %111111100
                DATA    Word %111111110
                DATA    Word %111111111
Jon McPhalen
EFX-TEK Hollywood Office