本帖最后由 浴火的一片冰芯 于 2017-1-31 20:46 编辑
转载请注明:@浴火的一片冰芯
一、本次实验所需器材
1、TPYboard V102板 一块
2、DS3231模块 一块
3、NOKIA 5110 LCD 屏 一块
4、杜邦线:若干
二、DS3231模块
1、什么是DS3231
DS3231是低成本、高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体。该器件包含电池输入端,断开主电源时仍可保持精确的计时。集成晶振提高了器件的长期精确度,并减少了生产线的元件数量。DS3231提供商用级和工业级温度范围,采用16引脚300mil的SO封装。RTC保存秒、分、时、星期、日期、月和年信息。少于31天的月份,将自动调整月末的日期,包括闰年的修正。时钟的工作格式可以是24小时或带/AM/PM指示的12小时格式。提供两个可设置的日历闹钟和一个可设置的方波输出。地址与数据通过I2C双向总线串行传输。
2、DS3231与TPYBoardv102的连接(IIC连接)
DS3231与TPYBoard V102使用IIC连接方法,使用DS3231的SCL,SDA,VCC,GND四个针脚即可设定读出当前时间,对应如下表:
这里IIC常用命令如下:
》 i2c.deinit(),解除I2C定义
》 i2c.init(mode, *, addr=0x12, baudrate=400000, gencall=False),初始化
. mode,只能是 I2C.MASTER 或 I2C.SLAVE
.addr,7位I2C地址
.baudrate,时钟频率
.gencall,通用调用模式
》 i2c.is_ready(addr),检测I2C设备是否响应,只对主模式有效
》 i2c.mem_read(data, addr, memaddr, *, timeout=5000, addr_size=8),读取数据
.data,整数或者缓存
.addr,设备地址
. memaddr,内存地址
. timeout,读取等待超时时间
.addr_size,memaddr的大小。8位或16位
》 i2c.mem_write(data, addr, memaddr, *, timeout=5000, addr_size=8),写入数据,参数含义同上
》 i2c.recv(recv, addr=0x00, *, timeout=5000),从总线读取数据
. recv,需要读取数据数量,或者缓冲区
. addr,I2C地址
. timeout,超时时间
》 i2c.send(send, addr=0x00, *, timeout=5000)
. send,整数或者缓冲区
. addr,I2C地址
. timeout,超时时间
》 i2c.scan(),搜索I2C总线上设备。
三、调试DS3231模块
1、TPYBoard V102的调试
如何能够时时对TPYBoard V102的输出进行调试和查看呢?这里需要用到putty工具。
第一步:将TPYBoard V102与pc通过usb线进行连接,然后通过设备管理器查看其对应的端口号。
第二步:打开putty,如下图进行填写。(putty工具详见附件压缩包)
第三步:点击确定,进入调试窗口,此时屏幕上显示"hello world",是因为main.py程序做了修改,否则不显示。
#main.py
# main.py -- put your code here!
import pyb
print "hello world!!"
第四步:这时就可以在命令行进行调试,常用的几个组合键如下:
Ctrl + C:终止程序
Ctrl + D:重新运行。
2、连接DS3231进行调试
DS3231的连接方法见上文。
第一步:DS3231时间设定,以设定2017年1月25日为例。在TPYBoard V102里添加DS3231.py文件,修改main.py,具体代码如下:
#main.py
# main.py -- put your code here!
from ds3231 import ds3231
ds=ds3231(1)
ds.DATE([17,01,25])
ds.TIME([10,26,30])
while True:
ds.TEMP()
print('Tem:',ds.TEMP())
print('Time:',ds.DateTime())
pyb.delay(1000)
第二步:按一下RST键,此时DS3231的时间已经设定为2017年1月25日,具体见图:
四、利用DS3231和5110制作电子时钟
5110的使用方法请见:[TPYBoard-Micropython之会python就能做硬件 第2篇]控制5110
1、连接方法
(注意与上面不同,这里使用DS3231用的是TPYBoard的第二个I2C口)
2、程序原代码
该程序涉及文件5个,分别为boot.py、main.py、chinese.py、font.py、DS3231.py、upcd8544.py。
源文件详见**末附件内。
//转载请注明:@浴火的一片冰芯
#main.py
# main.py -- put your code here!
import pyb
import upcd8544
from machine import SPI,Pin
from DS3231 import DS3231
ds=DS3231(1) #定义DS3231,用DS3231(2)的话就要选择IIC2
# 用于设定时间和日期
def setDateTime(year,month,day,time,minutes,seconds):
ds.DATE([year,month,day])
ds.TIME([time,minutes,seconds])
# 在LCD5110 显示时间或日期,separator 中间的分割符
# x,y 在LCD5110 显示的位置
def showTimeOrDate(why,x,y,separator=':'):
# [HH,MM,SS] >> HH:MM:SS
why = why.replace('[','')
why = why.replace(']','')
why = why.replace(',',separator)
print(why)
lcd_5110.lcd_write_string(why,x,y)
def main():
lcd_5110.lcd_write_chinese('萝',14,0)
lcd_5110.lcd_write_chinese('卜',30,0)
lcd_5110.lcd_write_chinese('智',46,0)
lcd_5110.lcd_write_chinese('能',62,0)
lcd_5110.lcd_write_string('TEM:',14,2)
lcd_5110.lcd_write_string(str(ds.TEMP()),44,2)
lcd_5110.lcd_write_chinese("当",14,3)
lcd_5110.lcd_write_chinese("前",30,3)
lcd_5110.lcd_write_chinese("时",46,3)
lcd_5110.lcd_write_chinese("间",62,3)
showTimeOrDate(str(ds.TIME()),14,5)
print(str(ds.TIME()))
pyb.delay(1000)
if __name__ == '__main__':
#setDateTime(2016,12,27,13,17,00)#设置时间
ds.DATE()
SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
#DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)
#CLK =>SPI(1).SCK 'X6' SPI clock
RST = pyb.Pin('X1')
CE = pyb.Pin('X2')
DC = pyb.Pin('X3')
LIGHT = pyb.Pin('X4')
lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)
while(1):
main()
五、实现效果
源代码和Putty工具:
TPYBoardV102制作电子时钟.zip
(275.29 KB)
|