Added snowman file
[pi-xmas.git] / snowman / snowman1.py
1 #!/usr/bin/python
2 # Tony Goodhew 19 November 2015
3 # Uses SnowPi and switch with 10K Ohm pull up on GPIO #16
4 # PWM brightness control of nose
5
6 # Import required libraries
7 import RPi.GPIO as GPIO
8 import time
9 import random
10 random.seed()
11
12 # Tell GPIO library to use GPIO references
13 GPIO.setmode(GPIO.BCM)
14 sw = 16
15 GPIO.setup(sw,GPIO.IN)
16
17 LEDs = [7,8,9,22,18,17,23,24] # Not nose
18 # Setup LED pins as outputs
19 for x in range(8):
20 GPIO.setup(LEDs[x], GPIO.OUT)
21 GPIO.output(LEDs[x], False)
22 # Light white and blue LEDs
23 for x in range(8):
24 GPIO.output(LEDs[x], True)
25
26 # Set up PWM on nose to control brightness
27 LED = 25
28 freq = 200 # PWM frequency - 200 times /sec
29 dutyCycle = 0 # percentage of time on - range 0 to 100
30 GPIO.setup(LED,GPIO.OUT)
31 pwmLED = GPIO.PWM(LED,freq)
32 pwmLED.start(0)
33
34 def spin(): #Clockwise
35 for i in range(6):
36 GPIO.output(LEDs[i],0) # White Off
37 for n in range(6):
38 for i in range(6):
39 GPIO.output(LEDs[i],1)
40 time.sleep(0.07)
41 GPIO.output(LEDs[i],0)
42 for i in range(6):
43 GPIO.output(LEDs[i],1) #White ON
44 return
45
46 def spin2(): # Counter Clockwise
47 for i in range(6):
48 GPIO.output(LEDs[i],0) # White OFF
49 for n in range(6):
50 for i in range(5,-1,-1):
51 GPIO.output(LEDs[i],1)
52 time.sleep(0.07)
53 GPIO.output(LEDs[i],0)
54 for i in range(6):
55 GPIO.output(LEDs[i],1) # White ON
56 return
57
58 def wink():
59 GPIO.output(LEDs[7],0)
60 time.sleep(0.2)
61 GPIO.output(LEDs[7],1)
62 return
63
64 def wink2():
65 GPIO.output(LEDs[6],0)
66 time.sleep(0.2)
67 GPIO.output(LEDs[6],1)
68 return
69
70 def upDown(): # Up and Down
71 for i in range(6):
72 GPIO.output(LEDs[i],0) # White OFF
73 for i in range(4):
74 for n in range(3):
75 GPIO.output(LEDs[n],1)
76 GPIO.output(LEDs[5-n],1)
77 time.sleep(0.1)
78 GPIO.output(LEDs[n],0)
79 GPIO.output(LEDs[5-n],0)
80 time.sleep(0.1)
81 for m in range(3):
82 n = 2-m
83 GPIO.output(LEDs[n],1)
84 GPIO.output(LEDs[5-n],1)
85 time.sleep(0.1)
86 GPIO.output(LEDs[n],0)
87 GPIO.output(LEDs[5-n],0)
88 time.sleep(0.1)
89 for i in range(6):
90 GPIO.output(LEDs[i],1) # White ON
91 return
92
93 def wobble(): # Side to side
94 for i in range(6):
95 GPIO.output(LEDs[i],0) # White OFF
96 for i in range(6):
97 GPIO.output(7,1)
98 GPIO.output(8,1)
99 GPIO.output(9,1)
100 time.sleep(0.1)
101 GPIO.output(7,0)
102 GPIO.output(8,0)
103 GPIO.output(9,0)
104 time.sleep(0.1)
105 GPIO.output(22,1)
106 GPIO.output(18,1)
107 GPIO.output(17,1)
108 time.sleep(0.1)
109 GPIO.output(22,0)
110 GPIO.output(18,0)
111 GPIO.output(17,0)
112 time.sleep(0.1)
113 for i in range(6):
114 GPIO.output(LEDs[i],1) # White ON
115 return
116
117 # ==== Main begins ====
118 pwmLED.ChangeDutyCycle(100) # Nose full brightness
119 wobble()
120 upDown()
121 spin()
122 wink()
123 spin2()
124 wink2()
125
126 print("Hold button down to stop")
127
128 # === Loop ===
129 swVal = GPIO.input(sw)
130 while swVal == 1:
131 for brite in range(0,90,5):
132 pwmLED.ChangeDutyCycle(brite) # Brighter nose
133 time.sleep(0.1)
134 n = random.randint(0,5)
135 if n == 0:
136 spin()
137 if n == 1:
138 spin2()
139 if n == 2:
140 wink()
141 if n == 3:
142 wink2()
143 if n == 4:
144 wobble()
145 if n == 5:
146 upDown()
147 for brite in range(90,0,-5):
148 pwmLED.ChangeDutyCycle(brite) # Dimmer nose
149 time.sleep(0.1)
150 swVal = GPIO.input(sw) # Check switch for stopping
151
152 # === Tidy up ===
153 print("Halted by button")
154 # Reset GPIO settings
155 GPIO.cleanup()