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

3分钟利用TurnipBit制作电子时钟的更多相关文章

  1. [TPYBoard-Micropython之会python就能做硬件 3] 制作电子时钟

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.TPYboard V102板  一块 2.DS3231 ...

  2. js傻瓜式制作电子时钟

    js傻瓜式制作电子时间 使用到的知识点 setInterval函数 构建函数new Date if判断 demo: //css样式请自行设置 <span id="timer" ...

  3. 利用html5制作一个时钟动画

    <canvas id="clock" width="500" height="500" style="background- ...

  4. Micropython TurnipBit 电子时钟 青少年编程入门

    电子时钟是一个很常用但是制作非常简单的小玩具了,对于Micropython初学者来说,制作一个电子时钟是非常简单又容易检验自己学习成果的实验了.TurnipBit相比于其他开发板,制作电子时钟就更加简 ...

  5. 数据可视化之powerBI技巧(三)这个Power BI技巧很可爱:利用DAX制作时钟

    周末放松一下,给大家分享一个小技巧,仅利用DAX制作一个简易的时钟. 时钟效果如下: 这个时钟的制作只需一个度量值,你信吗? 事实上确实如此,制作步骤介绍如下: 1,新建参数,生成一个数字序列作为小时 ...

  6. JS实现电子时钟

          目前有个小项目,在首页头部导航栏里需要一个电子时钟的效果,于是我就采用如下代码实现了一个电子时钟的效果.不过不完美,第一种方式容易导致网页莫名其妙的异常,后来觉得可能是做的操作太多了,然后 ...

  7. 桌面小部件----LED电子时钟实现

    桌面控件是通过 Broadcast 的形式来进行控制的,因此每个桌面控件都对应于一个BroadcastReceiver.为了简化桌面控件的开发,Android 系统提供了一个 AppWidgetPro ...

  8. Qt - 与众不同的电子时钟

     Qt的电子时钟是个老掉牙的demo了,但是利用lcdNumber显示的样子非常老土(下图第一个显示效果),一看就知道是从qt帮助文档里摘出来的example,毫无新意. 美化一下系统时钟,抛开固有控 ...

  9. MFC桌面电子时钟的设计与实现

    目录 核心技术 需求分析 程序设计 程序展示 (一)核心技术 MFC(Micosoft Foundation Class Libay,微基础类库)是微基于Windows平台下的C++类库集合,MFC包 ...

随机推荐

  1. lintcode.44 最小子数组

    最小子数组   描述 笔记 数据 评测 给定一个整数数组,找到一个具有最小和的子数组.返回其最小和. 注意事项 子数组最少包含一个数字 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题 ...

  2. MyEclipse中Source Folder,package,folder的区别

    1.在eclipse下,package, source folder, folder都是文件夹. 但它们有区别如: 2. package:当你在建立一个package时,它自动建立到source fo ...

  3. 关于APP分享到QQ、微信等

    <script> var shares=null;        var Intent=null,File=null,Uri=null,main=null; function plusRe ...

  4. OpenStack Ocata 超详细搭建文档

    前言 搭建前必须看我本文档搭建的是分布式O版openstack(controller+ N compute + 1 cinder)的文档.openstack版本为Ocata.搭建的时候,请严格按照文档 ...

  5. 一张图告诉你移动Web前端所有技术(工程化、预编译、自动化)

    你要的移动web前端都在这里! 大前端方向:移动Web前端.Native客户端.Node.js. 大前端框架:React.Vue.js.Koa 跨终端技术:HTML5.CSS 3.JavaScript ...

  6. 用wrk测试nginx/ndoejs/golang

    sudo taskset -c ./wrk -c1 -t1 -d30 http://localhost/hello wrk+nginx(helloworld module) sudo taskset ...

  7. jmeter测试教程

    http://www.cnblogs.com/TankXiao/p/4045439.html

  8. 一张图讲解对象锁和关键字synchronized修饰方法

    每个对象在出生的时候就有一把钥匙(监视器),那么被synchronized 修饰的方法相当于给方法加了一个锁,这个方法就可以进行同步,在多线程的时候,不会出现线程安全问题. 下面通过一张图片进行讲解: ...

  9. Qt のEXecl

    http://blog.csdn.net/czyt1988/article/details/52121360           OK http://bbs.csdn.net/topics/39184 ...

  10. WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系

    WPF布局控件与子控件的HorizontalAlignment/VerticalAlignment属性之间的关系: 1.Canvas/WrapPanel控件: 其子控件的HorizontalAlign ...