Project Log
Hello Everyone! 
Christmas time is coming! So I created a mini Christmas tree decoration to be a gift. It has four modes:
The modes are selectable by the switch 'S1' on the schematic. The switch 'S2' and the pot 'R11' are for adjusting the flash rate. You turn the pot and then press 'S2' and it loads a new flash rate to the current mode playing (it only adjusts the current mode playing). It uses the PICAXEs EEPROM, so once you turn it off it does not forget the mode it's playing or the flash rate for any of the modes (so when you start it back up it will be playing the same mode as when you turned it off). Here's the schematic:
and Here's the code:
I used 12 SMD 0603 blue LEDs for it. They are each mounted on a header that was soldered to the tree before the LEDs where put on. The tree is made of paper clips soldered together. And it has one SMD led on the top that is always on (D13). Here's some photos of it (more in gallery):
I cut down a perf board to fit the the bottom of the tree. Here's how I laid it out:
I hope this is useful to someone!
Dan
Christmas time is coming! So I created a mini Christmas tree decoration to be a gift. It has four modes:
- It plays a strip of lights rotating around the tree.
- It alternately plays the lights flashing on it.
- It selects a random (kind of) light to flash.
- It selects a random (also kind of) strip and then plays the LEDs on it one by one.
The modes are selectable by the switch 'S1' on the schematic. The switch 'S2' and the pot 'R11' are for adjusting the flash rate. You turn the pot and then press 'S2' and it loads a new flash rate to the current mode playing (it only adjusts the current mode playing). It uses the PICAXEs EEPROM, so once you turn it off it does not forget the mode it's playing or the flash rate for any of the modes (so when you start it back up it will be playing the same mode as when you turned it off). Here's the schematic:
and Here's the code:
Code:
;***********************PIN_LAYOUT************************;
;* || Pin____Grid__No._GNo._||__Pin___Grid_No._GNo._|| *;
;* || C.0 -> column 1 01 || B.3 -> row 1 05 || *;
;* || C.1 -> column 2 02 || B.4 -> row 2 06 || *;
;* || C.2 -> column 3 03 || B.5 -> row 3 07 || *;
;* || C.4 -> column 4 04 || || *;
;*********************OTHER_PIN_LAYOUT********************;
;* || Pin____Function_______||__Pin____Function_____|| *;
;* || C.3 -> Mode switch || B.2 -> Set Speed || *;
;* || B.1 -> ADC || || *;
;*********************************************************;
;*_________________________Grid__________________________*;
;* 01 02 03 04 *;
;* LED---LED---LED---LED 05 *;
;* LED---LED---LED---LED 06 *;
;* LED---LED---LED---LED 07 *;
;* *;
;* Logic 0 selects each channel *;
;*********************************************************;
;**************************MAIN***************************;
;* The main code block checks the mode switch and stores *;
;* its last state in the on board EPROM. It also executes*;
;* the correct pattern. *;
;*********************************************************;
main: ;this is to make all the variables equal zero (only done once)
setfreq M32 ;set the PICAXE chip frequency to 32MHZ
let b8=0
let b7=0
let b6=0
let b5=0
let b4=0
let w13=0
let w12=0 ;this is for the random command. So do NOT use b25 or b24
let w11=0
let w10=0 ;this is for the next random command. So do NOT use b20 or b21
let w9=0
let w8=0
let w7=0
let w6=0
let bit0=0
let bit1=0
let bit2=0
let bit3=0
let bit4=0
let bit5=0
let bit6=0
let bit7=0
let bit8=0
let bit9=0
let bit10=0
goto start
start:
do ;start endless loop
if pinb.2=0 then ;if switch is pressed update playing time
readadc b.1,b8
let w6=b8*2
if b7=0 then ;if playing the 1st pat
write 1, WORD w6 ;write the ADC value to space 1 and 2
endif
if b7=1 then ;if playing the 2nd pat
write 3, WORD w6 ;write the ADC value to space 3 and 4
endif
if b7=2 then ;if playing the 3rd pat
write 5, WORD w6 ;write the ADC value to space 5 and 6
endif
if b7=3 then ;if playing the 4th pat
write 7, WORD w6 ;write the ADC value to space 7 and 8
endif
endif
high c.0,c.1,c.2,c.4,b.2,b.3,b.4,b.5 ;turn off all lights
if pinc.3=0 AND bit10=0 then ;if the switch is pressed update pat playing
inc b6 ;debounce with delay
if b6=30 then
let bit10=1 ;switch has to go to high before this is repeated
inc b5
if b5=4 then ;all pats have been shown so reset
let b5=0
endif
write 255,b5 ;write the pat number to play to the EEPROM
let b6=0
endif
endif
if pinc.3=1 then ;this will complete making sure the switch goes back to
let bit10=0 ;high before repeating that code above
endif
read 255,b4 ;find out what pat to play
if b4=0 then
let b7=0 ;this tells the ADC thing above that pat1 is playing
read 1, WORD w6 ;read the value from the 1st and 2nd space to w6
gosub pat1
endif
if b4=1 then
let b7=1 ;this tells the ADC thing above that pat2 is playing
read 3, WORD w6 ;read the value from the 3rd and 4th space to w6
gosub pat2
endif
if b4=2 then
let b7=2 ;this tells the ADC thing above that pat3 is playing
read 5, WORD w6 ;read the value from the 5th and 6th space to w6
gosub pat3
endif
if b4=3 then
let b7=3 ;this tells the ADC thing above that pat4 is playing
read 7, WORD w6 ;read the value from the 7th and 8th space to w6
gosub pat4
endif
loop until b4=10 ;loop forever
goto start
;**************************PAT1***************************;
;* This pattern plays a rotating strip of lights *;
;*********************************************************;
pat1:
if bit0=0 then ;get rid of back loop
low c.0 ;turn on column 1
low b.3,b.4,b.5 ;turn on row one,two,and three
inc w13
if w13<w6 then ;delay
return
endif
endif
let bit0=1;make sure it does not back loop
if bit1=0 then ;get rid of back loop
if w13=w6 then ;make sure not to reset count
let w13=0
endif
low c.1 ;turn on column 2
low b.3,b.4,b.5 ;turn on row one,two, and three
inc w13
if w13<w6 then ;delay
return
endif
endif
let bit1=1;make sure it does not back loop
if bit2=0 then ;get rid of back loop
if w13=w6 then ;make sure not to reset count
let w13=0
endif
low c.2 ;turn on column 3
low b.3,b.4,b.5 ;turn on row one,two, and three
inc w13
if w13<w6 then ;delay
return
endif
endif
let bit2=1;make sure it does not back loop
if w13=w6 then ;make sure not to reset count
let w13=0
endif
low c.4 ;turn on column 4
low b.3,b.4,b.5 ;turn on row one,two, and three
inc w13
if w13<w6 then
return
endif
let bit0=0
let bit1=0
let bit2=0
let w13=0
return
;**************************PAT2***************************;
;* This pattern plays stripes rotating around the tree *;
;*********************************************************;
pat2:
if w13<w6 AND bit9=0 then
inc w13
if bit8=0 then
low c.0,c.2 ;turn on solum 1 and 3
low b.3,b.5 ;turn on row 1 and 3
let bit8=1
return
endif
low c.1,c.4 ;turn on column 2 and 4
low b.4 ;turn on row 2
let bit8=0
return
endif
if bit9=0 then ;make sure not to reset second players count
let w13=0
endif
let bit9=1
if w13<w6 then
inc w13
if bit8=0 then
low c.1,c.4 ;turn on column 2 and 4
low b.3,b.5 ;turn on row 1 and 3
let bit8=1
return
endif
low c.0,c.2 ;turn on column 1 and 3
low b.4 ;turn on row 2
let bit8=0
return
endif
let w13=0
let bit9=0
return
;**************************PAT3****************************;
;* This pattern randomly selects 1 LED to light *;
;**********************************************************;
pat3:
random w8
if bit4=0 then
;let w12=time ;seed random
;random w12 ;generate random number
let w12=w8
let bit4=1
endif
if w11<w6 then
random w9
inc w11
if w12<=5461 then
low c.0,b.3 ;select column 1 row 1
endif
if w12>5461 AND w12<=10922 then
low c.0,b.4 ;select column 1 row 2
endif
if w12>10922 AND w12<=16383 then
low c.0,b.5 ;select column 1 row 3
endif
if w12>16383 AND w12<=21844 then
low c.1,b.3 ;select column 2 row 1
endif
if w12>21844 AND w12<=27305 then
low c.1,b.4 ;select solum 2 row 2
endif
if w12>27305 AND w12<=32766 then
low c.1,b.5 ;select column 2 row 3
endif
if w12>32766 AND w12<=38227 then
low c.2,b.3 ;select column 3 row 1
endif
if w12>38227 AND w12<=43688 then
low c.2,b.4 ;select column 3 row 2
endif
if w12>43688 AND w12<=49149 then
low c.2,b.5 ;select column 3 row 3
endif
if w12>49149 AND w12<=54610 then
low c.4,b.3 ;select column 4 row 1
endif
if w12>54610 AND w12<=60071 then
low c.4,b.4 ;select column 4 row 2
endif
if w12>60071 AND w12<=65535 then
low c.4,b.5 ;select column 4 row 3
endif
return
endif
let bit4=0 ;reset
let w11=0
return
;**************************PAT4***************************;
;* This pattern makes it look like water drops are *;
;* falling off of the tree. *;
;*********************************************************;
pat4:
random w7 ;generate random number
if bit5=0 then
let w10=w7 ;let w10 = the random number once
let bit5=1 ;make sure it only happens once per playing
endif
if w9<w6 AND bit6=0 then
random w7
inc w9
if w10<=16383 then
low c.0,b.3 ;select column 1 row 1
endif
if w10>16383 AND w10<=32766 then
low c.1,b.3 ;select column 2 row 1
endif
if w10>32766 AND w10<=49149 then
low c.2,b.3 ;select column 3 row 1
endif
if w10>49149 AND w10<=65535 then
low c.4,b.3 ;select column 4 row 1
endif
return
endif
if bit6=0 then ;make sure it does not play the code above again
let w9=0
endif
let bit6=1 ;get rid of back loop
if w9<w6 AND bit7=0 then
random w7
inc w9
if w10<=16383 then
low c.0,b.4 ;select column 1 row 2
endif
if w10>16383 AND w10<=32766 then
low c.1,b.4 ;select column 2 row 2
endif
if w10>32766 AND w10<=49149 then
low c.2,b.4 ;select column 3 row 2
endif
if w10>49149 AND w10<=65535 then
low c.4,b.4 ;select column 4 row 2
endif
return
endif
if bit7=0 then
let w9=0
endif
let bit7=1 ;get rid of back loop
if w9<w6 then
random w7
inc w9
if w10<=16383 then
low c.0,b.5 ;select column 1 row 3
endif
if w10>16383 AND w10<=32766 then
low c.1,b.5 ;select column 2 row 3
endif
if w10>32766 AND w10<=49149 then
low c.2,b.5 ;select column 3 row 3
endif
if w10>49149 AND w10<=65535 then
low c.4,b.5 ;select column 4 row 3
endif
return
endif
let w9=0 ;reset
let bit5=0
let bit6=0
let bit7=0
let w10=0
return
;*********************************************************;
;* <- END OF CTREE PROGRAM -> *;
;*********************************************************;
I used 12 SMD 0603 blue LEDs for it. They are each mounted on a header that was soldered to the tree before the LEDs where put on. The tree is made of paper clips soldered together. And it has one SMD led on the top that is always on (D13). Here's some photos of it (more in gallery):
I cut down a perf board to fit the the bottom of the tree. Here's how I laid it out:
I hope this is useful to someone!
Dan