PCF8575是一款常见的I2C接口16位数字输入/输出扩展芯片,在嵌入式开发和物联网项目中广泛应用。这个芯片通过I2C总线与主控器通信,能够为主控器提供额外的16个GPIO引脚,有效解决了微控制器IO资源不足的问题。
adafruit-circuitpython-pcf8575是Adafruit为CircuitPython生态系统开发的专用驱动库,它封装了PCF8575芯片的底层操作,提供了简单易用的Python接口。这个库最大的特点是完全遵循CircuitPython的设计哲学 - 让硬件交互变得像Python编程一样自然。
在实际项目中,我发现这个库特别适合以下场景:
安装这个库最简单的方式是通过CircuitPython的包管理器circup:
bash复制circup install adafruit-circuitpython-pcf8575
或者也可以手动下载库文件,复制到CIRCUITPY设备的lib文件夹中。我建议使用circup,因为它能自动处理依赖关系 - 这个库需要依赖adafruit-circuitpython-busdevice和adafruit-circuitpython-register这两个基础库。
硬件连接方面,PCF8575的典型接线方式如下:
注意:PCF8575的I2C地址范围是0x20-0x27,具体由A0-A2引脚的电平决定。如果遇到设备未找到的错误,首先检查地址配置是否正确。
初始化一个PCF8575设备只需要几行代码:
python复制import board
from adafruit_pcf8575 import PCF8575
i2c = board.I2C() # 使用默认I2C总线
pcf = PCF8575(i2c, address=0x20) # 假设地址为0x20
这个库最巧妙的设计是它使用Python的属性访问语法来操作IO引脚。每个引脚都可以像对象属性一样访问:
python复制pcf.gpio0 = True # 设置GPIO0为高电平
pcf.gpio1 = False # 设置GPIO1为低电平
print(pcf.gpio2) # 读取GPIO2的状态
这种语法糖让代码可读性大大提高,特别适合教学场景。实际上,每个gpio属性背后都对应着PCF8575的16位寄存器操作。
除了基本的IO操作,这个库还提供了一些实用功能:
python复制pcf.set_mode(0, pcf.INPUT) # 将GPIO0设为输入模式
pcf.set_mode(1, pcf.OUTPUT) # 将GPIO1设为输出模式
python复制pcf.enable_interrupt(0) # 启用GPIO0的中断
pcf.disable_interrupt(1) # 禁用GPIO1的中断
python复制pcf.port = 0xFFFF # 所有引脚置高
pcf.port = 0x0000 # 所有引脚置低
我最近用PCF8575做了一个低成本的家居控制面板,控制8个继电器和读取8个按钮状态。核心代码如下:
python复制# 初始化
import time
import board
from adafruit_pcf8575 import PCF8575
i2c = board.I2C()
io = PCF8575(i2c)
# 配置引脚模式
for i in range(8):
io.set_mode(i, io.OUTPUT) # 0-7接继电器
io.set_mode(i+8, io.INPUT) # 8-15接按钮
# 主循环
while True:
for i in range(8):
# 按钮按下时点亮对应的LED
io.gpio[i] = io.gpio[i+8]
time.sleep(0.1)
这个项目展示了PCF8575的典型应用场景 - 扩展IO数量。整个项目成本不到50元,却实现了16路IO控制。
在另一个工业监测项目中,我用PCF8575连接了多个数字传感器:
python复制from adafruit_pcf8575 import PCF8575
import board
import digitalio
import busio
# 初始化两个PCF8575设备
i2c = busio.I2C(board.SCL, board.SDA)
pcf1 = PCF8575(i2c, address=0x20)
pcf2 = PCF8575(i2c, address=0x21)
# 传感器读取函数
def read_sensors():
return {
'temp_alert': pcf1.gpio0,
'pressure_high': pcf1.gpio1,
'flow_status': pcf2.gpio0
}
这个案例展示了多设备协同工作的能力。PCF8575的I2C地址可配置特性让我们可以轻松扩展多个设备。
虽然PCF8575使用方便,但在高频操作时需要注意:
python复制i2c = board.I2C(frequency=400000) # 设置为快速模式
python复制# 不推荐 - 产生多次I2C传输
pcf.gpio0 = True
pcf.gpio1 = True
# 推荐 - 单次I2C传输
pcf.port = 0x0003
问题1:设备未找到
问题2:引脚状态不稳定
问题3:响应速度慢
PCF8575的核心是一个16位的输入/输出寄存器。库的底层实际上是通过I2C读写这个寄存器。了解这一点有助于更高效地使用这个库:
寄存器位与引脚的对应关系:
在CircuitPython生态中,除了PCF8575,还有其他IO扩展方案:
PCF8575的优势在于简单够用,特别适合基础IO扩展场景。
利用PCF8575可以轻松实现4x4矩阵键盘:
python复制# 行设为输出,列设为输入
for row in range(4):
io.set_mode(row, io.OUTPUT)
for col in range(4,8):
io.set_mode(col, io.INPUT_PULLUP)
# 扫描函数
def scan_keypad():
for row in range(4):
io.port = ~(1 << row) # 设置当前行为低
for col in range(4,8):
if not io.gpio[col]:
return (row, col-4)
return None
这个例子展示了如何用PCF8575实现更复杂的输入设备。