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.
Yes its 1-wire similar to this this probe. It can be wired as the Mega with 5V to power the probe but 3.3V will also be sufficient. Its important that the 4.7k resistor is between 3.3V and the datawire/input pin, since the Wemos cant handle 5V on the input pin. Connect the datawire to pin D1 on the Wemos D1 mini. D1 equals pin 5 on the interface wiring map.
 
Glad to see another local guy on here! I'm just building out my brewery over on GI and have been looking at this software for my build!
Let me know if you need a hand with anything. I'm fairly busy lately with the nano were opening in webster st but sure I could spare time to answer questions if you end up with any.
 
So I bought the brucontrol system a few weeks ago and I'm getting everything set up, got it working on serial, everything went smoothly until I tried to switch over to WiFi. I loaded the WiFi specific firmware, set up the WiFi and everything took. My router is set up as DHCP so I set the controller up that way with Termite, and everything looked good. The router reserved an IP for its MAC address. However, it won't communicate with the software (also configured with the IP that it assigned, etc.). When I try to ping the controller IP I get "Reply from <my computer IP>: Destination host unreachable.

I'm not a network type of person and I know this is probably something simple, but I can't figure it out and can't even begin to find the right words to do a proper internet search to figure it out. Do you know what I'm doing wrong, or what I need to change so it will communicate?
 
So I bought the brucontrol system a few weeks ago and I'm getting everything set up, got it working on serial, everything went smoothly until I tried to switch over to WiFi. I loaded the WiFi specific firmware, set up the WiFi and everything took. My router is set up as DHCP so I set the controller up that way with Termite, and everything looked good. The router reserved an IP for its MAC address. However, it won't communicate with the software (also configured with the IP that it assigned, etc.). When I try to ping the controller IP I get "Reply from <my computer IP>: Destination host unreachable.

I'm not a network type of person and I know this is probably something simple, but I can't figure it out and can't even begin to find the right words to do a proper internet search to figure it out. Do you know what I'm doing wrong, or what I need to change so it will communicate?

Can you provide more info? What microcontroller interface are you using? What Wi-Fi? Specific links to what you purchased will help. Also, I suggest you use a static IP vs. DHCP. Provide more details on your setup and we will get it working.
 
Can you provide more info? What microcontroller interface are you using? What Wi-Fi? Specific links to what you purchased will help. Also, I suggest you use a static IP vs. DHCP. Provide more details on your setup and we will get it working.

I have the Arduino Mega with the Adafruit winc1500 shield, specifically the ones you recommended in your purchase sheet (I used the links too!) I went DHCP because the router was previously set up that way and didn’t want to ham up the rest of the net... but if you have a good solution I am all ears.
 
Last edited:
Please PM me your email address. I will send you the latest firmware (version 42V). It is possible the generic one you currently have will not work with the Adafruit board. I will confirm that now, but either way let's get you the latest version. We will post the version for everyone in the next day or so.
 
Please PM me your email address. I will send you the latest firmware (version 42V). It is possible the generic one you currently have will not work with the Adafruit board. I will confirm that now, but either way let's get you the latest version. We will post the version for everyone in the next day or so.

Awesome, thanks!
 
I got it working with the new file. I had to switch to static, I didn’t change anything with my router, it’s still set up as DHCP. I’m guessing as long as I have the DHCP reservation it should be ok?
 
You can use DHCP or Static IP. The problem with DHCP is if your router is not configured to assign the same IP address to a device based on that device's MAC address, it could get a different IP on occasion, which would break the connection to BruControl. Therefore we recommend static IP, but of course if you prefer, you can ensure your router assigns the same IP to a device based on its MAC address - the static method requires just one configuration (interface), but DHCP requires two (interface and router).

Anyway, glad you have it working!
 
I’m glad I stopped pounding my head against a brick wall trying to get it working and reached out to you! Thanks for the support!
 
Hi All,

Just an FYI that we posted v43 of the Firmware. This fixes some stability issues with aberrant packets and router re-connection on Wi-Fi. It also provides support for the new Adafruit Wi-Fi shield (shown above). Note that there are changes to the Interface Wiring Maps as well.

The FW can be downloaded from: http://brucontrol.com/download/firmware/ and the Interface Wiring Maps are here: http://brucontrol.com/build/interface-wiring-maps/

In other BruControl news... version 1.1 is underway, we are working to add the new ESP32 development board (successor to the ESP8266 modules) as an interface, and we will have a "hacking the Sonoff module as an easy fermentation controller" demo up soon.
 
I got it working with the new file. I had to switch to static, I didn’t change anything with my router, it’s still set up as DHCP. I’m guessing as long as I have the DHCP reservation it should be ok?

Depending on your router, it is generally easy to configure the DHCP assigned IP address to a Static or Manual assigned IP address. This would be the best way to do it to ensure that the DHCP server does not issue that IP address to another client. It probably would not happen, however it could save you a major headache of trying to figure out why some random client one day is not working properly, which could end up being your MEGA.

You do need to know the admin password to access the router, most likely via IP address. As long as you know the admin password and how to access the configuration page, I could help you on where to go if you provide the make \ model of the router.

Edit: Clarification on possible DHCP issues. DHCP server issues IP addresses to clients from a configured pool or scope of IP addresses. As long as the DHCP server issues the IP address, it will not re-issue the same IP address to a different client. However if you take an IP address that the server issued that is part of the scope and manually enter that on the client, then the server is not aware of that action since it did not assign the address. This holds true even if you manually enter the IP address that the server initially assigned. To get around this you tell the DHCP server that the client was manually or statically assigned an IP address. The server will issue only that client the IP address if the client is still configured for DHCP, and if the client is manually entered the IP address then the server will still not issue that IP address out to any other client.

I hope this helps and does not confuse things more.
 
Last edited:
You can use DHCP or Static IP. The problem with DHCP is if your router is not configured to assign the same IP address to a device based on that device's MAC address, it could get a different IP on occasion, which would break the connection to BruControl. Therefore we recommend static IP, but of course if you prefer, you can ensure your router assigns the same IP to a device based on its MAC address - the static method requires just one configuration (interface), but DHCP requires two (interface and router).

Anyway, glad you have it working!

The only thing that you have to be careful with only setting a static on the device and not configuring DHCP manual\static\reservation entry is if you choose an IP address in the DCHP server scope, the DHCP server could issue that same IP address to another device. If that happens one of the devices will stop working. Most of the time the DHCP server will continue to issue the same IP address to the same device, but not always. So the chances of the issue I reference happening is slim, it is still a possibility that will take some troubleshooting to figure out.
 
The only thing that you have to be careful with only setting a static on the device and not configuring DHCP manual\static\reservation entry is if you choose an IP address in the DCHP server scope, the DHCP server could issue that same IP address to another device. If that happens one of the devices will stop working. Most of the time the DHCP server will continue to issue the same IP address to the same device, but not always. So the chances of the issue I reference happening is slim, it is still a possibility that will take some troubleshooting to figure out.

Yea I was wondering if once it filled up all the reservations, it might loop back and reassign an old IP to a new device? It would be fairly easy to manually assign a reservation outside the range as cheap insurance.
 
Yea I was wondering if once it filled up all the reservations, it might loop back and reassign an old IP to a new device? It would be fairly easy to manually assign a reservation outside the range as cheap insurance.

Reservations are supposed to be permanent and never assigned to a different device. That is why I was surprised to see that your router had an option to auto set Reservation for every device connected. Now obviously at a home user perspective, chances are very slim that you are going to have that many devices connected to the router for the life of the router. Normally the scope configured by default has at least 200 addresses available.
 
If it is an IP address that is not in the scope, then you do not need to setup a static\manual\reservation within DHCP since it will never issue an IP address that is not part of the scope. Also, if you use an IP address outside of the DHCP scope, you need to make sure that it is an IP address inside the same network range as the DHCP scope. That however is a more complicated topic!
 
Good discussion. I suggest your static IP assignments are outside the pool of DHCP reservations. For example, if your DHCP pool is 192.168.1.10 to 192.168.1.200, then your static assignments should be say, 192.168.1.201 to 192.168.1.254. You do not want two devices with the same IP... its a nightmare to troubleshoot.

This is how my network is configured... and I keep a list of those I assigned statically.

Anyway, we are saying the same thing... just adding my practice.
 
Good discussion. I suggest your static IP assignments are outside the pool of DHCP reservations. For example, if your DHCP pool is 192.168.1.10 to 192.168.1.200, then your static assignments should be say, 192.168.1.201 to 192.168.1.254. You do not want two devices with the same IP... its a nightmare to troubleshoot.

This is how my network is configured... and I keep a list of those I assigned statically.

Anyway, we are saying the same thing... just adding my practice.

Absolutely, I just wanted to provide some help if needed since this particular topic is part of my day to day job. I understood your post, but I wanted to add onto it for those that are not familiar with networking and DHCP.

I used to do the same as you, but there are two reasons why I just use the DHCP reservation now.

1. My current router has a nice network map, and it will show me custom names if I use DHCP. This is very nice with some devices that have weird network names. For most, this means absolutely nothing as once the router is setup they probably never go back into it.

2. My laptop is used for travel as well. It would never fail that I would forget that it was configured for static IP, which of course gives trouble when trying to connect to hotel wireless! Not a big deal, I would remember once it failed. However sometimes it would take me a couple to remember since it had been a long day with airport and travel!

Anyway, hopefully I helped some out, especially when it comes to using Brucontrol! I know you and augie have been a huge help to me!
 
I suppose I am an old school guy when it comes to addressing IP's. I have no valid reason NOT to use DHCP and arrange for an IP assignment in the router. Certainly makes configuration of a wireless BruControl interface easier... which is going to become more and more popular. I have been really happy with WiFi so far - the latency is a non-factor as far as I can tell. Since all the timing critical stuff is on the board itself, there is no real risk. Just make sure the WiFi signal is good!

Speaking of... we have completed an initial port of the ESP-32. This is a powerful little board! We have a lot of testing to do before we can say it's good to go. FYI at some point we may consolidate the board options a little. The MEGA will be supported for a long time. We were thinking we would probably obsolete support for the 101 in favor of the Primo... but it looks like the Primo will be retired as a result of the Arduino.org/Arduino.cc consolidation... frustrating!
 
Last edited:
Hi,

FYI we uploaded an application note to the website which demonstrates how to build a simple fermentation controller for BruControl, using an off-the-shelf wireless switch, for under $50 (assuming you have most of the tools). This unit is dual-channel, so it can be used to heat & cool a fermentation chamber, run two refrigerators for fermentation & dispensing, run a glycol pump and ball valve for conicals, or do whatever you want with two 120V supplies: http://brucontrol.com/build/resources/
 
Last edited:
Hi HBT,

Just wanted to update you on a cool option to further reduce dedicated hardware, prevent cutting holes in control panels, and enhance the “digital control panel” experience that BruControl provides.

Many of us implement Voltage/Current meters as a matter of course to monitor AC line voltage and current use. We’ve received several inquiries about voltage/amps measurements, and we have always known it relatively easy to do with a custom circuit, but due to the gentle prodding of @GParkins, I put some energy to identifying an off-the-shelf sensor. For current anyway... voltage is next.

This model: http://www.crmagnetics.com/current-sensors/cr9580 is a self contained current transformer and signal conditioner. It directly outputs 0-5V DC current, proportional with the current flow through the wire it is sensing. It is a split core, meaning it can be mounted without any re-wiring or termination. It wires directly to a BruControl interface, such as the MEGA, with only two wires: one to Ground and the other to an analog input.

I tested this today, and it couldn’t be easier. I wired it in, snapped it on my L1 line, added the Analog Input device element in BC, added a linear calibration (multiply the incoming value * 50/1023) and was all set. Amazingly, the difference between this sensor and my existing sensor were barely different. See pics below.

I bought the 50A sensor from Digikey, but you can buy it direct or via Amazon if so inclined. 30A panels would need the 50A model, as a 30A doesn’t exist on the website, though I suspect a call to the company can yield a 30A model.

Now my current will be constantly displayed on my brewing screen - psyched! As I said, voltage is next. Then we can compute power usage, cost, etc. from that data as desired!

Sensor placed temporarily for testing:
IMG_3215.jpg


Just one pump running:
IMG_3205.jpg

IMG_3206.jpg


Pump and RIMs on high power:
IMG_3214.jpg

IMG_3212.jpg
 
Last edited:
Hi,

Wanted to share an example script that a user requested. The goal was to issue an alarm in case a mash temp goes too high or low, and turn the Mash Pump on and off for pre-determined amount of times. The script is commented below so should be explanatory, but feel free to ask any questions!

Code:
[mash_prep]
restart "StepTimer"                  // this is an overall timer to keep track of the mash step – restart it
restart “PumpTimer”                  // this is a timer for the pump on/off – restart it
new value MashTemp                   // this is a variable for the mash temp
new value MashTempAlarmHigh           // this is a variable for the mash temp alarm (too high)
new value MashTempAlarmLow            // this is a variable for the mash temp alarm (too low)
new time MashTime                    // this is a variable for your mash time
MashTemp = 152                       // set the mash temp value
MashTempAlarmHigh = MashTemp + 3      // set the mash temp alarm high threshold
MashTempAlarmLow = MashTemp – 3       // set the mash temp alarm low threshold
MashTime = 01:00:00                  // set the mash time
"Pump 1" State = on                  // turn on the pump
sleep 5000                           // wait for liquid to flow
"RIMS Heat PID" Target = MashTemp     // set the mash heat temp (RIMS)
"RIMS Heat PID" Enabled = true        // turn on the mash heat
sleep 10000                          // wait 10 secs for the temp to stabilize so alarm doesn’t trip right away

[mash_loop]
if “Mash Temp” > MashTempAlarmHigh    // check if temp is too high, and activate alarm if so
"Brew Alarm" Active = true
endif
if “Mash Temp” < MashTempAlarmLow     // check if temp is too low, and activate alarm if so
"Brew Alarm" Active = true
endif

if “Pump 1” State == on                     // check if pump is on
     if “PumpTimer” Value > 0:08:00         // check if pump timer is running longer than 8 minutes
           “Pump 1” State = off             // if so, turn the pump off
           “RIMS Heat PID” Enabled = false  // and turn the heat off
           restart “PumpTimer”              // restart the pump timer
     endif
endif

if “Pump 1” State == off                    // check is pump is off
     if “PumpTimer” Value > 0:02:00         // check if pump timer is running longer than 2 minutes
           “Pump 1” State = on              // if so, turn the pump on
           “RIMS Heat PID” Enabled = true   // and turn the heat on
           restart “PumpTimer”              // restart the pump timer
     endif
endif


if "StepTimer" Value >= MashTime      // check if mash time have been exceded, and exit if so
     goto mashout
endif

sleep 5000                           // wait for a few seconds so loop doesn’t run needlessly fast
goto mash_loop                       // go back to the top of the loop

[mashout]                             // beginning of next section
…
 
Hi HBT,

We have received several requests for info on how to set up a fermenter/glycol system using BruControl. Like anything, there are multiple ways to skin a cat, so here is my take. @augiedoggy may weigh in, as he does this in real life. I am not fortunate enough to have such a system (yet!). This assumes BC will control the whole setup, rather than the glycol chiller maintaining its own temperature, etc.

A few key items:
1. Glycol chiller (can be legit or a modified AC setup, etc.), with temperature probe in glycol bath, and switchable power on/off (re-wired thermostat or power-feed).
2. Heater(s). Can be a glycol heater (e.g. immersion heater, element, or RIMS tube) to cool or heat all fermenters, or individual heating belts for each fermenter. Note: If there will be a need to heat one fermenter and cool another, then the latter is required (e.g. ale in one fermenter and lager in another and ambient temp is 50 degrees).
3. Glycol pump.
4. One two-way ball valve for each fermenter.
5. Relay board, controlled by the BC interface, which contains enough relays for all the items required: 1 for chiller power, 1 for glycol pump, 1 for each heater (must cover current requirement), 1 for each ball valve.
6. Temperature probes: 1 for the glycol reservoir (at the pump exit), 1 for each fermenter (location of choice - but ideal is 1/3 into wort in distance from cooling/heating surface to heat escape surface). Probes can be 1-wire, thermistor, or RTD (in order of recommended). Extra probes can be added where desired for monitoring.
7. 2x manifolds with # or ports = # fermenters + 2. 'A' manifold distributes glycol to the fermenters, and 'B' manifold receives the glycol from the fermenters.
8. Check valve, with a small cracking pressure.
9. Ball valve power supply (can be 12VDC which is shared with BruControl interface power).

The setup is this: The glycol chiller has a reservoir with an exit and entrance on opposite sides of the cooling coil. The exit is plumbed into the pump, then into manifold A's input port. Each A manifold exit port is plumbed to the input of a ball valve except one, which is plumbed to one side of a check valve. The exit of each ball valve goes to a respective fermenter, and the exit of each fermenter goes into the B manifold. The B manifold's two other ports are plumbed such that one goes back to the reservoir input, and the other is plumbed to the other side of the check valve. The glycol flow will pass from the reservoir, into pump, into the A manifold, through the ball valve (if open), throught the fermenter, through the B manifold, back to the reservoir. If none of the ball valves are open, the glycol will pass straight from manifold A to manifold B through the check valve. Depending on gravity/layout, a check valve may not be needed.

The wiring is set up such that the relay's contacts control the chiller power and the heater power (these are 120VAC but can be 240VAC also so long as the relay contact rating's exceed the chiller or heater's requirement). The relay's contacts switch 12VDC power to the ball valves. The pump can be switched by either 12VDC or 120/240VAC depending on its design. The relay board's inputs are wired directly to the BruControl interface (Arduino MEGA recommended, with WiFi connection for ease of integration). Schematics are on the website, but a 12V relay board is recommended.

The basic operation will be such that if a fermenter's temp is too high or too low, the glycol will be routed to that fermenter through its ball valve. Cooling or heating will be automatically called, and the glycol reservoir can be heated or cooled continuously, or simply as needed. Note: since the reservoir is likely small, running the heater/chiller continuously is probably not a good strategy. BruControl has discreet digital output device elements established for the heater, chiller, and pump. It has discrete input devices for each temperature measurement point. It has 2 hysteresis devices controlling each ball valve (one for heating, the other for cooling), using the fermenter temperatures as reference input devices.

Now there are multiple ways to handle the automation. First (recommended), implement Hysteresis devices (noted above) and use a simple script (example below) to call for heating/cooling when needed. This script would power on the chiller/heater when a ball valve is opened. Second, run a single script in a continuous loop to handle all the automation. This would take more skill since certain protections need to be put in place which already exist in the Hysteresis device elements, like turn-on delay to prevent short-cycling the compressor. This script would check each temperature (reservoir, fermenters, extras), open each valve as needed, and power on/off the heater/chiller/pump as decided.

Here is an example of the simple script noted in the first example above to run two fermenters (multiply as needed), where the glycol is heated or cooled together. If using group cooling but individual heating, a slightly different script would be required.

I know schematics/diagrams would help - I just need to find some time to draft them up!

Code:
[setup]
new bool NeedCooling            //set up flag for cooling
new bool NeedHeating            //set up flag for heating
new bool PumpOff            //set up flag for pump been turned off

[loop]
NeedCooling = false            //set flag that cooling is not needed
NeedHeating = false            //set flag that heating is not needed

if "FermCool1" Value == on        //check if fermenter 1 hysteresis device is on
    NeedCooling = true        //if so, set flag that cooling is needed
endif

if "FermCool2" Value == on        //check if fermenter 2 hysteresis device is on
    NeedCooling = true        //if so, set flag that cooling is needed
endif

if "FermHeat1" Value == on        //check if fermenter 1 hysteresis device is on
    NeedHeating = true        //if so, set flag that heating is needed
endif

if "FermHeat2" Value == on        //check if fermenter 2 hysteresis device is on
    NeedHeating = true        //if so, set flag that heating is needed
endif

if NeedCooling == true            //if flag for cooling needed is on
    "Pump" State = on        //turn on the pump
    "Chiller" State = on        //turn on the chiller
    "Heater" = off            //turn off the heater
    PumpOff = false            //reset the pump has been turned off flag
else
    if NeedHeating == true        //otherwise, if flag for heating needed is on
        "Pump" State = on    //turn on the pump
        "Chiller" State = off    //turn off the chiller
        "Heater" = on        //turn on the heater
        PumpOff = false        //reset the pump has been turned off flag
    else
        PumpOff = true        //otherwise, set the pump has been turned off flag
        Restart "Pump"        //reset the Pump timer
        "Chiller" State = off    //turn off the chiller
        "Heater" State = off    //turn off the heater
    endif
endif

if PumpOff == true            //check if the pump has been turned off flag is set
    if "Pump" Value >= 0:03:00    //if so, check to see if the Pump timer has passed 3 mins
        "Pump" State = off    //if so, turn the pump off
        PumpOff = false        //reset the pump has been turned off flag
    endif
endif

sleep 15000                //pause for 15 seconds to reduce loop execution speed
goto loop                //execute the loop again
 
Many ways to skin a cat indeed. I am not using any code myself to control my for fermenters with my glycol or heating wraps I do use a common CPVC manifold on the wall with a $3 24-volt solenoid valve for each conical. I use dual pole relays which activate any of the valves that need to be opened along with the main Chiller pump for recirculation of glycol through the manifold. It's a pretty simple system but it's been working good for me for almost 4 years now
 
I should edit that comment I do sometimes use scripts for ramping and temperature-controlled profiles but not to actually control temperature in my conicals per se without ramping or scheduled temp profiles
 
I've got an old countertop soda dispenser that was donated. It uses a 1/2 HP compressor to chill a 10-gallon reservoir. I've filled the reservoir with a glycol solution, but instead of one pump into a manifold for distributing chilled glycol, I bought a couple of submersible pumps that I just toss into the reservoir. They are intended for use as a small garden pond waterfall pump. So, instead of more valves, I have one circuit that switches the glycol tank on and off, and then the pumps are connected to outlets that switch on and off depending on what the conical or the cold box needs. That's the idea, anyway. Still working on the execution.
 
That should work fine too. Its the same idea behind the SS brewtech system only it uses stc-1000 type controllers and cheap fountain pumps.
 
This is a good idea also @GParkins. Since individual pumps can be inexpensive, the manifolds and valves can be eliminated. In fact this is probably a better approach, as you can implement 120VAC fountain style pumps or use 24VDC pumps. For any pump, you need to make sure it is compatible with the fluid and temperature being used. Note that the RV antifreeze mix typically has alcohol in it, which can be corrosive to certain plastics over time.
 
Here is a link to the el cheapo pump I bought two of. For an extra $4, I added on a 4-year extended warranty.
 
Last edited by a moderator:
Back
Top