zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    linux expr命令执行问题
    Virtual Box设置Host only模式的网络互通问题
    Linux下管理软件的方法
    转载 AMI方案和Insyde方案
    笔记二(名词详解)持续更新。。。
    笔记一(固件、BIOS、UEFI)
    Cache As Ram
    (二十四)C语言之文件
    (二十三)C语言之位运算
    (二十二)C语言之typedef
  • 原文地址:https://www.cnblogs.com/xiaowuyi/p/7745328.html
Copyright © 2011-2022 走看看