Код (C): boolean Day = (Hour >= lightOn && Hour <lightOff); tStatus = (t < ((Day) ? tempDay : tempNight))? LOW:HIGH; if (t < (Day) ? tempDay : tempNight - 2 || t == (Day) ? tempDay : tempNight) { digitalWrite(tPIN, tStatus); } t - показания с датчика tempDay и tempNight переменные задания температуры дня и ночи tStatus принимает значения LOW и HIGH, которые управляют пином включения ламп проблема в том что данный регулятор нагревает до определенной температуры и начинает судорожно переключать реле при изменении температуры около точки регулирования c помощью введения строки if хотелось достигнуть того что после достижения заданной температуры, выполнение регулирования будет возобновленно после того как температура упадет на 2 градуса по сравнению с заданием "t < (Day) ? tempDay : tempNight - 2" и будет выполнятся до наступления равенства с заданием. укажите пожалуйста на ошибку т.к. сейчас происходит мерцание ламп без выполнения условия if я подозреваю что не выполняется именно вычет из "t < (Day) ? tempDay : tempNight - 2" двух градусов изза неправильной расстановки скобок или чего либо еще и -2 относится к части выражения "tempNight - 2"
Гистерезис добавьте. Переключение вблизи точки равновесия должно происходить при разных значениях в зависимости от направления изменения величины. В вашем примере вблизи равновесной температуры должно быть некоторое "окно" в какое то количество градусов, внутри которого не должно быть реакции на "шум", а переключение только при пересечении верхней и нижней границ интервала.
Код (C): const int PIN_HEATCTL = 13; const float DAY_EQ_TEMP = 25.0; const float NIGHT_EQ_TEMP = 18.0; const float TEMP_ERROR = 2.0; const int LIGHT_ON_HOUR = 9; const int LIGHT_OFF_HOUR = 21; int status = 0; void loop() { bool is_daytime = ((hour >= LIGHT_ON_HOUR) && (hour < LIGHT_OFF_HOUR)); float switch_temp = is_daytime ? DAY_EQ_TEMP : NIGHT_EQ_TEMP; if (status) { if (temp > (switch_temp+TEMP_ERROR)) { status = 0; } } else { if (temp < (switch_temp-TEMP_ERROR)) { status = 1; } } digitalWrite(PIN_HEATCTL, status); }
спасибо! очень интересное решение. я всетаки вылечил свой код путем расставления скобок (внимательно прочилал статью на вашем вики ) щас регулирование осуществляется формулой. ваш код более гибкий к изменениям и проще читается логика в случае если надо будет искать ошибки. буду использовать его