Python之adafruit-circuitpython-mcp3xxx包语法、参数和实际应用案例
adafruit-circuitpython-mcp3xxx 是 Adafruit 开发的 CircuitPython 库,用于与 Microchip 的 MCP3xxx 系列 ADC(模数转换器)芯片通信。这些芯片能将模拟信号(如传感器输出的电压)转换为数字信号,便于微控制器或单板计算机(如 Raspberry Pi、ESP32 等)读取。
Python 库 adafruit-circuitpython-mcp3xxx 详解
1. 功能介绍
adafruit-circuitpython-mcp3xxx 是 Adafruit 开发的 CircuitPython 库,用于与 Microchip 的 MCP3xxx 系列 ADC(模数转换器)芯片通信。这些芯片能将模拟信号(如传感器输出的电压)转换为数字信号,便于微控制器或单板计算机(如 Raspberry Pi、ESP32 等)读取。
支持的芯片型号包括:
- MCP3008(8 通道,10 位分辨率)
- MCP3004(4 通道,10 位分辨率)
- MCP3208(8 通道,12 位分辨率)
- MCP3204(4 通道,12 位分辨率)
2. 安装方法
需先安装 CircuitPython 环境,再通过 pip 安装库:
# 基础安装
pip install adafruit-circuitpython-mcp3xxx
# 若使用 SPI 通信,可能需要额外依赖
pip install adafruit-blinka # 用于在非 CircuitPython 设备上模拟 CircuitPython API

3. 核心语法与参数
3.1 初始化 SPI 通信
MCP3xxx 系列通过 SPI 协议通信,需先初始化 SPI 总线:
import board
import digitalio
import busio
# 初始化 SPI 总线
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
cs = digitalio.DigitalInOut(board.D5) # 片选引脚(根据硬件连接修改)
3.2 初始化 ADC 芯片
以 MCP3008 为例:
from adafruit_mcp3xxx.mcp3008 import MCP3008
# 创建 MCP3008 实例
mcp = MCP3008(spi, cs)
3.3 读取模拟值
通过 analog_in 类读取指定通道的数值:
from adafruit_mcp3xxx.analog_in import AnalogIn
# 配置通道(例如通道 0)
chan = AnalogIn(mcp, MCP3008.P0)
# 读取数值
print("原始值:", chan.value) # 原始 ADC 读数(0~1023 对应 MCP3008)
print("电压值:", chan.voltage) # 转换后的电压(V)
3.4 关键参数
spi:SPI 总线对象,包含时钟、MISO、MOSI 引脚配置。cs:片选引脚(数字输出),用于选中特定 ADC 芯片。channel:ADC 通道(如MCP3008.P0至MCP3008.P7)。
4. 实际应用案例
案例 1:读取光敏电阻值
import board
import busio
import digitalio
from adafruit_mcp3xxx.mcp3008 import MCP3008
from adafruit_mcp3xxx.analog_in import AnalogIn
# 初始化 SPI 和 MCP3008
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
cs = digitalio.DigitalInOut(board.D5)
mcp = MCP3008(spi, cs)
# 连接光敏电阻到通道 0
light_sensor = AnalogIn(mcp, MCP3008.P0)
while True:
print(f"光照值: {light_sensor.value}, 电压: {light_sensor.voltage:.2f}V")
time.sleep(1)
案例 2:测量温度(使用 NTC 热敏电阻)
import time
import board
import busio
import digitalio
from adafruit_mcp3xxx.mcp3008 import MCP3008
from adafruit_mcp3xxx.analog_in import AnalogIn
# 初始化硬件
spi = busio.SPI(clock=board.SCK, MISO=board.MISO, MOSI=board.MOSI)
cs = digitalio.DigitalInOut(board.D5)
mcp = MCP3008(spi, cs)
ntc = AnalogIn(mcp, MCP3008.P1)
# NTC 计算参数(需根据型号调整)
B_VALUE = 3950
REFERENCE_TEMP = 25 # 摄氏度
REFERENCE_RESISTANCE = 10000 # 10kΩ 下拉电阻
while True:
# 计算 NTC 电阻
resistance = REFERENCE_RESISTANCE * (65535 / ntc.value - 1)
# 转换为温度
temp = 1 / (1/(REFERENCE_TEMP + 273.15) + (math.log(resistance/REFERENCE_RESISTANCE))/B_VALUE) - 273.15
print(f"温度: {temp:.1f}°C")
time.sleep(2)
案例 3:读取电位器值(旋钮控制)
# 硬件初始化同上
potentiometer = AnalogIn(mcp, MCP3008.P2)
while True:
# 电位器值范围映射到 0~100
percentage = (potentiometer.value / 65535) * 100
print(f"电位器位置: {percentage:.1f}%")
time.sleep(0.5)
案例 4:土壤湿度传感器
# 硬件初始化同上
soil_sensor = AnalogIn(mcp, MCP3008.P3)
while True:
# 湿度值(假设 0 为干燥,65535 为湿润)
moisture = (soil_sensor.value / 65535) * 100
print(f"土壤湿度: {moisture:.1f}%")
time.sleep(5)
案例 5:多通道数据采集
# 硬件初始化同上
channels = [
AnalogIn(mcp, MCP3008.P0), # 传感器 1
AnalogIn(mcp, MCP3008.P1), # 传感器 2
AnalogIn(mcp, MCP3008.P2) # 传感器 3
]
while True:
for i, chan in enumerate(channels):
print(f"通道 {i}: {chan.value}, {chan.voltage:.2f}V")
time.sleep(1)
案例 6:电池电压监测
# 硬件初始化同上
battery_monitor = AnalogIn(mcp, MCP3008.P4)
# 假设通过分压电阻将电池电压减半(例如 12V 电池 → 6V 输入)
VOLTAGE_DIVIDER = 2
while True:
actual_voltage = battery_monitor.voltage * VOLTAGE_DIVIDER
print(f"电池电压: {actual_voltage:.2f}V")
time.sleep(10)
案例 7:声音传感器(麦克风模块)
# 硬件初始化同上
sound_sensor = AnalogIn(mcp, MCP3008.P5)
while True:
# 声音强度(数值越高声音越大)
print(f"声音强度: {sound_sensor.value}")
time.sleep(0.1)
案例 8:光照控制继电器(阈值触发)
import digitalio
# 硬件初始化同上
light_sensor = AnalogIn(mcp, MCP3008.P0)
relay = digitalio.DigitalInOut(board.D6)
relay.direction = digitalio.Direction.OUTPUT
LIGHT_THRESHOLD = 30000 # 光照阈值
while True:
if light_sensor.value < LIGHT_THRESHOLD:
relay.value = True # 光线暗时打开继电器(如开灯)
print("继电器开启")
else:
relay.value = False
print("继电器关闭")
time.sleep(1)
5. 常见错误与注意事项
5.1 常见错误
-
SPI 通信失败
- 错误提示:
OSError: [Errno 121] Remote I/O error - 原因:SPI 引脚连接错误、CS 引脚未正确配置、硬件接触不良。
- 解决:检查引脚接线,确保 SPI 总线使能(如 Raspberry Pi 需通过
raspi-config开启 SPI)。
- 错误提示:
-
通道索引错误
- 错误提示:
ValueError: Invalid channel - 原因:使用了芯片不支持的通道(如 MCP3004 访问 P4 及以上通道)。
- 解决:确认芯片型号支持的通道范围(MCP3004/3204 为 4 通道,MCP3008/3208 为 8 通道)。
- 错误提示:
-
数值异常波动
- 原因:电源噪声、传感器未校准、未加滤波电容。
- 解决:增加电源滤波电容(100nF),对读数进行多次采样平均。
5.2 注意事项
- 电压范围:MCP3xxx 输入电压范围为 0~Vref(通常接 3.3V,而非 5V,避免损坏芯片)。
- SPI 速率:默认速率为 1MHz,过高可能导致通信不稳定。
- 多芯片配置:多个 MCP3xxx 可共用 SPI 总线,但需各自独立的 CS 引脚。
- 校准:高精度应用需校准(如测量电压时考虑参考电压误差)。
- 兼容性:该库主要用于 CircuitPython 设备,在 Python 环境中需配合
adafruit-blinka模拟层使用。
通过上述内容,可以全面了解 adafruit-circuitpython-mcp3xxx 的使用方法,并快速实现各类模拟信号采集场景。
《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能。《AI提示工程必知必会》主要内容包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词的使用技巧;使用提示词进行文本摘要、改写重述、语法纠错、机器翻译等语言处理任务,以及在数据挖掘、程序开发等领域的应用;AI在绘画创作上的应用,百度文心一言和阿里通义大模型这两大智能平台的特性与功能,以及市场调研中提示词的实战应用。通过阅读《AI提示工程必知必会》,读者可掌握如何有效利用AI提示工程提升工作效率,创新工作流程,并在职场中脱颖而出。
更多推荐


所有评论(0)