#include <EEPROM.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define pinOneWire 13
#define pinMischerAuf 12
#define pinMischerZu 11
class Interval {
private:
unsigned long millisOld = 0;
unsigned long millisInterval = 1;
bool isActiv = false;
public:
Interval() {}
bool test() {
unsigned long millisNow = millis();
if (isActiv && millisNow - millisOld >= millisInterval) {
millisOld = millisNow;
return true;
} else {
return false;
}
}
void stop() {
isActiv = false;
}
void start(unsigned long I) {
unsigned long millisNow = millis();
millisOld = millisNow;
millisInterval = I;
isActiv = true;
}
};
// Setup a OneWire instance to communicate with any OneWire devices
OneWire oneWire(pinOneWire);
// Pass OneWire reference to Dallas Temperature
DallasTemperature TempFuehler(&oneWire);
float TempIst = 0;
float TempSoll = 20;
float ZeitGesamt = 15000;
float ZeitFaktor = 1;
float ZeitFaktor1 = 1;
float ZeitFaktor2 = 10;
float TempDelta1 = 20;
float TempDelta2 = 1;
String StatusMischer = "";
String ps = "0"; // Programmschritt
Interval IntervalAn;
Interval IntervalAus;
struct Einstellungen {
float TempSoll;
float ZeitGesamt;
float ZeitFaktor1;
float ZeitFaktor2;
float TempDelta1;
float TempDelta2;
}
Einstellungen e;
void setup() {
// put your setup code here, to run once:
// pinMode(pinOneWire, INPUT);
pinMode(pinMischerAuf, OUTPUT);
pinMode(pinMischerZu, OUTPUT);
pinMode(pinOneWire, INPUT);
EEPROM.get(0,e);
TempSoll = e.TempSoll;
ZeitGesamt = e.ZeitGesamt;
Serial.begin(115200);
TempFuehler.begin();
IntervalAn.start(ZeitGesamt);
IntervalAus.stop();
}
void loop() {
// put your main code here, to run repeatedly:
gibTemperatur();
gibZeitFaktor();
tueMenu();
tueMischer();
}
float gibTemperatur() {
TempFuehler.requestTemperatures();
TempIst = TempFuehler.getTempCByIndex(0);
}
float gibZeitFaktor() {
float TempDelta = abs(TempIst - TempSoll);
float Faktor = TempDelta / (TempDelta1 - TempDelta2);
ZeitFaktor = (ZeitFaktor1 - ZeitFaktor2) * Faktor + ZeitFaktor2;
if ( ZeitFaktor < ZeitFaktor1) ZeitFaktor = ZeitFaktor1;
if ( ZeitFaktor > ZeitFaktor2) ZeitFaktor = ZeitFaktor2;
return ZeitFaktor;
}
void tueMischer() {
if (IntervalAn.test()) {
if ( TempIst > TempSoll ) {
digitalWrite(pinMischerAuf, LOW);
digitalWrite(pinMischerZu, HIGH);
StatusMischer = "-";
}
if ( TempIst == TempSoll ) {
digitalWrite(pinMischerAuf, LOW);
digitalWrite(pinMischerZu, LOW);
StatusMischer = "=";
}
if ( TempIst < TempSoll ) {
digitalWrite(pinMischerAuf, HIGH);
digitalWrite(pinMischerZu, LOW);
StatusMischer = "+";
}
float ZeitAus = ZeitGesamt / ZeitFaktor;
ZeitAus = ZeitAus > 1000 ? ZeitAus : 1000;
ZeitAus = ZeitGesamt - ZeitAus > 1000 ? ZeitAus : ZeitGesamt - 1000;
IntervalAus.start(ZeitAus);
}
if (IntervalAus.test()) {
IntervalAus.stop();
digitalWrite(pinMischerAuf, LOW);
digitalWrite(pinMischerZu, LOW);
StatusMischer = ".";
}
}
void tueMenu() {
if (ps == "0") {
Serial.println("== Menue ==");
Serial.println("1 - Information");
Serial.println("2 - Einstellungen");
Serial.println("0 - zurück");
Serial.println();
ps = "";
}
if (ps == "1") {
Serial.println("== Information ==");
Serial.println("11 - Temperaturen");
Serial.println("12 - Zeitfaktor");
Serial.println("13 - permanete Ausgabe");
Serial.println("0 - zurück");
Serial.println();
ps = "";
}
if (ps == "11") {
Serial.println("== Temperaturen ==");
Serial.println("Ist-Temperatur: " + (String) TempIst + "°C");
Serial.println("Soll-Temperatur: " + (String) TempSoll + "°C");
Serial.println();
Serial.println("Delta-Temperatur " + (String) (TempIst - TempSoll) + " K");
Serial.println("0 - zurück");
Serial.println();
ps = "";
}
if (ps == "12") {
Serial.println("== Zeitfaktor ==");
Serial.println("Zeitfaktor: " + (String) ZeitFaktor + " *");
Serial.println();
Serial.println("Zeitfaktor 1: " + (String) ZeitFaktor1 + " *");
Serial.println("Zeitfaktor 2: " + (String) ZeitFaktor2 + " *");
Serial.println();
Serial.println("Temperaturdelta 1: " + (String) TempDelta1 + " K");
Serial.println("Temperaturdelta 2: " + (String) TempDelta2 + " K");
Serial.println("0 - zurück");
Serial.println();
ps = "";
}
if (ps == "13") {
Serial.print(TempSoll); Serial.print(",");
Serial.print(TempIst); Serial.print(",");
Serial.print(StatusMischer); Serial.print(",");
Serial.println(ZeitFaktor);
}
if (ps == "2") {
Serial.println("== Einstellungen ==");
Serial.println("21 - Solltemperatur");
Serial.println("22 - Temperaturdelta 1");
Serial.println("23 - Temperaturdelta 2");
Serial.println("24 - ZeitFaktor 1");
Serial.println("25 - ZeitFaktor 2");
Serial.println("0 - zurück");
Serial.println();
ps = "";
}
if (ps == "21") {
Serial.println("== Eingabe ==");
Serial.println("Solltemperatur: " + (String) TempSoll + "°C");
Serial.println("Neuen Wert oder nichts eingeben:");
Serial.println();
ps = "21E";
}
if (ps == "22") {
Serial.println("== Eingabe ==");
Serial.println("Temperaturdelta 1: " + (String) TempDelta1 + "K");
Serial.println("Neuen Wert oder nichts eingeben:");
Serial.println();
ps = "22E";
}
if (ps == "23") {
Serial.println("== Eingabe ==");
Serial.println("Temperaturdelta 2: " + (String) TempDelta2 + "K");
Serial.println("Neuen Wert oder nichts eingeben:");
Serial.println();
ps = "23E";
}
if (ps == "24") {
Serial.println("== Eingabe ==");
Serial.println("ZeitFaktor 1: " + (String) ZeitFaktor1 + "/min");
Serial.println("Neuen Wert oder nichts eingeben:");
Serial.println();
ps = "24E";
}
if (ps == "25") {
Serial.println("\== Eingabe ==");
Serial.println("ZeitFaktor 2: " + (String) ZeitFaktor2 + "/min");
Serial.println("Neuen Wert oder nichts eingeben:");
Serial.println();
ps = "25E";
}
// Eingabe und Speicherung
if (Serial.available() > 0) {
String Eingabe;
Eingabe = Serial.readString();
Eingabe.trim();
if (ps == "21E") {
if (Eingabe != "") TempSoll = Eingabe.toFloat();
Eingabe = "2";
}
if (ps == "22E") {
if (Eingabe != "") TempDelta1 = Eingabe.toFloat();
Eingabe = "2";
}
if (ps == "23E") {
if (Eingabe != "") TempDelta2 = Eingabe.toFloat();
Eingabe = "2";
}
if (ps == "24E") {
if (Eingabe != "") ZeitFaktor1 = Eingabe.toFloat();
Eingabe = "2";
}
if (ps == "25E") {
if (Eingabe != "") ZeitFaktor2 = Eingabe.toFloat();
Eingabe = "2";
}
ps = Eingabe;
}
}
Loading
ds18b20
ds18b20