Glohbe - Hansis Blog

Programmierung Brausteuerung mit dem Arduino

veröffentlicht am 18.05.2016 - 14:04 Uhr Uhr - letzte Änderung 25.11.2016 - 07:41 Uhr Uhr Tags: Bierbrauen Programmierung Hobby DIY Sketch Brausteuerung Arduino

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):

  1. Display ansteuern
  2. Temperatur auslesen
  3. Motor an- /ausschalten
  4. Gasbrenner starten/stoppen

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.

1. LCD Display mit Arduino kontrollieren

Damit wir uns später die Ausgabe über die Konsole bzw. den Seriellen Monitor sparen, richten wir zu erst das LCD-Display ein.

New LiquidCrystal-Library runterladen

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.

LCD-Display PINs belegen

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.

Fehlerquellen LiquidCrystal_I2C

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.

2. Temperatur auslesen mit Arduino

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.

OneWire Thermometer Beispiel:

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.

Scheibenwischermotor mit Arduino steuern

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.

Scheibenwischermotor Sketch

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 ;)

Gaskocher mit dem Arduino steuern

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.

Die nächsten Schritte

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 ;)

Programmcode kaufen

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.).

Kommentare