用户工具

站点工具


micropython:mpy-lib:misc:ds3231高精度rtc

DS3231是一个低功耗、高精度的实时时钟(RTC),集成有温补晶振(TCXO)。

使用方法

from machine import I2C, Pin
import DS3231
 
i2c = I2C(sda = Pin(5), scl=Pin(4))
ds = DS3231.DS3231(i2c)
 
ds.Hour(12)
 
ds.Time()
ds.Time([12,10,0])
 
ds.DateTime([2018,3,12,1,22,10,0])
 
ds.ALARM(12, 20, 10, ds.PER_DISABLE)
ds.ALARM(12, 20, 10, ds.PER_DAY)
ds.ClearALARM()

驱动源码

DS3231.py
'''
    DS3231 RTC drive
 
    Author: shaoziyang
    Date:   2018.3
 
    http://www.micropython.org.cn
'''
from machine import I2C, Pin
 
DS3231_I2C_ADDR   = (0x68)
DS3231_REG_SEC    = (0x00)
DS3231_REG_MIN    = (0x01)
DS3231_REG_HOUR   = (0x02)
DS3231_REG_WEEKDAY= (0x03)
DS3231_REG_DAY    = (0x04)
DS3231_REG_MONTH  = (0x05)
DS3231_REG_YEAR   = (0x06)
DS3231_REG_A1SEC  = (0x07)
DS3231_REG_A1MIN  = (0x08)
DS3231_REG_A1HOUR = (0x09)
DS3231_REG_A1DAY  = (0x0A)
DS3231_REG_A2MIN  = (0x0B)
DS3231_REG_A2HOUR = (0x0C)
DS3231_REG_A2DAY  = (0x0D)
DS3231_REG_CTRL   = (0x0E)
DS3231_REG_STA    = (0x0F)
DS3231_REG_AGOFF  = (0x10)
DS3231_REG_TEMP   = (0x11)
 
PER_DISABLE = (0)
PER_MINUTE  = (1)
PER_HOUR    = (2)
PER_DAY     = (3)
PER_WEEKDAY = (4)
PER_MONTH   = (5)
 
class DS3231():
    def __init__(self, i2c):
        self.i2c = i2c
        self.setReg(DS3231_REG_CTRL, 0x4C)
 
    def DecToHex(self, dat):
        return (dat//10) * 16 + (dat%10)
 
    def HexToDec(self, dat):
        return (dat//16) * 10 + (dat%16)
 
    def setReg(self, reg, dat):
        self.i2c.writeto(DS3231_I2C_ADDR, bytearray([reg, dat]))
 
    def getReg(self, reg):
        self.i2c.writeto(DS3231_I2C_ADDR, bytearray([reg]))
        return self.i2c.readfrom(DS3231_I2C_ADDR, 1)[0]
 
    def Second(self, second = None):
        if second == None:
            return self.HexToDec(self.getReg(DS3231_REG_SEC))
        else:
            self.setReg(DS3231_REG_SEC, self.DecToHex(second%60))
 
    def Minute(self, minute = None):
        if minute == None:
            return self.HexToDec(self.getReg(DS3231_REG_MIN))
        else:
            self.setReg(DS3231_REG_MIN, self.DecToHex(minute%60))
 
    def Hour(self, hour = None):
        if hour == None:
            return self.HexToDec(self.getReg(DS3231_REG_HOUR))
        else:
            self.setReg(DS3231_REG_HOUR, self.DecToHex(hour%24))
 
    def Weekday(self, weekday = None):
        if weekday == None:
            return self.HexToDec(self.getReg(DS3231_REG_WEEKDAY))
        else:
            self.setReg(DS3231_REG_WEEKDAY, self.DecToHex(weekday%8))
 
    def Day(self, day = None):
        if day == None:
            return self.HexToDec(self.getReg(DS3231_REG_DAY))
        else:
            self.setReg(DS3231_REG_DAY, self.DecToHex(day%32))
 
    def Month(self, month = None):
        if month == None:
            return self.HexToDec(self.getReg(DS3231_REG_MONTH))
        else:
            self.setReg(DS3231_REG_MONTH, self.DecToHex(month%13))
 
    def Year(self, year = None):
        if year == None:
            return self.HexToDec(self.getReg(DS3231_REG_YEAR)) + 2000
        else:
            self.setReg(DS3231_REG_YEAR, self.DecToHex(year%100))
 
    def Date(self, dat = None):
        if dat == None:
            return [self.Year(), self.Month(), self.Day()]
        else:
            self.Year(dat[0]%100)
            self.Month(dat[1]%13)
            self.Day(dat[2]%32)
 
    def Time(self, dat = None):
        if dat == None:
            return [self.Hour(), self.Minute(), self.Second()]
        else:
            self.Hour(dat[0]%24)
            self.Minute(dat[1]%60)
            self.Second(dat[2]%60)
 
    def DateTime(self, dat = None):
        if dat == None:
            return self.Date() + [self.Weekday()] + self.Time()
        else:
            self.Year(dat[0])
            self.Month(dat[1])
            self.Day(dat[2])
            self.Weekday(dat[3])
            self.Hour(dat[4])
            self.Minute(dat[5])
            self.Second(dat[6])
 
    def ALARM(self, day, hour, minute, repeat):
        IE = self.getReg(DS3231_REG_CTRL)
        if repeat == PER_DISABLE:
            self.setReg(DS3231_REG_CTRL, IE & 0xFC) # disable ALARM OUT
            return
        IE |= 0x46
        self.setReg(DS3231_REG_CTRL, IE)
        M2 = M3 = M4 = 0x80
        DT = 0
        if repeat == PER_MINUTE:
            pass
        elif repeat == PER_HOUR:
            M2 = 0
        elif repeat == PER_DAY:
            M2 = M3 = 0
        else:
            M2 = M3 = M4 = 0
            if repeat == PER_WEEKDAY:
                DT = 0x40
        self.setReg(DS3231_REG_A2MIN,  self.DecToHex(minute%60)|M2)
        self.setReg(DS3231_REG_A2HOUR, self.DecToHex(hour%24)|M3)
        self.setReg(DS3231_REG_A2DAY,  self.DecToHex(day%32)|M4|DT)
 
    def ClearALARM(self):
        self.setReg(DS3231_REG_STA, 0)
 
    def Temperature(self):
        t1 = self.getReg(DS3231_REG_TEMP)
        t2 = self.getReg(DS3231_REG_TEMP + 1)
        if t1>0x7F:
            return t1 - t2/256 -256
        else:
            return t1 + t2/256


purge    随机主题   
micropython/mpy-lib/misc/ds3231高精度rtc.txt · 最后更改: 2021/02/28 23:12 (外部编辑) · 查看次数: 7335