BruControl: Brewery control & automation software

Homebrew Talk - Beer, Wine, Mead, & Cider Brewing Discussion Forum

Help Support Homebrew Talk - Beer, Wine, Mead, & Cider Brewing Discussion Forum:

This site may earn a commission from merchant affiliate links, including eBay, Amazon, and others.
I'll volunteer to run a 3V HERMS batch. You know, for science and stuff. Somebody pick a recipe that is easily scalable, and has a simple grist and hops bill. Something we can all have a reasonable expectation of producing as similar a wort as is practical.
 
Here is an interesting element for the BK:https://store.brewpi.com/mashing/st...ating-element-for-brewing-30cm-diameter-5500w

Specs say 7.5 W/cm^2... Not sure how this compares to the 5kW BoilCoil, but likely similar given they both have 3 loops. Diameter may make a difference. I also wonder how difficult it would be to clean between the coils - they seem very closely stacked which is not ideal. The BoilCoil has better separation it appears. BTW the ripple elements we use are ~9.3 W/cm^2, so can't claim that is a major difference.
 
Here is an interesting element for the BK:https://store.brewpi.com/mashing/st...ating-element-for-brewing-30cm-diameter-5500w

Specs say 7.5 W/cm^2... Not sure how this compares to the 5kW BoilCoil, but likely similar given they both have 3 loops. Diameter may make a difference. I also wonder how difficult it would be to clean between the coils - they seem very closely stacked which is not ideal. The BoilCoil has better separation it appears. BTW the ripple elements we use are ~9.3 W/cm^2, so can't claim that is a major difference.

FWIW, per Blichmann's website...


"All BoilCoil[emoji769] and RIMS-Rocket[emoji769] Electric Heaters are rated at or below 30 Watts/in2, less than Ultra-Low-Watt-Density!"

30 watts/in2 = 4.65 watts/cm2
 
You beat me to it tex. If I am not mistaken the 3750 element I use was at or below 4. Which was more than half the normal ripple. I was able to taste a difference in product, and funny enough it heats as fast if not faster than my 5500 in my HLT.
 
You beat me to it tex. If I am not mistaken the 3750 element I use was at or below 4. Which was more than half the normal ripple. I was able to taste a difference in product, and funny enough it heats as fast if not faster than my 5500 in my HLT.
I went from a 4000w ulwd element to a 5500w ulwd element which had the same surface area and I noticed a large decrease in my heat times (10-15 mins) myself but no difference in the beer.
 
Last edited:
Hi guys. Sorry for the delayed response. For some reason alerts have been very sporadic lately...

Anyway I am waiting for a version from my partner which fixes some issues and includes some of the final items on the upgrade list. We are admittedly slower than promised but trust I am pressing! Gotta get it right (at least squash any bugs we can find)!
 
Attention owners of the RP-2 RTD Platform,

Please review an email we just sent you regarding a defect in the RP-2 RTD Platform PC board. We are committed to resolving the problem, and your options include self-repair and refund, or no-cost replacement.

If you did not receive that email, PM me here with your email and we will resend it.
 
I was able to repair my RP-2 rtd board last night. It really wasnt a big deal since I have a soldering station and was using it to solder my xlr connections in my panel so I wasnt concerned about it myself but thanks for the heads up Brundog.
 
I'm just about done with my 10 element 3bbl Brucontrol panel.. can't wait to test it out.
 

Attachments

  • 20180430_082625.jpg
    20180430_082625.jpg
    1.7 MB · Views: 288
  • 20180430_082639.jpg
    20180430_082639.jpg
    1.6 MB · Views: 286
I went from a 4000w ulwd element to a 5500w ulwd element which had the same surface area and I noticed a large decrease in my heat times (10-15 mins) myself but no difference in the beer.

Wow that is an awesome looking panel! I'm currently drawing out mine and was wondering what the second rail from the bottom was? I.E. the bottom is the breakers, the one up I don't know, the one above is power supplies and the top one is controllers / relay boards...
 
Wow that is an awesome looking panel! I'm currently drawing out mine and was wondering what the second rail from the bottom was? I.E. the bottom is the breakers, the one up I don't know, the one above is power supplies and the top one is controllers / relay boards...
they are dual pole contactors (mechanical relays) , mainly for added safety rather than paying much more for dual pole ssrs. This also allows me to easily control the panel in a way as to when my rims is on my 4th heating element in my HLT is automatically disabled to keep the max amp draw down since I am limited by our electrical service.
The larger one in the bottom row is the main power switch contactor turning both 60amp power sources on or off at once.
 
Looks great!!
I miss wire numbers;)
Yeah we use them on the equipment I work on daily... it would have slowed me down to add them to this build or I would have done it... In hindsight they actually would have been a good idea. I have started doing some labeling of things but since im the only one who will be servicing it , I didnt feel it was that important...
Now that its done I have to be Bass ackwards and draw up some schematics so I remember what I did lol..

I was able to score some CR9580-50m coils for measuring amps in brucontrol very cheap on amazon ($17 with shipping) but It appears they are out of the 50 amp ones at that price for now.
 
Wow.... So that's what a brewery panel looks like..... I need to read up.
This panel isnt at all what my home brewing brucontrol panel looks like. This one is for a 3bbl system and is powered by 120amps and powers 4 elements in each kettle and 2 rims elements along with 2 pwm controlled TD5 pumps and 2 120v switched outlets.

The funny part is when I finished it and went to move it , I realized its now too heavy to move on my own! This thing is a beast!

now its time to start the fermentation control panel...
 
Wait.... Is that an armchair the door is leaning on in the 2nd picture? Holy crap!
Guilty, its been in the corner of my living room for almost 2 weeks so I can spend what little free time Ive had lately near the girlfriend while working lol.. she was less than thrilled with this taking up space. its since been moved and is now taking up space in front of my bar in the den.
 
.. she was less than thrilled with this taking up space. its since been moved and is now taking up space in front of my bar in the den..

Hence the comment about how heavy it is. The enclosure alone must weigh a tonne.

So this is a 3bbl, 120v, 10 element system? Having BruControl to manage that must be a godsend. You mentioned above that you had limits on electricity capacity but I missed the part about no 240v. Kudos on figuring it out - especially on a Nano type system.

Chris
 
Hence the comment about how heavy it is. The enclosure alone must weigh a tonne.

So this is a 3bbl, 120v, 10 element system? Having BruControl to manage that must be a godsend. You mentioned above that you had limits on electricity capacity but I missed the part about no 240v. Kudos on figuring it out - especially on a Nano type system.

Chris
Oh theres 240v its just single phase.. all the elements are 240v and the aux outlets are 120v for pumps.

One of the great things about brucontrol is its ability to be reconfigured and have things added or removed very easily without adding holes to the front of the panel and having things in less than ideal configurations as its done because you cant rearrange the existing holes. the system can easily grow as I see fit as long as theres room IN the panel for the components. and even if there isnt, I can add multiple physical panels to all be controlled from the same control screen as needed.
 
Last edited:
Hello all,

I am finally done with the automation of mashing and sparging of my 3 kettle RIMS setup. If someone wants to use my script for ideas your welcome. I wrote it as ongoing loops so I always have the chance to pause things in case of stuck mash or anything else. For now it has only one mash step + mashout step but its easy to add more steps by duplicating the mashout step. Next to add is also to automatic control the RIMS circulation rate based on the suction pressure in the MLT, to maximise circulation rate and still avoid too much suction under the false bottom. Normally I have to pause once to stir the mash and then I increase the circulation rate manually as the grain gets thinner. Suggestions on how to improve it further are most welcome!

Code:
[mashprep]
new bool mashongoing
new bool heatongoing
new bool mashoutheating
new bool mashoutstarted
new string Status
new value lastMLTpumprate
new value mashpumprate
mashpumprate = 80
new value heatrate
heatrate = 100
new value mashrate
mashrate = 50
new value preboilvolume
preboilvolume = 0
new value stuckmashlimit
stuckmashlimit = 8
"BKL PID" enabled = false
"Dough in" state = false
"Pauser" state = false
"Mash timer" Type = CountDown
"Mash timer" ResetValue = 01:00:00
reset "Mash timer"
reset "Sparge timer"
stop "Mash timer"
Status = "PrEboiL vOl "
wait preboilvolume > 1
Status = "AcK MaSh tiMeR"
wait "Pauser" state == true
"Pauser" state = false
Status = "CHecK vaLvEs"
wait "Pauser" state == true
"Pauser" state = false
Status = "MasHinGPrEp"
"RIMS PID" Enabled = true
"HLT vlv" value = 0
"HLT vlv return" state = on
"BKL vlv" value = 0
sleep 2000
"MLT vlv" value = heatrate
"MLT pump" value = mashpumprate
"HLT pump" value = 80
sleep 7000
heatongoing = true
Status = "HEaTing"
goto heat

[heat]
lastMLTpumprate = "MLT pump" value
if "Pauser" state == true
"Pauser" State = false
goto stopmash
endif
if "Dough in" state == true
    goto stopmash
endif
if "MLT volume" value < stuckmashlimit
    "Stuck mash" Active = true
    goto stopmash
endif
sleep 1000
goto heat

[mash]
lastMLTpumprate = "MLT pump" value
"MLT vlv" value = mashrate
if "Pauser" state == true
    goto stopmash
endif
if "MLT volume" value < stuckmashlimit
    "Stuck mash" Active = true
    goto stopmash
endif
if "Mash timer" value <= 00:00:00
    stop "Mash timer"
    "RIMS PID" Target = 76
    "Mash timer" Type = CountDown
    "Mash timer" ResetValue = 00:05:00
    reset "Mash timer"
    Status = "MaSH oUt"
    mashoutheating = true
    goto mashout
endif
sleep 1000
goto mash

[mashout]
lastMLTpumprate = "MLT pump" value
"MLT vlv" value = mashrate
if "Pauser" state == true
    "Pauser" State = false
    goto stopmash
endif
if "MLT volume" value < stuckmashlimit
    "Stuck mash" Active = true
    goto stopmash
endif
if "MLT temp" value >= "RIMS PID" Target
    if mashoutstarted == false
    start "Mash timer"
    mashoutstarted = true   
    endif
endif
if "Mash timer" value <= 00:00:00
     if mashoutstarted == true
    stop "Mash timer"
    "RIMS PID" Enabled = false   
    goto spargeprep
    endif
endif
sleep 1000
goto mashout

[stopmash]
Status = "StoPPiNg"
stop "Mash timer"
"RIMS PID" Enabled = false
"MLT vlv" value = 0
sleep 10000
"MLT pump" value = 0
"Pauser" state = false
if heatongoing == true
    if "Dough in" state == true
    "Dough in" state = false
    Status = "aDD gRaiN"
    wait "Pauser" state == true
    "Pauser" state = false
    Status = "AcK maSh tEMp"
    wait "Pauser" state == true
    "Pauser" state = false
    Status = "StaRTinG"
    "Stuck mash" Active = false
    "MLT vlv" value = mashrate
    "MLT pump" value = lastMLTpumprate
    sleep 5000
    "RIMS PID" Enabled = true
    start "Mash timer"
    Status = "MaShiNg"
    heatongoing = false
    mashongoing = true
    goto mash
    endif
endif
if heatongoing == true
    Status = "PaUsED"
    wait "Pauser" state == true
    Status = "StaRTinG"
    "Pauser" state = false
    "Stuck mash" Active = false
    "MLT vlv" value = heatrate
    "MLT pump" value = lastMLTpumprate
    sleep 5000
    "RIMS PID" Enabled = true
    Status = "HEaTing"
    goto heat   
endif
Status = "PaUsED"
wait "Pauser" state == true
Status = "StaRTinG"
"Pauser" state = false
"Stuck mash" Active = false
"MLT vlv" value = mashrate
"MLT pump" value = lastMLTpumprate
sleep 5000
"RIMS PID" Enabled = true
if mashoutheating == true
      if mashoutstarted == true
       start "Mash timer"
       endif
Status = "MaSH oUt"
goto mashout
endif
if mashongoing == true
    start "Mash timer"
    Status = "MaShiNg"
    goto mash
endif

[spargeprep]
delete heatongoing
delete mashongoing
delete mashoutstarted
delete mashoutheating
delete lastMLTpumprate
delete mashrate
delete mashpumprate
delete heatrate
delete stuckmashlimit
new bool boilstart
new bool finished
new value MLTintegrator
new value MLTSP
new value MLTtoplevel
new value MLTlowlevel
new value lastMLTlevel
new value MLTleveldiff
new value averageMLTlevel
new value averagecounter
new value lasthltvlv
new value lastbklvlv
new value spargeloopcounter
new value flowcounter
flowcounter = -20
new value flowmin
flowmin = 0,9
new value flowmax
flowmax = 1,4
"Pauser" state = false
"HLT pump" value = 0
"MLT pump" value = 0
"HLT vlv" value = 0
"BKL vlv" value = 0
"MLT vlv" value = 0
"HLT vlv return" state = off
Status = "SpArgEPrEp"
sleep 30000
"HLT pump" value = 50
"MLT pump" value = 50
"HLT vlv" value = 40
"BKL vlv" value = 39
sleep 15000
MLTSP = "MLT volume" value
lastMLTlevel = "MLT volume" value
MLTtoplevel = MLTSP + 0,1
MLTlowlevel = MLTSP - 0,1
start "Sparge timer"
Status = "SpArgE"
goto sparge

[sparge]
if "Pauser" state == true
    lasthltvlv = "HLT vlv" value
    lastbklvlv = "BKL vlv" value
    "Pauser" state = false
    goto stopsparge
endif
if "BKL volume" value >= 25   
    if boilstart == false
    "BKL PID" enabled = true
    "BKL PID" Target = 98
    boilstart = true
    endif
endif
if "BKL volume" value >= preboilvolume
    lasthltvlv = "HLT vlv" value
    lastbklvlv = "BKL vlv" value
    finished = true
    goto stopsparge
endif
if spargeloopcounter >= 40
averageMLTlevel = averagecounter / 40
averagecounter = 0
MLTleveldiff = averageMLTlevel - lastMLTlevel
MLTintegrator = MLTleveldiff * 3
"BKL vlv" value += MLTintegrator
    if averageMLTlevel > MLTtoplevel
        if  MLTleveldiff > 0,02
        "BKL vlv" value += 0,5
        endif
    endif
    if averageMLTlevel < MLTlowlevel
        if MLTleveldiff < -0,02
        "BKL vlv" value -= 0,5
        endif
    endif
lastMLTlevel = averageMLTlevel
spargeloopcounter = 0
endif
if flowcounter >= 20
    if "RIMS flow" rate <= flowmin
    "HLT vlv" value += 0,5
    endif
    if "RIMS flow" rate >= flowmax
    "HLT vlv" value -= 0,5
    endif
flowcounter = 0
endif
averagecounter += "MLT volume" value
spargeloopcounter += 1
flowcounter += 1
sleep 500
goto sparge

[stopsparge]
Status = "StoPPiNg"
"HLT vlv" value = 0
"BKL vlv" value = 0
sleep 7000
"HLT pump" value = 0
"MLT pump" value = 0
stop "Sparge timer"
if finished == true
    Status = "ReADy tO BoiL!"
    "The end" Active = true
    sleep 7000
    "The end" Active = false
endif
Status = "PaUsED"
wait "Pauser" state == true
    "HLT pump" value = 50
    "MLT pump" value = 50
    "HLT vlv" value = lasthltvlv
    "BKL vlv" value = lastbklvlv
    "MLT vlv" value = 0
    "HLT vlv return" state = off
    "Pauser" state = false
    start "Sparge timer"
      Status = "SpArgE"
goto sparge
 
Hello all,

I am finally done with the automation of mashing and sparging of my 3 kettle RIMS setup. If someone wants to use my script for ideas your welcome. I wrote it as ongoing loops so I always have the chance to pause things in case of stuck mash or anything else. For now it has only one mash step + mashout step but its easy to add more steps by duplicating the mashout step. Next to add is also to automatic control the RIMS circulation rate based on the suction pressure in the MLT, to maximise circulation rate and still avoid too much suction under the false bottom. Normally I have to pause once to stir the mash and then I increase the circulation rate manually as the grain gets thinner. Suggestions on how to improve it further are most welcome!

Code:
[mashprep]
new bool mashongoing
new bool heatongoing
new bool mashoutheating
new bool mashoutstarted
new string Status
new value lastMLTpumprate
new value mashpumprate
mashpumprate = 80
new value heatrate
heatrate = 100
new value mashrate
mashrate = 50
new value preboilvolume
preboilvolume = 0
new value stuckmashlimit
stuckmashlimit = 8
"BKL PID" enabled = false
"Dough in" state = false
"Pauser" state = false
"Mash timer" Type = CountDown
"Mash timer" ResetValue = 01:00:00
reset "Mash timer"
reset "Sparge timer"
stop "Mash timer"
Status = "PrEboiL vOl "
wait preboilvolume > 1
Status = "AcK MaSh tiMeR"
wait "Pauser" state == true
"Pauser" state = false
Status = "CHecK vaLvEs"
wait "Pauser" state == true
"Pauser" state = false
Status = "MasHinGPrEp"
"RIMS PID" Enabled = true
"HLT vlv" value = 0
"HLT vlv return" state = on
"BKL vlv" value = 0
sleep 2000
"MLT vlv" value = heatrate
"MLT pump" value = mashpumprate
"HLT pump" value = 80
sleep 7000
heatongoing = true
Status = "HEaTing"
goto heat

[heat]
lastMLTpumprate = "MLT pump" value
if "Pauser" state == true
"Pauser" State = false
goto stopmash
endif
if "Dough in" state == true
    goto stopmash
endif
if "MLT volume" value < stuckmashlimit
    "Stuck mash" Active = true
    goto stopmash
endif
sleep 1000
goto heat

[mash]
lastMLTpumprate = "MLT pump" value
"MLT vlv" value = mashrate
if "Pauser" state == true
    goto stopmash
endif
if "MLT volume" value < stuckmashlimit
    "Stuck mash" Active = true
    goto stopmash
endif
if "Mash timer" value <= 00:00:00
    stop "Mash timer"
    "RIMS PID" Target = 76
    "Mash timer" Type = CountDown
    "Mash timer" ResetValue = 00:05:00
    reset "Mash timer"
    Status = "MaSH oUt"
    mashoutheating = true
    goto mashout
endif
sleep 1000
goto mash

[mashout]
lastMLTpumprate = "MLT pump" value
"MLT vlv" value = mashrate
if "Pauser" state == true
    "Pauser" State = false
    goto stopmash
endif
if "MLT volume" value < stuckmashlimit
    "Stuck mash" Active = true
    goto stopmash
endif
if "MLT temp" value >= "RIMS PID" Target
    if mashoutstarted == false
    start "Mash timer"
    mashoutstarted = true   
    endif
endif
if "Mash timer" value <= 00:00:00
     if mashoutstarted == true
    stop "Mash timer"
    "RIMS PID" Enabled = false   
    goto spargeprep
    endif
endif
sleep 1000
goto mashout

[stopmash]
Status = "StoPPiNg"
stop "Mash timer"
"RIMS PID" Enabled = false
"MLT vlv" value = 0
sleep 10000
"MLT pump" value = 0
"Pauser" state = false
if heatongoing == true
    if "Dough in" state == true
    "Dough in" state = false
    Status = "aDD gRaiN"
    wait "Pauser" state == true
    "Pauser" state = false
    Status = "AcK maSh tEMp"
    wait "Pauser" state == true
    "Pauser" state = false
    Status = "StaRTinG"
    "Stuck mash" Active = false
    "MLT vlv" value = mashrate
    "MLT pump" value = lastMLTpumprate
    sleep 5000
    "RIMS PID" Enabled = true
    start "Mash timer"
    Status = "MaShiNg"
    heatongoing = false
    mashongoing = true
    goto mash
    endif
endif
if heatongoing == true
    Status = "PaUsED"
    wait "Pauser" state == true
    Status = "StaRTinG"
    "Pauser" state = false
    "Stuck mash" Active = false
    "MLT vlv" value = heatrate
    "MLT pump" value = lastMLTpumprate
    sleep 5000
    "RIMS PID" Enabled = true
    Status = "HEaTing"
    goto heat   
endif
Status = "PaUsED"
wait "Pauser" state == true
Status = "StaRTinG"
"Pauser" state = false
"Stuck mash" Active = false
"MLT vlv" value = mashrate
"MLT pump" value = lastMLTpumprate
sleep 5000
"RIMS PID" Enabled = true
if mashoutheating == true
      if mashoutstarted == true
       start "Mash timer"
       endif
Status = "MaSH oUt"
goto mashout
endif
if mashongoing == true
    start "Mash timer"
    Status = "MaShiNg"
    goto mash
endif

[spargeprep]
delete heatongoing
delete mashongoing
delete mashoutstarted
delete mashoutheating
delete lastMLTpumprate
delete mashrate
delete mashpumprate
delete heatrate
delete stuckmashlimit
new bool boilstart
new bool finished
new value MLTintegrator
new value MLTSP
new value MLTtoplevel
new value MLTlowlevel
new value lastMLTlevel
new value MLTleveldiff
new value averageMLTlevel
new value averagecounter
new value lasthltvlv
new value lastbklvlv
new value spargeloopcounter
new value flowcounter
flowcounter = -20
new value flowmin
flowmin = 0,9
new value flowmax
flowmax = 1,4
"Pauser" state = false
"HLT pump" value = 0
"MLT pump" value = 0
"HLT vlv" value = 0
"BKL vlv" value = 0
"MLT vlv" value = 0
"HLT vlv return" state = off
Status = "SpArgEPrEp"
sleep 30000
"HLT pump" value = 50
"MLT pump" value = 50
"HLT vlv" value = 40
"BKL vlv" value = 39
sleep 15000
MLTSP = "MLT volume" value
lastMLTlevel = "MLT volume" value
MLTtoplevel = MLTSP + 0,1
MLTlowlevel = MLTSP - 0,1
start "Sparge timer"
Status = "SpArgE"
goto sparge

[sparge]
if "Pauser" state == true
    lasthltvlv = "HLT vlv" value
    lastbklvlv = "BKL vlv" value
    "Pauser" state = false
    goto stopsparge
endif
if "BKL volume" value >= 25   
    if boilstart == false
    "BKL PID" enabled = true
    "BKL PID" Target = 98
    boilstart = true
    endif
endif
if "BKL volume" value >= preboilvolume
    lasthltvlv = "HLT vlv" value
    lastbklvlv = "BKL vlv" value
    finished = true
    goto stopsparge
endif
if spargeloopcounter >= 40
averageMLTlevel = averagecounter / 40
averagecounter = 0
MLTleveldiff = averageMLTlevel - lastMLTlevel
MLTintegrator = MLTleveldiff * 3
"BKL vlv" value += MLTintegrator
    if averageMLTlevel > MLTtoplevel
        if  MLTleveldiff > 0,02
        "BKL vlv" value += 0,5
        endif
    endif
    if averageMLTlevel < MLTlowlevel
        if MLTleveldiff < -0,02
        "BKL vlv" value -= 0,5
        endif
    endif
lastMLTlevel = averageMLTlevel
spargeloopcounter = 0
endif
if flowcounter >= 20
    if "RIMS flow" rate <= flowmin
    "HLT vlv" value += 0,5
    endif
    if "RIMS flow" rate >= flowmax
    "HLT vlv" value -= 0,5
    endif
flowcounter = 0
endif
averagecounter += "MLT volume" value
spargeloopcounter += 1
flowcounter += 1
sleep 500
goto sparge

[stopsparge]
Status = "StoPPiNg"
"HLT vlv" value = 0
"BKL vlv" value = 0
sleep 7000
"HLT pump" value = 0
"MLT pump" value = 0
stop "Sparge timer"
if finished == true
    Status = "ReADy tO BoiL!"
    "The end" Active = true
    sleep 7000
    "The end" Active = false
endif
Status = "PaUsED"
wait "Pauser" state == true
    "HLT pump" value = 50
    "MLT pump" value = 50
    "HLT vlv" value = lasthltvlv
    "BKL vlv" value = lastbklvlv
    "MLT vlv" value = 0
    "HLT vlv return" state = off
    "Pauser" state = false
    start "Sparge timer"
      Status = "SpArgE"
goto sparge

Many thanks this is the next hurdle for me and will help a bunch.
 
Hi, I just wanted to follow up on the issues I've seen mentioned regarding using the ethernet shield on the MEGA 2560. Is it correct to say that you believe the timing is unreliable to the point of system instability if I'm trying to coordinate timing between a USB interface and an ethernet interface? Ideally for my configuration I'd like my kettle temp sensors, pumps, flow meters, etc on one interface and my PID control for the heating elements on another. Would ethernet issues screw up the PID feedback loop?
 
I'd like my kettle temp sensors, pumps, flow meters, etc on one interface and my PID control for the heating elements on another.

I think you can create a second workspace to accomplish that. You will, however, need to keep all device names unique across all workspaces, as the scripting does not differentiate between workspaces.
 
Hi, I just wanted to follow up on the issues I've seen mentioned regarding using the ethernet shield on the MEGA 2560. Is it correct to say that you believe the timing is unreliable to the point of system instability if I'm trying to coordinate timing between a USB interface and an ethernet interface? Ideally for my configuration I'd like my kettle temp sensors, pumps, flow meters, etc on one interface and my PID control for the heating elements on another. Would ethernet issues screw up the PID feedback loop?

I do something similar. I have wired the temp sensor to a Feather and the SSR to a Wemos D1 mini. On the Feather I have set up the PID interface and assigned the output from it to a unused not wired pin on the Feather. (Since you can only assign the temp sensor to a PID element on the same interface). On the Wemos I have wired the output from a dutycycle element to the SSR. Then I use a script to send the output from the PID (0-100%) to the dutycycle output on the Wemos (0-100%).

It works perfect. There is a lag of about 0.5sec from the PID output changes to the SSR dutycycle gets updated because the refresh interval of the interfaces cant be set lower than 0.5 sec. But anyway 0.5sec is more than fast enough for our "process". I use wifi between the interfaces, never tested wired ethernet or USB but it should work similar as I see.

Example script:

Code:
[setup]
new value HLTpidout    //creates a value to store the PID output

[loop]
//HLT
HLTpidout = "HLT PID" value    //writes PID output to value HLTpidout
if "HLT PID" Connected != true    //if the Feather is not connected HLTpidout=0%
HLTpidout = 0
endif
if "HLT volume" value < 15    //if low level in the HLT HLTpidout=0%
HLTpidout = 0
endif
if "HLT temp" value > 85    //if high temp in HLT HLTpidout=0%
HLTpidout = 0
endif
"HLT duty" DutyCycle = HLTpidout    //sends the HLTpidout value to the dutycycle element running the SSR.

sleep 500
goto loop
 
Hi, I just wanted to follow up on the issues I've seen mentioned regarding using the ethernet shield on the MEGA 2560. Is it correct to say that you believe the timing is unreliable to the point of system instability if I'm trying to coordinate timing between a USB interface and an ethernet interface? Ideally for my configuration I'd like my kettle temp sensors, pumps, flow meters, etc on one interface and my PID control for the heating elements on another. Would ethernet issues screw up the PID feedback loop?

Where have you heard this? We know of no timing reliability issues - please clarify.
 
I do something similar. I have wired the temp sensor to a Feather and the SSR to a Wemos D1 mini. On the Feather I have set up the PID interface and assigned the output from it to a unused not wired pin on the Feather. (Since you can only assign the temp sensor to a PID element on the same interface). On the Wemos I have wired the output from a dutycycle element to the SSR. Then I use a script to send the output from the PID (0-100%) to the dutycycle output on the Wemos (0-100%).

It works perfect. There is a lag of about 0.5sec from the PID output changes to the SSR dutycycle gets updated because the refresh interval of the interfaces cant be set lower than 0.5 sec. But anyway 0.5sec is more than fast enough for our "process". I use wifi between the interfaces, never tested wired ethernet or USB but it should work similar as I see.

Example script:

Code:
[setup]
new value HLTpidout    //creates a value to store the PID output

[loop]
//HLT
HLTpidout = "HLT PID" value    //writes PID output to value HLTpidout
if "HLT PID" Connected != true    //if the Feather is not connected HLTpidout=0%
HLTpidout = 0
endif
if "HLT volume" value < 15    //if low level in the HLT HLTpidout=0%
HLTpidout = 0
endif
if "HLT temp" value > 85    //if high temp in HLT HLTpidout=0%
HLTpidout = 0
endif
"HLT duty" DutyCycle = HLTpidout    //sends the HLTpidout value to the dutycycle element running the SSR.

sleep 500
goto loop

Cool, awesome to hear! Thanks so much for the code!
 
Where have you heard this? We know of no timing reliability issues - please clarify.

Sorry, what I meant was I thought I'd read that there was an issue with the ethernet shield for the MEGA having connection issues. When I said timing, I meant that there'd probably be script timing issues if the ethernet connection was spotty. Just trying to make sure I plan well, having two interfaces connected with an ethernet cable is preferable for cable management, I just wanted to make sure I wasn't making a mistake by planning it out that way.
 
I am sorry but I don’t know of any disconnection issues with Ethernet connected interfaces. I have resolved a couple of issues with USB and believe these are usually associated with either driver, power supply, or over-current situations.

If any user has a problem with connection reliability, we will personally work to resolve it.
 
I am sorry but I don’t know of any disconnection issues with Ethernet connected interfaces. I have resolved a couple of issues with USB and believe these are usually associated with either driver, power supply, or over-current situations.

If any user has a problem with connection reliability, we will personally work to resolve it.

Ok, glad to hear, I must have misread something. Thanks for the help.
 
I finally have enough of my system completed that I ran a test brew last night, with good success. So with nothing to do out in the garage tonight except clean up after myself, I cemented my status as an elite-level procrastinator and worked on my automation scripts instead. I borrowed @BrunDog's sample brew day script from his website (Link) and started adapting it to my own nefarious purposes. It went a whole lot better than I expected it to, and I'm already thinking of some interesting stuff I'd like to try with it. Since I am an automation neophyte, I built in a lot more checkpoints than I probably actually need. I may wind up deleting a bunch of them as my comfort level increases. Anyway, following are excerpts from the original, and my modifications:

Original:

Code:
[setup]
new value MashVol
new value SpargeVol
new value StrikeTemp
new value MashStep1Temp
new time MashStep1Time
new value MashStep2Temp
new time MashStep2Time
new value MashStep3Temp
new time MashStep3Time
new value MinFlowRate
new value MaxFlowRate
new value PreBoilVolume
new string Status

MashVol = 18
SpargeVol = 17
StrikeTemp = 160
MashStep1Temp = 152
MashStep1Time = 01:00:00
MashStep2Temp = 152
MashStep2Time = 00:00:00
MashStep3Temp = 152
MashStep3Time = 00:00:00
MinFlowRate = 0.9
MaxFlowRate = 1.1
PreBoilVolume = 30

[prep]
Status = "Ready to Start"
"Step" Type = CountUp
restart "Step"
"Mash Temp" Enabled = true
"Mash Level" Enabled = true
"RIMS Temp" Enabled = true
"Flowmeter 1" Enabled = true
"Valve 1" Enabled = true
"Valve 2" Enabled = true
"Valve 3" Enabled = true
"Valve 4" Enabled = true
"Valve 5" Enabled = true
"Valve 6" Enabled = true
"Valve P1" Enabled = true
"RIMS Heat PID" Enabled = false
"RIMS Heat Duty" Enabled = false
"RIMS High Power" Enabled = true
"Pump 1" Enabled = true
"Pump 2" Enabled = true
"RIMS Heat PID" Enabled = false
"Water Input" Enabled = false
"Boil Temp" Enabled = false
"Boil Heat Duty" Enabled = false
"Boil Heat PID" Enabled = false
"Chill Temp" Enabled = false
"Chill Flush" Enabled = false
"Vent Fans" Enabled = false
"Panel Alarm" Enabled = true
"CONTINUE" State = false
wait "CONTINUE" State == true

[prep_fill]
Status = "Prep Fill"
restart "Step"
restart "Master"
"Valve 1" State = on
"Valve 2" State = off
"Valve 3" State = off
"Valve P1" Value = 60
"RIMS High Power" State = on
"Pump 1" State = off
"Valve 4" State = off
"Valve 5" State = off
"Valve 6" State = off
sleep 5000

[fill]
Status = "Fill"
restart "Step"
"Pump 1" State = on
wait "Mash Level" Value >= MashVol

Modified:

Code:
[setup]
new value StrikeTemp
new value MashStep1Temp
new time MashStep1Time
new value MashStep2Temp
new time MashStep2Time
new value MashStep3Temp
new time MashStep3Time
new string Status

StrikeTemp = 163
MashStep1Temp = 152
MashStep1Time = 01:00:00
MashStep2Temp = 152
MashStep2Time = 00:00:00
MashStep3Temp = 152
MashStep3Time = 00:00:00

[prep]
Status = "Ready to Start"
"Step" Type = CountUp
restart "Step"
"HLT Temp" Enabled = true
"Mash Tun Temp" Enabled = true
"Boil Kettle Temp" Enabled = true
"HERMS Coil Temp" Enabled = true
"Mp-1" Enabled = true
"M3-1" Enabled = true
"M3-2" Enabled = true
"Mp-2" Enabled = true
"M3-3" Enabled = true
"M3-4" Enabled = true
"M2-1" Enabled = true
"HLT Element" Enabled = false
"Boil Kettle Element" Enabled = false
"Water Pump" Enabled = true
"Wort Pump" Enabled = true
"Brew Alarm" Enabled = true
"HERMS Flow Rate" Enabled = false
"Wort Flow Rate" Enabled = false
"CONTINUE" State = false
Status = "Click CONTINUE"
"Brew Alarm" Active = true
wait "CONTINUE" State == true
Status = "Here we Go!!!"
"Brew Alarm" Active = false
sleep 5000

[prep_fill]
Status = "Fill Prep"
restart "Step"
restart "Master"
"Mp-1" Value = 100
"M3-1" State = on
"M3-2" State = off
"Mp-2" Value = 100
"M3-3" State = on
"M3-4" State = on
"M2-1" State = off
"Water Pump" State = off
"Wort Pump" State = off
sleep 5000
stop "Step"
Status = "Click CONTINUE to add water to HLT"
"Brew Alarm" Active = true
"CONTINUE" State = false
wait "CONTINUE" State == true
"Brew Alarm" Active = false


[fill]
Status = "Click CONTINUE When Filled"
"CONTINUE" State = false
wait "CONTINUE" State == true
 
This one is for a 3bbl system and is powered by 120amps and powers 4 elements in each kettle and 2 rims elements along with 2 pwm controlled TD5 pumps and 2 120v switched outlets.

How have you incorporated two rims elements? So they come off a tee and both fire up at once?

Also what is a TD5 pump?
 
I'll let @augiedoggy respond to the question, but in case anyone is interested, you can set up multiple PID elements in BruControl to read off the same temperature probe. They would cycle the same amount since the error between the setpoints and the current temperature would be the same (unless you had two different setpoints). So in case you wanted, you could run two elements for high power, then turn one off for low power. Not sure this is better than one big set of elements running off one PID, but the flexibility is there to do basically whatever you want in BruControl.
 
Back
Top