KRITSADA icon

RTC Neopixel

KRITSADA | PRO | 10/28/19 08:33:12 AM UTC | 0 ⭐ | 775 👁️ | Never ⏰ | []
Python |

5.38 KB

|

None

|

0 👍

/

0 👎

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)

Comments