From 777d54b43723512336d3591955ea269208ce25f1 Mon Sep 17 00:00:00 2001 From: Nathaniel Wesley Filardo Date: Thu, 14 Dec 2017 23:00:42 -0500 Subject: [PATCH] Second PID loop to drive left tank-side heater --- bin/pidmonitor.py | 62 ++++++++++++++++++++++++------------------ bin/rrdtool-creates.sh | 1 + 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/bin/pidmonitor.py b/bin/pidmonitor.py index 0220cde..4556aea 100755 --- a/bin/pidmonitor.py +++ b/bin/pidmonitor.py @@ -20,10 +20,25 @@ loop_hidenear.setHardMin(-128) loop_hidenear.setKP(60.0) loop_hidenear.setKI(0.004) loop_hidenear.setKD(1000.0,0.95) -loop_hidenear.sum_error = -7600.0 # XXX Initialize offset point a bit +loop_hidenear.sum_error = 7600.0 # XXX Initialize offset point a bit + +loop_tanknear = pidloop.PIDThresh(128,22,23,0,26,28,-128) +loop_tanknear.setPoint(25) +loop_tanknear.setHardMax(128) +loop_tanknear.setHardMin(-128) +loop_tanknear.setKP(60.0) # XXX These are un-tuned +loop_tanknear.setKI(0.004) +loop_tanknear.setKD(1000.0,0.95) bmemid = BME280.BME280(port=1, address=0x77) +def log(devfn, temp, logname, rrd, kw="temp"): + rrdtool.update(rrd, "N:" + ("%f" % temp)) + print ("DATA: %s %s=%s" % (logname, kw, temp)) + +def logfail(devfn, name, *arg): + print ("FAIL: %s %s %s" % (name, devfn, arg)) + def with_ow_temp_fk_id2(devfn, loop, s, *arg, **kwarg): print("WARNING: failed to read %s" % devfn) return s # an ugly default @@ -40,18 +55,27 @@ def with_ow_temp(cache, devfn, sk, fk, *arg, **kwarg): return sk(devfn, val, *arg, **kwarg) return fk(devfn, *arg, **kwarg) +def checkpid(devfn, temp, loop, s, offset, rrd, logname): + desire = 128.0 + loop.update(temp, time.time()) + + if desire < 0 : + desire = 0 + loop.output = 0 + elif desire > 255 : + desire = 255 + loop.output = 255 + + rrdtool.update(rrd, "N:" + ("%f" % desire)) + dmx = int(desire+0.5) + print("DATA: %s dmx=%s" % (logname, dmx)) + + return s[:offset] + chr(dmx) + s[offset+1:] + def check_temps(sc): sc.enter(10, 1, check_temps, (sc,)) cache = {} - def log(devfn, temp, logname, rrd, kw="temp"): - rrdtool.update(rrd, "N:" + ("%f" % temp)) - print ("DATA: %s %s=%s" % (logname, kw, temp)) - - def logfail(devfn, name, *arg): - print ("FAIL: %s %s %s" % (name, devfn, arg)) - # BME280 atop try: top = bmemid.get_data() @@ -86,23 +110,6 @@ def check_temps(sc): "/sys/bus/w1/devices/28-0416526de6ff/w1_slave", log, logfail, "tank-top", "/home/pi/sc/data/tank-top-temp.rrd") - - def checkpid(devfn, temp, loop, s, offset, rrd, logname): - desire = 128.0 + loop.update(temp, time.time()) - - if desire < 0 : - desire = 0 - loop.output = 0 - elif desire > 255 : - desire = 255 - loop.output = 255 - - rrdtool.update(rrd, "N:" + ("%f" % desire)) - dmx = int(desire+0.5) - print("DATA: %s dmx=%s" % (logname, dmx)) - - return s[:offset] + chr(dmx) + s[offset+1:] - # DMX conttrol string; initialize to all channels full off # 7E -- header # 06 -- type @@ -118,9 +125,10 @@ def check_temps(sc): # Drive loop s = with_ow_temp(cache, "/sys/bus/w1/devices/28-011620f10dee/w1_slave", - checkpid, with_ow_temp_fk_id2, loop_hidenear, s, 5, "/home/pi/sc/data/hide-near-dmx.rrd", "dmx-near") + checkpid, with_ow_temp_fk_id2, loop_hidenear, s, 5, "/home/pi/sc/data/hide-near-dmx.rrd", "dmx-hidenear") - # Log some other probes + s = with_ow_temp(cache, "/sys/bus/w1/devices/28-011620c805ee/w1_slave", + checkpid, with_ow_temp_fk_id2, loop_tanknear, s, 6, "/home/pi/sc/data/tank-near-dmx.rrd", "dmx-tanknear") print ("check temps fini: out=%r lhn=(%s)" % (s, loop_hidenear)) assert(dmxdev.write(s) == len(s)) diff --git a/bin/rrdtool-creates.sh b/bin/rrdtool-creates.sh index c180e9d..c9b4a31 100755 --- a/bin/rrdtool-creates.sh +++ b/bin/rrdtool-creates.sh @@ -26,6 +26,7 @@ done RRDS=( hide-near-dmx + tank-near-dmx ) ARGS=( -- 2.50.1