[M4] [TPYBoard-Micropython之会python就能做硬件 第2升级篇] 制作电子钟

[复制链接]
1693|0
 楼主| 浴火的一片冰芯 发表于 2017-1-29 13:27 | 显示全部楼层 |阅读模式
本帖最后由 浴火的一片冰芯 于 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四个针脚即可设定读出当前时间,对应如下表:

01.PNG
这里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线进行连接,然后通过设备管理器查看其对应的端口号。

2.jpg

第二步:打开putty,如下图进行填写。(putty工具详见附件压缩包)
3.jpg

第三步:点击确定,进入调试窗口,此时屏幕上显示"hello world",是因为main.py程序做了修改,否则不显示。

#main.py
  1. # main.py -- put your code here!
  2. import pyb
  3. print "hello world!!"
4.PNG
第四步:这时就可以在命令行进行调试,常用的几个组合键如下:

Ctrl + C:终止程序

Ctrl + D:重新运行。

2、连接DS3231进行调试
      DS3231的连接方法见上文。
第一步:DS3231时间设定,以设定2017年1月25日为例。在TPYBoard V102里添加DS3231.py文件,修改main.py,具体代码如下:
#main.py
  1. # main.py -- put your code here!
  2. from ds3231 import ds3231
  3. ds=ds3231(1)
  4. ds.DATE([17,01,25])
  5. ds.TIME([10,26,30])
  6. while True:
  7.     ds.TEMP()
  8.     print('Tem:',ds.TEMP())
  9.     print('Time:',ds.DateTime())
  10.     pyb.delay(1000)
第二步:按一下RST键,此时DS3231的时间已经设定为2017年1月25日,具体见图:
5.png
四、利用DS3231和5110制作电子时钟
5110的使用方法请见:[TPYBoard-Micropython之会python就能做硬件 第2篇]控制5110

1、连接方法

(注意与上面不同,这里使用DS3231用的是TPYBoard的第二个I2C口)
6.PNG
2、程序原代码

      该程序涉及文件5个,分别为boot.py、main.py、chinese.py、font.py、DS3231.py、upcd8544.py。
       源文件详见**末附件内。
     //转载请注明:@浴火的一片冰芯
      #main.py
  1. # main.py -- put your code here!
  2. import pyb
  3. import upcd8544
  4. from machine import SPI,Pin
  5. from DS3231 import DS3231

  6. ds=DS3231(1) #定义DS3231,用DS3231(2)的话就要选择IIC2

  7. # 用于设定时间和日期
  8. def setDateTime(year,month,day,time,minutes,seconds):
  9.     ds.DATE([year,month,day])
  10.     ds.TIME([time,minutes,seconds])
  11.   
  12. # 在LCD5110 显示时间或日期,separator 中间的分割符
  13. # x,y 在LCD5110 显示的位置
  14. def showTimeOrDate(why,x,y,separator=':'):
  15.     # [HH,MM,SS] >> HH:MM:SS
  16.     why = why.replace('[','')
  17.     why = why.replace(']','')
  18.     why = why.replace(',',separator)
  19.     print(why)
  20.     lcd_5110.lcd_write_string(why,x,y)


  21. def main():
  22.     lcd_5110.lcd_write_chinese('萝',14,0)
  23.     lcd_5110.lcd_write_chinese('卜',30,0)
  24.     lcd_5110.lcd_write_chinese('智',46,0)
  25.     lcd_5110.lcd_write_chinese('能',62,0)
  26.     lcd_5110.lcd_write_string('TEM:',14,2)
  27.     lcd_5110.lcd_write_string(str(ds.TEMP()),44,2)
  28.     lcd_5110.lcd_write_chinese("当",14,3)
  29.     lcd_5110.lcd_write_chinese("前",30,3)
  30.     lcd_5110.lcd_write_chinese("时",46,3)
  31.     lcd_5110.lcd_write_chinese("间",62,3)
  32.     showTimeOrDate(str(ds.TIME()),14,5)
  33.     print(str(ds.TIME()))
  34.     pyb.delay(1000)

  35. if __name__ == '__main__':
  36.     #setDateTime(2016,12,27,13,17,00)#设置时间
  37.     ds.DATE()
  38.     SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
  39.     #DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)
  40.     #CLK =>SPI(1).SCK  'X6' SPI clock
  41.     RST    = pyb.Pin('X1')
  42.     CE     = pyb.Pin('X2')
  43.     DC     = pyb.Pin('X3')
  44.     LIGHT  = pyb.Pin('X4')
  45.     lcd_5110 = upcd8544.PCD8544(SPI, RST, CE, DC, LIGHT)
  46.     while(1):
  47.      main()
五、实现效果
实验效果.jpg

源代码和Putty工具:
TPYBoardV102制作电子时钟.zip (275.29 KB, 下载次数: 3)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

12

帖子

0

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