from microbit import * import neopixel import speech import music np = neopixel.NeoPixel(pin1, 72) a = 0x68 def bcd2bin(value, mask): units = value & 0x0F tens = (value & mask) >> 4 return tens * 10 + units def bin2bcd(value): return (value or 0) + 6 * ((value or 0) // 10) def setup_rtc(): i2c.write(a, b'\x00') cs = i2c.read(a,1)[0] i2c.write(a, b'\x07\x43') i2c.write(a, b'\x03') cwd = i2c.read(a,1)[0] i2c.write(a,bytes([0x03,0x1F | cwd])) i2c.write(a,bytes([0x00,0x80 | cs])) def get_time(): i2c.write(a, b'\x00') buf = i2c.read(a,7) ms = [0x70,0x70,0x30,0x10,0x30,0x10,0xF0] tm = [bcd2bin(buf[i],ms[i]) for i in range(7)] tm[3] -= 8 return tm def set_time(t): i2c.write(a, b'\x00') i2c.write(a, b'\x00\x00') t[3] = 0x1f | t[3] for i in range(1,7): i2c.write(a,bytes([i,bin2bcd(t[i])])) i2c.write(a,bytes([0,0x80 | bin2bcd(t[0])])) setup_rtc() hours = get_time()[2] minutes = get_time()[1] while True: if button_a.is_pressed() and button_b.is_pressed(): display.scroll("H?") while not button_b.is_pressed(): if button_a.is_pressed(): hours+=1 if hours > 23: hours=0 display.scroll(hours) display.scroll("M?") while not button_b.is_pressed(): if button_a.is_pressed(): minutes+=5 if minutes > 55: minutes=0 display.scroll(minutes) display.scroll(hours) display.scroll(":") display.scroll(minutes) set_time([0,minutes,hours,1,17,3,19]) np.clear() if hours >= 12: for pixel_id in range(7, 8): np[pixel_id] = (0, 0, 255) else: for pixel_id in range(6, 7): np[pixel_id] = (0, 0, 255) #set oclock, past, to if minutes > 57 or minutes < 3: for pixel_id in range(0, 6): np[pixel_id] = (0, 255, 0) elif minutes > 2 and minutes < 33: for pixel_id in range(43, 47): np[pixel_id] = (255, 0, 0) elif minutes > 32 and minutes < 58: hours += 1 for pixel_id in range(42, 44): np[pixel_id] = (0, 0, 255) if hours >=12: hours -= 12 if hours == 0: for pixel_id in range(16, 20): np[pixel_id] = (255, 0, 0) for pixel_id in range(21, 23): np[pixel_id] = (255, 0, 0) elif hours == 1: for pixel_id in range(8, 10): np[pixel_id] = (0, 255, 0) for pixel_id in range(14, 15): np[pixel_id] = (0, 255, 0) elif hours == 2: for pixel_id in range(16, 18): np[pixel_id] = (0, 0, 255) for pixel_id in range(14, 15): np[pixel_id] = (0, 0, 255) elif hours == 3: for pixel_id in range(24, 29): np[pixel_id] = (0, 0, 255) elif hours == 4: for pixel_id in range(12, 16): np[pixel_id] = (255, 255, 0) elif hours == 5: for pixel_id in range(32, 36): np[pixel_id] = (255, 165, 0) elif hours == 6: for pixel_id in range(29, 32): np[pixel_id] = (255, 20, 147) elif hours == 7: for pixel_id in range(31, 32): np[pixel_id] = (160, 32, 240) for pixel_id in range(20, 24): np[pixel_id] = (160, 32, 240) elif hours == 8: for pixel_id in range(35, 40): np[pixel_id] = (0, 0, 205) elif hours == 9: for pixel_id in range(8, 12): np[pixel_id] = (50, 205, 50) elif hours == 10: for pixel_id in range(28, 29): np[pixel_id] = (255, 0, 0) for pixel_id in range(22, 24): np[pixel_id] = (255, 0, 0) elif hours == 11: for pixel_id in range(18, 24): np[pixel_id] = (0, 255, 255) if (minutes > 2 and minutes < 8) or (minutes > 52 and minutes < 58): for pixel_id in range(48, 52): np[pixel_id] = (255, 255, 0) elif (minutes > 7 and minutes < 13) or (minutes > 47 and minutes < 53): for pixel_id in range(65, 66): np[pixel_id] = (0, 255, 255) for pixel_id in range(67, 69): np[pixel_id] = (0, 255, 255) elif (minutes > 12 and minutes < 18) or (minutes > 42 and minutes < 48): for pixel_id in range(57, 64): np[pixel_id] = (50, 205, 50) elif (minutes > 17 and minutes < 23) or (minutes > 37 and minutes < 43): for pixel_id in range(65, 71): np[pixel_id] = (255, 0, 255) elif (minutes > 22 and minutes < 28) or (minutes > 32 and minutes < 38): for pixel_id in range(65, 71): np[pixel_id] = (255, 255, 255) for pixel_id in range(48, 52): np[pixel_id] = (255, 255, 255) elif (minutes > 27 and minutes < 33): for pixel_id in range(52, 56): np[pixel_id] = (255, 165, 0) elif minutes == 0: sleep(1) music.play(music.PUNCHLINE) for i in range (0,hours): sleep(1500) speech.say("chiss", speed=120, pitch=100, throat=100, mouth=200) np.show() #display.scroll(hours) #display.scroll(":") #display.scroll(minutes) sleep(200)