diff --git a/DS1307_/README_.md b/DS1307_/README_.md new file mode 100644 index 0000000000000000000000000000000000000000..0b8cb64e9eb03d2d687849afd8427c37ad28b39a --- /dev/null +++ b/DS1307_/README_.md @@ -0,0 +1,77 @@ +# 时钟 + +## 案例展示 + +一个能显示时间,日期和星期的时钟。 + +![](img/IMG20210721120603.jpg) + +## 物理连线 + +### 传感器选择 + +传感器选择如下图所示的型号为`DS1307`的时钟模组。 + +![](img/IMG20210713195601.jpg) + +### 传感器接线 + +传感器与`Waffle Nano`之间的接线方式如下表所示,且未在下表中显示的引脚均处于悬空不连状态。 + +| Waffle Nano | 传感器 | +| ----------- | ------ | +| 3V3 | VCC | +| IO0 | SDA | +| IO1 | SCL | +| GND | GND | + +(注:上述传感器接线柱均为五接线柱一侧,即上图下方的五个接线柱) + +## 传感器库使用 + +可以获取[ds1307.py](https://gitee.com/blackwalnutlabs/waffle-nano-v1-sensor-lib/tree/master/DS1307_/code/ds1307.py),将此库通过[Waffle Maker](https://wafflenano.blackwalnut.tech/ide/index.html#/editor)的文件上传功能将此库上传到`Waffle Nano`上。 + +我们可以在主函数中使用以下代码导入此库。 + +```python +import ds1307 +``` + +在对象构造函数中,我们需要传入一个已经构造好的`I2C`对象 + +```python +# 此处省略I2C对象的构造过程 +ds = ds1307.DS1307(i2c) # 构造时钟对象 +``` + +导入此库后,我们可以进行以下操作 + +```python +datetime() datetime(now) halt(False) +``` + +1.`ds.datetime()` + +该函数能读出`DS1307`现在的时间,所以,你可以使用`print(ds.datetime())`来显示时间(注:若未的设置时间,只能读出其内置的初始值,即`(2000,1,1,0,0,0,0)`)。 + +2.`ds.datetime(now)` + +该函数用于设置时间,具体设置方法如下。 + +```python +now=(2021,7,1,4,0,0,0) +ds.datetime(now) +``` + +3.`ds.halt(False)` + +该函数用于控制振荡器,`False`激活,`True`关闭。 + +关于此库相关细节说明详见代码注释。 + +## 案例代码复现 + +可以获取[main.py](https://gitee.com/blackwalnutlabs/waffle-nano-v1-sensor-lib/tree/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..6ec89637f40160808cd6f41f0faa165ed58a538b --- /dev/null +++ b/DS1307_/code/ds1307.py @@ -0,0 +1,53 @@ +from micropython import const # 引入常量 + +DATETIME_REG = const(0) # 日期的地址是从0x00-0x06 +CHIP_HALT = const(128) + +class DS1307(object): + def __init__(self, i2c, addr=0x68):# 定义一个DS1307的类 + self.i2c = i2c + self.addr = addr + self.weekday_start = 1 + self._halt = False # False时振荡器启动,True时振荡器关闭 + + def _dec2bcd(self, value):# 将十进制转换为二进制编码十进制(BCD)格式 + return (value // 10) << 4 | (value % 10) + + def _bcd2dec(self, value):# 将二进制编码十进制(BCD)格式转换为十进制 + return ((value >> 4) * 10) + (value & 0x0F) + + def datetime(self, datetime=None):# 设定或获得时间 + 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]), # months + self._bcd2dec(buf[4]), # days + self._bcd2dec(buf[3] - self.weekday_start), # weekday + self._bcd2dec(buf[2]), # hours + self._bcd2dec(buf[1]), # minutes + self._bcd2dec(buf[0] & 0x7F), # seconds + 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):# 通电、断电或检查状态 + 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])) \ No newline at end of file diff --git a/DS1307_/code/main_.py b/DS1307_/code/main_.py new file mode 100644 index 0000000000000000000000000000000000000000..ca362e0549ce213136da28f05b833a341bd8f2d9 --- /dev/null +++ b/DS1307_/code/main_.py @@ -0,0 +1,37 @@ +from machine import I2C, Pin,SPI # 导入通信引脚及相关的库 +import ds1307,utime,st7789 # 导入时钟模块,时间模块和屏幕驱动 +i2c = I2C(1, sda=Pin(0), scl=Pin(1),freq=100000) # 构造IIC对象,将1号引脚设置为scl,将0号引脚设置为sda,频率设为100000 +week_day = ["Mon", "Tue", "Wed", "Thus", "Fri", "Sat", "Sun"] # 设置星期列表便于下方将数字转换为星期 +ds = ds1307.DS1307(i2c) # 构造时钟对象 +spi = SPI(0, baudrate=40000000, polarity=1, phase=0, bits=8, endia=0, sck=Pin(6), mosi=Pin(8)) # 构造spi对象 +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)) # 设置屏幕背景为白色 + +# 接下来的一部分为设置时间,设置完成后需删除,防止覆盖现有时间而产生错误 +# print(ds.datetime()) # 显示当前DS1307模块的内置时间 +# ds.halt(False) # 打开振荡器,让时间开始走动 +# now=(2021,7,16,5,13,27,0,0) # 接下来两句为设定时间 +# ds.datetime(now) + +while True: # 不断刷新,获取实时数据 + date = ds.datetime() # 获取时间和日历信息 + year = date[0] # 年 + month = date[1] # 月 + day = date[2] # 日 + weekday = date[3] # 星期 + hour = date[4] # 小时 + minute = date[5] # 分钟 + second = date[6] # 秒 + + # 统一格式 + year1_str = "%04d" % year + month1_str = "%02d" % month + day1_str = "%02d" % day + time1_str = "%02d:%02d" % (hour, minute) + second1_str = "%02d" % second + + display.draw_string(40, 40, time1_str+":"+second1_str, size=3, color=st7789.color565(0, 0, 0)) # 在屏幕上显示时分秒 + display.draw_string(20, 130, year1_str+"/"+month1_str+"/"+day1_str, size=3, color=st7789.color565(0, 0, 0)) # 在屏幕上显示年月日 + display.draw_string(30, 195, week_day[weekday - 1], size=3, color=st7789.color565(0, 0, 0)) # 在屏幕上显示星期 + utime.sleep(1) # 每隔一秒刷新一次 \ No newline at end of file diff --git a/DS1307_/img/IMG20210713195601.jpg b/DS1307_/img/IMG20210713195601.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e8e90db0b7691cc508788b4b0d2937a8790ef939 Binary files /dev/null and b/DS1307_/img/IMG20210713195601.jpg differ diff --git a/DS1307_/img/IMG20210721120603.jpg b/DS1307_/img/IMG20210721120603.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c3c849375a79805471e6fa2dc844daea556bea0e Binary files /dev/null and b/DS1307_/img/IMG20210721120603.jpg differ diff --git a/LM35/README.md b/LM35/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fd39eff4ff9d6351671a350b03d951d24822b772 --- /dev/null +++ b/LM35/README.md @@ -0,0 +1,50 @@ +# 温度测量 + +## 案例展示 + +一个简单的温度计,检测周围的环境温度,并呈现出来。 + + + +## 物理连线 + +### 传感器选择 + +传感器选择如下图的型号为LM35的温度传感模块 + + + +### 传感器连线 + +传感器与Waffle Nano 之间的接线方式如下表所示 + +| Waffle Nano | 传感器 | +| :---------- | ------ | +| 3V3 | VCC | +| IO13 | OUT | +| GND | GND | + +## 传感器库使用 + +可以获取[LM35.py](https://gitee.com/blackwalnutlabs/waffle-nano-v1-sensor-lib/blob/master/LM35/code/LM35.py),将此库通过[Waffle Maker](https://wafflenano.blackwalnut.tech/ide/index.html#/editor)的文件上传到`Waffle Nano`上。 + +因为该传感器测温库较为简单,所以我们可以直接在主函数中使用以下代码导入此库 + +```python +import LM35 +``` + +接着,定义一个新的变量接收`temp()`方法传回来的结果 + +```python +te=LM35.temp()#获取温度 +``` + +关于此库相关细节说明详见代码注释。 + +## 案例代码复现 + +可以获取[main.py](https://gitee.com/blackwalnutlabs/waffle-nano-v1-sensor-lib/blob/master/LM35/code/main.py)函数,将其内容复制到[Waffle Makeer](https://wafflenano.blackwalnut.tech/ide/index.html#/editor)编辑器上传输给`Waffle Nano`,以复现此案例。 + +案例相关细节说明详见代码注释。 + diff --git a/LM35/code/LM35.py b/LM35/code/LM35.py new file mode 100644 index 0000000000000000000000000000000000000000..f58cfa8439fa337f962acd7f1817a98ba40663e4 --- /dev/null +++ b/LM35/code/LM35.py @@ -0,0 +1,7 @@ +def temp(): + from machine import Pin, ADC#导入 machine 模块的硬件类 Pin和数模转换类ADC + adc = ADC(Pin(13))#把waffle nano默认的GPIO 13号引脚设置为ADC通道3 + adc.equ(ADC.EQU_MODEL_8)#设置ADC的平均计算的采样次数为8次 + adc.atten(ADC.CUR_BAIS_DEFAULT)#将电源电压设为默认值 + a = "%.3g" % ((adc.read() * 0.488 - 32) / 1.8-5)#读取采样值并计算,实操后发现测得温度偏高5℃,所以减去5℃ + return a#返回温度值 \ No newline at end of file diff --git a/LM35/code/main.py b/LM35/code/main.py new file mode 100644 index 0000000000000000000000000000000000000000..58bc4879c3dcbdb792fa23c6ef2129bcd99d2914 --- /dev/null +++ b/LM35/code/main.py @@ -0,0 +1,11 @@ +from machine import SPI, Pin#导入通信以及引脚相关的库 +import st7789,LM35,utime#导入屏幕库驱动,温度模块,时间模块 +spi = SPI(0, baudrate=40000000, polarity=1, phase=0, bits=8, endia=0, sck=Pin(6), mosi=Pin(8))##构造spi对象 +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(1):#不断循环获取实时温度 + te=LM35.temp()#获取温度 + display.draw_string(70, 150, str(te)+" C",size=3,color=st7789.color565(0, 0, 0))#在屏幕上显示温度 + utime.sleep(1)#刷新温度的时间间隔 + display.fill(st7789.color565(255, 255, 255))#设置屏幕背景为白色 \ No newline at end of file diff --git a/LM35/img/IMG20210713193158.jpg b/LM35/img/IMG20210713193158.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b8ac7790e00f0597f6e067aa3f8f73da8cc4621e Binary files /dev/null and b/LM35/img/IMG20210713193158.jpg differ diff --git a/LM35/img/IMG20210716152704.jpg b/LM35/img/IMG20210716152704.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5f0b9b57338c06e96ae05f039dc800f6f68dff3 Binary files /dev/null and b/LM35/img/IMG20210716152704.jpg differ