Firebeetle 2 ESP32 C5 评测2:PT100温度计
继续使用Firebeetle 2 ESP32 C5来制作一个宽范围的温度计。
硬件
PT100温度探头:这是一种铂电阻温度传感器(RTD):利用铂的电阻随温度近似线性变化来测温。0°C 时电阻为 100Ω,每升高 1°C 电阻增加约 0.385Ω。C5 内置 ADC 是 12 位 ADC,直接用ESP32 C5的ADC来读取这个温度探头,误差太大了,不合适。所以这里增加一个MAX31865芯片模块:DI&MIKRO MIKROE-2815。

连线
使用杜邦线,将模块进行连接。OLED屏幕走I2C总线,MAX31865走SPI总线。PT100的三根线:红:R+;红:F+;蓝:F- 。
| Firebeetle 2 ESP32 C5 | DI&MIKRO MIKROE-2815 | OLED |
| 9 | I2C_SDA | |
| 10 | I2C_SCL | |
| 2 | SPI_CS | |
| 23 | SPI_SCK | |
| 24 | SPI_MOSI | |
| 25 | SPI_MISO |

系统实现
编程依然使用ArduinoIDE。首先添加MAX31865的库,这样就不用再从底层实现MAX31865的读取了。

参考着官方的例程,使用SPI初始化MAX31865,然后在主循环里,读取当前温度信息,在OLED屏幕上显示即可。
#include <Wire.h>
#include <U8g2lib.h>
#include <Adafruit_MAX31865.h>
// FireBeetle 2 ESP32-C5 硬件 I2C 引脚(OLED)
#define SDA_PIN 9
#define SCL_PIN 10
// MIKROE-2815 (MAX31865) SPI 引脚
#define CS_PIN 2
#define MOSI_PIN 24
#define MISO_PIN 25
#define SCK_PIN 23
// MIKROE-2815 板载参考电阻与实际测得的 RREF 值
#define RREF 470
#define RNOMINAL 100.0
// SSD1306 128x64,硬件 I2C,全缓冲模式,不使用复位引脚
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, SCL_PIN, SDA_PIN);
// 软件 SPI 方式(CS, MOSI, MISO, SCK)
Adafruit_MAX31865 max31865(CS_PIN, MOSI_PIN, MISO_PIN, SCK_PIN);
void setup() {
// 初始化 OLED(0x7A 为跳线调整后的 I2C 写入地址)
u8g2.setI2CAddress(0x7A);
Wire.begin(SDA_PIN, SCL_PIN);
u8g2.begin();
// 三线制 PT100;若为两线制改为 MAX31865_2WIRE
max31865.begin(MAX31865_3WIRE);
max31865.enable50Hz(true); // 50Hz 滤波
}
void loop() {
uint16_t raw = max31865.readRTD();
float temp = max31865.calculateTemperature(raw, RNOMINAL, RREF);
char num[16];
sprintf(num, "%.1f", temp);
u8g2.clearBuffer();
// 大号数字
u8g2.setFont(u8g2_font_inb24_mf);
int wnum = u8g2.getStrWidth(num);
int xnum = (128 - wnum) / 2;
u8g2.drawStr(xnum, 42, num);
// 数字后接“度”字
u8g2.setFont(u8g2_font_unifont_t_chinese3);
u8g2.drawUTF8(xnum + wnum + 4, 42, "度");
u8g2.sendBuffer();
delay(500);
}这里需要注意一下“RREF”这个常量的值。例程中给的是430,对应为DI&MIKRO MIKROE-2815模块上的电阻值。可以使用万用表去测量一下对应的电阻,我这个模块,可以看见丝印标识着470Ω。所以这个常量就填写为470。如果填写的不对,测量出来的温度就会有偏差。

效果展示
办公室的室温

从水房接满一杯热水。嗯,感觉这个热水不够烫啊!





