内网时间同步必读:NTP与SNTP原理、chrony配置与避坑指南
2026/9/23 15:32:36
非接触红外听起来高大上,但真正动手才发现“测不准”才是常态。总结去年指导的12组同学,90%的卡点集中在下面五处:
把这些问题提前想清楚,后面的调试量直接砍半。
2.1 红外传感器对比
| 型号 | 视场角 | 精度(25 ℃) | 接口 | 价格(片) | 备注 |
|---|---|---|---|---|---|
| MLX90614ESF-BAA | 35° | ±0.5 ℃ | I2C | 25元 | 车规级,带出厂标定 |
| GY-906(模拟) | 90° | ±2 ℃ | PWM | 15元 | 需运放,漂移大 |
| TMP006 | 120° | ±1 ℃ | I2C | 35元 | 需补偿算法复杂 |
结论:MLX90614在精度、封装、出厂校准三方面最均衡,且网上可买到已焊好透镜的TO-39模块,直接5 V兼容。
2.2 MCU资源匹配
STM32F103C8T6主频72 MHz,Flash 64 KB,SRAM 20 KB,对于“单点测温+OLED+串口”场景绰绰有余;更重要的是,它带硬件I2C1/2,事件中断可唤醒STOP模式,功耗做到50 μA,给低功耗章节留足余量。
flag.i2c_done,避免轮询卡死。MLX90614出厂已把传感器温度(Ta)和物体温度(To)做了一次线性标定,但外壳热阻差异仍会导致2 ℃左右的偏移。补偿公式:
Tobj_comp = To - k*(Ta - 25)其中k为热梯度系数,取0.02/℃即可。把Ta、To同时读出,代入上式,可将空调、手热等外部干扰压到±0.2 ℃以内。
以下代码全部在STM32CubeIDE 1.12上验证通过,芯片STM32F103C8T6,传感器MLX90614ESF-BAA。
/* mlx90614.h */ #define MLX_ADDR (0x5A<<1) // 8位写地址 #define REG_TA 0x06 // 环境温度 #define REG_TOBJ1 0x07 // 物体温度 void MX_I2C1_Init(void); uint8_t MLX_Read(uint8_t reg, uint16_t *dat);/* mlx90614.c */ I2C_HandleTypeDef hi2c1; void MX_I2C1_Init(void) { hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; HAL_I2C_Init(&hi2c1); } // 带PEC的读寄存器 uint8_t MLX_Read(uint8_t reg, uint16_t *dat) { uint8_t buf[3]; buf[0] = reg; if(HAL_I2C_Master_Transmit(&hi2c1, MLX_ADDR, buf, 1, 50) != HAL_OK) return 1; if(HAL_I2C_Master_Receive(&hi2c1, MLX_ADDR, buf, 3, 50) != HAL_OK) return 2; uint8_t crc = crc8_maxim(buf, 2); // 计算CRC if(crc != buf[2]) return 3; // PEC校验失败 *dat = (buf[1]<<8)|buf[0]; return 0; }static const uint8_t crc_table[256]={0x00,0x5e…}; // 256字节表略 uint8_t crc8_maxim(uint8_t *p, uint8_t len) { uint8_t crc = 0x00; for(uint8_t i=0;i<len;i++) crc = crc_table[crc ^ p[i]]; return crc; }float calc_temp(uint16_t raw) { return (float)raw*0.02 - 273.15; // 传感器固定分辨率0.02 K/LSB }调用示例:
uint16_t ta, tobj; if(!MLX_Read(REG_TA, &ta) && !MLX_Read(REG_TOBJ1, &tobj)) { float Ta = calc_temp(ta); float To = calc_temp(tobj); float Tcomp = To - 0.02f*(Ta - 25.0f); printf("Tobj=%.2f\r\n", Tcomp); }把上面模块跑通后,建议用黑体胶枪做一条“恒温槽-冰水-热水”三点曲线,验证线性度R²≥0.999;有余力再把USART换成HC-08蓝牙,把Tobj实时上传到手机,用App Inventor拖个折线图,答辩现场瞬间加分。动手吧,数据有了,故事就好讲了。