如何用继电器实现Arduino Uno恒温控制(解决温度超调问题)
Arduino Uno 温度恒定控制(解决超调问题)
针对你遇到的温度超调问题,以下是修正后的代码,实现温度高于25℃启动制冷、达到25℃关闭制冷;自然降温低于25℃启动加热的需求:
//********************Temp Control Relay #define COOL_RELAY_PIN 5 // 制冷器继电器引脚 #define HEAT_RELAY_PIN 6 // 加热器继电器引脚 //********************Display int PinClkLcd = 2; int PinDioLcd = 3; #include <TM1637.h> #define CLK PinClkLcd #define DIO PinDioLcd TM1637 Display1(CLK, DIO); //********************Temp int PinVccTemp = 8; int PinDataTemp = 9; int PinGndTemp = 10; #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS PinDataTemp OneWire oneWire(ONE_WIRE_BUS); DallasTemperature Temp(&oneWire); int8_t Digitos[] = {8, 8, 8, 8}; float Temp_IN; // 改为float类型,保留温度小数精度 //********************Temperature Settings const float TARGET_TEMP = 25.0; // 目标温度25℃ //********************Switch //int PinSW = 12; int TimeSW; int TimeDisplay; boolean Key; void setup() { Temp.begin(); Display1.set(7); Display1.init(); Display1.display(Digitos); Display1.point(POINT_OFF); //pinMode(PinSW, INPUT_PULLUP); pinMode(COOL_RELAY_PIN, OUTPUT); pinMode(HEAT_RELAY_PIN, OUTPUT); pinMode(PinVccTemp, OUTPUT); pinMode(PinGndTemp, OUTPUT); // 初始状态:关闭制冷,关闭加热 digitalWrite(COOL_RELAY_PIN, HIGH); digitalWrite(HEAT_RELAY_PIN, HIGH); digitalWrite(PinVccTemp, HIGH); Temp.requestTemperatures(); delay(500); } void loop() { Temp.requestTemperatures(); Temp_IN = Temp.getTempCByIndex(0); // 更新四位数码管显示(带小数点,显示格式如"25.0") int integerPart = (int)Temp_IN; int decimalPart = (int)((Temp_IN - integerPart) * 10); Digitos[0] = integerPart / 10; // 十位 Digitos[1] = integerPart % 10; // 个位 Digitos[2] = decimalPart; // 小数位 Digitos[3] = 12; // 符号位(空白占位) Display1.point(POINT_ON); // 开启小数点 Display1.display(Digitos); // 制冷控制:温度高于目标值时启动,达到或低于时关闭 if (Temp_IN > TARGET_TEMP) { digitalWrite(COOL_RELAY_PIN, LOW); // 启动制冷(假设继电器低电平触发) digitalWrite(HEAT_RELAY_PIN, HIGH); // 同时关闭加热 } else { digitalWrite(COOL_RELAY_PIN, HIGH); // 关闭制冷 } // 加热控制:仅当温度低于目标值时启动(自然降温后的补温) if (Temp_IN < TARGET_TEMP) { digitalWrite(HEAT_RELAY_PIN, LOW); // 启动加热(假设继电器低电平触发) } else { digitalWrite(HEAT_RELAY_PIN, HIGH); // 温度达标时关闭加热 } delay(1000); // 降低检测频率,避免频繁启停 }
关键修改说明
- 变量精度修正:将
Temp_IN从int改为float,避免温度小数部分丢失导致的判断误差 - 继电器功能明确:用宏定义区分制冷/加热继电器引脚,便于后续接线调整
- 控制逻辑优化:
- 制冷仅在温度高于25℃时启动,一旦温度降到25℃立即关闭,避免过度制冷
- 加热仅在温度低于25℃时启动,温度达标后关闭,避免重复启停
- 显示逻辑修复:正确解析温度的整数和小数部分,开启小数点让显示更直观
- 初始状态优化:上电时默认关闭所有执行器,避免误启动
- 添加延迟:
loop末尾加入1秒延迟,降低传感器检测频率,减少继电器频繁通断损耗
注意:请根据你的继电器模块触发逻辑(高电平/低电平触发)调整
digitalWrite的电平值,确保执行器动作正确。
内容的提问来源于stack exchange,提问作者Pezhvak
相关产品推荐
相关产品推荐

