diff --git a/DS1307/README.md b/DS1307/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f6192f255237ba008845d1c600a9b27720f404a8 --- /dev/null +++ b/DS1307/README.md @@ -0,0 +1,86 @@ +# DS1307 钟表模型 + +## 案例展示 + + + + + +ds1307 + +能够显示当前的年、月、日与时间,同时能够重新设置时间一校准。 + +## 传感器 + +DS1307使用I2C协议。 + +各寄存器地址如下: + +![Timekeeper_Registers](https://gitee.com/black-pwq/waffle-nano-v1-sensor-lib/raw/master/DS1307/img/Timekeeper_Registers.png) + + +## 物理连线 + +Tiny RTC DS1307 与Waffle nano的连线选择左侧引脚较少一侧,只需与主板连四根线即可。 + +- [ ] SCL --> G01 +- [ ] SDA --> G00 +- [ ] VCC --> 3V3 +- [ ] GND --> GND + +## 传感器库 + +传感器库名为ds1307, 提供: + +- 查询时间 get_time() +- 设置时间 set_time() +- 查询状态 query_halt() +- 设置状态 set_halt() + +使用方法: + +```python +from machine import I2C, Pin +import ds1307 + +i2c = I2C(1, sda = Pin(0), scl = Pin(1), freq = 100000) +ds = ds1307.DS1307(i2c) # 传入接口 +ds.set_halt(False) # 启动计时 +now = (year, month, day, date, hour, minute, second, subsecond) # 写入当前时间 +ds.set_time(now) #设置时间 +print(ds.get_time()) # 查询时间 +``` + +## 测试样例: + +```python +>>> from machine import I2C, Pin +>>> import ds1307 +>>> i2c = I2C(1, sda = Pin(0), scl = Pin(1), freq = 100000) +>>> ds = ds1307.DS1307(i2c) +>>> i2c.scan() # 查询接口地址 +[80, 104] +>>> ds.query_halt() # 查询时钟是否暂停 +False # 时钟未暂停 +>>> ds.get_time() # 查询时间 +(2021, 7, 16, 5, 20, 54, 7, 0) # 当前时间 +>>> ds.get_time() # 等待 8s +(2021, 7, 16, 5, 20, 54, 16, 0) +>>> ds.get_time() # 等待 10s +(2021, 7, 16, 5, 20, 54, 26, 0) +>>> ds.set_halt(True) # 设置时钟暂停计时 +>>> ds.get_time() # 获取时间 +(2021, 7, 16, 5, 20, 54, 43, 0) +>>> ds.get_time() # 等待 5s +(2021, 7, 16, 5, 20, 54, 43, 0) # 时间未变 +>>> ds.set_halt(False) # 设置时钟开启计时 +>>> ds.get_time() # 获取时间 +(2021, 7, 16, 5, 20, 54, 49, 0) +>>> ds.get_time() #等待 5S +(2021, 7, 16, 5, 20, 54, 54, 0) +``` + +## 案例代码复现 + +可以获取[main.py](https://gitee.com/black-pwq/waffle-nano-v1-sensor-lib/blob/master/DS1307/code/main.py)函数,将其内容复制到[Waffle Maker](https://wafflenano.blackwalnut.tech/ide/index.html#/editor) 编辑器上传输给`Waffle Nano`,以复现此案例。 + diff --git a/DS1307/code/ds1307.py b/DS1307/code/ds1307.py new file mode 100644 index 0000000000000000000000000000000000000000..0c9806f052fbceeaa502b40a160c69fb39b9229c --- /dev/null +++ b/DS1307/code/ds1307.py @@ -0,0 +1,59 @@ +# ds1307 +DATETIME_REG = 0 # 0x00-0x06 +CHIP_HALT = 128 # (binary) 1000 0000 + +class DS1307(object): + """Driver for the DS1307 RTC.""" + def __init__(self, i2c, addr = 0x68): + self.i2c = i2c + self.addr = addr + self._halt = False + + def _dec2bcd(self, value): + """Convert decimal to binary coded decimal (BCD) format""" + """Equivalent to convert hexa to dec""" + return (value // 10) << 4 | (value % 10) + + def _bcd2dec(self, value): + """Convert binary coded decimal (BCD) format to decimal""" + """Equivalent to convert dec to hexa""" + return ((value >> 4) * 10) + (value & 0x0F) + + def get_time(self): + buf = self.i2c.readfrom_mem(self.addr, DATETIME_REG, 7) + return ( + self._bcd2dec(buf[6]) + 2000, # year + self._bcd2dec(buf[5]), # month + self._bcd2dec(buf[4]), # day + self._bcd2dec(buf[3]), # weekday + self._bcd2dec(buf[2]), # hour + self._bcd2dec(buf[1]), # minute + self._bcd2dec(buf[0] & 0x7F), # second + 0 # subseconds + ) + def set_time(self, datetime = None): + buf = bytearray(7) + buf[0] = self._dec2bcd(datetime[6]) & 0x7F # second, msb = CH, 1=halt, 0=go + buf[1] = self._dec2bcd(datetime[5]) # minute + buf[2] = self._dec2bcd(datetime[4]) # hour + buf[3] = self._dec2bcd(datetime[3]) # weekday + buf[4] = self._dec2bcd(datetime[2]) # day + buf[5] = self._dec2bcd(datetime[1]) # month + buf[6] = self._dec2bcd(datetime[0] - 2000) # year + if (self._halt): + buf[0] |= (1 << 7) + self.i2c.writeto_mem(self.addr, DATETIME_REG, buf) + + def query_halt(self): + """check status""" + return self._halt + + def set_halt(self, val = None): + """Power up or power down""" + reg = self.i2c.readfrom_mem(self.addr, DATETIME_REG, 1)[0] + if val: + reg |= CHIP_HALT + else: + reg &= ~CHIP_HALT + self._halt = bool(val) + self.i2c.writeto_mem(self.addr, DATETIME_REG, bytearray([reg])) \ No newline at end of file diff --git a/DS1307/code/main.py b/DS1307/code/main.py new file mode 100644 index 0000000000000000000000000000000000000000..291918d01b5f6a0dbe5ac3bde2acd70e944e9f30 --- /dev/null +++ b/DS1307/code/main.py @@ -0,0 +1,31 @@ +from machine import I2C, Pin, SPI +from utime import sleep +import ds1307, st7789 + +i2c = I2C(1, sda=Pin(0), scl=Pin(1),freq=400000) +week_day = [" ", "Mon", "Tue", "Wed", "Thus", "Fri", "Sat", "Sun"] +print(i2c.scan()) +ds = ds1307.DS1307(i2c) + +spi = SPI(0, baudrate=40000000, polarity=1, phase=0, bits=8, endia=0, sck=Pin(6), mosi=Pin(8)) +display = st7789.ST7789(spi, 240, 240, reset=Pin(11,func=Pin.GPIO, dir=Pin.OUT), dc=Pin(7,func=Pin.GPIO, dir=Pin.OUT)) +display.init() +display.fill(st7789.color565(255, 255, 255)) + +while True: + display.fill(st7789.color565(255, 255, 255)) + date = ds.get_time() + year = date[0] + month = date[1] + day = date[2] + weekday = date[3] + hour = date[4] + minute = date[5] + second = date[6] + + pre_str = "%04d/%02d/%02d" % (year, month, day) + post_str = "%02d:%02d:%02d" % (hour, minute, second) + display.draw_string(45, 70, pre_str, size=3, color=st7789.color565(0, 0, 0)) + display.draw_string(60, 110, post_str, size=3, color=st7789.color565(0, 0, 0)) + display.draw_string(97, 150, week_day[weekday], size=3, color=st7789.color565(0, 0, 0)) + sleep(1) \ No newline at end of file diff --git a/DS1307/img/Timekeeper_Registers.png b/DS1307/img/Timekeeper_Registers.png new file mode 100644 index 0000000000000000000000000000000000000000..188975ade5683b3e8d10fd35f74b67781727dc9b Binary files /dev/null and b/DS1307/img/Timekeeper_Registers.png differ diff --git a/DS1307/img/ds1307_figure.jpg b/DS1307/img/ds1307_figure.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a2131904ad6b93bcffe11a0b5d8d624e4b703020 Binary files /dev/null and b/DS1307/img/ds1307_figure.jpg differ