基于ESP32的洗碗机多模式洗涤循环程序实现求助
多模式洗碗机控制程序适配方案
1. 修正洗涤模式参数配置
当前所有模式参数完全一致,无法区分不同流程,先按需求调整参数:
switch (currProg) { // 参数定义:水位, 预洗时间, 洗涤时间, 洗涤温度, 漂洗时间, 漂洗温度, 烘干时间, 烘干温度 case hotFastProg: washprogconfig(high,5,15,60,10,60,10,70); break; case hotLongProg: washprogconfig(high,10,25,60,10,60,10,70); break; case coldFastProg: washprogconfig(high,5,15,0,10,0,10,50); break; // 冷水模式加热温度设为0,自动跳过加热逻辑 case coldLongProg: washprogconfig(high,10,25,0,10,0,10,50); break; case fruitProg: washprogconfig(high,5,0,0,0,0,0,0); break; // 果蔬模式仅保留预洗,后续阶段时间全设为0 }
新增全局变量标记当前大流程阶段,程序启动时(progStart分支)记得初始化currStage = 0:
uint8_t currStage = 0; // 0=预洗阶段, 1=洗涤阶段, 2=漂洗阶段
2. 改造状态跳转逻辑
2.1 修正fill阶段跳转逻辑
原逻辑fill完成后固定跳wash,改为根据当前阶段匹配对应模式:
case fillin: if (currMode != prevMode) { switchmode (fillTime, "fill"); digitalWrite (inlet, switchOn); } else if (waterLevel == high or (currProg == testProg and timeNow >= endTime)) { // 根据当前阶段跳转到对应洗涤模式 switch(currStage) { case 0: currMode = prewash; break; case 1: currMode = wash; break; case 2: currMode = rinse; break; } } else if (timeNow >= endTime) { currMode = errPause; } break;
2.2 修正drain阶段跳转逻辑
原逻辑用固定循环次数判断流程不适配多模式,改为按阶段参数动态判断后续流程:
case drain: if (currMode != prevMode) { switchmode (drainTime, "Drain"); delay (2000); digitalWrite (outlet, switchOn); } else if (waterLevel == empty || (currProg == testProg && timeNow >= endTime)) { if(currStage == 0) { // 预洗阶段排水完成 if(washTime > 0) { // 有洗涤阶段就进水走洗涤流程 currStage = 1; currMode = fillin; } else { // 无洗涤阶段直接判断是否需要烘干 if(dryTime > 0) currMode = dry; else currMode = complete; } } else if(currStage == 1) { // 洗涤阶段排水完成 if(rinseTime > 0) { // 有漂洗阶段就进水走漂洗流程 currStage = 2; currMode = fillin; } else { // 无漂洗阶段判断是否需要烘干 if(dryTime > 0) currMode = dry; else currMode = complete; } } else if(currStage == 2) { // 漂洗阶段排水完成 if(dryTime > 0) currMode = dry; else currMode = complete; } } else if (timeNow >= endTime) { currMode = errPause; } break;
2.3 修正switchmode函数
新增关闭烘干输出的逻辑,避免状态切换时烘干模块误启动:
void switchmode ( int induration, String newmsg) { String outmsg = " mode started"; prevMode = currMode; startTime = timeNow; endTime = startTime + induration; outmsg = ": " + newmsg + outmsg; digitalWrite (outlet, switchOff); digitalWrite (washPump, switchOff); digitalWrite (inlet, switchOff); digitalWrite (heater, switchOff); digitalWrite (dryer, switchOff); // 新增关闭烘干模块 heaterStatus = false; }
3. 简化剩余时间计算逻辑
原重复累加逻辑容易出错,改为提前计算总时长、实时扣除已运行时长:
// 程序启动时计算一次总时长 uint32_t totalProgTime = 0; if(prewashTime > 0) totalProgTime += drainTime + fillTime + prewashTime; if(washTime > 0) totalProgTime += drainTime + fillTime + washTime; if(rinseTime > 0) totalProgTime += drainTime + fillTime + rinseTime; if(dryTime > 0) totalProgTime += dryTime + drainTime; // 运行时剩余时间计算,progStartTime为程序启动时记录的timeNow值 remainProgTime = totalProgTime - (timeNow - progStartTime); if(remainProgTime < 0) remainProgTime = 0;
4. 可选细节优化
- 烘干阶段如果使用空气加热,不要用waterTemp判断温度,额外接NTC传感器测腔内空气温度
- 冷水模式可新增逻辑,进水时直接走冷水阀,无需混合热水
- 果蔬模式可降低洗涤泵输出功率,避免损伤果蔬表皮
内容的提问来源于stack exchange,提问作者dhannemon13
相关产品推荐
相关产品推荐

