1. 项目缘起:为什么用树莓派 Pico 测温度?
最近在折腾一个需要多点温度监控的小项目,手头正好有几块闲置的树莓派 Pico。这玩意儿核心是 RP2040 微控制器,自带几个 12 位的 ADC(模数转换器)通道。我就在想,能不能直接用它的 ADC 来读取温度传感器的数据,省去外接专用温度芯片的麻烦和成本?毕竟,对于很多精度要求不那么苛刻的场景(比如环境温度监测、设备散热预警),一个简单的 ADC 方案可能更直接、更“够用”。
这个想法其实挺自然的。很多嵌入式开发者,无论是玩 Arduino、STM32 还是 ESP32,都接触过用 ADC 配合热敏电阻(NTC)或热电偶来测温的方案。树莓派 Pico 作为一款性价比极高的 MCU 开发板,其 ADC 性能如何?用它来测温到底靠不靠谱?过程中有哪些坑?这正是我这次想和大家深入聊聊的。我会从原理、硬件选型、代码实现、误差处理到实际应用,一步步拆解,目标是让你看完就能自己动手搭一个稳定可用的 Pico 温度测量系统。
2. 核心原理:ADC 如何“感知”温度?
要理解用 ADC 测温,得先抛开“温度传感器”这个抽象概念,回到最基础的物理量变化。温度本身不能直接被 ADC 读取,ADC 只能读取电压。所以,测温的核心是找到一个随温度变化而线性(或近似线性)变化的电气参数,最常见的就是电阻。
2.1 热敏电阻:最亲民的温度敏感元件
在 DIY 和成本敏感的项目里,负温度系数热敏电阻绝对是主角。它的电阻值会随着温度升高而降低,关系是非线性的,但可以通过查表或公式计算来对应温度。
为什么选 NTC 而不是 PTC(正温度系数)?对于常见的测温范围(比如-40°C到+125°C),NTC 的灵敏度更高,电阻变化范围大,更容易被 ADC 分辨出来,而且价格极其低廉。一个常用的型号是NTC 10K B值 3950,意思是它在 25°C 时电阻为 10KΩ,其 B 值(一个描述材料特性的常数)为 3950。这个型号资料丰富,网上有现成的电阻-温度对应表,用起来非常方便。
2.2 分压电路:将电阻变化转为电压变化
ADC 测的是电压,而 NTC 是电阻,所以我们需要一个简单的分压电路来完成转换。这是整个硬件设计的核心。
典型的接法是将 NTC 与一个精度较高的固定电阻(称为上拉或下拉电阻)串联,在它们中间连接点引出电压送到 ADC 引脚。电路的一端接参考电压(比如 Pico 的 3.3V),另一端接地。
3.3V (ADC_VREF) --- [固定电阻 R_fixed] --- V_ADC (连接到 Pico ADC 引脚) --- [NTC] --- GND这里有个关键选择:固定电阻 R_fixed 的阻值该用多大?很多人随手就用一个 10KΩ,因为 NTC 在 25°C 时就是 10KΩ,这样在常温下 V_ADC 正好是 1.65V,处于 ADC 量程中间,看起来很美。但这其实不是最优解。
注意:固定电阻的选取目标,是让整个测温范围内,V_ADC 的变化范围尽可能大,以充分利用 ADC 的分辨率,减小量化误差。对于 NTC 10K B3950,如果你主要关心中低温段(例如 0-50°C),用一个 10KΩ 固定电阻没问题。但如果你希望在整个 NTC 的有效范围内(比如-20°C到+100°C)都有较好的线性度和分辨率,经过计算,阻值在 5KΩ 到 8.2KΩ 左右的固定电阻往往能提供更均匀的电压输出跨度。我手头有 5.1KΩ 的 1% 精度金属膜电阻,实测下来效果不错。
ADC 读取到的原始值adc_raw是一个 0-4095 的数字(对应 12 位分辨率)。V_ADC 电压的计算公式为:V_ADC = (adc_raw / 4095) * ADC_VREF其中ADC_VREF是 ADC 的参考电压,对于 Pico,默认是供电电压 3.3V,但这个电压本身可能有波动,这是误差来源之一。
知道了 V_ADC,根据分压公式就能反推出 NTC 的当前电阻值R_ntc:R_ntc = R_fixed * (ADC_VREF / V_ADC - 1)或者R_ntc = R_fixed * (4095 / adc_raw - 1)
2.3 从电阻到温度:查表法与公式法
得到R_ntc后,就需要把它转换成温度。有两种主流方法:
1. 查表法:这是最准确、计算最快的方法。提前根据 NTC 的数据手册,将一系列温度点对应的电阻值(或者电阻值对应的温度)做成一个数组表存储在程序里。测量时,通过查找当前电阻值在表中相邻的两个点,进行线性插值,得到温度值。对于 B3950 10K NTC,网上很容易找到现成的、步长为 1°C 或 0.1°C 的表格。在资源有限的 MCU 上,这是首选。
2. 公式法(Steinhart-Hart 方程):这是一个描述 NTC 电阻与温度关系的经验公式,比简单的 B 值公式更精确,尤其适用于宽温区。1/T = A + B * ln(R) + C * [ln(R)]^3其中 T 是开尔文温度,R 是 NTC 电阻,A, B, C 是元件特定的系数,可以从数据手册中获得。这个方法需要浮点数运算和自然对数计算,对 Pico(RP2040)来说负担不重,但比查表法慢一些。如果找不到精确的 A,B,C 系数,使用简化的 B 值公式1/T = 1/T0 + (1/B) * ln(R/R0)也是可以的,其中 T0 是参考温度(如 298.15K 即 25°C),R0 是该温度下的电阻(如 10KΩ)。
在我的实现里,为了兼顾精度和方便,我选择了查表法。我找到了一个从 -40°C 到 125°C,步长 1°C 的电阻表,将其转换成adc_raw值直接存入数组,省去了运行时计算电阻的步骤,速度更快。
3. 硬件搭建:细节决定精度
原理清楚了,动手搭电路。别看电路简单,几个细节没处理好,测量结果可能飘得亲妈都不认识。
3.1 元器件选择与电路连接
- 树莓派 Pico:任何版本均可,引脚定义一致。
- NTC 热敏电阻:我选用的是MF52-103/3950,即 10KΩ B3950,玻璃封装的比环氧树脂封装的稳定性稍好。
- 固定电阻:一颗5.1KΩ,精度1%,温度系数50ppm的金属膜电阻。精度很重要,1%是起码要求,温度系数影响相对次之。
- 连接线:尽量短。如果传感器需要引线到较远位置,建议使用屏蔽线或双绞线,并将屏蔽层单点接地(在 Pico 端),以减少干扰。
- 滤波电容:在 ADC 输入引脚与地之间,并联一个 0.1uF 的陶瓷电容。这个电容非常关键,它可以滤除电源噪声和引线引入的高频干扰,使 ADC 读数更稳定。位置要尽量靠近 Pico 的 ADC 引脚。
最终电路连接如下:
- Pico 的3V3(OUT)引脚(第36脚)连接到固定电阻一端。
- 固定电阻另一端连接到ADC 输入引脚(我选用的是GP26,对应 ADC0)和 NTC 的一端。
- NTC 的另一端连接到 Pico 的GND(任意一个接地脚)。
- 在GP26引脚与GND之间,焊接上0.1uF (104)的陶瓷电容。
- (可选)如果你担心 3.3V 电源的噪声,可以在 3V3(OUT) 和 GND 之间也加一个 10uF 的电解电容或钽电容。
3.2 关于参考电压的深入讨论
这是影响 ADC 精度的最核心因素之一。Pico 的 ADC 参考电压默认来自内部的3.3V LDO 输出。这个电压并非绝对稳定:
- 负载变化:当板上其他电路(如 LED、外设)工作电流变化时,3.3V 会有微小波动。
- 温度变化:LDO 本身输出电压随温度漂移。
- 初始精度:出厂就有一定误差。
对于要求不高的温度测量(±2°C 以内),可以接受这个误差。但如果想提升精度,有两大改进方向:
方向一:使用外部精密电压基准源这是最专业的方法。你可以断开 ADC 的内部参考,通过 Pico 的ADC_VREF引脚(第35脚)接入一个外部的、高精度、低温漂的基准电压芯片,例如REF3033(3.3V,精度0.1%)。这样,无论主电源如何波动,ADC 的参考电压都是稳定的,测量结果自然准确。不过这会增加成本和复杂度。
方向二:测量参考电压进行软件补偿一个更取巧且低成本的方法是:用 ADC 测量它自己的参考电压。Pico 有一个特殊的 ADC 通道,连接到内部一个由固定电压驱动的分压器,这个固定电压是相对稳定的。通过读取这个通道的值,可以反推出当前实际的 3.3V 电压是多少,然后在计算其他通道电压时进行补偿。在 MicroPython 中,可以读取ADC(4)来获取这个值。在 C/C++ SDK 中,也有相应的函数。我后续的代码示例会展示这种方法。
3.3 布局与接地要点
- 模拟地与数字地:Pico 没有独立的模拟地引脚,但 PCB 布局上已将模拟电路部分的地进行了优化。我们搭建外部电路时,所有模拟部分(分压电路、滤波电容)的接地线,应最终汇集到Pico 的同一个 GND 引脚上,避免形成地环路。
- 远离噪声源:尽量让分压电路远离 Pico 的开关电源电路、高频晶振以及 GPIO 快速翻转的区域。
- 电源去耦:除了在 ADC 引脚加小电容,在 Pico 的 3.3V 和 GND 入口处增加一个更大的电容(如 100uF)也有助于稳定整体电源。
4. 软件实现:MicroPython 与 C SDK 双视角
硬件准备好了,我们来写代码。我会分别用 MicroPython(快速原型)和 C SDK(高性能应用)两种方式实现。
4.1 MicroPython 实现:快速上手
MicroPython 语法简单,交互性强,非常适合验证想法和快速开发。
import machine import math import time # 初始化 ADC,使用 GP26 (ADC0) adc = machine.ADC(26) # 初始化 ADC(4) 用于测量内部参考电压,实现补偿 adc_vref = machine.ADC(4) # NTC 参数 R_FIXED = 5100.0 # 固定电阻 5.1K NTC_R0 = 10000.0 # NTC在25°C时的电阻 10K T0 = 25.0 + 273.15 # 参考温度,单位开尔文 B_VALUE = 3950.0 # B值 # 简易中值滤波函数 def median_filter(samples): samples.sort() return samples[len(samples)//2] def read_temperature_mp(sample_count=11): """ 读取温度 - MicroPython版本 sample_count: 采样次数,取中值,建议为奇数 """ adc_samples = [] vref_samples = [] for _ in range(sample_count): adc_samples.append(adc.read_u16()) # 读取16位值 (0-65535) vref_samples.append(adc_vref.read_u16()) time.sleep_us(100) # 短暂延时,避免采样过快 adc_raw = median_filter(adc_samples) vref_raw = median_filter(vref_samples) # 计算实际的参考电压 (3.3V 的理想值对应 vref_raw 的理论值) # 根据手册,ADC(4) 连接到内部一个 ~0.706 * VREF 的分压。 # 因此,实际 VREF = (vref_raw / 65535) * VREF / 0.706 # 简化处理:我们计算一个比例因子 # 理论情况下,如果 VREF 正好是 3.3V,那么 vref_raw 应该是一个固定值。 # 我们采用经验法:vref_raw 通常在 52600 左右。用此值来校准。 VREF_THEORY = 3.3 VREF_RAW_IDEAL = 52600.0 # 这是一个需要根据实际板子校准的经验值 vref_correction = vref_raw / VREF_RAW_IDEAL actual_vref = VREF_THEORY * vref_correction # 计算 NTC 两端电压 # 注意:adc.read_u16() 返回的是 16 位值,但 ADC 是 12 位,所以值范围是 0-65535,对应 0-3.3V voltage = (adc_raw / 65535.0) * actual_vref # 计算 NTC 电阻 if voltage == 0: return None # 避免除零错误 r_ntc = R_FIXED * (actual_vref / voltage - 1) # 使用 B 值公式计算温度 (开尔文) steinhart = (1.0 / T0) + (1.0 / B_VALUE) * math.log(r_ntc / NTC_R0) steinhart = 1.0 / steinhart # 转换为摄氏度 temp_c = steinhart - 273.15 return temp_c # 主循环 while True: temp = read_temperature_mp() if temp is not None: print("温度: {:.2f} °C".format(temp)) time.sleep(2)代码解读与注意事项:
- 中值滤波:这是处理 ADC 读数跳动的有效且简单的方法。采集奇数个样本(如11个),排序后取中间值,可以很好地抑制偶发的尖峰噪声。
- 参考电压补偿:我们通过
ADC(4)读取了内部参考电压相关的读数vref_raw。通过一个经验值VREF_RAW_IDEAL进行比例校准,从而得到更接近真实的actual_vref。这个VREF_RAW_IDEAL需要校准!方法是在已知精确电压(比如用万用表测得的稳定3.3V)下,运行程序打印出vref_raw的值,将其作为理想值填入。 - 公式计算:使用了简化的 B 值公式。对于更高精度,可以换成完整的 Steinhart-Hart 公式或查表法。
4.2 C SDK 实现:追求性能与精度
对于需要高速采样、低功耗或更复杂控制的项目,使用 C/C++ 和 Pico 的官方 SDK 是更好的选择。
#include <stdio.h> #include "pico/stdlib.h" #include "hardware/adc.h" #define FIXED_RESISTOR 5100.0f #define NTC_R0 10000.0f #define T0 (25.0f + 273.15f) #define B_VALUE 3950.0f // 查表法(示例片段,仅包含部分数据) static const float temp_table[] = { -40.0, -30.0, -20.0, -10.0, 0.0, 10.0, 20.0, 25.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0, 110.0, 120.0, 125.0 }; static const uint16_t adc_table[] = { /* 这里需要预先计算或测量出对应温度下的ADC原始值 */ }; #define TABLE_SIZE (sizeof(temp_table)/sizeof(temp_table[0])) uint16_t read_adc_median(uint8_t channel, uint8_t samples) { uint16_t adc_values[samples]; for (int i = 0; i < samples; i++) { adc_select_input(channel); sleep_us(100); // 等待通道切换稳定 adc_values[i] = adc_read(); } // 简易冒泡排序找中值 (samples 应为奇数) for (int i = 0; i < samples - 1; i++) { for (int j = 0; j < samples - i - 1; j++) { if (adc_values[j] > adc_values[j + 1]) { uint16_t temp = adc_values[j]; adc_values[j] = adc_values[j + 1]; adc_values[j + 1] = temp; } } } return adc_values[samples / 2]; } float calculate_temperature_c(uint16_t adc_raw, uint16_t vref_raw) { // 1. 计算实际参考电压 (校准) const float VREF_THEORY = 3.3f; const uint16_t VREF_RAW_IDEAL = 52600; // 需校准 float vref_correction = (float)vref_raw / VREF_RAW_IDEAL; float actual_vref = VREF_THEORY * vref_correction; // 2. 计算电压和电阻 float voltage = ((float)adc_raw / 4095.0f) * actual_vref; // 注意:C SDK的adc_read()返回0-4095 if (voltage <= 0.0f || voltage >= actual_vref) { return -273.15f; // 错误值 } float r_ntc = FIXED_RESISTOR * (actual_vref / voltage - 1.0f); // 3. 使用查表法 + 线性插值 for (int i = 0; i < TABLE_SIZE - 1; i++) { if (adc_raw >= adc_table[i+1] && adc_raw <= adc_table[i]) { // 注意ADC值随温度升高而减小 // 线性插值 float temp_range = temp_table[i+1] - temp_table[i]; float adc_range = (float)(adc_table[i+1] - adc_table[i]); float adc_offset = (float)(adc_raw - adc_table[i]); return temp_table[i] + (temp_range / adc_range) * adc_offset; } } // 如果超出表格范围,退回使用B值公式计算 float steinhart = (1.0f / T0) + (1.0f / B_VALUE) * logf(r_ntc / NTC_R0); steinhart = 1.0f / steinhart; return steinhart - 273.15f; } int main() { stdio_init_all(); // 初始化ADC adc_init(); adc_gpio_init(26); // 使用GP26 (ADC0) adc_set_temp_sensor_enabled(true); // 如果需要读取内部温度传感器,可以启用,但这里我们不用它 while (true) { // 读取传感器通道 (GP26, ADC0) 和内部参考电压通道 (ADC4) uint16_t sensor_raw = read_adc_median(0, 11); // 通道0,采样11次取中值 uint16_t vref_raw = read_adc_median(4, 11); // 通道4,采样11次取中值 float temperature = calculate_temperature_c(sensor_raw, vref_raw); printf("ADC Raw: %u, Vref Raw: %u, Temperature: %.2f C\n", sensor_raw, vref_raw, temperature); sleep_ms(2000); } return 0; }C 版本关键点:
- 性能与效率:直接操作硬件寄存器,速度远快于 MicroPython。中值滤波和查表运算效率极高。
- 查表法实现:示例展示了查表加线性插值的思路。你需要预先根据你的 NTC 参数和电路,计算出每个温度点对应的
adc_raw值,填充adc_table数组。这是最精确的方法。 - ADC 读取:
adc_read()返回的是0-4095的 12 位原始值,与 MicroPython 的read_u16()范围不同,计算时需注意。 - 错误处理:加入了电压边界检查,防止除零或计算溢出。
5. 误差分析与校准:让读数更可信
即使电路和代码都正确,测量值也可能和实际温度有偏差。我们需要系统地分析和减小这些误差。
5.1 主要误差来源
| 误差来源 | 影响描述 | 缓解方法 |
|---|---|---|
| ADC 参考电压误差 | 3.3V LDO 的初始误差、温漂、负载调整率。这是最大误差源之一。 | 1. 使用外部精密电压基准。 2. 使用 ADC(4)进行软件补偿校准。 |
| 固定电阻误差 | 1% 精度的电阻,在 5.1KΩ 上就可能带来 ±51Ω 的绝对误差,直接影响分压比。 | 选用更高精度(如 0.1%)的电阻,或进行单个电阻的实测校准。 |
| NTC 参数离散性 | B 值和 R25 值存在公差(通常 B 值 ±1%,R25 ±5%)。 | 购买精度更高的 NTC,或进行两点校准。 |
| ADC 非线性与积分误差 | ADC 本身并非理想的线性器件,存在微分非线性(DNL)和积分非线性(INL)误差。RP2040 的 ADC 典型 INL 为 ±2 LSB。 | 软件上难以完全消除,但通过滤波和平均可以平滑其影响。 |
| 自热效应 | 流过 NTC 的电流会导致其自身发热。Pico 的 ADC 输入阻抗并非无穷大,也会吸取微小电流。 | 增大分压电阻阻值以减小电流(但会降低信噪比)。在软件中,仅在采样时给分压电路上电(需要额外 GPIO 控制),平时断电。 |
| 环境噪声 | 电源纹波、数字电路开关噪声耦合到模拟线路。 | 良好的滤波电容(0.1uF 就近并联)、合理的布线、远离噪声源。 |
5.2 两点校准法:大幅提升绝对精度
对于大多数应用,我们更关心测量的绝对精度(即读数和真实温度的差值)。两点校准是提升绝对精度最有效的方法。
你需要准备:
- 一个你认为可信的温度参考源。比如:
- 冰水混合物:标准 0°C 环境。将传感器与温度计探针一起插入冰水混合的保温杯中,确保充分接触且不结冰。
- 恒温水浴/油浴:提供稳定的已知温度点(如 50°C)。
- 高精度温度计:用于测量传感器所处环境的实际温度。
校准步骤:
- 低温点校准(如 0°C):将传感器置于 0°C 环境,等待读数稳定(至少5分钟)。记录程序输出的原始 ADC 值
adc_raw_low和vref_raw_low,以及实际的参考温度T_low_true(0.0)。 - 高温点校准(如 50°C):同理,将传感器置于 50°C 环境,稳定后记录
adc_raw_high,vref_raw_high和T_high_true(50.0)。 - 软件修正:在计算函数中,不再使用理论上的 NTC_R0 和 B_VALUE,而是利用这两个实测点,反向拟合出适用于你这套具体硬件(包含了电阻误差、NTC离散性、参考电压误差)的“等效”R0 和 B 值,或者直接建立一条两点间的线性(或指数)校正曲线。
简易线性补偿示例(在得到电阻值 R_ntc 后):假设你在T_low_true时测得的电阻为R_low,在T_high_true时测得的电阻为R_high。 你可以用这两个点,对通过公式计算出的温度进行线性偏移补偿。更精确的做法是将(1/T, ln(R))两个点代入 B 值公式,解算出你这颗 NTC 的实际 B 值和实际 R0。网上有很多现成的两点校准计算工具。
实操心得:我自己的校准方法是,先用高精度万用表测量我使用的 5.1KΩ 固定电阻的实际阻值(比如是 5097Ω),替换代码中的理论值。然后,将传感器和校准用的热电偶探头紧贴在一起,放入可控温的加热台中,在 25°C 和 75°C 两个点记录 ADC 读数。用这两个点去反推 NTC 的实际参数,更新到代码里。经过这样校准后,在 20-80°C 范围内,我的系统误差可以控制在 ±0.5°C 以内,完全满足项目需求。
6. 进阶应用与优化思路
一个基础的测温系统工作后,可以考虑以下方向进行优化和扩展:
6.1 多通道与分布式测量
RP2040 有 5 个 ADC 通道(GP26, GP27, GP28, GP29 和内部温度传感器)。你可以轻松扩展为4 路外部温度监测。只需复制分压电路,连接到不同的 ADC 引脚即可。在代码中循环读取不同通道。
对于更远的距离(>1米),建议考虑以下方案以增强抗干扰能力:
- 使用屏蔽电缆。
- 在传感器端增加一个电压跟随器(运算放大器),利用运放的高输入阻抗、低输出阻抗特性,将信号与长导线隔离。
- 采用差分信号传输(需要更多线缆和电路),或直接改用数字接口的温度传感器(如 DS18B20),后者在长距离抗干扰方面有天然优势。
6.2 低功耗设计
如果你的设备是电池供电,需要降低功耗:
- 间歇采样:大部分时间让 MCU 和传感器电路进入睡眠模式,定时唤醒测量。
- 切断传感器电源:用一个 GPIO 口控制一个 MOS 管,为分压电路供电。仅在需要测量时通电,彻底消除自热效应和静态电流消耗。
- 降低采样速率:ADC 采样速率越高功耗越大。对于缓慢变化的温度,每秒采样一次都绰绰有余。
6.3 与内部温度传感器对比
RP2040 芯片内部有一个温度传感器,可以通过ADC(4)在特定模式下读取。但这个传感器主要是用来监测芯片结温的,精度较差(典型 ±3°C),且受芯片自身发热影响巨大。它不适合测量环境温度。我们的外部 NTC 方案在精度和稳定性上远超内部传感器。
6.4 数据记录与上传
将测量到的温度数据存储或上传,才能发挥其价值。
- 本地存储:Pico 没有内置 Flash,但可以通过 SPI 接口连接一个 MicroSD 卡模块,将带时间戳的温度数据写入 CSV 文件。
- 无线传输:给 Pico 配上 WiFi 模块(如 ESP-01S)或者蓝牙模块,可以将数据发送到手机、电脑或云平台(如 ThingsBoard、Home Assistant)。
- 有线传输:通过串口(UART)实时将数据发送给上位机(电脑)进行处理和显示。
7. 常见问题排查(Q&A)
在实际操作中,你可能会遇到以下问题:
Q1:ADC 读数跳动很大,不稳定。
- A:首先检查硬件:ADC 输入引脚是否并联了0.1uF 滤波电容?电容是否尽量靠近 Pico 引脚?电源是否稳定?尝试用示波器观察 ADC 引脚波形。其次检查软件:是否实施了软件滤波(如中值滤波、移动平均)?采样间隔是否太短?可以尝试在
adc_read()之间增加微小延时 (sleep_us(50-100))。
Q2:测量值整体偏高或偏低,且不随温度变化。
- A:这很可能是电路接错了。用万用表检查:固定电阻和 NTC 的连接顺序是否正确?ADC 引脚是否确实连接在两者的连接点上?3.3V 和 GND 是否接反?固定电阻值是否用错(比如误用了 100KΩ)?
Q3:温度变化时,读数反应迟钝。
- A:NTC 本身的热响应时间。玻璃封装的比环氧树脂的快。确保传感器与被测物体/介质良好接触(使用导热硅脂)。自热效应也会导致响应变慢和读数偏高,检查流经 NTC 的电流是否过大。
Q4:如何测量 100°C 以上的高温?
- A:普通 NTC(如 MF58)的长期工作温度上限通常在 125°C~150°C。对于更高温度,需要选用高温型 NTC或热电偶。热电偶需要配合热电偶放大器(如 MAX6675, MAX31855)使用,它们输出数字信号或模拟信号,后者可以接 ADC。另一种方案是使用PT100/PT1000 铂电阻,其线性度好、范围广,但需要更复杂的恒流源驱动和放大电路。
Q5:代码编译/下载到 Pico 后没反应。
- A:检查接线是否牢固,Pico 是否正常供电(USB 或外部 5V)。对于 C 项目,确认
CMakeLists.txt配置正确,并正确选择了编译目标。最简单的验证方法是先跑一个点亮 LED 的例程,确保开发环境没问题。
折腾完这一套,你应该对用树莓派 Pico 的 ADC 进行温度测量有了从理论到实践的完整认识。这个方案成本极低,灵活性高,虽然绝对精度可能比不上专业的数字温度传感器,但在很多工业和家居应用场景(如温室大棚、鱼缸、3D打印机热床、设备机箱)中已经完全够用,并且其过程本身对于理解模拟信号采集、传感器特性、误差分析和嵌入式系统设计非常有价值。