| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- #include "RelayController.h"
- #include <WiFi.h>
- #include <time.h>
- // 构造函数
- RelayController::RelayController(int pin22, int pin23, int pin4)
- : _relayPin22(pin22),
- _relayPin23(pin23),
- _relayPin4(pin4),
- _relay22State(HIGH_Z),
- _relay23State(HIGH_Z),
- _relay4State(HIGH_Z),
- _relay22TimeoutCheck(false),
- _relay22TempHold(false), // 初始化为未触发
- _relay4LastOnCycle(0),
- _powerOnTime(0),
- _simulatedUnixTime(0)
- {}
- // 初始化
- void RelayController::begin() {
- // 所有继电器初始化为高阻态
- pinMode(_relayPin22, INPUT);
- pinMode(_relayPin23, INPUT);
- pinMode(_relayPin4, INPUT);
-
- _powerOnTime = millis();
- _simulatedUnixTime = 0;
-
- Serial.println("继电器初始化完成,所有继电器默认高阻态");
- }
- // GPIO22控制方法
- void RelayController::setRelay22HighZ() {
- if (_relay22State != HIGH_Z) {
- pinMode(_relayPin22, INPUT);
- _relay22State = HIGH_Z;
- _relay22TimeoutCheck = false;
- _relay22TempHold = false; // 重置温度保持标记
- Serial.println("GPIO22继电器已设为高阻态");
- }
- }
- void RelayController::turnOnRelay22(float currentGpio6Temp) {
- if (_relay22State != ON) {
- pinMode(_relayPin22, OUTPUT);
- digitalWrite(_relayPin22, HIGH);
- _relay22State = ON;
-
- _relay22StartTime = millis();
- _gpio6TempAtRelay22On = currentGpio6Temp;
- _relay22TimeoutCheck = true;
- Serial.println("GPIO22继电器已打开(高电平)");
- }
- }
- // GPIO23控制方法
- void RelayController::setRelay23HighZ() {
- if (_relay23State != HIGH_Z) {
- pinMode(_relayPin23, INPUT);
- _relay23State = HIGH_Z;
- Serial.println("GPIO23继电器已设为高阻态");
- }
- }
- void RelayController::turnOnRelay23() {
- if (_relay23State != ON) {
- pinMode(_relayPin23, OUTPUT);
- digitalWrite(_relayPin23, HIGH);
- _relay23State = ON;
- Serial.println("GPIO23继电器已打开(高电平)");
- }
- }
- // GPIO4定时继电器控制方法
- void RelayController::setRelay4HighZ() {
- if (_relay4State != HIGH_Z) {
- pinMode(_relayPin4, INPUT);
- _relay4State = HIGH_Z;
- Serial.println("GPIO4定时继电器已设为高阻态");
- }
- }
- void RelayController::turnOnRelay4() {
- if (_relay4State != ON) {
- pinMode(_relayPin4, OUTPUT);
- digitalWrite(_relayPin4, HIGH);
- _relay4State = ON;
- _relay4OnTime = millis();
- Serial.println("GPIO4定时继电器已打开(高电平)");
- }
- }
- // 主控制逻辑(包含温度滞后控制)
- void RelayController::controlByTempConditions(float tempGpio2, float tempGpio3, float tempGpio6,
- float diffThreshold, float gpio6High, float gpio6Low,
- float highTempOn, float highTempOff) {
- float diff = tempGpio2 - tempGpio3;
- Serial.print("温度差 (GPIO2 - GPIO3): ");
- Serial.print(diff);
- Serial.print(" °C, GPIO6温度: ");
- Serial.print(tempGpio6);
- Serial.println(" °C");
-
- // 新增:高温控制逻辑(带滞后)
- // 当温度高于35℃时打开继电器并标记保持状态
- if (tempGpio6 > highTempOn) {
- turnOnRelay22(tempGpio6);
- _relay22TempHold = true; // 标记为需要滞后关闭
- }
- // 当温度低于25℃且已触发保持状态时,才关闭继电器
- else if (tempGpio6 < highTempOff && _relay22TempHold) {
- setRelay22HighZ();
- _relay22TempHold = false; // 重置保持状态
- }
- // 原有温度差控制逻辑(仅在未触发高温保持时生效)
- else if (!_relay22TempHold) {
- // 控制GPIO22:原有条件
- if (diff < -diffThreshold && tempGpio6 > gpio6High) {
- turnOnRelay22(tempGpio6);
- } else {
- setRelay22HighZ();
- }
- }
-
- // GPIO23控制逻辑(保持不变)
- if (diff > diffThreshold && tempGpio6 < gpio6Low) {
- turnOnRelay23();
- } else {
- setRelay23HighZ();
- }
- }
- // 定时任务处理(保持不变)
- void RelayController::handleTimedTasks(float currentGpio6Temp) {
- unsigned long currentTime = millis();
-
- // 1. GPIO22超时检测
- if (_relay22TimeoutCheck && _relay22State == ON) {
- if (currentTime - _relay22StartTime >= 15 * 60 * 1000) { // 15分钟
- float tempIncrease = currentGpio6Temp - _gpio6TempAtRelay22On;
-
- if (tempIncrease < 5.0) {
- setRelay22HighZ();
- Serial.println("警告:加热没有成功!15分钟内温度未上升5度");
- } else {
- _relay22TimeoutCheck = false;
- Serial.println("加热成功,温度上升达标");
- }
- }
- }
-
- // 2. 定时继电器GPIO4控制
- unsigned long currentCycle = get24hCycleCount();
- int currentHour = getCurrentHour();
-
- if (currentHour == _dailyOnHour && currentCycle != _relay4LastOnCycle) {
- turnOnRelay4();
- _relay4LastOnCycle = currentCycle;
- }
-
- if (_relay4State == ON && (currentTime - _relay4OnTime) >= _onDuration) {
- setRelay4HighZ();
- }
- }
- // 时间管理方法(保持不变)
- void RelayController::updateNtpTime() {
- if (WiFi.status() == WL_CONNECTED) {
- configTime(8 * 3600, 0, "pool.ntp.org", "time.nist.gov");
- time_t now;
- time(&now);
-
- if (now > 1609459200) {
- _simulatedUnixTime = now - ((millis() - _powerOnTime) / 1000);
- Serial.println("NTP时间同步成功,校准模拟时间");
- }
- }
- }
- unsigned long RelayController::getCurrentUnixTime() {
- return _simulatedUnixTime + ((millis() - _powerOnTime) / 1000);
- }
- int RelayController::getCurrentHour() {
- unsigned long secondsSincePowerOn = (millis() - _powerOnTime) / 1000;
- return (secondsSincePowerOn / 3600) % 24;
- }
- unsigned long RelayController::get24hCycleCount() {
- unsigned long secondsSincePowerOn = (millis() - _powerOnTime) / 1000;
- return secondsSincePowerOn / (24 * 3600);
- }
- unsigned long RelayController::getPowerOnTime() {
- return _powerOnTime;
- }
- // 获取状态字符串
- String RelayController::getRelay22State() {
- return (_relay22State == ON) ? "打开(高电平)" : "高阻态";
- }
- String RelayController::getRelay23State() {
- return (_relay23State == ON) ? "打开(高电平)" : "高阻态";
- }
- String RelayController::getRelay4State() {
- return (_relay4State == ON) ? "打开(高电平)" : "高阻态";
- }
-
|