thermferm/thermferm.c

changeset 176
8c7d87a2c094
parent 175
b73490398368
child 177
48d19ec83a49
--- a/thermferm/thermferm.c	Sun Aug 03 22:49:33 2014 +0200
+++ b/thermferm/thermferm.c	Mon Aug 04 15:18:29 2014 +0200
@@ -232,6 +232,7 @@
     time_t		now, last = (time_t)0;
     units_list		*unit;
     int			rc, run = 1, seconds = 0, minutes = 0;
+    float		err = 0.0, sp, pv, P_err, I_err, D_err, Out;
 #ifdef HAVE_WIRINGPI_H
     struct tm		*tm;
     int			row;
@@ -345,6 +346,33 @@
 		for (unit = Config.units; unit; unit = unit->next) {
 		    if (unit->mode != UNITMODE_OFF) {
 
+			if (0) {
+			    /*
+			     * PID controller
+			     */
+			    sp = unit->beer_set;
+			    pv = unit->beer_temperature;
+			    if (unit->mode == UNITMODE_FRIDGE) {
+				sp = unit->fridge_set;
+				pv = unit->air_temperature;
+			    } else if (unit->mode == UNITMODE_PROFILE) {
+				sp = unit->prof_target;
+			    }
+
+			    unit->PID_err_old = err;
+			    err = sp - pv;
+			    if (err < unit->idle_rangeH && err > unit->idle_rangeL)
+				err = 0;
+			    P_err = err;
+			    I_err += unit->PID_err_old;
+			    D_err = err - unit->PID_err_old;
+
+			    Out = 0.1*P_err + 0.3*I_err + 0.02*D_err;
+			    if (debug)
+				fprintf(stdout, "sp=%.2f pv=%.2f err_old=%.2f err=%.2f P_err=%.2f I_err=%.2f D_err=%.2f Out=%.2f\n",
+						sp, pv, unit->PID_err_old, err, P_err, I_err, D_err, Out);
+			}
+
 			snprintf(target, 39, "NA");
 			snprintf(heater, 39, "NA");
 			snprintf(cooler, 39, "NA");

mercurial