The S3 is the perfect option IMO. Lots of I/O!Yeah, I know... so much MCU power though!
I'm playing with the S3 and C3 on some scale and tap display projects. I'm liking them a lot.
The S3 is the perfect option IMO. Lots of I/O!Yeah, I know... so much MCU power though!
I'm playing with the S3 and C3 on some scale and tap display projects. I'm liking them a lot.
Yeah, but keep in mind if that port leads to a pump (or any other flow through it, it will misread when there is flow.I was adding a Volume a sensor to my HLT. I had had a sensor port added to the vessel. I was thinking in how I could add a volume sensor to any vessel and realized that a simple Tee on the output of the vessel could take the volume sensor. No need for a special port.
Now if Lilygo or Robodyn woule make a S3 board with integrated relays and such, we'd be in business.The S3 is the perfect option IMO. Lots of I/O!
So you could control an SSR relay as a Digital Output as the trigger voltage?
You just lose the data. Since I have so many globals, I uninstalled the SQL so I no longer get a Database. It was really slowing down the loading of BruContol (Like 10 minutes). I was deleting mine every other day. So just delete at will. It only gets rid of any stored data. BruControl is going to fix the Globals to take care of a lot of the issues with the data base.I sort of asked this question before, but am unsure if I understand correctly. Can I delete the database file if it gets too large and I don't need the data? Will it then create a new file and start logging?
Seconding this. Mine got really large as well, so I deleted it and did away with SQL. I have my brew stats pulled from Brucontrol by Node-RED and sent to Supabase (a free database like Firebase) and Brewfather, so I can see both historical and current data when needed. Saves me from very large files files.You just lose the data. Since I have so many globals, I uninstalled the SQL so I no longer get a Database. It was really slowing down the loading of BruContol (Like 10 minutes). I was deleting mine every other day. So just delete at will. It only gets rid of any stored data. BruControl is going to fix the Globals to take care of a lot of the issues with the data base.
[
{
"id": "7393774e6b605aaf",
"type": "tab",
"label": "BruControl Flow",
"disabled": false,
"info": "",
"env": []
},
{
"id": "28f07e072a7d90f8",
"type": "inject",
"z": "7393774e6b605aaf",
"name": "Start flow",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "300",
"crontab": "",
"once": true,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 110,
"y": 80,
"wires": [
[
"b45926e60e401fd4"
]
],
"info": "This starts the flow at start and at an interval of 5 minutes."
},
{
"id": "b45926e60e401fd4",
"type": "http request",
"z": "7393774e6b605aaf",
"name": "HTTP Request to BC",
"method": "GET",
"ret": "txt",
"paytoqs": "ignore",
"url": "http://127.0.0.1:8000/globals",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 300,
"y": 80,
"wires": [
[
"3dc90f4b793804ba"
]
],
"info": "This makes a HTTP GET call to BruControl's data exchange server, running on port 8000."
},
{
"id": "3dc90f4b793804ba",
"type": "json",
"z": "7393774e6b605aaf",
"name": "Convert JSON String to Object",
"property": "payload",
"action": "",
"pretty": false,
"x": 550,
"y": 80,
"wires": [
[
"e594e165c8a55fc7",
"0ea11e696e11d069",
"81eab8e2366410d3"
]
],
"info": "This will take the msg.payload variable (a JSON string after the HTTP request) and make it a browsable object."
},
{
"id": "e594e165c8a55fc7",
"type": "debug",
"z": "7393774e6b605aaf",
"name": "Show Full Response JSON Data in Debug Pane",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 900,
"y": 120,
"wires": []
},
{
"id": "0ea11e696e11d069",
"type": "function",
"z": "7393774e6b605aaf",
"name": "Example Functions 1 (For/Switch)",
"func": "bcGlobals = msg.payload;\n\nfor (let i = 0, l = Object.keys(bcGlobals).length; i < l; i++) { //Declare i and l, set l to the length of the array (starting from 0), go as long as i is less than l, increment i by one each cycle.\n \n switch (bcGlobals[i].Name){ //Check each array entry by setting the path to i, with the object key being Name.\n case \"Temp1\": //Change the words between the quotes to your BC global name\n node.warn('Temp 1 is: ' + bcGlobals[i].Value); //If the name matches, the value shows in the debug node.\n msg.payload = bcGlobals[i].Value; //Sets msg.payload to the value\n break; //Then the switch stops, going to the next For iteration.\n // default: //Nothing found, so goes to default. However, in a For loop, it will state this for EVERYOTHER BC global entry, so don't uncomment this unless you know what you are doing.\n // node.warn('Nothing found.');\n // break;\n } \n} \n\nreturn msg; //Returns the message, meaning msg.payload moves forward with the new value.",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 860,
"y": 40,
"wires": [
[]
]
},
{
"id": "81eab8e2366410d3",
"type": "function",
"z": "7393774e6b605aaf",
"name": "Example Functions 1 (Get Specific Key Value from BC Name)",
"func": "var arr = msg.payload; //arr for array\nvar temp1;\nvar bcGlobals;\n\n//The following lines rearranges the array into a standard JSON key/value pair via a string and then makes it an object.\nbcGlobals = '{' + arr.map(function(elem){ \n return '\"' + elem.Name + '\":\"' + elem.Value + '\"'; }).join(\",\");\nbcGlobals = bcGlobals + '}';\nbcGlobals = JSON.parse(bcGlobals);\n\n\ntemp1 = bcGlobals['Temp1']; //Sets temp1 to the value of the BC global based on the global name. Change the name accordingly.\nnode.warn('Temp1 is ' + temp1); //Shows the value in the debug pane.\n\nmsg.payload = temp1; //Sets msg.payload to the temp1 value so it can carry forward.\n\n\nreturn msg; //Returns the message, meaning msg.payload moves forward with the new value.",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 940,
"y": 80,
"wires": [
[]
]
}
]
Hi Oakbarn - I am in the process of educating myself with Paint 3D in order to buid a half decent background containing my brewery's layout; I really like yours. I am assuming I could copy/paste it in Paint 3D and customize it as required?Success: My Temp Probes are working with the TF-4 with the wires between the Mega 2560 and the TF-4 roughly 4' 8". I used Cat 5 Shielded wire and did not ground the shield on either end. The only ground was between the Mega and the GND on the TF-4 next to the VCC (5v from the Mega).
This is NOT a Recommendation but I had not purchased a big enough enclosure to house the Interfaces and the TF-4 so I needed to mount it in a different enclosure. That enclosure is metal and has M12 PANEL MOUNT QDs for the temp probes (M12 Quick Disconnect Panel Mount - Male from Brewers Hardware).
View attachment 809628
I used MS Paint (the old version on Windows 10. I can use the one on Win 11 but it is not as easy. I have dabbled with Paint 3D but cannot see any advantage over MS Paint (although you may be able to have transparent backgrounds but I have never figured out how).Hi Oakbarn - I am in the process of educating myself with Paint 3D in order to buid a half decent background containing my brewery's layout; I really like yours. I am assuming I could copy/paste it in Paint 3D and customize it as required?
Also, I notice small buttons next to your pumps - are these controlling the ON/OFF of the pump Element? If so - how can we link Button/Switches like that to Elements such as pumps?
Lastly, the digital temp gauges look neet; how to?
Cheers!
OK great, switch is gone. For the "i", I'm unable to find the lock button; is it in the "appearance" tab somewhere?To get rid of the switch, click the "i" then go to Appearance>Enable Button Visibility>Never
To get rid of the "i" simply click the lock button in the upper right corner.
Some general information:..... A few things I haven't sorted out yet, such as what is a Global and String. I think I get the difference between an Element and a Variable in a script - Elements need to be enabled and Variables are to be declared as new in a script, but I'll leave that for now.
?
Thanks for these explanation Oakbarn; I anticipate coming up with a few more queries as I continue with my scripting. I have a few scripts working now (Boil -over Control, HLT Fill and electric elements dry fire protection). After building the control panel and hooking up the various electrical devices, I find the scripting part - which is totally new to me- makes the Brucontrol a WOW software. I can see me sleeping at night with an automated mash infusion happening at the same time so I can save some time during my long brewdays..!!Some general information:
- This is always a WORK In Progress
- Both Global Elements and a BruControl Variables are a type of variable.
- A Variable is like a place holder or container of some snippets of data. In a lot of cases, you use a variable because you are going to use it more than once.
Dictionary:
variable
noun
1: a quantity that may assume any one of a set of values
a symbol representing a variable
2: something that is variable
a factor in a scientific experiment that may be subject to change
In computers, a variable is a place to hold some snippet of data.
From Wikipedia:
What is a Variable?
Variables are used to store information to be referenced and manipulated in a computer program. They also provide a way of labeling data with a descriptive name, so our programs can be understood more clearly by the reader and ourselves. It is helpful to think of variables as containers that hold information. Their sole purpose is to label and store data in memory. This data can then be used throughout your program.
- Both of the terms are generally used in talking about variables in any computer language and they are similar in meaning to most computer languages. Most computer languages have local Variables and Global ones.
- All variables and Global Elements have some common attributes (properties) in BruControl:
- Type (Basically what kind of Data can it have)
- Boolean = True or False
- Value = a number
- String = Text (even if you put numbers here they are still text and not values)
- Time = a time
- DateTime = a Date and Time
- Scope: Where can they be used:
- Variables are script specific in Scope. It can only be used within the SAME Single Script where it was declared (created).
- Global Element is global in Scope. It can be used in any script.
Variables in BruControl are script persistent. That means as long as the script is running, the variable will last. You can clear the variable with a script command and kill it. You can also “assign” a value to a Variable so that it is available the next time you want to use it. If you have a Variable where you enter the data from the computer screen within BruControl, the data you entered is gone when the script is no longer running.
- Persistent: Means how long the variable lasts.
Global Elements are persistent and non volatile. They will be there even if you close BruControl and then reopen it the next day or next month.
Persistent refers to the container and not the data. The data can be changed at any time. If you do not change the data in a Global Element, it will still have that value when you open BruControl again.
4. The biggest differences between a Global Element and Variables are:
a. Scope
b. Persistent
c . Global Elements are used for DATA EXCHANGE (requires Professional License).
What specifically are you asking about? OUT 1 - TEMP and OUT 2 - Flow. Both outputs require 250ohm or less resistors to enable the Analog Input to read it.
Feeding the SM6004 with +24VDC, 250 ohm resistor in series with the output 2.. makes sense?What specifically are you asking about?
To clarify further you would place on one side of the resistor Output 2 and Analog PIN on UNISHEILD and GROUND the other side of the resistor.Feeding the SM6004 with +24VDC, 250 ohm resistor in series with the output 2.. makes sense?
Output 2 and Analog 11 on the same side of resistor ground on the other side