很开心参加“Let's design 第三期”活动,这次活动我选择的板子是:DI&MIKRO MIKROE-2815。这是一款基于 MAX31865 芯片的温度传感器扩展板,专门配合PT100 铂电阻探头做高精度测温。计划使用这个模块制作一个宽范围的温度计。
硬件
首先准备了一根PT100 铂电阻探头,线长1米,3芯,精度0.3℃。然后是一块RP2040的开发板,带TFT屏幕。但是开发板没有mikroBUS接口,所以使用杜邦线将与DI&MIKRO MIKROE-2815连接。PT100 铂电阻探头的三个芯对应接到:红--F+;红--R+;蓝--F-


系统实现
编程使用arduino,编程工具使用Vscode+platformIO。模块ADI&MIKRO MIKROE-2815使用的芯片是MAX31865芯片,在arduino的库中找到MAX31865的开源库,这样就不用自己再造轮子了。

参考着例程,开始读取温度。但是读取到的温度,比实际温度差不多低了20摄氏度,开始查找原因。用万用表测量探头,在常温下110Ω左右,电阻正常。留意到例程中有这么段代码:
// The value of the Rref resistor. Use 430.0 for PT100 and 4300.0 for PT1000 #define RREF 430.0
然后用万用表测量了一下板子上对应的电阻,这个模块上测量出来的电阻阻值为:467.7Ω。修改代码,读取出来的值就正常了。
// MAX31865 软件SPI引脚
#define MAX31865_CS 21
#define MAX31865_MOSI 23
#define MAX31865_MISO 20
#define MAX31865_SCK 22
Adafruit_MAX31865 max31865 = Adafruit_MAX31865(MAX31865_CS, MAX31865_MOSI, MAX31865_MISO, MAX31865_SCK);
const float R0 = 100.0;
// const float Rref = 430.0; // 绝大多数模块是430Ω,看你丝印
const float Rref = 467.7; //测量值
void setup()
{
Serial.begin(115200);
// 注意:不能 while(!Serial) 等待,否则外接电源供电(无USB)时程序会卡死
// 启用三线PT100模式
if (!max31865.begin(MAX31865_3WIRE))
{
Serial.println("MAX31865初始化失败!检查接线/3线跳线");
while (1)
;
}
max31865.enable50Hz(true); // 50Hz滤波
Serial.println("MAX31865 三线PT100 OK");室温下读取:
RTD:110.43 Ω | Temp:26.79 °C RTD:110.43 Ω | Temp:26.79 °C RTD:110.40 Ω | Temp:26.72 °C RTD:110.39 Ω | Temp:26.68 °C RTD:110.40 Ω | Temp:26.72 °C RTD:110.37 Ω | Temp:26.65 °C RTD:110.37 Ω | Temp:26.65 °C RTD:110.35 Ω | Temp:26.57 °C RTD:110.36 Ω | Temp:26.61 °C RTD:110.35 Ω | Temp:26.57 °C
我的RP2040开发板,正好带着个TFT屏幕,将输出内容,在屏幕上做显示。
void loop()
{
uint16_t raw = max31865.readRTD(); // 原始ADC码
float rtd = raw / 32768.0 * Rref; // 换算为电阻(Ω)
float temp = max31865.calculateTemperature(raw, R0, Rref);
uint8_t fault = max31865.readFault();
if (fault)
{
Serial.print("Fault: ");
Serial.println(fault, HEX);
max31865.clearFault();
}
Serial.print("RTD:");
Serial.print(rtd, 2);
Serial.print(" Ω | Temp:");
Serial.print(temp, 2);
Serial.println(" °C");
// ---- 屏幕刷新 ----
// 清空数字显示区域(避免残影)
tft.fillRect(0, 60, 240, 110, TFT_BLACK);
// 大号温度值
u8f.setFont(u8g2_font_inb42_mn);
char buf[12];
sprintf(buf, "%.1f", temp);
u8f.setCursor(25, 115);
u8f.print(buf);
// 单位 ℃
u8f.setFont(u8g2_font_inb24_mf);
u8f.setCursor(200, 110);
u8f.print("C");
// 分隔线
tft.drawFastHLine(0, 170, 240, TFT_GREEN);
// 底部电阻
u8f.setFont(u8g2_font_wqy16_t_gb2312);
u8f.setCursor(5, 205);
u8f.print("RTD:");
u8f.setFont(u8g2_font_inb16_mf);
sprintf(buf, "%.1f", rtd);
u8f.setCursor(70, 205);
u8f.print(buf);
u8f.setCursor(185, 205);
u8f.print("ohm");
delay(1000); // 每秒刷新
}效果展示
将探头放入热水壶中,将水烧开,可以看见水沸腾的温度:99.4℃。
‘
再将探头放入冰箱的冷冻层,持续15分钟后,再去观察。可以看见读取到的温度为--15.5℃,不过看冰箱设置,冷冻层设置的是-18℃,看来冰箱没有达标。

常温下的测量

我要赚赏金
