1. 程式人生 > >3分鐘利用TurnipBit制作電子時鐘

3分鐘利用TurnipBit制作電子時鐘

elf str scl size display col nbsp 線路 sleep

轉載請註明:@小五義 http://www.cnblogs.com/xiaowuyi

歡迎加入討論群 64770604

TurnipBit(www.turnipbit.com)是一個面向青少年的開發板,其基於microbit開發板開發制作完成,青少年可以利用其自帶的LED點陣、磁敏傳感器、加速度傳感器等進行快速的開發和學習。TurnipBit是micropython學習的一個很好的工具,直接利用其本身進行的實驗及開發教程當前已經有很多了(docs.turnipbit.com),這裏我得用該開發板加DS3231快速實現一個電子時鐘。

一、材料準備

1、TurnipBit開發板1塊

技術分享

2、TurnipBit擴展板1塊

技術分享

3、DS3231模塊1塊

技術分享

4、杜邦線4根

5、外置電池盒及電池

二、線路連接

1、將TurnipBit插入TurnipBit擴展板,擴展板上已經將TurnipBit的引腳全面引出來了,擴展板的具體分布如下圖:

技術分享

2、將DS3231與擴展板進行連接,連接引腳如下:

DS3231 TurnipBit擴展板
VCC 3V3
GND GND
SCL SCL
SDA SDA

三、程序設計

考慮到相對簡單,本實驗中未做時間調整的設計,因此采用了兩個程序的方法,第一個程序用來設定時間,因為DS3231模塊帶有氧化銀電池,所以設定時間後,就算是TurnipBit斷電,DS3231依然可以工作。第二程序用來完成時間的讀取與顯示。

1、定義DS3231

該類用來完成DS3231的基本操作,包括日期、時間的設定及讀取,代碼如下:

DS3231_ADDR       = 0x68
DS3231_REG_SEC    = b\x00
DS3231_REG_MIN    = b\x01
DS3231_REG_HOUR   
= b\x02 DS3231_REG_DAY = b\x04 DS3231_REG_MONTH = b\x05 DS3231_REG_YEAR = b\x06 DS3231_REG_TEMP = b\x11 class DS3231(object): def __init__(self): pass def DATE(self, dat=[]): if dat==[]: t = [] t.append(self.year()) t.append(self.month()) t.append(self.day()) return t else: self.year(dat[0]) self.month(dat[1]) self.day(dat[2]) def TIME(self, dat=[]): if dat==[]: t = [] t.append(self.hour()) t.append(self.min()) t.append(self.sec()) return t else: self.hour(dat[0]) self.min(dat[1]) self.sec(dat[2]) def DateTime(self, dat=[]): if dat==[]: return self.DATE() + self.TIME() else: self.year(dat[0]) self.month(dat[1]) self.day(dat[2]) self.hour(dat[3]) self.min(dat[4]) self.sec(dat[5]) def dec2hex(self, dat): return (int(dat/10)<<4) + (dat%10) def setREG(self, dat,reg): buf = bytearray(2) buf[0] = reg[0] buf[1] = dat i2c.write(DS3231_ADDR,buf, repeat=False) def getREG_DEC(self,reg): i2c.write(DS3231_ADDR,reg) t = i2c.read(DS3231_ADDR,1)[0] #print("--===",t,"----------") return (t>>4)*10 + (t%16) def sec(self, sec=‘‘): if sec == ‘‘: return self.getREG_DEC(DS3231_REG_SEC) else: self.setREG(self.dec2hex(sec), DS3231_REG_SEC) def min(self, min=‘‘): if min == ‘‘: return self.getREG_DEC(DS3231_REG_MIN) else: self.setREG(self.dec2hex(min), DS3231_REG_MIN) def hour(self, hour=‘‘): if hour==‘‘: return self.getREG_DEC(DS3231_REG_HOUR) else: self.setREG(self.dec2hex(hour), DS3231_REG_HOUR) def day(self, day=‘‘): if day==‘‘: return self.getREG_DEC(DS3231_REG_DAY) else: self.setREG(self.dec2hex(day), DS3231_REG_DAY) def month(self, month=‘‘): if month==‘‘: return self.getREG_DEC(DS3231_REG_MONTH) else: self.setREG(self.dec2hex(month), DS3231_REG_MONTH) def year(self, year=‘‘): if year==‘‘: return self.getREG_DEC(DS3231_REG_YEAR) else: self.setREG(self.dec2hex(year), DS3231_REG_YEAR) def TEMP(self): i2c.write(DS3231_ADDR,DS3231_REG_TEMP, repeat=False) t1 = i2c.read(DS3231_ADDR,1, repeat=False)[0] i2c.write(DS3231_ADDR,b\x12, repeat=False) t2 = i2c.read(DS3231_ADDR,1, repeat=False)[0] if t1>0x7F: return t1 - t2/256 -256 else: return t1 + t2/256

2、設定時鐘程序

設計時鐘程序,先利用1裏的代碼定義DS3231類,然後調用,具體代碼為:

from microbit import *

DS3231_ADDR       = 0x68
DS3231_REG_SEC    = b\x00
DS3231_REG_MIN    = b\x01
DS3231_REG_HOUR   = b\x02
DS3231_REG_DAY    = b\x04
DS3231_REG_MONTH  = b\x05
DS3231_REG_YEAR   = b\x06
DS3231_REG_TEMP   = b\x11
class DS3231(object):
    
    def __init__(self):
        pass
    def DATE(self, dat=[]):
        if dat==[]:
            t = []
            t.append(self.year())
            t.append(self.month())
            t.append(self.day())
            return t
        else:
            self.year(dat[0])
            self.month(dat[1])
            self.day(dat[2])
            
    def TIME(self, dat=[]):
        if dat==[]:
            t = []
            t.append(self.hour())
            t.append(self.min())
            t.append(self.sec())
            return t
        else:
            self.hour(dat[0])
            self.min(dat[1])
            self.sec(dat[2])
    def DateTime(self, dat=[]):
        if dat==[]:
            return self.DATE() + self.TIME()
        else:
            self.year(dat[0])
            self.month(dat[1])
            self.day(dat[2])
            self.hour(dat[3])
            self.min(dat[4])
            self.sec(dat[5])

    def dec2hex(self, dat):
        return (int(dat/10)<<4) + (dat%10)

    def setREG(self, dat,reg):
        buf = bytearray(2)
        buf[0] = reg[0]
        buf[1] = dat
        i2c.write(DS3231_ADDR,buf, repeat=False)
        
    def getREG_DEC(self,reg):
        i2c.write(DS3231_ADDR,reg)
        t = i2c.read(DS3231_ADDR,1)[0]
        #print("--===",t,"----------")
        return (t>>4)*10 + (t%16)

    def sec(self, sec=‘‘):
        if sec == ‘‘:
            return self.getREG_DEC(DS3231_REG_SEC)
        else:
            self.setREG(self.dec2hex(sec), DS3231_REG_SEC)

    def min(self, min=‘‘):
        if min == ‘‘:
            return self.getREG_DEC(DS3231_REG_MIN)
        else:
            self.setREG(self.dec2hex(min), DS3231_REG_MIN)

    def hour(self, hour=‘‘):
        if hour==‘‘:
            return self.getREG_DEC(DS3231_REG_HOUR)
        else:
            self.setREG(self.dec2hex(hour), DS3231_REG_HOUR)

    def day(self, day=‘‘):
        if day==‘‘:
            return self.getREG_DEC(DS3231_REG_DAY)
        else:
            self.setREG(self.dec2hex(day), DS3231_REG_DAY)

    def month(self, month=‘‘):
        if month==‘‘:
            return self.getREG_DEC(DS3231_REG_MONTH)
        else:
            self.setREG(self.dec2hex(month), DS3231_REG_MONTH)

    def year(self, year=‘‘):
        if year==‘‘:
            return self.getREG_DEC(DS3231_REG_YEAR)
        else:
            self.setREG(self.dec2hex(year), DS3231_REG_YEAR)

    def TEMP(self):
        i2c.write(DS3231_ADDR,DS3231_REG_TEMP, repeat=False)
        t1 = i2c.read(DS3231_ADDR,1, repeat=False)[0]
        i2c.write(DS3231_ADDR,b\x12, repeat=False)
        t2 = i2c.read(DS3231_ADDR,1, repeat=False)[0]
        if t1>0x7F:
            return t1 - t2/256 -256
        else:
            return t1 + t2/256

ds=DS3231()
ds.DATE([17,10,27])#設定年,月,日
ds.TIME([19,10,00])#設定時,分,秒
while True:
    Date=ds.DATE()
    Time=ds.TIME()
    Time_s=20
    for i in Date:
        Time_s+=str(i)+-
    Time_s=Time_s[:-1]+ 
    for i in Time:
        
        Time_s+=str(i)+:
    display.scroll(Time_s[:-1])
    
    #print(Time)
    #print(ds.TEMP())
    sleep(1000)

以上代碼保存為settime.py,然後打開www.turnipbit.com,點擊“開始編程”,將以上代碼復制到瀏覽器的編輯框中,如下圖:

技術分享

點擊“下載hex”,然後算成一個hex文件,將TurnipBit連接電腦後,會出現一個“TURNIPBIT”文件夾,然後將hex文件入該文件夾,TurnipBit會自動完成硬件的燒寫過程。

技術分享

這時會發現,TurnipBit已經開始顯示你設定的時間了。

3、時鐘運行程序

設定好時間後,我們只需要燒寫時鐘運行程序,這樣每次通電後,就能顯示正常時間了。如果有一天發現你的時間不準了,就說明你DS3231上的氧化銀電池需要更換了,更換後再重新進行一次settime.py,然後再運行時鐘運行程序就可以了,具體代碼如下:

from microbit import *

DS3231_ADDR       = 0x68
DS3231_REG_SEC    = b\x00
DS3231_REG_MIN    = b\x01
DS3231_REG_HOUR   = b\x02
DS3231_REG_DAY    = b\x04
DS3231_REG_MONTH  = b\x05
DS3231_REG_YEAR   = b\x06
DS3231_REG_TEMP   = b\x11
class DS3231(object):
    
    def __init__(self):
        pass
    def DATE(self, dat=[]):
        if dat==[]:
            t = []
            t.append(self.year())
            t.append(self.month())
            t.append(self.day())
            return t
        else:
            self.year(dat[0])
            self.month(dat[1])
            self.day(dat[2])
            
    def TIME(self, dat=[]):
        if dat==[]:
            t = []
            t.append(self.hour())
            t.append(self.min())
            t.append(self.sec())
            return t
        else:
            self.hour(dat[0])
            self.min(dat[1])
            self.sec(dat[2])
    def DateTime(self, dat=[]):
        if dat==[]:
            return self.DATE() + self.TIME()
        else:
            self.year(dat[0])
            self.month(dat[1])
            self.day(dat[2])
            self.hour(dat[3])
            self.min(dat[4])
            self.sec(dat[5])

    def dec2hex(self, dat):
        return (int(dat/10)<<4) + (dat%10)

    def setREG(self, dat,reg):
        buf = bytearray(2)
        buf[0] = reg[0]
        buf[1] = dat
        i2c.write(DS3231_ADDR,buf, repeat=False)
        
    def getREG_DEC(self,reg):
        i2c.write(DS3231_ADDR,reg)
        t = i2c.read(DS3231_ADDR,1)[0]
        #print("--===",t,"----------")
        return (t>>4)*10 + (t%16)

    def sec(self, sec=‘‘):
        if sec == ‘‘:
            return self.getREG_DEC(DS3231_REG_SEC)
        else:
            self.setREG(self.dec2hex(sec), DS3231_REG_SEC)

    def min(self, min=‘‘):
        if min == ‘‘:
            return self.getREG_DEC(DS3231_REG_MIN)
        else:
            self.setREG(self.dec2hex(min), DS3231_REG_MIN)

    def hour(self, hour=‘‘):
        if hour==‘‘:
            return self.getREG_DEC(DS3231_REG_HOUR)
        else:
            self.setREG(self.dec2hex(hour), DS3231_REG_HOUR)

    def day(self, day=‘‘):
        if day==‘‘:
            return self.getREG_DEC(DS3231_REG_DAY)
        else:
            self.setREG(self.dec2hex(day), DS3231_REG_DAY)

    def month(self, month=‘‘):
        if month==‘‘:
            return self.getREG_DEC(DS3231_REG_MONTH)
        else:
            self.setREG(self.dec2hex(month), DS3231_REG_MONTH)

    def year(self, year=‘‘):
        if year==‘‘:
            return self.getREG_DEC(DS3231_REG_YEAR)
        else:
            self.setREG(self.dec2hex(year), DS3231_REG_YEAR)

    def TEMP(self):
        i2c.write(DS3231_ADDR,DS3231_REG_TEMP, repeat=False)
        t1 = i2c.read(DS3231_ADDR,1, repeat=False)[0]
        i2c.write(DS3231_ADDR,b\x12, repeat=False)
        t2 = i2c.read(DS3231_ADDR,1, repeat=False)[0]
        if t1>0x7F:
            return t1 - t2/256 -256
        else:
            return t1 + t2/256

ds=DS3231()

while True:
    Date=ds.DATE()
    Time=ds.TIME()
    Time_s=‘‘
    for i in Date:
        Time_s+=str(i)+-
    Time_s=Time_s[:-1]+ 
    for i in Time:
        
        Time_s+=str(i)+:
    display.scroll(Time_s[:-1])
    
    #print(Time)
    #print(ds.TEMP())
    sleep(1000)

四、完成效果

連接外置電池盒及電池,這樣一個電子時鐘就完成了。

視頻效果:http://v.youku.com/v_show/id_XMzExNTM1MTI0OA==.html?spm=a2h3j.8428770.3416059.1#paction

3分鐘利用TurnipBit制作電子時鐘