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.
What would be an acceptable SSR or extra components added with a "typical" SSR to make it suitable to be used to control a 5k BTU window AC unit for a glycol chiller? I've heard about inductive loads - and that a window AC unit would be one...but didn't realize that a regular cheap SSR from ebay is not the proper one to use.
 
What would be an acceptable SSR ... to be used to control a 5k BTU window AC unit for a glycol chiller? I didn't realize that a regular cheap SSR from ebay is not the proper one to use.

I would consider a relay for this application—presumably the AC unit will not be cycled on and off frequently. Besides, it will sound cool! :)
 
We uploaded v1.1.1 today... this corrects the Global and Inspector data recording issue where it records those values into the data logs up to 20x per second. We created a default of 1 second per data point. This will reduce overhead (and disk space)!

I suggest users of Global variables and Inspectors upgrade ASAP. For users who do not... no rush.
 
if someone with a feather M0 could put it in debug %1&14; before doing the network setup with %0&15; and show me the output, I would appreciate it... I think my M0 died... it takes firmware, it charges battery, it takes network config, but never connects... debug after programming network shows what I think is goofy stuff...
 
We uploaded v1.1.1 today... this corrects the Global and Inspector data recording issue where it records those values into the data logs up to 20x per second. We created a default of 1 second per data point. This will reduce overhead (and disk space)!

I suggest users of Global variables and Inspectors upgrade ASAP. For users who do not... no rush.

Does this also include the fix for graphs only updating when global variable is on the same active workspace?

No big deal if not and I'm happy to wait, it would just be nice to clear up my "user" workspace, and have a "config" workspace which my user never looks at.

Actually, it might be nice to have a setting to hide workspaces when the lock button is clicked, so in "run" mode users never see those workspaces.
 
I am in the process of setting up some proportional valves and have a question with regards to PWM Outputs listed in the V 1.1 Wiring Map. I cannot find the PWM option in the pull down menu while trying to set up Pins 11,12,13,44. I realize there are alternative pins I could use but am I missing something maybe a revision somewhere with respect to these specific pins? I'm using a RobotDyn MEGA 2560 board, firmware V45 and V1.1 software
Thanks
 
Last edited:
I am in the process of setting up some proportional valves and have a question with regards to PWM Outputs listed in the V 1.1 Wiring Map. I cannot find the PWM option in the pull down menu while trying to set up Pins 11,12,13,44. I realize there are alternative pins I could use but am I missing something maybe a revision somewhere with respect to these specific pins? I'm using a RobotDyn MEGA 2560 board, firmware V45 and V1.1 software
Thanks


I'm showing PWM for all of those pins on my MEGA 2560 (I happen to be using the RobotDyn board as well but that is not part of the pin function availability). IS this some sort of wiring map issue from a pre 1.1 installation?
 
@BrunDog @VacationLand

Those particular pins were vacant, however I was using a previous software version V1.1.0 When I installed V1.1.1 it did allow PWM on PIN 44 however the others no dice. I did a complete uninstall of both V1.1.0 and V1.1.1 but I made a backup of the Data folder from 1.1.0 first. I then replaced the backup folder in the newer version (V1.1.1). After a reinstall all is good as I now have PWM listed on the pins mentioned, however I lost my device setup I thought I had backed up during the update. Not sure what went wrong? I still have the Data Folder from the previous install but for some reason I cant get it to repopulate the new work space. Anyway looks like I'll have to start from scratch and this time I will document with a good old fashion hard copy :)
Thanks again!!
 
Last edited:
The configuration file will work from v1.0 so long as the interface type is a match. If you email us your previous and current configuration files, we can combine them so you don’t have to recreate all your stuff.
 
Thanks for your offer to combine my files but instead I spent the afternoon adding the devices into a new install. It wasn't too bad and the way I look at it, this was a good learning experience. If/when future updates are made to the current version, (so I don't have to do this all again) my understanding is V1.1.1 does an auto backup of the config files with a 30 day history? To apply to a (future) revision I would simply make a copy of my backup config files, install the new update and import the former config files into the update as per instructions in the user manual. Would this be the correct process?
 
Last edited:
It would be nice to be able to select a counter elements flow rate value for the dead band control input. I would like to use the dead band control to drive a DC pump PWM control based off of a counter flow meter.

I have both a counter flow meter and a mass flow meter and the MFM's min flow is too high for driving my pump at it's lowest speeds, which is why I would like to switch to the counter flow meter for the dead band control input. The dead band control works great with the MFM as the input as long as I stay above the MFM's min flow rate.
 
The "On Delay" time allowed (1800) for an Hysteresis Output Element seems way to short. I generally used these for compressors or mechanical contractors. 1.8 seconds is too small a time to insure not "short cycling". For my compressors, I use about 15 minutes (900000 milliseconds) as a "On Delay". I know that you can set the offset to control this as well, but it would seem that I should be able to choose the "On Delay" I want. Why are these (and other things) limited in range? It would seem that you would have to write code to enforce the limitations rather that limiting it to an long integer. You never "know" what an end user may use something for, so limitations can prevent "outside" the box implementations.
 
DUDE. Please. It clearly states that delay is in seconds. Please RTFM. 180 seconds is 3 minutes and 1800 is 30 minutes....
 
DUDE. Please. It clearly states that delay is in seconds. Please RTFM. 180 seconds is 3 minutes and 1800 is 30 minutes....
Dude, you are correct. I ASSumed milliseconds.What the TFM says:

"There are four specific properties for a Hysteresis Output. The first is the ‘Input Device’ selection, which is the Device Element’s input signal to be compared to the target. The second is the ‘Target’, which is the input signal the hysteresis output will try to achieve by turning the element’s device ON or OFF. The third is the ‘ON Offset’, which is difference from the Target where the input signal value upon which the output will turn ON. Fourth is the ‘On Delay’, which is the minimum period of time for the output to be turned ON once it was turned off. This is designed to prevent short-cycling of certain devices, like refrigeration compressors, which need a delay between power cycles".

It is clear on the Element Properties once you know to look. I wish the slots were different for seconds or milliseconds.
 
Last edited:
Ok, I'll admit we could state it explicitly in the manual, and will try to make these changes, but I'm not sure we could make it any clearer in the software.

upload_2019-6-23_17-42-43.png
 
FYI - if you are cutting and pasting you scripts to from notepad and you hit the shift key when typing the left bracket and put in a left squigly bracket, you will make a software bomb that crashes BC without running the script...

upload_2019-6-24_7-45-20.png
 
Ok, I'll admit we could state it explicitly in the manual, and will try to make these changes, but I'm not sure we could make it any clearer in the software.

View attachment 632466
Once you see it, it is easy. I am just not "used" to seeing seconds only for a time, rather than 1800 seconds displayed as I would have preferred something like 30:00. Since it is an OnDelay to prevent short cycling, the minimum delay could be in minutes and not seconds regardless. In a lot of cases, milliseconds is the norm in BruControl, therefore I made the ASSumption.

I did notice that you can use a script to set a value higher than 1800:
"Big Mac-E" OnDelay = 3600
Would that value work for an hour delay or is the 1800 seconds a true limit?
 
I'm not able to duplicate this. Can you post the exact steps you are taking to induce this crash?
i probably has to do with the characters after the {...

you will see the character near the end in the CoolDown_a declaration

If you cut and paste this in, it will crash BC


Code:
new value StopTemp
new string CurrentState

StopTemp = 207
reset "Timer 1"
Stop "Timer 1"
restart "Total Runtime"
"Stop Still Run" State = false

// Enable all devices needed
"Element 0" Enabled = true
"Element 1" Enabled = true
"Element 2" Enabled = true
"Element 3" Enabled = true
"Agitator" Enabled = true
"Bain Marie" Enabled = true
"Boiler Temp" Enabled = true
"Vapor Temp 1" Enabled = true
"Vapor Temp 2" Enabled = true
"Vapor Temp 3" Enabled = true
"PC Water IN" Enabled = true
"PC Water OUT" Enabled = true
"PC HX Return" Enabled = true
"PC Pump" Enabled = true
"PC Fan" Enabled = true
"RC Water IN" Enabled = true
"RC Internal" Enabled = true
"RC Pump" Enabled = true
"RC Fan" Enabled = true
"RC Valve" Enabled = true
"AlarmOut 1" Enabled = true

// start the still run
[Heating Up]
CurrentState = "Heating Up"
sleep 1000     // pause before energizing contactor
"Element 0" State = on
sleep 1000     // pause before energizing contactor
"Element 1" State = on
sleep 1000     // pause before energizing contactor
"Element 2" State = on
sleep 1000     // pause before energizing contactor
"Element 3" State = on

[State1]
if "Stop Still Run" State == true
 goto CoolDown
endif
if "Start Still Run" State == true
 sleep 1000
 goto State2
endif
if "Bain Marie" Value > 230 // energize Agitator
   if "Agitator" State == off
      "Element 0" State = off
      "Element 1" State = off
      "Element 3" State = off
      sleep 1000
      "Agitator" State = on
      sleep 1000
      "Element 0" State = on
      sleep 1000
      "Element 1" State = on
   endif
endif
if "Bain Marie" Value > 248 // Lower power by one element
  if "Element 3" State == on
     "Element 3" State = off
  endif
endif
if "Bain Marie" Value > 250 // Lower power by one element
  if "Element 2" State == on
     "Element 2" State = off
  endif
endif
if "Bain Marie" Value > 252 // Lower power by one element
  if "Element 1" State == on
     "Element 1" State = off
  endif
endif
if "Bain Marie" Value > 270 // Kill power and alarmif temp actually reaches 250F
  "Element 0" State = off
  "Element 1" State = off
  "Element 2" State = off
  "Element 3" State = off
  "Alarm 1" Active = true
  goto CoolDown
endif

if "Boiler Temp" Value > 170 // exit to State2 when BK temp reaches 170
 goto State2
endif
if "Vapor Temp 1" Value > 160 // exit to State2 when V1 temp reaches 160
 goto State2
endif
sleep 50
goto State1

if "Element 3" State == on
   "Element 3" State == off
endif
if "Element 2" State == on
   "Element 2" State == off
endif



[State2]
CurrentState = "Heating 2nd stage"
if "Stop Still Run" State == true
 goto CoolDown
endif
if "Start Still Run" State == true
 sleep 1000
 goto State3
endif
if "Boiler Temp" Value > 212 // exit and alarm if BK temp reaches 212
  "Alarm 1" Active = true
  goto CoolDown
endif
if "Vapor Temp 1" Value > 210 // exit and alarm if V1 temp reaches 210
  "Alarm 1" Active = true
  goto CoolDown
endif

if "Vapor Temp 3" Value > 110 // exit to State3 when V2 temp reaches 165
 goto State3
endif
sleep 50
goto State2

[State3]
CurrentState = "filling plates"
if "Stop Still Run" State == true
 goto CoolDown
endif
if "Start Still Run" State == true
 sleep 1000
 goto State4
endif

if "Vapor Temp 3" Value > 130 //  clear plates when V3 temp reaches 130
 goto State4
endif
sleep 50
goto State3

[State4]
CurrentState = "clearing plates"
"Element 0" State = off
"Element 1" State = off
"Element 2" State = off
"Element 3" State = off

"Timer 1" Type = CountDown
"Timer 1" Value = 00:01:00
Start "Timer 1"
[State4a]
if "Stop Still Run" State == true
  Stop "Timer 1"
  goto CoolDown
endif
if "Start Still Run" State == true
  sleep 1000
  goto State5
endif

if "Timer 1" Value < 00:00:00
  Stop "Timer 1"
  goto State5
endif
sleep 50
goto State4a


[State5]
CurrentState = "Reflux"
"Element 0" State = on     //  1 element should be plenty to run full reflux

"RC Pump" State = on     //  set up reflux PID
"RC Fan" State = on
//"RC Valve PID" Enabled = true
//"RC Valve PID" target = 150
"RC Valve Manual" Enabled = true
"RC Valve Actual" Enabled = true
"RC Valve" State = on

"Timer 1" Type = CountDown     //  start 1 hour reflux timer
"Timer 1" Value = 1:00:00
Start "Timer 1"
[State5a]
if "Stop Still Run" State == true
  Stop "Timer 1"
  goto CoolDown
endif
if "Start Still Run" State == true
  sleep 1000
  goto State6
endif

if "Timer 1" Value < 00:00:00
  Stop "Timer 1"
  goto State6
endif
sleep 50
goto State5a



[State6]
CurrentState = "Distill"
"Timer 1" Type = CountUp
restart "Timer 1"
if "PC Pump" State == off     //  Turn on pump
 "PC Pump" State = on
endif
if "PC Water OUT" Value > 100     //  turn on fan when needed
 if "PC Fan" State == off
  "PC Fan" State = on
 endif
endif
[State6a]
if "Start Still Run" State == true
 sleep 1000
 goto CoolDown
endif
if "Stop Still Run" State == true
 goto CoolDown
endif

if "Vapor Temp 1" Value >= StopTemp // exit to cooldown state when distillation finished
 goto CoolDown
endif
sleep 50
goto State6a

[CoolDown]
CurrentState = "CoolDown"
"Element 0" State = off
"Element 1" State = off
"Timer 1" Type = CountDown
"Timer 1" Value = 00:03:00
Start "Timer 1"
{CoolDown_a]
if "Start Still Run" State == true
  Stop "Timer 1"
  sleep 1000
  goto PowerDown
endif
if "Stop Still Run" State == true
  Stop "Timer 1"
  goto PowerDown
endif
if "Timer 1" Value < 00:00:00 // exit to cooldown state
  Stop "Timer 1"
  goto PowerDown
endif
sleep 50
goto CoolDown_a



[PowerDown]
"Element 0" State = off
"Element 1" State = off
"Element 2" State = off
"Element 3" State = off
"Agitator" State = off
"PC Pump" State = off
"PC Fan" State = off
"RC Pump" State = off
"RC Fan" State = off
"RC Valve" State = off
stop "Total Runtime"

// Disable all outputs
"Element 0" Enabled = false
"Element 1" Enabled = false
"Element 2" Enabled = false
"Element 3" Enabled = false
"Agitator" Enabled = false
"PC Pump" Enabled = false
"PC Fan" Enabled = false
"RC Pump" Enabled = false
"RC Fan" Enabled = false
"RC Valve" Enabled = false
"RC Valve PID" Enabled = false
"AlarmOut 1" Enabled = false
"Running" Enabled = false

stop "Still Run Script"
 
Too bad the cart is before the horse on this one. Isn't there issues with the OS and this, meaning its not fully working?

It's just the announcement, it won't be shipping for around a month, so there may still be open issues being worked. But it's a big step in performance that could enable all kinds of usage models that the predecessors just lacked the gas to handle.

That said, I'm not looking forward to Debian 10, every time they release a new Raspbian there's all kinds of hell to pay with all the package updates breaking **** left and right. As soon as I lay my hands on a 4B I'll see if I can update Jessie's firmware to make it work...

Cheers!
 
i probably has to do with the characters after the {...

you will see the character near the end in the CoolDown_a declaration

If you cut and paste this in, it will crash BC

I verified this is correct. You have an open brace instead of an open bracket for section 'CoolDown_a' which is causing it to fail. This is a recoverable error so long as you select 'Continue' in the debugger and do not put your cursor back into the script window.

We'll fix this but in the meantime, don't put open braces in your scripts!
 
Once you see it, it is easy. I am just not "used" to seeing seconds only for a time, rather than 1800 seconds displayed as I would have preferred something like 30:00. Since it is an OnDelay to prevent short cycling, the minimum delay could be in minutes and not seconds regardless. In a lot of cases, milliseconds is the norm in BruControl, therefore I made the ASSumption.

I did notice that you can use a script to set a value higher than 1800:
"Big Mac-E" OnDelay = 3600
Would that value work for an hour delay or is the 1800 seconds a true limit?

We picked units that we thought matched the application best. There are applications where a seconds-only delay makes sense (like two motors powering on at the same time - this could make sure the circuit is not overloaded). Millisecond units doesn't make sense, nor do minutes in our estimation.

You can write what you like in a script... it doesn't mean it will work, so we recommend you pay attention to the limits. In this circumstance, the script will execute, but the value will be capped when it gets transmitted to the interface.
 

I'm not sure the allure of the RPi other than its cost. The reliability is meh (this is our experience - please refrain from grabbing your flame thrower) and it can't do much. Yes, its inexpensive... but when you are building automated equipment where you are spending likely into the thousands, saving $50 - $100 doesn't seem to make a lot of sense. My personal opinion anyway.

Edit: Oh...forgot the I/O. Yes, onboard I/O is nice. Problem is the OS is not real-time. So running time-critical applications poses a risk. Brewing is slow, so it's not really an issue admittedly. It would show up if you had a ton of PID's maybe.
 
Last edited:
Is it possible to move a "Device Element" from one Workspace to another? For my particular setup it would be nice to pick the device elements associated with a particular process from a master workspace and drag it across to the pertinent process workspace. I'm not trying to duplicate a device just trying to move it.
 
Is it possible to move a "Device Element" from one Workspace to another? For my particular setup it would be nice to pick the device elements associated with a particular process from a master workspace and drag it across to the pertinent process workspace. I'm not trying to duplicate a device just trying to move it.

v1.1+... element properties, bottom left corner:
upload_2019-6-24_18-40-8.png
 
Real time OS? Bit of red herring, ainnit? Meanwhile you're running BC on Windows! :D

Cheers!

I meant in context to the I/O. Micro-controllers will stay on time, assuring events occur as scheduled. I'd challenge anyone to measure duty cycle times on a micro vs. the RPi.

In terms of reliability - trust this is a #1 goal. I think we have seen really good reliability from Win10. Anyway, if RPi will deliver it, we'll go there. The interesting thing is the RPi 4 offers up to 4GB RAM - it will be $55 which is not exactly the savings it was before. You can get an AtomicPi for under $45 at this moment... but again I don't think we should be skimping on computer hardware that is running our automated equipment!
 
Last edited:
Back
Top