[活动] Micropython turnipbit带小夜灯的电子时钟

[复制链接]
 楼主| turnipbit 发表于 2018-5-17 11:19 | 显示全部楼层 |阅读模式
实验目的:
²  LED是什么²
光敏电阻是什么²  
DS3231模块²
电阻阻值的色环计算²
时钟模块DS3231()库的应用
所需器材:²  
TurnipBit开发板 1块²
下载数据线 1条²
废旧纸盒 1个²  
导线若干²
DS3231时钟模块 1个²
光敏电阻 1个²
LED 灯 1个²  
1K电阻 1个²
接入互联网的电脑 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。具体连接实物图,如下:
连线图具体代码具体代码如下:

  1. from microbit import *

  2. DS3231_ADDR = 0x68
  3. DS3231_REG_SEC = b'\x00'
  4. DS3231_REG_MIN = b'\x01'
  5. DS3231_REG_HOUR = b'\x02'
  6. DS3231_REG_DAY = b'\x04'
  7. DS3231_REG_MONTH = b'\x05'
  8. DS3231_REG_YEAR = b'\x06'
  9. DS3231_REG_TEMP = b'\x11'
  10. class DS3231(object):

  11. def __init__(self):
  12. pass
  13. def DATE(self, dat=[]):
  14. if dat==[]:
  15. t = []
  16. t.append(self.year())
  17. t.append(self.month())
  18. t.append(self.day())
  19. return t
  20. else:
  21. self.year(dat[0])
  22. self.month(dat[1])
  23. self.day(dat[2])

  24. def TIME(self, dat=[]):
  25. if dat==[]:
  26. t = []
  27. t.append(self.hour())
  28. t.append(self.min())
  29. t.append(self.sec())
  30. return t
  31. else:
  32. self.hour(dat[0])
  33. self.min(dat[1])
  34. self.sec(dat[2])
  35. def DateTime(self, dat=[]):
  36. if dat==[]:
  37. return self.DATE() + self.TIME()
  38. else:
  39. self.year(dat[0])
  40. self.month(dat[1])
  41. self.day(dat[2])
  42. self.hour(dat[3])
  43. self.min(dat[4])
  44. self.sec(dat[5])

  45. def dec2hex(self, dat):
  46. return (int(dat/10)<<4) + (dat%10)

  47. def setREG(self, dat,reg):
  48. buf = bytearray(2)
  49. buf[0] = reg[0]
  50. buf[1] = dat
  51. i2c.write(DS3231_ADDR,buf, repeat=False)

  52. def getREG_DEC(self,reg):
  53. i2c.write(DS3231_ADDR,reg)
  54. t = i2c.read(DS3231_ADDR,1)[0]
  55. #print("--===",t,"----------")
  56. return (t>>4)*10 + (t%16)

  57. def sec(self, sec=''):
  58. if sec == '':
  59. return self.getREG_DEC(DS3231_REG_SEC)
  60. else:
  61. self.setREG(self.dec2hex(sec), DS3231_REG_SEC)

  62. def min(self, min=''):
  63. if min == '':
  64. return self.getREG_DEC(DS3231_REG_MIN)
  65. else:
  66. self.setREG(self.dec2hex(min), DS3231_REG_MIN)

  67. def hour(self, hour=''):
  68. if hour=='':
  69. return self.getREG_DEC(DS3231_REG_HOUR)
  70. else:
  71. self.setREG(self.dec2hex(hour), DS3231_REG_HOUR)

  72. def day(self, day=''):
  73. if day=='':
  74. return self.getREG_DEC(DS3231_REG_DAY)
  75. else:
  76. self.setREG(self.dec2hex(day), DS3231_REG_DAY)

  77. def month(self, month=''):
  78. if month=='':
  79. return self.getREG_DEC(DS3231_REG_MONTH)
  80. else:
  81. self.setREG(self.dec2hex(month), DS3231_REG_MONTH)

  82. def year(self, year=''):
  83. if year=='':
  84. return self.getREG_DEC(DS3231_REG_YEAR)
  85. else:
  86. self.setREG(self.dec2hex(year), DS3231_REG_YEAR)

  87. def TEMP(self):
  88. i2c.write(DS3231_ADDR,DS3231_REG_TEMP, repeat=False)
  89. t1 = i2c.read(DS3231_ADDR,1, repeat=False)[0]
  90. i2c.write(DS3231_ADDR,b'\x12', repeat=False)
  91. t2 = i2c.read(DS3231_ADDR,1, repeat=False)[0]
  92. if t1>0x7F:
  93. return t1 - t2/256 -256
  94. else:
  95. return t1 + t2/256

  96. ds=DS3231()

  97. while True:
  98. Date=ds.DATE()
  99. Time=ds.TIME()
  100. Time_s='20'
  101. for i in Date:
  102. Time_s+=str(i)+'-'
  103. Time_s=Time_s[:-1]+' '
  104. for i in Time:
  105. Time_s+=str(i)+':'

  106. hour=Time[0]
  107. sumnum=0

  108. for j in range(0,5): #计算5次电压平均值

  109. sumnum=sumnum+pin2.read_analog()
  110. averagenum=sumnum/5
  111. if averagenum < 54: #如果小于54说明光线弱
  112. pin1.write_digital(1) #打开LED
  113. else: #如果大于或者等于54,说明光线强
  114. pin1.write_digital(0) #关闭LED

  115. display.scroll(Time_s[:-1]) #显示时钟时间
  116. if button_a.get_presses() > 0 or button_b.get_presses() > 0:
  117. display.scroll(Time_s[:-1]) #如果按过按键,显示时钟时间
  118. sleep(1000)

将以上代码,复制到TurnipBit编程区域,然后保存hex文件,并复制到TURNIPBIT磁盘后,会发现Turnipbit已经开始工作了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部