前言
近期为了解决电热水器温度显示不准的问题,制作了一个小屏幕显示出水温度,成功的解决了温度显示不准的问题
分析
由于出水温度的变化并不是线性的,所以查看剩余水量非常不直观。
这是电热水器结构所决定的,如下图所示:
在使用过程中下部的进水管进入冷水,上部热水管出热水。
由于冷热水存在交界处,随着热水的消耗,冷热交界处上移,出水口温度下降;但是,冷热交界处的范围很小,以致于在用水的前半部分,出水温度变化是很小的,直接使用线性估值非常不准确。
所以我才用了构建数学模型的方法实现百分比的估计,步骤如下:
- 采集7天以上的实际出水温数据,并拟合后生成曲线

从曲线可以看出,第一次用水过程中,出水温无明显变化;
而在第二次用水过程,水温出现了趋于线性的下降现象。
- 细化分析
聚焦第二次用水区间,若设定目标温度为65℃度,则出水温在56℃附近,温差9℃;
出水温下降至48℃时,寒冷天气时可以明显感知水温不足,所以根据实际使用情况分析得到下降区间为
(设定温度-出水温差9℃) ~ 48℃。
程序编写
由于查表法占用ROM较多,所以此处使用插值法实现,具体如下
// 估算剩余水量
int estimateWaterVolume(float temp)
{
// 根据温度区间返回剩余水量
if (temp >= 56.0) {
return 100; // 高于或等于56°C,100%
} else if (temp >= 55.5) {
return (int)interpolate(55.5, 80.0, 56.0, 100.0, temp);//插值法估算百分比,对55.5~56.0℃之间的范围映射到80~100%
} else if (temp >= 54.3) {
return (int)interpolate(54.3, 60.0, 55.5, 80.0, temp);
} else if (temp >= 52.4) {
return (int)interpolate(52.4, 40.0, 54.3, 60.0, temp);
} else if (temp >= 50.0) {
return (int)interpolate(50.0, 20.0, 52.4, 40.0, temp);
} else if (temp >= 48.0) {
return (int)interpolate(48.0, 5.0, 50.0, 20.0, temp);
} else {
return 5; // 温度低于48°C,返回最低水量5%,更贴近用户体验
}
}
所取点可由人工或自动数据分析取点,数据为65℃设定温度下的结果,其他设定温度应增加温度偏移。
由于温度变化不是完全线性的,interpolate函数可以实现范围内的线性插值,将整个范围分割为几个小段,可以模拟类似曲线的效果,相较于拟合曲线法,能够节约单片机资源。
以上则为全部内容,欢迎交流指教。
评论0
暂时没有评论