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

 

目录
相关文章
|
存储 JSON Kubernetes
KubeConfig
KubeConfig 是一个用于存储和管理 Kubernetes 集群配置文件的 JSON 格式文件。它包含了集群的详细信息,如 API 服务器地址、认证信息、命名空间等。KubeConfig 文件的主要作用是让用户能够轻松地在不同的 Kuberne
287 1
|
缓存 测试技术 编译器
[Eigen中文文档] 稠密矩阵分解函数对比
本文介绍了 Eigen 为各种方阵和过约束问题提供的稠密矩阵分解的速度比较。
296 0
|
运维 安全 Cloud Native
全方位解读服务网格(Service Mesh)的背景和概念
为了解决微服务框架的侵入性问题,我们引入服务网格。
4906 0
全方位解读服务网格(Service Mesh)的背景和概念
|
8月前
|
机器学习/深度学习 人工智能 运维
基于AI的自动化事件响应:智慧运维新时代
基于AI的自动化事件响应:智慧运维新时代
379 11
|
11月前
|
JSON 并行计算 数据格式
Python Error 汇总
本文汇总了Python编程中常见的错误及其解决办法,包括导入错误、类型错误、运行时错误等,并提供了详细的解决方案。
651 0
Python Error 汇总
|
11月前
|
消息中间件 Kafka API
kafka使用教程
kafka使用教程
|
前端开发 JavaScript
前端搞懂事件循环机制
【8月更文挑战第3天】前端搞懂事件循环机制
210 1
|
开发工具 数据安全/隐私保护 开发者
最全的 pip 使用指南,50% 你可能没用过。
最全的 pip 使用指南,50% 你可能没用过。
374 1
|
块存储
ceph-deploy部署ceph分部署集群
这篇博客详细介绍了如何使用ceph-deploy工具部署Ceph集群,包括环境准备、配置hosts、免密登录、时间同步、添加块设备、部署mon、mgr组件以及初始化OSD节点的步骤,并提供了在部署过程中可能遇到的问题和解决方案。
967 4
|
监控 Java 测试技术
如何构建高效的自动化测试框架:策略与实践
【7月更文挑战第6天】构建高效的自动化测试框架是一个持续的过程,需要不断迭代和优化。通过遵循设计原则、选择合适的关键技术、并遵循科学的实施步骤,我们可以构建出稳定、可靠、易于维护的自动化测试框架,为软件质量的提升和交付周期的缩短提供有力支持。