Last active 1700878528

https://blahaj.zone/notes/9mehzr6pjs5zsfs8

Revision 5ade934912e5f989840730ead354f5330cd0bcbd

main.py Raw
1import machine
2import utime
3
4class Notes:
5 B3 = 247
6 E4 = 330
7 FS4 = 370
8 GS4 = 415
9 A4 = 440
10 D6 = 1174
11 E6 = 1320
12 D7 = 2349
13
14mute = list(range(0,5))+list(range(21,24))
15is_muted = False
16
17buzzer = machine.PWM(machine.Pin(22))
18green = machine.Pin(21, machine.Pin.OUT)
19green.value(0)
20
21rtc=machine.RTC()
22#rtc.datetime((2023,11,24,0, 3,59,55,0))
23offset = 0
24ben = [
25 [
26 (Notes.GS4,0.4,1000,True),
27 (Notes.E4,0.4,1000,True),
28 (Notes.FS4,0.4,1000,True),
29 (Notes.B3,0.4,1000,True),
30 (None,0.4,1000,False),
31 (None,0.4,1000,False)
32 ],
33 [
34 (Notes.B3,0.4,1000,True),
35 (Notes.FS4,0.4,1000,True),
36 (Notes.GS4,0.4,1000,True),
37 (Notes.E4,0.4,1000,True),
38 (None,0.4,1000,False),
39 (None,0.4,1000,False)
40 ]
41]
42
43minute = [(Notes.E6, 0.1, 500, True)]
44special = {
45 900: ben[0],
46 1800: ben[0] + ben[1],
47 2700: ben[0] + ben[1] + ben[0],
48}
49
50def get_hour_tune(hour):
51 chimes = []
52 for n in range((hour%12 or 12)):
53 chimes += [(Notes.GS4,0.4,1000,True), (None,0.4,1000,False), (None,0.4,1000,False)]
54 if not is_muted:
55 return ben[0] + ben[1] + ben[0] + ben[1] + chimes
56 return chimes
57
58def init_clock():
59 global offset
60 # check if offset pin is pulled high: GP0-11 for 5-60 minute offset
61 for n,pin in enumerate(range(0,12)):
62 inp = machine.Pin(pin, machine.Pin.IN, pull=None)
63 if inp.value():
64 offset += (n+1)*300
65 break
66 m,s = divmod(offset,60)
67 h,m = divmod(m,60)
68 print("init clock",offset,h,m,s)
69 t = rtc.datetime()
70 rtc.datetime((t[0],t[1],t[2],t[3],t[4]+h,t[5]+m,t[6]+s,t[7]))
71
72def sleep(s,p=True):
73 if p: print("sleep %02f"%s)
74 utime.sleep(s)
75
76def play(song):
77 tot = 0
78 for note,length,vol,flash in song:
79 print("freq:%d,length:%d,vol:%d,flash:%r"%(note or 0,length,vol,flash))
80 if flash:
81 green.value(1)
82 if note:
83 buzzer.freq(note)
84 buzzer.duty_u16(vol if not is_muted else 0)
85 sleep(length, p=False)
86 tot += length
87 if flash:
88 green.value(0)
89 if note:
90 buzzer.duty_u16(0)
91 return 60-tot
92
93def loop():
94 global is_muted
95 first = True
96 while True:
97 timestamp=rtc.datetime()
98 y,m,d,w,h,m,s,ss = rtc.datetime()
99 sec = m*60+s
100 print("%04d-%02d-%02d %02d:%02d:%02d %03d"%(y,m,d,h,m,s,sec))
101 is_muted = h in mute
102 if first:
103 first = False
104 sleep(60-s)
105 continue
106 if m == 0:
107 sleep(play(get_hour_tune(h)))
108 elif sec in special:
109 sleep(play(special[sec]))
110 else:
111 sleep(play(minute))
112
113init_clock()
114loop()