3分鐘利用TurnipBit制作電子時鐘
轉載請註明:@小五義 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制作電子時鐘