diff -r 73cd31dc6ce1 -r 18dd6eadba31 thermferm/thermferm.c --- a/thermferm/thermferm.c Thu Feb 19 14:42:55 2015 +0100 +++ b/thermferm/thermferm.c Thu Feb 19 15:43:43 2015 +0100 @@ -1311,51 +1311,72 @@ for (unit = Config.units; unit; unit = unit->next) { if ((unit->mode == UNITMODE_FRIDGE) || (unit->mode == UNITMODE_BEER) || (unit->mode == UNITMODE_PROFILE)) { // double pTerm, dTerm, iTerm; + int usePid = TRUE; sp = unit->beer_set; pv = unit->beer_temperature / 1000.0; if (unit->mode == UNITMODE_FRIDGE) { sp = unit->fridge_set; pv = unit->air_temperature / 1000.0; + usePid = FALSE; } else if (unit->mode == UNITMODE_PROFILE) { sp = unit->prof_target; } - /* - * PID controller compute - */ P_err = sp - pv; if (P_err < unit->idle_rangeH && P_err > unit->idle_rangeL) { P_err = 0.0; } - pid = (pid_var *)malloc(sizeof(pid_var)); - pid->dState = unit->PID_dState; - pid->iState = unit->PID_iState; - pid->iMax = 100.0; - pid->iMin = -100.0; - pid->pGain = unit->PID_Kp; - pid->iGain = unit->PID_Ki; - pid->dGain = unit->PID_Kd; + if (usePid) { + /* + * PID controller compute + */ + pid = (pid_var *)malloc(sizeof(pid_var)); + pid->dState = unit->PID_dState; + pid->iState = unit->PID_iState; + pid->iMax = 100.0; + pid->iMin = -100.0; + pid->pGain = unit->PID_Kp; + pid->iGain = unit->PID_Ki; + pid->dGain = unit->PID_Kd; - Out = UpdatePID(pid, P_err, pv); + Out = UpdatePID(pid, P_err, pv); + + if (Out > 100.0) + Out = 100.0; + if (Out < -100.0) + Out = -100.0; - if (Out > 100.0) - Out = 100.0; - if (Out < -100.0) - Out = -100.0; - - if (debug) - fprintf(stdout, "sp=%.2f pv=%.2f dState=%.2f P_err=%.2f iState=%.2f Out=%.2f\n", + if (debug) + fprintf(stdout, "sp=%.2f pv=%.2f dState=%.2f P_err=%.2f iState=%.2f Out=%.2f\n", sp, pv, unit->PID_dState, P_err, unit->PID_iState, Out); - if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) { - syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f dState=%.2f iState=%.2f Out=%.2f", + if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) { + syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f dState=%.2f iState=%.2f Out=%.2f", sp, pv, P_err, unit->PID_dState, unit->PID_iState, Out); + } + + unit->PID_iState = pid->iState; + unit->PID_dState = pid->dState; + free(pid); + pid = NULL; + } else { + /* + * Simple temperature control + */ + if (P_err < 0) { + Out = 100.0; + } else if (P_err > 0) { + Out = -100.0; + } else { + Out = 0.0; + } + if ((Out >= 1) || (Out <= -1) || (seconds == 60) || unit->heater_state || unit->cooler_state) { + syslog(LOG_NOTICE, "sp=%.2f pv=%.2f P_err=%.2f Out=%.2f", + sp, pv, P_err, Out); + } } - unit->PID_iState = pid->iState; - unit->PID_dState = pid->dState; - // pTerm = unit->PID_Kp * P_err; /*