// Das jewalige Kochrezept das man brauen will einfach auskommentieren
// Falls keins vorhanden ist einfach ein neues anlegen
// Wichtig drauf aufpassen das nur ein Kochrezept auskommentiert ist
// Test Programm
/*
int SchrittAnzahl=14;
char *Vorgang[] = {"Kochrezept","Hauptguss 14 l","Einmaischtemperatur","Eiweissrast","Maltoserast","Fabmalz zugeben","Verzuckerungsrast","Laeutern","Nachguss 17 Liter","Wuerze Kochen", "Wuerze Kochen", "Wuerze Kochen","Hauptgaerung","Abfuellung"} ;
char *zusatztext[] = { "Alt Bier", "", "Malz zugeben", "", "", "", "", "", "", "", "Hopfenzugabe 48g","Hopfenzugabe 16g", "", ""} ;
int temperatur[] = { 0, 55, 51, 50, 64, 0, 73, 0, 0, 0, 0, 0, 17, 0 } ;
int zeitdauer[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 } ;
int MotorDrehung[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ;
/*
// Alt Bier
// https://www.candirect.eu/Malzmischung-Altbier-obergaerig-mit-Weyermann-Malzen-fuer-20-L-Bier
// Nach der Zeile auskommentieren
/*
int SchrittAnzahl=14;
char *Vorgang[] = {"Kochrezept","Hauptguss 14 l","Einmaischtemperatur","Eiweissrast","Maltoserast","Fabmalz zugeben","Verzuckerungsrast","Laeutern","Nachguss 17 Liter","Wuerze Kochen", "Wuerze Kochen", "Wuerze Kochen","Hauptgaerung","Abfuellung"} ;
char *zusatztext[] = { "Alt Bier", "", "Malz zugeben", "", "", "", "", "", "", "", "Hopfenzugabe 48g","Hopfenzugabe 16g", "", ""} ;
int temperatur[] = { 0, 55, 51, 50, 64, 0, 73, 0, 0, 0, 0, 0, 17, 0 } ;
int zeitdauer[] = { 0, 0, 0, 23, 45, 0, 35, 0, 0, 10, 70, 10, 0, 0 } ;
int MotorDrehung[] = { 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0 } ;
Bis zur dieser zeile */
// Malzmischung Kölner Art
// https://www.candirect.eu/Malzmischung-Koelner-Art-obergaerig-mit-Weyermann-Malzen-fuer-20-L-Bier
// Nach der Zeile auskommentieren
/*
int SchrittAnzahl=13;
char *Vorgang[] = { "Kochrezept","Hauptguss 15 l","Einmaischtemperatur","Eiweissrast","Maltoserast","Verzuckerungsrast","Laeutern","Nachguss 16 Liter","Wuerze Kochen", "Wuerze Kochen", "Hauptgaerung", "Abfuellung"} ;
char *zusatztext[] = { "MalzmischungKoelner Art", "", "", "", "", "", "", "", "", "Hopfenzugabe", "", ""} ;
int temperatur[] = { 0, 45, 40, 50, 66, 78, 0, 0, 0, 0, 20, 0 } ;
int zeitdauer[] = { 0, 0, 0, 30, 60, 10, 0, 0, 10, 80, 0, 0 } ;
int MotorDrehung[] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ;
*/
// Malzmischung Flavorhop Weizen
// https://braumischung.de/brauzutaten/braumischungen/05-flavorhop-weizen/
// Nach der Zeile auskommentieren
/*int SchrittAnzahl=14;
char *Vorgang[] = { "Kochrezept", "Hauptguss", "Einmaischen", "Rast", "Rast", "Rast", "Laeutern", "Nachguss", "Wuerze Kochen", "Wuerze Kochen", "Wuerze Kochen", "Whirlpool", "Hauptgaerung", "Abfuellung",};
char *zusatztext[] = { "Flavorhop Weizen", "17 Liter", "Malzzugabe", "(1/3)", "(2/3)", "(3/3)", "Abmaischen", "16 Liter", "", "Hopfenzugabe (1/2)", "Hopfenzugabec(2/2)", "", "", "",};
int temperatur[] = { 0, 56, 40, 52, 62, 20, 78, 66, 100, 100, 100, 0, 20, 0,};
int zeitdauer[] = { 0, 0, 0, 15, 40, 71, 0, 60, 70, 70, 10, 0, 0, 0,};
int MotorDrehung[] = { 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0,};
*/
int SchrittAnzahl=14;
char *Vorgang[] = { "Kochrezept", "Hauptguss", "Einmaischen", "Rast", "Rast", "Abmaischen", "Wuerze Kochen", "Nachguss", "Wuerze Kochen", "Wuerze Kochen", "Whirlpool", "Abhopfen", "Abkuehlen", "Hefezugabe",};
char *zusatztext[] = { "Rothopfen Pils", "17 Liter", "Malzzugabe", "(1/2)", "(2/2)", "", "1. Hopfenzugabe", "11 Liter", "", "2. Hopfenzugabe", "", "Filtern", "Auf 12 grad C", "",};
int temperatur[] = { 0, 66, 0, 62, 71, 78, 0, 78, 100, 100, 0, 0, 12, 0,};
int zeitdauer[] = { 0, 0, 0, 35, 15, 0, 0, 0, 70, 5, 0, 0, 0, 0,};
int MotorDrehung[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define PIN_TASTER 42 // An Pin 42 ist der Taster für nächseten Step angschlossen
#define PIN_TASTERB 4
#define pinA2 A2 //A2 ist der Pin über den der kürzere PT1000 ausgelesen werden muss. Auf der Rückseite muss der kurze PT1000 in den unteren Stecker gesteckt werden
#define pinA3 A3 //A3 ist der Pin über den der längere PT1000 ausgelesen werden muss. Auf der Rückseite muss der lange PT1000 in den oberen Stecker gesteckt werden
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
const int relayPin1 = 24;
const int relayPin2 = 26;
const long intervalRel = 3000; // zeit um das Relay an und aus zuschalten
//const Lampe Pins
const int pinB = 5;
const int pinG = 6;
const int pinR = 7;
const int SPEAKER_PIN = A14;
//zeitsteuerung
unsigned long previousMillisTime = 0; // will store time since new step;
int saveI = 0; // speichert i;
int ledState = LOW;
unsigned long previousMillis = 0; // will store last time LED was updated
unsigned long previousMillisRel = 0; // will store last time Relay was updated
const long intervalTemp = 200; // Intervall, indem der Widerstand an den AnalogPins ausgelesen wird
int AnalogValue1 = analogRead(pinA2); //Liest den Input (Widerstand an Pin A2) aus
int AnalogValue2 = analogRead(pinA3); //Liest den Input (Widerstand an Pin A3) aus
float temp1; //Initialisiere Variablen für Temperatur
float temp2;
float avrgtemp; //gibt Durchscnittstemperatur an von Fühler 1 und 2
int i = 0; //Beschreibt den Brauschritt, indem man gerade ist. Entnimmt entsprechende Werte aus dem Rezept-Array (oben)
int temperaturZiel;
float temperaturMessung1;
float temperaturMessung2;
float zeitMessung1;
float zeitMessung2;
float deltaTziel;
float deltaTstart;
float deltaZeit;
float tau;
float zeit;
unsigned long previousMillis2 = 0;
const long intervalZeitmessung = 3000;
void setup() {
pinMode(PIN_TASTER, INPUT_PULLUP); //Ist für den Taster
pinMode(relayPin1, OUTPUT); //Initialisiert die Relaypins
pinMode(relayPin2, OUTPUT); // "
lcd.init(); //Initialisiert das Display (kommt aus der Libary)
lcd.backlight();
lcd.setCursor(0, 0);
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
}
void loop() {
//Hiermit wird verhindert, dass ein delay verwendet werden muss und das ganze Programm stopt
unsigned long currentMillis = millis();
unsigned long currentMillisTime = millis();
Serial.println(currentMillisTime);
unsigned long currentMillisRel = millis();
if (currentMillis - previousMillis >= intervalTemp) {
previousMillis = currentMillis;
AnalogValue1 = analogRead(pinA2);
AnalogValue2 = analogRead(pinA3);
}
if (currentMillisTime >= (zeitdauer[i])*60000){
digitalWrite(pinG, HIGH);
tone(SPEAKER_PIN,369);
}
if(saveI = !i){
currentMillisTime = 0;
}
if (currentMillisRel - previousMillisRel >= intervalRel) {
previousMillisRel = currentMillisRel;
if (avrgtemp >= temperatur[i]) {
digitalWrite(relayPin1, HIGH); //Steuerung für das Relais
digitalWrite(relayPin2, HIGH);
Serial.print("relaypin1: HIGH");
Serial.print("relaypin2: HIGH");
} else {
digitalWrite(relayPin1, LOW);
digitalWrite(relayPin2, LOW);
Serial.print("relayPin1: LOW");
Serial.print("relayPin2: LOW");
}
}
//Umrechnen des ausgelesenen Widerstandes in Temperatur
temp1 = 0.00002 * AnalogValue2 * AnalogValue2 + 0.0702 * AnalogValue2 + 7.4887; //Für den kurzen fühler (y=0,00002*x^2 + 0,0702x +7 ,4887)
temp2 = 0.000007 * AnalogValue1 * AnalogValue1 + 0.0885 * AnalogValue1 + 2.1218; //für den langen Fühler (y=0.000007x^2 + 0.0885x + 2.1218)
avrgtemp = (temp1 + temp2) / 2; //Berechent durchscnittliche Temperatur aus den 2 Temperaturfühlern
//Zeitprognose
unsigned long currentMillis2 = millis();
temperaturZiel=temperatur[i];
if (currentMillis2 - previousMillis2 >= intervalZeitmessung) {
// save the last time you blinked the LED
zeitMessung1=previousMillis2;
zeitMessung2= currentMillis2;
previousMillis2 = currentMillis2; //previousMillis2 = currentMillis2; stand vorher in der Zeile (habe ich ans Ende verschoben, denke das könnte der Fehler sein)
temperaturMessung2=avrgtemp;
deltaTziel = temperaturZiel-temperaturMessung1;
deltaTstart = temperaturMessung2 - temperaturMessung1;
deltaZeit=zeitMessung2 - zeitMessung1;;
tau = (-(deltaZeit)/log(-((deltaTstart)/(deltaTziel)-1)));
zeit = (5.5* tau)-zeitMessung2;
zeit= zeit/1000; //umrechnen in sekunden
zeit= zeit/60; // umrechnen in minuten
//round(zeit*1); //auf zwei Nachkommastellen runden
temperaturMessung1=temperaturMessung2;
}
if (digitalRead(PIN_TASTER) == LOW) { //Wenn Taster gedrückt, wird i erhöht und nächster Step im Rezept startet
i = i + 1;
lcd.clear();
lcd.setCursor(5, 1);
lcd.print("next Step"); //Das ist die coole "Animation" , wenn man auf die Taste drückt
delay(1500);
lcd.clear();
}
/* if (digitalRead(swPin) == LOW) {
i=i-1;
lcd.clear();
lcd.setCursor(3,1);
lcd.print("previous Step");
delay(1500);
lcd.clear();// Warte kurz, um Flattern zu vermeiden
}*/
lcd.setCursor (0,1);
lcd.print(zusatztext[i]);
lcd.setCursor(0, 2); //Schreibt jedes mal die "Grundstruktur" des Displays auf
lcd.print("Aktuell:");
lcd.setCursor(9, 2);
lcd.print(avrgtemp); //zeigt aktuelle Temperatur auf Display, wie oben beschrieben
lcd.setCursor(15,2);
lcd.print ("C");
lcd.setCursor(0, 3);
lcd.print (zeit);
lcd.setCursor(4, 3);
lcd.print ("min");
lcd.setCursor(8, 3);
lcd.print("bis");
lcd.setCursor(12,3);
lcd.print(temperatur[i]); //Schreibt die Temperatur, die für den Brauvorgang benötigt wird
lcd.setCursor(15,3);
lcd.print("C");
/*lcd.setCursor(0,3);
lcd.print("t bis Soll:");
lcd.setCursor(12, 3);
lcd.print (zeit);*/
/* lcd.setCursor(10, 2);
lcd.print("Grad C"); //Bis hier Grundstruktur*/
lcd.setCursor(3, 0);
lcd.print(Vorgang[i]); //Schreibt den aktuellen Brauvorgang
if (i == SchrittAnzahl) { //Startet Vorgang von neu!
lcd.clear();
i = 0;
}
}