电子时钟是一个很常用但是制作非常简单的小玩具了,对于Micropython 初学者来说,制作一个电子时钟是非常简单又容易检验自己学习成果的实验了。TurnipBit 相比于其他开发板,制作电子时钟就更加简单了,无需外接任何显示器,因为Turnipbit 自带显示功能,只需将Turnipbit 扩展板与时钟模块连接,编写相应的代码就OK 了,那么接下来,就让我们一起学习下吧。
所需元器件:
TurnipBit 一块
TurnipBit 扩展板一块
DS3231 时钟模块一个
杜邦线若干
usb 数据线一条
实验原理:
DS3231 时钟模块原理
DS3231 (图11-12 )是一个时钟模块,其实就是像一个电子时钟,它自身带有电池,当设置好时间后,DS3231 就会自动走时。DS3231 与开发板之间的通讯是通过I2C 接口来完成的。I2C 总线是由Philips 公司开发的一种简单、双向二线制同步串行总线。它只需要SDA (串行数据线)和SCL (串行时钟线)两根线即可在连接于总线上的器件之间传送信息。SDA 和SCL 都是双向I/O 线,连接时,只需要将DS3231 上的SDA 和SCL 与TurnipBit 扩展板上的SDA 和SCL 相连即可。
接线方法:
Turnipbit 扩展板与发光二极管接口对应如下表:
TurnipBit 扩展板 | DS3231 时钟模块 |
3V3 | VCC |
GND | GND |
SCL | SCL |
SDA | SDA |
关于代码,这里我们就不用拼插编程了,代码太长拼插起来就有点费时间了
源代码:
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,24]) ds.TIME([10,03,00]) while True: Time=ds.TIME() Time_s='' for i in Time: Time_s+=str(i)+':' display.scroll(Time_s[:-1]+"-") #print(Time) #print(ds.TEMP()) sleep(1000)