Python之adafruit-circuitpython-mcp3421包语法、参数和实际应用案例
adafruit-circuitpython-mcp3421 是一个用于控制 MCP3421 高精度模数转换器 (ADC) 的 CircuitPython 库。MCP3421 是一款低噪声、高精度的 18 位 ADC,支持 I2C 通信,适用于需要精确测量模拟信号(如传感器数据)的场景。该库提供了简洁的接口,方便在 CircuitPython 兼容设备(如 Raspberry Pi Pico、ES
Python 库 adafruit-circuitpython-mcp3421 详解
1. 功能概述
adafruit-circuitpython-mcp3421 是一个用于控制 MCP3421 高精度模数转换器 (ADC) 的 CircuitPython 库。MCP3421 是一款低噪声、高精度的 18 位 ADC,支持 I2C 通信,适用于需要精确测量模拟信号(如传感器数据)的场景。该库提供了简洁的接口,方便在 CircuitPython 兼容设备(如 Raspberry Pi Pico、ESP32 等)上读取 MCP3421 的转换数据。
2. 安装方法
需先安装 CircuitPython 环境,再通过 pip 安装库:
pip install adafruit-circuitpython-mcp3421
同时需确保硬件连接正确:MCP3421 的 SDA 和 SCL 引脚与开发板的 I2C 引脚连接,并接好电源(通常 3.3V)。

3. 基本语法与参数
核心类:MCP3421
初始化方法:
adafruit_mcp3421.MCP3421(i2c_bus, address=0x68)
- 参数:
i2c_bus:I2C 总线对象(如board.I2C())。address:MCP3421 的 I2C 地址(默认0x68,可通过硬件引脚修改)。
常用方法:
-
configure(resolution=12, gain=1, continuous=False)
配置 ADC 转换参数:resolution:分辨率(12/14/16/18 位,对应转换时间递增)。gain:增益(1/2/4/8,放大输入信号)。continuous:是否连续转换(True为连续模式,False为单次模式)。
-
read()
读取转换后的电压值(单位:伏特),返回浮点数。 -
read_raw()
读取原始 ADC 转换值(整数),需结合分辨率和增益计算实际电压。
4. 实际应用案例
案例 1:基础电压测量
import board
import adafruit_mcp3421
i2c = board.I2C() # 初始化 I2C 总线
mcp = adafruit_mcp3421.MCP3421(i2c)
# 配置为 16 位分辨率,增益 1,单次转换模式
mcp.configure(resolution=16, gain=1)
voltage = mcp.read()
print(f"电压: {voltage:.6f} V")
案例 2:连续模式读取
import board
import adafruit_mcp3421
import time
i2c = board.I2C()
mcp = adafruit_mcp3421.MCP3421(i2c)
# 连续模式,18 位分辨率(最高精度)
mcp.configure(resolution=18, continuous=True)
while True:
print(f"电压: {mcp.read():.6f} V")
time.sleep(0.5) # 连续模式下需等待转换完成
案例 3:使用增益放大小信号
# 测量微伏级信号(如传感器输出)
mcp.configure(resolution=16, gain=8) # 增益 8 倍放大
small_voltage = mcp.read()
print(f"放大后电压: {small_voltage:.6f} V")
print(f"实际电压: {small_voltage / 8:.6f} V") # 除以增益得到真实值
案例 4:温度测量(配合热电偶)
# 假设热电偶输出经放大后连接到 MCP3421
mcp.configure(resolution=16, gain=4)
voltage = mcp.read()
# 热电偶转换公式(示例:K 型热电偶,放大电路增益 100)
temperature = (voltage / 100) * 250 # 简化公式,实际需校准
print(f"温度: {temperature:.2f} °C")
案例 5:电池电压监测
# 测量锂电池电压(通过分压电阻将 0-4.2V 转为 0-2.1V)
mcp.configure(resolution=14, gain=1)
measured_voltage = mcp.read()
actual_voltage = measured_voltage * 2 # 分压比 1:1
print(f"电池电压: {actual_voltage:.2f} V")
案例 6:光照强度测量(配合光敏电阻)
# 光敏电阻串联固定电阻,中间节点接 MCP3421
mcp.configure(resolution=12, gain=1)
voltage = mcp.read()
# 电压与光照强度成反比(需校准)
light_intensity = 1000 / (voltage + 0.001) # 示例公式
print(f"光照强度: {light_intensity:.1f} lux")
案例 7:原始数据读取与自定义计算
mcp.configure(resolution=18, gain=2)
raw_value = mcp.read_raw()
# 18 位分辨率下,电压 = 原始值 * (2.048V / (2^17 * 增益))
# 参考电压为 2.048V,18 位模式下有效范围为 ±2^17
voltage = raw_value * (2.048 / (131072 * 2))
print(f"原始值: {raw_value}, 计算电压: {voltage:.6f} V")
案例 8:多设备同时读取(不同 I2C 地址)
i2c = board.I2C()
mcp1 = adafruit_mcp3421.MCP3421(i2c, address=0x68) # 设备 1
mcp2 = adafruit_mcp3421.MCP3421(i2c, address=0x69) # 设备 2(地址通过硬件修改)
mcp1.configure(resolution=16)
mcp2.configure(resolution=16)
print(f"设备 1 电压: {mcp1.read():.6f} V")
print(f"设备 2 电压: {mcp2.read():.6f} V")
5. 常见错误与注意事项
错误 1:I2C 通信失败
- 现象:
OSError: [Errno 121] Remote I/O error - 原因:I2C 接线错误、设备地址错误或电源问题。
- 解决:检查接线(SDA/SCL 引脚是否对应)、用 I2C 扫描工具确认地址(如
adafruit_bus_device库)。
错误 2:读取超时
- 现象:
TimeoutError或返回固定值。 - 原因:分辨率过高(如 18 位需 62.5ms 转换时间),单次模式下未等待完成。
- 解决:连续模式下增加等待时间,或根据分辨率计算所需延迟。
错误 3:电压值异常(超出范围)
- 现象:读数始终为最大值或最小值。
- 原因:输入电压超过参考电压(通常 2.048V),或增益设置不当。
- 解决:通过分压电阻降低输入电压,或减小增益。
注意事项:
- 参考电压:MCP3421 内置 2.048V 参考电压,输入电压需在此范围内(或通过增益调整)。
- 分辨率与速度:分辨率越高,转换时间越长(12 位约 1ms,18 位约 62.5ms)。
- 噪声处理:高精度模式下建议增加滤波电容,或多次读取取平均值。
- 电源稳定性:供电电压波动会影响测量精度,建议使用稳压电源。
通过上述内容,可以全面了解 adafruit-circuitpython-mcp3421 的使用方法,并在实际项目中灵活应用于各类高精度模拟信号测量场景。
《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能。《AI提示工程必知必会》主要内容包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词的使用技巧;使用提示词进行文本摘要、改写重述、语法纠错、机器翻译等语言处理任务,以及在数据挖掘、程序开发等领域的应用;AI在绘画创作上的应用,百度文心一言和阿里通义大模型这两大智能平台的特性与功能,以及市场调研中提示词的实战应用。通过阅读《AI提示工程必知必会》,读者可掌握如何有效利用AI提示工程提升工作效率,创新工作流程,并在职场中脱颖而出。
更多推荐



所有评论(0)