Last active 1700878528

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

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