这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 机器人开发 » 【EEPW-let'sdesign】DI&MIKROMIKROE-2815+宽范

共1条 1/1 1 跳转至页

【EEPW-let'sdesign】DI&MIKROMIKROE-2815+宽范围温度计

菜鸟
2026-10-12 20:27:21     打赏

很开心参加“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-

7771067fcd44aa1dce9284eb8ddcc5cb.jpg05882b624359a958b6ad0e9296a1ff50.jpg

系统实现

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

image.png

参考着例程,开始读取温度。但是读取到的温度,比实际温度差不多低了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℃。

51788d1e193f4db2d1eb2c8bc6ebee7c.jpg‘

再将探头放入冰箱的冷冻层,持续15分钟后,再去观察。可以看见读取到的温度为--15.5℃,不过看冰箱设置,冷冻层设置的是-18℃,看来冰箱没有达标。

451b78ef7da8a80e954bf4589458a010.jpg

常温下的测量

image.png



源码:rp2040_design.zip




共1条 1/1 1 跳转至页

回复

匿名不能发帖!请先 [ 登陆 注册 ]