传感器实验

日常生活中我们会用到各式各样的外设或者传感器,还是那句,一个有经验的嵌入式开发工程师驱动一款未接触过的传感器的一般流程是:了解传感器原理、设计电路图、信号时序分析和编程。没个几天折腾不出来。生活中有很多传感器已经是非常通用了,前人已经做好封装函数模块,我们直接调用函数即可。我们不需要将时间花在“怎么用”上,而更多的是考虑“用到什么地方”!

温度传感器 DS18B20

前言:

相信没有电子爱好者不知道 DS18B20 的,DS18B20 是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。DS18B20 数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样。主要根据应用场合的不同而改变其外观。封装后的 DS18B20 可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。

实验目的:

通过编程采集温度数据,并在 OLED 上显示。

实验讲解:

DS18B20 是单总线驱动(onewire)传感器,也就是说只占用 1 个 IO 口。我,们来看看原理图:

实验目的:

通过编程采集温度数据,并在 OLED 上显示。

实验讲解:

DS18B20 是单总线驱动(onewire)传感器,也就是说只占用 1 个 IO 口。我们来看看原理图:

image-20230702140646041

可以看到 DS18B20 传感器连接到了 pyBase 的 X11 引脚上。也就是连接到pyWiFi-ESP32-S2 的引脚 41,如下图所示:

image-20230702140747976

也就是说我们需要针对引脚 41 编写程序来驱动 DS18B20。那么我们需要自己来编写驱动么?如果你有兴趣的可以自己尝试一下。这部分我们 01Studio 已经收集整理和编写好了,单总线模块文件是:onewire.py,DS18B20 模块的文件是 ds18x20.py。如果你学习过前面基于 STM32 平台应该不陌生。而对于 ESP32-S2,这两个模块已经集成到了初始化固件中,也就是说我们可以直接在 main.py 导入模块并调用即可!单总线模块(onewire)和 ds18x20 模块说明如下:

构造函数

ow=onewire.OneWire(machine.Pin(id))

构建单总线对象。id:引脚编号;

使用方法

ow.scan()

扫描总线上的设备。返回设备地址,支持多设备同时挂载。

ow.reset()

总线设备复位。

ow.readbyte()

读 1 个字节。

ow.writebyte(0x12)

写入 1 个字节。

ow.write(‘123’)

写入多个字节。

ow.select_rom(b’12345678’)

根据 ROM 编号选择总线上指定设备

 

构造函数

ds=ds18x20.DS18X20(ow)

构建 DS18B20 传感器对象。ow:定义好的单总线对象;

使用方法

ds.scan()

扫描总线上的设备。返回设备地址,支持多设备同时挂载。

ds.convert_temp()

温度转换。

ds.read_temp(rom)

获取温度值。rom:表示对应的设备号。

 

大部分场景下温度的变化不会太频繁,我们可以每隔 1 秒采集一次,显示精度为小数点后 2 位,基本满足大部分应用需求。编程逻辑如下:

image-20230702140853444

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'''
实验名称:温度传感器DS18B20
说明:通过编程采集温度数据,并在OLED上显示。。
'''

#引用相关模块
from machine import Pin,SoftI2C,Timer
from ssd1306 import SSD1306_I2C
import onewire,ds18x20,time

#初始化相关模块
i2c = SoftI2C(sda=Pin(40), scl=Pin(38))
oled = SSD1306_I2C(128, 64, i2c, addr=0x3c)

#初始化DS18B20
ow= onewire.OneWire(Pin(41)) #使能单总线
ds = ds18x20.DS18X20(ow) #传感器是DS18B20
rom = ds.scan() #扫描单总线上的传感器地址,支持多个传感器同时连接

def temp_get(tim):
ds.convert_temp()
temp = ds.read_temp(rom[0]) #温度显示,rom[0]为第1个DS18B20

#OLED数据显示
oled.fill(0) #清屏背景黑色
oled.text('MicroPython', 0, 0)
oled.text('Temp test:',0,20)
oled.text(str('%.2f'%temp)+' C',0,40) #显示temp,保留2位小数
oled.show()

#开启RTOS定时器,编号为-1
tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC,callback=temp_get) #周期为1000ms

实验拓展:

pyBase 开发底板预留了外界传感器接口,只要接线正确就可以进行更多的传感器实验。我们将带金属探头的 DS18B20 传感器接到 pyBase 右侧上面的传感器母座,其连接到 pyBase 的“Y11”引脚,也就是对应 pyWiFi-ESP32-S2 的引脚 10。

所以只要将原程序代码:

1
ow= onewire.OneWire(Pin(41)) 

改成 :

1
ow= onewire.OneWire(Pin(10)),

即可驱动外接的 DS18B20。

总结

DS18B20 作为我们第一个实验传感器,使用 MicroPython 编程非常容易就用起来了,而且精度和稳定性丝毫没有影响。温度传感器只是一个敲门砖,接下来我们将会学习更多的传感器应用。

 

温湿度传感器 DHT11

前言:

温湿度也是我们日常非常常见的指标,我们使用的是 DHT11 数字温湿度传感器。这是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。

DHT11 具有小体积、极低的功耗,信号传输距离可达 20 米以上,使其成为给类应用甚至最为苛刻的应用场合的最佳选择。产品为 4 针单排引脚封装,连接方便。

实验目的:

通过编程采集温湿度数据,并在 OLED 上显示。

实验讲解:

DHT11 虽然有 4 个引脚,但其中第 3 个引脚是悬空的,也就是说 DHT11 也是单总线的传感器,只占用 1 个 IO 口。

image-20230702141333793

我们来看看 DHT11 在开发板上的接线图:

image-20230702141347945

可以看到 DHT11 连接到 pyBase 的‘X12’引脚,也就是连接到 pyWiFi-ESP32-S2 的引脚 42,如下图所示:

因此可以针对引脚 42 编程来驱动 DHT11 传感器,模块文件是 dht.py。而对于 pyWiFi-ESP32-S2,这个模块已经集成到了初始化固件中,也就是说我们可以直接在 main.py 导入模块并调用即可。函数模块说明如下

 

构造函数

d = dht.DHT11(machine.Pin(id))

构建 DHT11 传感器对象。id:传感器所连接的引脚;

使用方法

d.measure()

测量温湿度。

d.temperature()

获取温度值。

d.humidity()

获取湿度值

建议上电先延时 1 秒,让 DHT11 稳定后再开始读取。代码编写流程如下:

image-20230702141458320

 

人体感应传感器

前言:

人体感应传感器,在室内安防应用非常普遍,其原理是由探测元件将探测到人体的红外辐射转变成微弱的电压信号,经过放大后输出。为了提高探测器的探测灵敏度以增大探测距离,一般在探测器的前方装设一个塑料的菲涅尔透镜,它和放大电路相配合,可将信号放大 70dB 以上,这样就可以测出 5~10 米范围内人的行动。

实验目的:

通过外部中断编程来检测人体感应模块,当有人出现时候 OLED 通过“GetPeople!!!”闪烁提示。