Die einzelnen Teile der Brausteuerung zusammenzusuchen, zu verkabeln und zu verlöten ist nur der erste Schritt. Denn noch weiß der Arduino ja gar nicht was er damit überhaupt tun soll. Daher führe ich dich Schritt für Schritt durch die einzelnen Programmabschnitte (zumindest die meisten):
Was ich hier noch nicht behandeln werde ist das Brau-Programm an sich. Also die Menüführung und die Eingabe der einzelnen Werte. Das wird später kommen, sobald ich mit meiner Steuerung zufrieden bin und die meisten Bugs ausgemerzt sind.
Meine Brausteuerung habe ich mittlerweile umgebaut, so dass ich den GFA gar nicht mehr benötige. Diese Anleitung bezieht sich dennoch auf die Arduino Brausteuerung selbstgemacht-Anleitung und allen dort verwendeten Teilen.
Damit wir uns später die Ausgabe über die Konsole bzw. den Seriellen Monitor sparen, richten wir zu erst das LCD-Display ein.
Da wir das über ein I2C-Modul das Display steuern, benötigen wir zu erst die passende Bibliothek "New LiquidCrystal". Also von Github runterladen: New LiquidCrystal-Bibliothek und nach dortiger Anleitung installieren.
Da wir das ganze über ein I2C-Modul realisieren brauchen wir nur 4 PINS: Ground, 5V, A4 und A5. Bitte auch genau A4 und A5 belegen. Dann die Arduino Entwicklungsumgebung öffnen und diesen Code ganz oben einfügen:
#include #include #define I2C_ADDR 0x27 // Define I2C Address where the PCF8574A is #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
Dann kommen wir auch schon zur setup()-Funktion. Die schaut so aus:
void setup() { lcd.begin(20,4); // Was für ein Display: 20x4 oder 12x2 lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); // Beleuchtung PIN festlegen lcd.setBacklight(HIGH); // Beleuchtung AN lcd.home(); // Cursor Links oben setzen lcd.print("Brauhelfer v1.0"); // Brauhelfer v1.0 in der ersten Zeile (=0te Zeile im Code) ausgeben lcd.setCursor(0,1); // Cursor auf die 2te Zeile (=1te Zeile im Code) setzen lcd.print("Initialisiere..."); lcd.setCursor(0,3); lcd.print("[15.05.16] by Hansi"); }
Damit können wir schon den ersten Text ausgeben. Glückwunsch :)
lcd.begin(20,4); Brauchen wir nur einmal aufrufen, um der Bibliothek zusagen, wie groß das Display ist und wie viele Zeichen zur Verfügung stehen
lcd.setBacklight(HIGH); Auch nur einmalig, damit die Hintergrundbeleuchtung angeht
lcd.home(); Werden wir noch öfter brauchen. Damit setzen wir den Cursor auf "0,0". Sprich 0te Spalte in der 0ten Zeile. In Programmiersprachen ist die 0 immer der erste Wert. Also 0te Zeile im Code ist die erste Zeile im Display.
lcd.print("..."); Text ausgeben, beginnend von der Position, wo der Cursor gerade steht
lcd.setCursor(0,1); Cursor Position verändern. Dabei ist die erste Zahl die Spalte und die zweite Zahl die Zeile. Also im Display wäre das das erste Zeichen in der 2ten Zeile.
lcd.clear(); Komplettes Display löschen und Cursor auf 0,0 setzen.
Fehler 1: Falsche Verkabelung. Noch genau prüfen, ob alle Kabel richtig sind.
Fehler 2: Die Adresse I2C_ADDR 0x27 ist nicht korrekt. Die findet ihr über den Sketch heraus: I2C-Adresse herausfinden. Die 0x27 dann mit der gefunden Adresse ersetzen.
Das auslesen der Temperatur ist etwas "aufwendiger" aber simpel. Das gute an den OneWire-Thermometern ist, dass ihr mehrere Temperaturfühler an den selben PIN stecken könnt und dennoch jedes Thermometer einzeln ansprechen könnt. Damit ist es möglich einen genaueren Mittelwert der Temperatur zu berechnen.
Erweitere deinen Quelltext um folgende Zeilen vor der setup()-Funktion:
#include // OneWire-Bibliothek einbinden #include // DS18B20-Bibliothek einbinden #define DS18B20_PIN 7 // TemperaturPIN = D7 OneWire oneWire(DS18B20_PIN); // OneWire Referenz setzen DallasTemperature sensors(&oneWire); // DS18B20 initialisieren
Die Setup-Funktion ergänzen wir um eine Zeile:
void setup() { sensors.begin(); // DS18B20 Temp starten lcd.clear(); }
Dann erstellen wir nach der loop()-Funktion eine Funktion, die die Temperatur anzeigt:
displayTemp(){ sensors.requestTemperatures(); float temp = sensors.getTempCByIndex(0); char buffer[10]; String myTxt = String("Temperatur: ") + dtostrf(temp, 5, 2, buffer) + String("C"); lcd.setCursor(0,3); lcd.print(myTxt); }
sensors.requestTemperatures(); Anfordern der Temperaturen
sensors.getTempCByIndex(0); Temperatur des Thermometers mit Index 0. Falls mehr angeschlossen sind, kann es auch 1 oder noch höher werden.
dtostrf(temp, 5, 2, buffer) Funktion um aus einer Float einen String zu machen.
Jetzt müssen wir noch in der Loop-Funktion unsere displayTemp()-Funktion aufrufen:
void loop() { displayTemp(); delay(500); }
Um die Sensoren nicht zu überstrapazieren, reicht es aus, wenn wir nur alle halbe Sekunde die Werte aufrufen. Das macht das delay(500). Das ist eine Verzögerung von 500ms bevor die Funktion wieder aufgerufen wird.
Die Steuerung des Motors ist wirklich nicht kompliziert. Wir können danke der PWM-Pins (Pulsweitenmodulation) theoretisch die Geschwindigkeit von-255 vorgeben, wobei 0 = Stillstand und 255 = Vollgas ist. Theoretisch, da ein Scheibenwischermotor in der Regel eine Mindestpower braucht um überhaupt zu laufen. Wenn zu wenig Power kommt, brummt er nur, aber bewegt sich nicht. Der Schwellenwert bei uns liegt bei 50.
Alte Spiel, wir definieren die PIN-Belegung über der setup()-Funktion, in der setup()-Funktion weisen wir den PINS den Status (HIGH,LOW,0-255) zu und in der Loop-Funktion können wir eine von uns geschrieben Funktion aufrufen:
int mPin1 = 10; // Motor an DigitalPin 10 int mPin2 = 11; // Motor PWM an DigitalPin 11 void setup(){ pinMode(mPin1, OUTPUT); // Motor initialisieren digitalWrite(mPin1,HIGH); // Richtung des Motors HIGH oder LOW } void loop(){ lcd.clear(); lcd.print("Motor 250"); setMotor(250); delay(500); lcd.print("Motor 100"); setMotor(100); delay(500); lcd.print("Motor 50 "); setMotor(50); delay(500); lcd.print("Motor aus"); setMotor(0); delay(500); } function setMotor(int speedNow){ analogWrite(mPin2, speedNow); // Motor die Geschwindigkeit über den PWM mitteilen }
Das war es schon. Das dürfte alles selbsterklärend sein und ist wirklich kein Hexenwerk ;)
Die Gassteuerung mit einem GFA ist noch simpler als die Steuerung des Motors. Hier gibt es nämlich nur AN oder AUS:
int gPin = 8; // Digital PIN GFA void setup(){ pinMode(gPin, OUTPUT); // GFA initialisieren digitalWrite(gPin,HIGH); } void loop(){ toggleGFA(); delay(25000); // 25 Sekunden brennen lassen toggleGFA(); delay(5000); // 5 Sekunden ausgeschaltet lassen } boolean gfaStatus = false; void toggleGFA(){ lcd.clear(); if(!gfaStatus){ lcd.print("Brenner einschalten."); digitalWrite(gPin, LOW); // GFA anschalten delay(1000); lcd.print("Brenner ist an... "); gfaStatus = true; }else{ lcd.print("Brenner ausschalten."); digitalWrite(gPin, HIGH); // GFA ausschalten delay(1000); lcd.print("Brenner ist aus... "); gfaStatus = false; } }
Da ich meinen GFA nicht mehr nutze, sondern alles über den Arduino löse, ist das etwas komplizierter. Denn jetzt kommen noch Magnetventil, Feuerdetektor, Gasdetektor und Zündelektrode dazu, die alle über den Arduino gesteuert werden. Entsprechend muss ich prüfen, wie lange das Magnetventil schon offen ist und kein Feuer brennt, damit ich es notfalls zumachen kann, um zu viel Gasaustritt zu verhindern. Das geschieht sowohl über den Feuerdektor als auch über den Gasdetektor, als doppelte Absicherung. Dazu werde ich eventuell später noch eine Anleitung schreiben.
Was noch fehlt ist natürlich das komplette Menü und die Zusammenarbeit zwischen den einzelnen Funktionen. Außerdem fehlt noch die Funktion des Drehknopfs mit dem man sich durch das Menü navigieren kann. Aber hey, alles muss ich euch nicht fertig präsentieren ;)
Wem die Programmierung zu aufwendig ist, dem gebe ich gerne die hier vorgestellte Version an. Überweise einen beliebigen - aber hoffentlich fairen - Betrag per Paypal an mich: https://www.paypal.me/dahansi
Im Anschluss sende mir bitte eine E-Mail mit deinem Paypal Namen, dann schicke ich dir die entsprechende Arduino-Datei zu.
Aus Zeitgründen schaffe ich es leider nicht individuellen Support zum Programm zu geben. Das Programm entwickle ich nicht mehr weiter, da wir auf eine Brausteuerung auf Basis eines Raspberry Pi umgestiegen sind. Das Programm läuft, aber sollte noch ausgebaut werden (z.B. Rezepte einspeichern, etc.).
von: Patrick
Als Alternative zur "Kaufversion" gibt's eine Brausoftware für Arduino (die verdächtig ähnlich ist) hier: https://github.com/BernhardSchlegel/BierBot-mini
Antwort von Johannes - 09.06.2020
Hi Patrick,
danke für den Link.
Die verlinkte Brausteuerung geht auf den ersten Blick nur für Herdplatten und nicht mit Gas.
"Verdächtig ähnlich": Mein Beiträge habe ich ein paar Monate vor dem "BierBot" veröffentlicht, daher gehe ich nicht davon aus, dass der eine vom anderen kopiert hat. Zumal man mit Arduino nicht so viel andere Möglichkeiten hat, das anders darzustellen.
Meine Anleitung soll zum Nachbau anregen und dazu sich selbst mit der Arduino-Programmierung zu beschäftigen. Ich möchte damit nichts verdienen, möchte den Code aber auch nicht einfach so rausgeben.
Schöne Grüße
Johannes
Bewertung:
War dieser Kommentar hilfreich?
von: Philipp R
Hallo,
Ich wollte nachfragen ob ein Kauf des Programmes noch möglich ist.
vielen Dank im voraus!
Antwort von Johannes - 24.11.2018
Hi Philipp,
ja, ist noch möglich. Aber ich gebe hier keinen Support mehr und ich habe das Programm auch nie zu Ende geschrieben. Brauen geht, aber Rezepte abrufen, etc. ist nicht mehr eingebaut.
Schöne Grüße
Johannes
Bewertung:
War dieser Kommentar hilfreich?
von: Eugen
Hallo Hansi,
bin vor kurzem erst auf diese Anleitung gestoßen und finde es Super was du machst.
Ich selber bin mit der Programmierung des Arduino noch nicht so vertraut und würde von dir gerne den Programmcode kaufen. Bring es aber leider nicht fertig deine E-Mail adresse zu finden. Kannst du mir diese bitte mitteilen?
Vielen Dank im Voraus.
Gruß
Eugen
Antwort von Hansi - 11.03.2017
Hallo Eugen,
meine E-Mailadresse: info@glohbe.de
Für die Paypal-Überweisung: https://www.paypal.me/dahansi
Schöne Grüße
Hansi
Bewertung:
War dieser Kommentar hilfreich?
von: Thomas S.
Hallo Hansi,
eine fantastische Brausteuerung hast Du da entworfen. Leider bin ich in der Programmierung des Arduino ein vollkommener Anfänger. Aus diesem Grunde würde mich interessieren, ob der von Dir zum Kauf angebotene Programmcode auch die unter der Überschrift "Die nächsten Schritte" enthaltenen Punkte enthält. In dem Video funktionieren ja sowohl das Menü als auch die Funktion des Drehknopfes. Ich wäre an der Kaufversion nämlich sehr interessiert.
Kann mit dem Programmcode anstelle des elektrischen Gasanzünders auch eine elektrische Induktionskochplatte betrieben werden und anstelle des Scheibenwischermotors ein 12-Volt Getriebemotor (Einmacherversion)?
Über eine Antwort würde ich mich sehr freuen.
Freundliche Grüße
Thomas
Antwort von Hansi - 19.12.2016
Hallo Thomas,
danke für Deine Nachricht. Freut mich, dass sie dir gefällt.
Also diese Funktionen sind im Programmcode vorhanden. Ich kann Dir die gerne auch vorab schicken und Du kannst sie nachträglich kaufen. So ehrlich ist ja jeder Brauer... bzw. freue ich mich fast mehr über ein paar Bier =)
Ich nutze die Steuerung leider gar nicht mehr, aber funktioniert hat sie und wir haben 3 oder 4 Sude mit ihr gebraut.
Die Steuerung kannst Du in einer früheren Version hier sehen: https://www.youtube.com/watch?v=xJLOh0BVbaM
Schöne Grüße
Hansi
Antwort von Eugen - 08.05.2017
Hallo Thomas,
habe gelesen das du eine Elektro Herdplatte mit der Software ansteuerst. Habe die Software vom Hansi erworben und bekomme es nicht hin das Relais die dauerhaft zu bestromen, so lange der Sud erhitzt werden soll.
Kannst du mir ein Tipp geben wie du das Problem gelöst hast?
Gruß
Eugen
Antwort von Thomas S. - 09.05.2017
Hallo Eugen,
ich betreibe die Steuerung über funkgesteuerte Steckdosen. Die Frage ist nur, ob wir beide denselben Sketch für die Brausteuerung verwenden. Eventuell kann es auch daran liegen, dass Du eine digitale Induktionskochplatte benutzt. Hier brauch man wohl eine analoge von Hendi. Bisher mache ich das nur mit dem Einkocher. Hier mal einen interessanten Link zu einer Seite, wo es den Sketch kostenlos gibt und das für verschiedene Versionen:
Link
Gruß,
Thomas
Antwort von Hansi - 12.05.2017
Hallo Eugen,
du kannst eigenltich auch mit meiner Steuerung die Kochplatte betreiben:
Du kaufst dir im Baumarkt Einbausteckdosen, dann musst du das Kabel von deiner Herdplatte nicht aufschneiden. Dann verbindest Du die Kabel so, dass die Phase durch das Relais geht. Im Code musst du ansich nichts ändern (zumindest was das an/ausschalten angeht).
Allerdings heizen Herdplatten in der Regel nach und brauchen auch wieder länger um auf Temperatur zu kommen. Daher müsstest Du beim prüfen der Temperatur eine kleine Logik einbauen, die das berücksichtigt (z.B. 3% vor erreichen der Zieltemperatur die Platte bereits ausschalten, da die Resthitze für den letzten 3% ausreicht).
Schöne Grüße
Hansi
Der Funktion für die Herdplatte:
void setGfa(int i){
if(i && !gfaStatus){
clearLine(2);
lcd.setCursor(0,2);
lcd.print("Herdplatte ein.");
digitalWrite(GFA, LOW);
clearLine(2);
lcd.setCursor(0,2);
lcd.print("Herdplatte ist an...");
gfaStatus = true;
}else if(!i && gfaStatus){
clearLine(2);
lcd.setCursor(0,2);
lcd.print("Herdplatte aus.");
digitalWrite(GFA, HIGH);
delay(1000);
clearLine(2);
lcd.setCursor(0,2);
lcd.print("Herdplatte ist aus...");
gfaStatus = false;
}else{}
}
Bewertung:
War dieser Kommentar hilfreich?