Arduino PID温控器旋转编码器无法下调设定温度求助
问题排查与修复
1. 核心问题:编码器读取被阻塞
在loop()函数的运行模式(encoder_btn_count == 1)中,delay(200)会阻塞程序200毫秒,这段时间内编码器的脉冲无法被及时捕获,导致逆时针旋转的信号被遗漏,表现为无法下调温度。
修复方案:用非阻塞定时替代delay(),确保read_encoder()能被高频调用:
// 新增全局变量,控制显示更新间隔 unsigned long lastDisplayUpdate = 0; const long displayUpdateInterval = 200; void loop() { read_encoder(); set_temp(); if (encoder_btn_count == 1) { temperature_value_c = thermocouple.readCelsius(); int output = pid.compute(temperature_value_c); analogWrite(mosfet_pin, output); pid.setpoint(set_temperature); // 非阻塞更新OLED显示 if (millis() - lastDisplayUpdate >= displayUpdateInterval) { lastDisplayUpdate = millis(); display.clearDisplay(); display.setTextSize(2); display.setCursor(16, 0); display.print("Cur Temp."); display.setCursor(45, 25); display.print(temperature_value_c); display.display(); #ifdef __DEBUG__ Serial.print(temperature_value_c); Serial.print(" "); Serial.println(output); #endif } } }
2. 辅助优化:编码器信号稳定性与初始状态
- 给CLK、DATA引脚启用内部上拉,增强信号抗干扰能力,避免误判:
void setup() { // ... 其他代码 ... pinMode(CLK_PIN, INPUT_PULLUP); // 替换原INPUT为INPUT_PULLUP pinMode(DATA_PIN, INPUT_PULLUP); // 替换原INPUT为INPUT_PULLUP clockPinState = digitalRead(CLK_PIN); // 初始化CLK引脚初始状态 // ... 其他代码 ... }
3. 可选调整:方向判断逻辑适配硬件
如果上述修复后方向仍异常,可能是编码器相位与代码逻辑不符,可尝试调整边沿检测条件(改为检测下降沿):
void read_encoder() { clockPin = digitalRead(CLK_PIN); // 改为检测CLK引脚从高到低的下降沿 if (clockPin != clockPinState && clockPin == 0) { if (digitalRead(DATA_PIN) == clockPin) { set_temperature -= 3; } else { set_temperature += 3; } if (set_temperature < 1) set_temperature = 1; if (set_temperature > 150) set_temperature = 150; #ifdef __DEBUG__ Serial.println(set_temperature); #endif } clockPinState = clockPin; // ... 按钮检测代码保持不变 ... }
内容的提问来源于stack exchange,提问作者rgbyello
相关产品推荐
相关产品推荐

