如何通过继电器保持温度恒定



我开始了一个与Arduino Uno板一起工作的教程项目。这个项目的总结是,在加热器和冷却器的帮助下,我们必须保持腔室的温度恒定。

项目基本准备就绪,但问题是在温度高于所需温度后,冷却器开始工作并将温度降至所需温度以下,然后加热器开始工作以提高温度。您知道,在加热后,其温度在一段时间内是恒定的,没有必要将其冷却到低于所需温度。

问题就在这里,我不能写一个代码来打开冷却,把温度从25度以上调到25度,这样当温度达到25度时,冷却就会关闭,如果没有任何冷却的房间温度降到25度以下,加热器开始工作

****同时,我有一个2继电器模块在我的项目****

完整代码:

//********************Temp Control Relay
int PinRelay1 = 5;
int PinRelay2 = 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};
int Temp_IN;
//********************Area Tempreture
float TempSettings = 25.5;
//********************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(PinRelay1, OUTPUT);
pinMode(PinRelay2, OUTPUT);
pinMode(PinVccTemp, OUTPUT);
pinMode(PinGndTemp, OUTPUT);
digitalWrite(PinRelay1, HIGH);
digitalWrite(PinRelay2, LOW);
digitalWrite(PinVccTemp, HIGH);
Temp.requestTemperatures();
delay(500);
}
void loop() {
Temp.requestTemperatures();
Temp_IN = Temp.getTempCByIndex(0);
int8_t Digit2 = Temp_IN % 10 ;
int8_t Digit1 = (Temp_IN % 100) / 10 ;
Digitos[3] = 12 ;
Digitos[2] = Digit2 ;
Digitos[1] = Digit1 ;
Digitos[0] = 19 ;
Display1.display(Digitos);
if (Temp_IN > TempSettings)
digitalWrite(PinRelay, LOW);
if (Temp_IN < TempSettings)
digitalWrite(PinRelay, HIGH);
}
}

你不能用一个简单的开关系统将温度保持在25°C;这样的系统通常会振荡。

你可以尝试添加一些迟滞;例如,在温度达到25.5℃之前不要开始冷却,在温度降至24.5℃以下之前不要开始加热。

另一种选择是对腔室的热特性和加热和冷却系统进行建模,然后根据该模型设计和校准(PID)控制系统。

顺便说一句,我觉得末尾的花括号太多了。

遗憾的是,在电路板的这种训练结构下,我们无法专业地保持温度恒定,但可以通过使用条件和循环在一定程度上改善。

然而,在最后的代码中,出现了一个关于消除循环中的延迟的问题。因为如果没有延迟,冷却系统就不会工作,尽管有延迟,冷却系统总是打开或关闭。如果有人能解决这个问题,我会很高兴,并把答案留在这里,以便其他朋友也可以使用它。

修改部分:

delay(50);
if (Temp_IN  < (TempSettings - 0.2) ){
//delay(500);
digitalWrite(PinRelay1, HIGH);
Serial.println("Heater on");
digitalWrite(PinRelay2, LOW);
} 
if (Temp_IN  > (TempSettings + 0.9) ){
do {       
digitalWrite(PinRelay1, LOW);
//This delay should be removed, but I don't know how to solve 
the problem after removal
delay(800); 
digitalWrite(PinRelay2, HIGH); 
Serial.println("fan on");
} while (Temp_IN  == (TempSettings ) );
digitalWrite(PinRelay2, HIGH);
digitalWrite(PinRelay1, HIGH);
Serial.println("BOTH OFF");
} 

最新更新