You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用继电器实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:35:55