diff --git a/DS1307_/README.md b/DS1307_/README.md new file mode 100644 index 0000000000000000000000000000000000000000..264fbec26a4583aa04233e337c359603756bac9e --- /dev/null +++ b/DS1307_/README.md @@ -0,0 +1,56 @@ + + +# 时钟模块 + +## 案例展示 +![](img/20210716185257.jpg) + +## 物理连接 + +### 传感器选择 + +![](img/20210716185325.jpg) + +   传感器选择如下图所示的型号为DS1307的实时时钟传感器模组。 + +### 传感器接线 + +  传感器与Waffle Nano 之间的接线方式如下表所示,且未在下表中显示的引脚均处于悬空不连装态。 + +| Waffle Nano | | +| ----------- | ---- | +| 3.3 | VCC | +| IO0 | SDA | +| IO1 | SCL | +| GND | GND | + +## 传感器库使用 + +​ 可以获取[DS1307.py](https://gitee.com/blackwalnutlabs/waffle-nano-v1-sensor-lib/blob/master/DS1307_/code/DS1307.py),将此库通过[Waffle Maker](https://wafflenano.blackwalnut.tech/ide/index.html#/editor) 的文件上传功能将此库上传到`Waffle Nano`上。 + +  我们在可以在主函数中使用以下代码导入此库。 + +``` +import DS1307 +``` + +  在对象构造函数中,我们需要传入一个已经构造好的`IIC`对象。 + +``` +# 此处省略IIC对象的构造过程 +ds = DS1307.DS1307(i2c) #构造实时时钟对象 +``` + +  我们使用实时时钟对象的datetime()方法读取出一个含有八个元素的元组。 + +``` +current = ds.datetime() #从实时时钟中获取数据 +``` + +  关于此库相关细节说明详见代码注释 + +## 案例代码复现 + +  可以获取[main.py](https://gitee.com/blackwalnutlabs/waffle-nano-v1-sensor-lib/blob/master/DS1307_/code/main.py)函数,将其内容复制到[Waffle Maker](https://wafflenano.blackwalnut.tech/ide/index.html#/editor) 编辑器上传输给`Waffle Nano`,以复现此案例。 + +  案例相关细节说明详见代码注释 \ No newline at end of file diff --git a/DS1307_/code/DS1307.py b/DS1307_/code/DS1307.py new file mode 100644 index 0000000000000000000000000000000000000000..8a3b11b5142c982c4bf44490ab1da24b2414f73a --- /dev/null +++ b/DS1307_/code/DS1307.py @@ -0,0 +1,70 @@ +from micropython import const + +DATETIME_REG = const(0) # 0x00-0x06 +CHIP_HALT = const(128) +CONTROL_REG = const(7) # 0x07 +RAM_REG = const(8) # 0x08-0x3F + +class DS1307(object): + """Driver for the DS1307 RTC.""" + def __init__(self, i2c, addr=0x68): + self.i2c = i2c + self.addr = addr + self.weekday_start = 1 + self._halt = False + + def _dec2bcd(self, value): + """Convert decimal to binary coded decimal (BCD) format""" + return (value // 10) << 4 | (value % 10) + + def _bcd2dec(self, value): + """Convert binary coded decimal (BCD) format to decimal""" + return ((value >> 4) * 10) + (value & 0x0F) + + def datetime(self, datetime=None): + """Get or set datetime""" + if datetime is None: + 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] - self.weekday_start), # weekday + self._bcd2dec(buf[2]), # hour + self._bcd2dec(buf[1]), # minute + self._bcd2dec(buf[0] & 0x7F), # second + 0 # subseconds + ) + 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] + self.weekday_start) # 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 halt(self, val=None): + """Power up, power down or check status""" + if val is None: + return self._halt + 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])) + + def square_wave(self, sqw=0, out=0): + """Output square wave on pin SQ at 1Hz, 4.096kHz, 8.192kHz or 32.768kHz, + or disable the oscillator and output logic level high/low.""" + rs0 = 1 if sqw == 4 or sqw == 32 else 0 + rs1 = 1 if sqw == 8 or sqw == 32 else 0 + out = 1 if out > 0 else 0 + sqw = 1 if sqw > 0 else 0 + reg = rs0 | rs1 << 1 | sqw << 4 | out << 7 + self.i2c.writeto_mem(self.addr, CONTROL_REG, bytearray([reg])) diff --git a/DS1307_/code/main.py b/DS1307_/code/main.py new file mode 100644 index 0000000000000000000000000000000000000000..df9acc3afa4d4d12837e486a946c1eec58395c67 --- /dev/null +++ b/DS1307_/code/main.py @@ -0,0 +1,35 @@ +'''传入库''' +from machine import I2C, Pin,SPI +import utime +import st7789 +import ds1307 + +'''创建对象''' +i2c = I2C(1, sda=Pin(0), scl=Pin(1),freq=400000) +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.draw_string(50, 230, "Powered by BlackWalnuut Labs.") + +'''将屏幕背景渲染为白色''' +display.fill(st7789.color565(255, 255, 255)) + + +while True: + current = ds.datetime() #获取当下的时刻元组 + year = current[0]+21 #获取年份 + month = current[1] #获取月份 + day = current[2] #获取日期 + date = current[3] #获取星期 + hour = current[4] #获取小时 + minute = current[5] #获取分钟 + second = current[6] #获取秒 + former = "%04d/%02d/%02d" % (year,month,day) #格式化具体某一天 + later = "%02d:%02d:%02d" % (hour,minute,second) #格式化一天当中的时刻 + #将当下时刻累计的步数输出在显示屏上 + display.draw_string(10, 10,former,size=3,color=st7789.color565(0, 0, 0)) + display.draw_string(10, 40,later,size=3,color=st7789.color565(0, 0, 0)) + utime.sleep(1) #一秒获取一次时刻 \ No newline at end of file diff --git a/DS1307_/img/20210716185257.jpg b/DS1307_/img/20210716185257.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e58b52c85f36fb66333feb8c52d391440045b9a6 Binary files /dev/null and b/DS1307_/img/20210716185257.jpg differ diff --git a/DS1307_/img/20210716185325.jpg b/DS1307_/img/20210716185325.jpg new file mode 100644 index 0000000000000000000000000000000000000000..03761da4e11e94792e5dbf3785c243c2ef2ddbab Binary files /dev/null and b/DS1307_/img/20210716185325.jpg differ