3分钟利用TurnipBit制作电子时钟

简介: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi  欢迎加入讨论群 64770604        TurnipBit(www.turnipbit.com)是一个面向青少年的开发板,其基于microbit开发板开发制作完成,青少年可以利用其自带的LED点阵、磁敏传感器、加速度传感器等进行快速的开发和学习。

 

转载请注明:@小五义 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

 

目录
相关文章
|
1月前
|
C语言
基于单片机的简易电子时钟
基于单片机的简易电子时钟
21 0
|
1月前
|
芯片
基于Micropython利用ESP32-C3墨水屏电子时钟方法
基于Micropython利用ESP32-C3墨水屏电子时钟方法
58 0
|
3月前
|
物联网 芯片
毕业设计 基于STM32的语音RFID卡停车管理系统
毕业设计 基于STM32的语音RFID卡停车管理系统
|
9月前
电子元器件采购(一)----电容
电子元器件采购(一)----电容
46 0
|
6月前
|
编解码 vr&ar UED
电子显示器的介绍
电子显示器:从CRT到OLED的演进 一、介绍电子显示器的概念 电子显示器是一种利用电子技术将图像或文字显示在屏幕上的设备。它是计算机、电视、手机等电子设备的重要组成部分。电子显示器可以通过控制像素的亮度和颜色来显示不同的图像和文字。随着科技的发展,电子显示器也经历了多次演进,从传统的CRT显示器到现代的OLED显示器,不断提升了显示效果和用户体验。 二、CRT显示器的特点和优缺点 CRT显示器是最早出现的电子显示器,它使用阴极射线管来显示图像。CRT显示器具有以下特点:色彩饱满、对比度高、刷新率快等。然而,CRT显示器也存在一些缺点,如体积大、重量重、功耗高等
194 0
|
9月前
电子测量笔记
电子测量笔记
|
10月前
|
传感器 数据采集 芯片
LabVIEW Arduino电子称重系统(项目篇—1)
质量是物理学中的7个基本量纲之一。在工业生产和日常生活中,我们都需要获取一个物体的质量,比如购买某件商品时,需要确定其质量大小,或者以质量作为中间量以进一步获得物体的其他参数,如质心、偏心等。
|
异构计算 内存技术
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
189 0
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(下)
|
异构计算
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
219 0
FPGA新起点V1开发板(三)——Quartus II软件的使用(流水灯的烧录以及sof转jic的方法记录)(上)
|
传感器 编解码 C语言
基于单片机的电子万年历的设计
基于单片机的电子万年历的设计
333 1
基于单片机的电子万年历的设计