目录
8.1 PCF8691模块引脚介绍
8.2 工作原理
8.3 开启I2C接口
8.4 连接到树莓派
8.5 编写代码测量光照强度
在上一节我们使用光敏电阻传感器检测了环境中的光照是否达到了设定的阈值。在本节,我们将使用PCF8591模块和光敏电阻度传感器测量环境中光照强度的具体值,该项目设计到的材料有:
- 树莓派 * 1
- 面包板 * 1
- 杜邦线若干
- PCF8591模块 * 1
- 光敏电阻传感器 * 1
8.1 PCF8691模块引脚介绍
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS 数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591模块上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
左侧外扩排针接口:
AOUT:芯片DA输出接口
AIN0:芯片模拟输入接口0
AIN1:芯片模拟输入接口1
AIN2:芯片模拟输入接口2
AIN3:芯片模拟输入接口3
右侧外扩排针接口:
SCL:I2C 时钟接口,接树莓派SCL引脚
SDA:I2C 数字接口,接树莓派SDA引脚
GND:接地
VCC:电源接口 外接 3.3V-5V
下方共有两行三列排针接口:
J4列排针选择热敏电阻接入电路
J5列排针选择光敏电阻接入电路
J6列排针选择0-5V可调电压接入电路
注:读者的PCF8591模块上可能写的是P4、P5、P6。
8.2 工作原理
上一节提到通过光敏电阻传感器的AO引脚可以的值光照强度,但是该引脚输出的是模拟信号,树莓派因为没有AD转换器所以不能直接读取模拟信号。因此,我们需要PCF8591模块将模拟信号转换成数字信号,最后将数字信号传到树莓派上。
注:AD转换器有时候会直接简称为ADC,即Analog to Digtal Converter,作用就是将将模拟信号转换成数字信号。
8.3 开启I2C接口
PCF8591模块采用的是I2C总线进行通信的,但是在树莓派的镜像中默认是关闭的,在使用该传感器的时候,我们必须首先允许I2C总线通信。
第一步:在终端中输入sudo raspi-config
第二步:选择Interface Options
第三步:选择I2C
第四步:选择<是>
8.4 连接到树莓派
光敏电阻传感器:
- VCC引脚连接到树莓派的2号5V引脚上。
- GND引脚连接到树莓派的6号GND引脚上。
- AO引脚连接到PCF8591模块的A0引脚上。
PCF8591模块:
- VCC引脚连接到树莓派的2号5V引脚上。
- GND引脚连接到树莓派的6号GND引脚上。
- SCL引脚连接到树莓派的5号SCL引脚上。
- SDA引脚连接到树莓派的3号SDA引脚上。
连接完毕之后,我们在终端中输入以下命令获取PCF8591的设备地址,得知设备地址为0x48。
sudo i2cdetect -y 1
8.5 编写代码测量光照强度
在编写代码前,我们需要在树莓派上下载smbus库,通过这个库我们能够很方便的读取到I2C引脚上的值。
pip install smbus
编写代码如下:
import time
import smbus
import RPi.GPIO as GPIO
# 设置编码方式
GPIO.setmode(GPIO.BOARD)
# 设备地址
device_address = 0x48
# 创建smbus实例对象
bus = smbus.SMBus(1)
def read(address):
"""从设备地址读取值"""
bus.write_byte(address, 0x40)
return bus.read_byte(device_address)
try:
while True:
light_value = read(device_address)
if light_value:
print(f"光照强度为:{light_value}")
time.sleep(0.1)
except KeyboardInterrupt:
print("停止测量!")
GPIO.cleanup()
1. smbus.SMBus(1)中的1代表树莓派中的/dev/i2c-1文件。如果传入0,则表示/dev/i2c-0文件。具体传入0还是1,得看树莓派中有哪一个文件。
2. 自定义的read()函数用来从设备地址读取光照值,在读取之前我们需要调用write_byte()方法往设备地址发送一个控制字节0x40,控制字节用于控制器件的各种功能,如模拟信号由哪几个通道输入等。0x40代表PCF8591的A0通道。如果光敏电阻传感器的AO引脚连接的是A1,则发送控制字节0x41;如果是A2,则发送0x42;如果是A3,则发送0x43。
3. light_value是模拟信号经过AD转换器后得出的数字值,范围在0-255之间。光照越强,light_value的值就越低。