-
Notifications
You must be signed in to change notification settings - Fork 0
/
WordClock.py
212 lines (171 loc) · 5.84 KB
/
WordClock.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
#quick, dirty port of https://github.com/jonnyarnold/wordclock/blob/master/inos/wordclock.ino
#hopefully this will work instead of reinventing the wheel
from Adafruit.Adafruit_I2C import Adafruit_I2C
import Adafruit.Adafruit_MCP230xx as ada
#import subprocess
import time
import datetime
import RPi.GPIO as gpio
import os
gpio.setmode(gpio.BCM)
# CONSTANTS
switch = 9
button = 24
#This constant is used as a 'null'
#The code will ignore this value when it is found
pinNoPin = {'z': 0}
#Pin numbers
pinMinFive = {'m': 3}
pinMinTen = {'m': 2}
pinMinutes = {'g': 17}
pinMinQuarter = {'g': 7}
pinMinTwenty = {'g': 22}
pinMinHalf = {'m': 1}
pinMinOClock = {'g': 23}
pinItIs = {'m': 0}
pinPast = {'m': 5}
pinTo = {'m': 4}
pinHourOne = {'m': 6}
pinHourTwo ={'m': 15}
pinHourThree = {'m': 7}
pinHourFour = {'m': 14}
pinHourFive = {'m': 11}
pinHourSix = {'m': 13}
pinHourSeven = {'m': 12}
pinHourEight = {'m': 10}
pinHourNine = {'g': 25}
pinHourTen = {'m': 8}
pinHourEleven = {'m': 9}
pinHourTwelve = {'g': 18}
#All pins
allPins = [pinItIs, pinMinFive, pinMinTen, pinMinQuarter, pinMinTwenty,
pinMinHalf, pinMinOClock, pinPast, pinTo, pinHourOne, pinHourTwo,
pinHourThree, pinHourFour, pinHourFive, pinHourSix, pinHourSeven,
pinHourEight, pinHourNine, pinHourTen, pinHourEleven, pinHourTwelve]
numberOfPins = 21
#The hour pins array gives the order that the pins need to be lit up.
hourPins= [pinHourOne, pinHourTwo, pinHourThree, pinHourFour, pinHourFive,
pinHourSix, pinHourSeven, pinHourEight, pinHourNine, pinHourTen,
pinHourEleven, pinHourTwelve]
numberOfHourPins = 12
#Minute pins are more tricky. The following array shows the sequence of minute pins
minuteSequence = [
[ pinItIs, pinMinOClock ],
[ pinMinFive, pinPast ],
[ pinMinTen, pinPast ],
[ pinMinQuarter, pinPast ],
[ pinMinTwenty, pinPast ],
[ pinMinTwenty, pinMinFive, pinPast ],
[ pinMinHalf, pinPast ],
[ pinMinTwenty, pinMinFive, pinTo ],
[ pinMinTwenty, pinTo ],
[ pinMinQuarter, pinTo ],
[ pinMinTen, pinTo ],
[ pinMinFive, pinTo ] ]
numberOfMinuteSequences = 12
#Change the hour when the minute hits the following index
hourChangeIndex = 7
def setup(mcp, gpio, pins):
''' get pins setup and registered'''
for pin in pins:
for k, v in pin.items():
if k == 'g':
gpio.setup(v, gpio.OUT)
else:
mcp.config(v, mcp.OUTPUT)
def startUp(pins):
''' move through all the items and turn them on, turn them off'''
for pin in pins:
for k, v in pin.items():
if k == 'g':
gpio.output(v, True)
time.sleep(0.2)
gpio.output(v, False)
elif k == 'm':
mcp.output(v, True)
time.sleep(0.2)
mcp.output(v, False)
def turnOn(pins):
for p in pins:
for k, v in p.items():
if k == 'g':
gpio.output(v, True)
elif k == 'm':
mcp.output(v, True)
def turnOff(pins):
for p in pins:
for k, v in p.items():
if k == 'g':
gpio.output(v, False)
elif k == 'm':
mcp.output(v, False)
def SHUTDOWN():
turnOff(allPins)
time.sleep(0.8)
offSeq = [pinItIs, pinMinHalf, pinMinTen]
for i in xrange(0, 2):
turnOn(offSeq)
time.sleep(0.5)
turnOff(offSeq)
time.sleep(0.5)
print("shutting down...")
os.system("sudo shutdown -h now")
class wc(object):
def __init__(self):
# currentHourPinIndex keeps track of which hour pin (as defined in hourPins) is lit
# 0 = "one", 1 = "two", etc.
self.currentHourPinIndex = 0
# currentMinutePinsIndex does a similar job to currentHourPinsIndex.
# 0 = "o'clock", 1 = "five past", ... ,
# 5 = "twenty five past", 6 = "half past", 7 = "twenty five to", etc.
self.currentMinuteSequenceIndex = -1
self.lpTimer = 0
self.loopMax = 150
def loop(self):
self.lpTimer = 0
#Move the minutes onto the next step
turnOff(minuteSequence[self.currentMinuteSequenceIndex])
self.currentMinuteSequenceIndex +=1
if self.currentMinuteSequenceIndex == 0:
# must put this in a list as turnOn expects that
turnOn([hourPins[self.currentHourPinIndex]])
#If we hit the end of the minutePins array, add one to the hour index
if(self.currentMinuteSequenceIndex >= numberOfMinuteSequences):
self.currentMinuteSequenceIndex = 0
turnOn(minuteSequence[self.currentMinuteSequenceIndex])
#Check for hour change (this will change it after 'half past', thus 7 index)
if(self.currentMinuteSequenceIndex == hourChangeIndex):
turnOff([hourPins[self.currentHourPinIndex]])
self.currentHourPinIndex += 1
#If we hit the end of the hourPins array, go back to 0
if(self.currentHourPinIndex >= numberOfHourPins):
self.currentHourPinIndex = 0
turnOn([hourPins[self.currentHourPinIndex]])
# 150 * 2 seconds = 300seconds (5mins)
# So loop every 5 minutes, but check every 2 seconds
# if the switch has been turned off
while self.lpTimer < self.loopMax: # 150 * 2 seconds
if gpio.input(switch):
SHUTDOWN()
time.sleep(2)
self.lpTimer += 1
def moveTime(self, pin):
# INCREMENT THE TIME INDEX BY 1
print "moved the time"
#self.currentMinuteSequenceIndex +=1
self.lpTimer = self.loopMax
if __name__ == '__main__':
# register MCP to use the 230xx chip (16 gpio expander)
mcp = ada.Adafruit_MCP230XX(address = 0x20, num_gpios = 16)
# initalize our GPIO/MCP-gpio LEDs
setup(mcp, gpio, allPins)
gpio.setup(switch, gpio.IN)
gpio.setup(button, gpio.IN)
clock = wc()
#register the event detect for button
gpio.add_event_detect(button, gpio.RISING, callback=clock.moveTime, bouncetime=200)
# Sanity check at startup, turn all pins on and off
startUp(allPins)
# start counting time
while True:
clock.loop()