|
Micropython turnipbit带小夜灯的电子时钟
[复制链接]
实验目的:2 LED是什么2
光敏电阻是什么2
DS3231模块2
电阻阻值的色环计算2
时钟模块DS3231()库的应用
所需器材:2
TurnipBit开发板 1块2
下载数据线 1条2
废旧纸盒 1个2
导线若干2
DS3231时钟模块 1个2
光敏电阻 1个2
LED 灯 1个2
1K电阻 1个2
接入互联网的电脑 1台(推荐使用Google Chome或者Firefox浏览器)
TurnipBit扩展板TurnipBit扩展板是用来将TurnipBit的引脚和主要功能脚引出的一个开发板。利用扩展板,我们可以完成一些更加复杂的工作和任务。TurnipBit扩展板包含以下几个区域:1、金手指插槽,主要用于与TurnipBit开发板进行连接,只需进行正常的插拔即可。2、电源区,包括GND、3.3V和5V区域,提供电源供电。3、USB接口,负责电源接入。4、GPIO口,主要包括P0到P20的GPIO接口、I2C接口、串口以及SPI接口。
意图DS3231的连接DS3231(图11-12)是一个时钟模块,其实就是像一个电子时钟,它自身带有电池,当设置好时间后,DS3231就会自动走时。DS3231与开发板之间的通讯是通过I2C接口来完成的。I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要SDA(串行数据线)和SCL(串行时钟线)两根线即可在连接于总线上的器件之间传送信息。SDA和SCL都是双向I/O线,连接时,只需要将DS3231上的SDA和SCL与TurnipBit扩展板上的SDA和SCL相连即可。表 11-1 DS3231连线表
DS3231 | TurnipBit扩展板 | GND | GND | VCC | 3.3V | SCL | SCL | SDA | SDA |
DS3231 线路设计本实验中需要进行连接的器件主要包括LED、光敏电阻、电阻、DS3231,具体连接方法:1、LED的长引脚(正极)与扩展板的P1相连,短引脚也就是负极与GND相连。我们只需要控制P1输出高电平还是低电平就可以控制LED是亮还是灭。当P1输出高电平时,LED两条引脚形成回路,LED亮起。当P1输出低电平时,LED熄灭。2、光敏电阻与1K阻串联后,一端连接正极,一端连接负责,中间引出一个引线,连接到扩展板的P2处。这里我们只需要读取P2引脚的模拟电压,就可以获取光线的变化。3、DS3231与扩展板的连接参见表11-1。具体连接实物图,如下:
连线图具体代码具体代码如下:
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='20'
for i in Date:
Time_s+=str(i)+'-'
Time_s=Time_s[:-1]+' '
for i in Time:
Time_s+=str(i)+':'
hour=Time[0]
sumnum=0
for j in range(0,5): #计算5次电压平均值
sumnum=sumnum+pin2.read_analog()
averagenum=sumnum/5
if averagenum < 54: #如果小于54说明光线弱
pin1.write_digital(1) #打开LED
else: #如果大于或者等于54,说明光线强
pin1.write_digital(0) #关闭LED
display.scroll(Time_s[:-1]) #显示时钟时间
if button_a.get_presses() > 0 or button_b.get_presses() > 0:
display.scroll(Time_s[:-1]) #如果按过按键,显示时钟时间
sleep(1000)
将以上代码,复制到TurnipBit编程区域,然后保存hex文件,并复制到TURNIPBIT磁盘后,会发现Turnipbit已经开始工作了。
|
|