Die gute alte Temperatursteuerung

Hallo liebe Leute,

EDIT: NEUES PROBLEM -> siehe #40 :frowning:

ich bin im Vergleich zu den anderen hier wahrscheinlich als "blutiger Anfänger" zu bezeichnen.
Dennoch bitte ich Euch um Hilfe.

Die Funktion hinter dem Code soll sein, dass ich über einen Schalter einen gewissen Modus wähle:
Start, Temp1, Temp2, Temp 3, Temp 4, Temp 5 & den Abschalt-Modus.

Es handelt sich hierbei um eine Temperatursteuerung für einen Pelletsgrill. Ich wähle eine vordefinierte Temperatur. (Temp1-5)

Der Lüfter soll immer in Betrieb sein.

Im Start-Modus soll "Heizung" sowie "Schnecke" auf HIGH sein bis ich den Modus wechsle.
In den Temp-Modi soll "Schnecke" HIGH sein bis die definierte Temp erreicht ist. (Abfrage der Temp alle 15sek.)

Das Problem:
Sobald der Sketch hochgeladen wurde sollte ja theoretisch der Lüfter schon auf HIGH sein, ist er aber nicht.
Sobald ich aber einen der 5 Temp-Modi bzw. Start-Modus wähle geht der Lüfter zwar an aber sonst nichts. :slightly_frowning_face:

Entschuldigt die wahrscheinlich viel zu lange schreibweise im Sketch und ignoriert den Abschalt-Modus mit delay(..)

Hoffe ihr könnt mir helfen ::slight_smile:

EDIT: NEUES PROBLEM -> siehe #40 :frowning:
DANKE AN ALLE UNTERSTÜTZER UND DIE, DIE NOCH DAZU KOMMEN

#include <Wire.h>
#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

int Schnecke = 2;
int Heizung = 3;
int Luefter = 4;
int Start = 6;
int Eins = 8;
int Zwei = 10;
int Drei = 11;
int Vier = 12;
int Fuenf = 13;
int Shutdown = 22;
int START;
int EINS;
int ZWEI;
int DREI;
int VIER;
int FUENF;
int SHUTDOWN;
double Temp = 0;
unsigned long prev = 0;
const int intervalTemp = 15000;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(Schnecke, OUTPUT);
pinMode(Heizung, OUTPUT);
pinMode(Luefter, OUTPUT);
pinMode(Start, INPUT);
pinMode(Eins, INPUT);
pinMode(Zwei, INPUT);
pinMode(Drei, INPUT);
pinMode(Vier, INPUT);
pinMode(Shutdown, INPUT);


digitalWrite(Heizung, LOW);
digitalWrite(Schnecke, LOW);
}

void loop() {

unsigned long current = millis();
START = digitalRead(Start);
EINS = digitalRead(Eins);
ZWEI = digitalRead(Zwei);
DREI = digitalRead(Drei);
VIER = digitalRead(Vier);
FUENF = digitalRead(Fuenf);
SHUTDOWN = digitalRead(Fuenf);

digitalWrite(Luefter, HIGH);

// Temperaturmessung
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;

Serial.print(" val=");
Serial.println(Temp);

// Start Modus
if(START == HIGH)
  {
  digitalWrite(Heizung, HIGH);
  digitalWrite(Schnecke, HIGH);
  }
else 
  {
  digitalWrite(Heizung, LOW);
  digitalWrite(Schnecke, LOW);
  }

// Temp1 Modus
if(EINS == HIGH)
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 80)
      digitalWrite(Schnecke, HIGH);
      else
      digitalWrite(Schnecke, LOW);

// Temp2 Modus
if(ZWEI == HIGH)
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 100)
      digitalWrite(Schnecke, HIGH);
      else
      digitalWrite(Schnecke, LOW);

// Temp3 Modus
if(DREI == HIGH)
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 120)
      digitalWrite(Schnecke, HIGH);
      else
      digitalWrite(Schnecke, LOW);

// Temp4 Modus
if(VIER == HIGH)
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 140)
      digitalWrite(Schnecke, HIGH);
      else
      digitalWrite(Schnecke, LOW);
      
// Temp5 Modus
if(FUENF == HIGH);
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 160)
      digitalWrite(Schnecke, HIGH);
      else
      digitalWrite(Schnecke, LOW);
      
// Abschalt-Modus
if(SHUTDOWN == HIGH)
  {
  digitalWrite(Heizung, LOW);
  digitalWrite(Schnecke, LOW);
  digitalWrite(Luefter, LOW);
  }
delay(100);
}

Willkommen im Forum!

if-Syntax
In dem Sketch gibt es gravierende Fehler, vor allem in Verbindung mit "if". Der Code kompiliert zwar, tut aber nicht, was du glaubst.
Das erste Mal (Start Modus) ist die Setzung von geschweiften Klammern und Semikolons noch richtig, danach leider nicht mehr. Zum Beispiel "Temp1 Modus", dein Code:

// Temp1 Modus
if(EINS == HIGH)
  if((millis() - prev) > intervalTemp);
      prev = millis();
      if(Temp < 80)
      digitalWrite(Schnecke, HIGH);
      else
      digitalWrite(Schnecke, LOW);

Richtig müsse es heißen:

// Temp1 Modus
if(EINS == HIGH) {
  if((millis() - prev) > intervalTemp) {
      prev = millis();
      if(Temp < 80)
        digitalWrite(Schnecke, HIGH);
      else
        digitalWrite(Schnecke, LOW);
  }
}

Wenn du ein Semikolon unmittelbar nach der if-Abrfage machst, ist diese praktisch wirkungslos und die Zeilen danach werden immer ausgeführt.
Mehrzeilige Anweisungsblöcke nach dem if-Statement brauchen eine geschweifte Klammer.
Bei den folgenden if-Abfragen ist es auch so - das musst du korrigieren.
Schau dir bitte an, wie die Syntax richtig ist if - Arduino Reference

Hysterese
Eine Temperaturregelung so zu machen (Pseudocode)

if (Temp < 100) {
   schalte die Heizung ein
}
else {
   schalte die Heizung aus
}

ist keine allzu gute Idee.
Du brauchst zumindest Hysterese,
also nicht nur einen Schaltpunkt sondern zwei. Etwa so:

if (Temp < 98) {
   schalte die Heizung ein
}
if (Temp > 102) {
   schalte die Heizung aus
}

So funktionieren auch (einfache) Heizungsregelungen für Wohnungen und Häuser.

Ich vermute, du verwendest einen Drehschalter zur Einstellung des gewünschten Modus.
Frage: Wie sind denn deine Schalter angeschlossen. Verwendest du Pulldown-Widerstände (siehe auch hier)?
Falls nicht, können deine Eingänge zufällige Zustände annehmen, falls ein Eingang "in der Luft hängt".

Edit: Deinen Code nachträglich zu ändern ist fast ein wenig fies ... :slight_smile:

WAHNSINN & das um die Uhrzeit, danke!

Alles klar, extrem dumme Fehler eingebaut.

Sorry, tut mir leid. Dachte nicht, dass sich jemand so viel Mühe gibt.

Derzeitiger Stand:

void loop() {

unsigned long current = millis();
START = digitalRead(Start);
EINS = digitalRead(Eins);
ZWEI = digitalRead(Zwei);
DREI = digitalRead(Drei);
VIER = digitalRead(Vier);
FUENF = digitalRead(Fuenf);
SHUTDOWN = digitalRead(Fuenf);

digitalWrite(Luefter, HIGH);

// Temperaturmessung
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;

Serial.print(" val=");
Serial.println(Temp);

// Start Modus
if(START == HIGH) {
  digitalWrite(Heizung, HIGH);
  digitalWrite(Schnecke, HIGH);
  }

// Temp1 Modus
if(EINS == HIGH) {
  if(current - prev > intervalTemp) {
      prev = current;
      if(Temp < 80)
      digitalWrite(Schnecke, HIGH);
  }
}

Ich habe jetzt bewusst das "else ... low" weggelassen. Vielleicht falscher Gedanke meinerseits aber mal angenommen "START = HIGH" dann sollten "Schnecke" und "Heizung" ebenfalls auf HIGH sein.
Aber zum Beispiel Temp1 wären dann gleichzeitig LOW was bedeuten würde das "else ... Schnecke LOW" wäre. Das widerspricht sich dann doch.

Was auch eigenartig ist, ist das nicht einmal "START" funktioniert. Lüfter ist HIGH und die anderen beiden glimmen oder blinken ganz leicht und unregelmäßig.
Habe die Bauteile Schnecke(Förderschnecke + Motor), Lüfter & Heizung als LED am Breadboard "simuliert".

Drehschalter war geplant, ja. Aber derzeit hat jede Funktion einfach nur ein Kabel. Um die Funktion zu aktivieren stecke ich eines z.B. START an die Stromversorgung. Somit müsste dann START == HIGH sein und alle LEDs leuchten. Tun sie aber nicht ::frowning:

Am Bild: Orange ist START bzw. Pin 6. Dieses Kabel kommt zum Test einfach auf die +Leiste

Nur eine Stil Sache, aber man sollte sich bei der Namensgebung auf einen Stil festlegen und ihn durch das gesamte Projekt beibehalten. In C++ gibt es keinen vorgeschriebenen Stil, sehr verbreitet ist aber z.B.:

lowerCamelCase für alle Variablen und Funktionen
UpperCamelCase für Klassen
UPPERCASE für Makros

Vor allem die kompletten Großbuchstaben für Makros sind in der Arduino Welt etabliert (HIGH, LOW, OUTPUT, INPUT,...). Deshalb würde ich davon absehen noch etwas anderes in komplett Großbuchstaben zu bezeichnen. Das sorgt für Verwirrung.
Hier würde sich z.b. anbieten für die Pin Nummer "pEins" oder "pinEins" zu nehmen, und für den Wert "eins", oder "wertEins".

Vielleicht falscher Gedanke meinerseits aber mal angenommen "START = HIGH" dann sollten "Schnecke" und "Heizung" ebenfalls auf HIGH sein.
Aber zum Beispiel Temp1 wären dann gleichzeitig LOW was bedeuten würde das "else ... Schnecke LOW" wäre. Das widerspricht sich dann doch.

Ist das was du zuletzt gepostet hast nun die gesamte loop()? Denn da wird niemals irgendwas auf LOW gesetzt. Bei START == HIGH gehen Schnecke und Heizung = HIGH, und Temp1 spielt keine Rolle, weil nichts anderes passieren kann als die Schnecke, die schon HIGH ist, nochmal HIGH zu setzen.
Aber richtig, deine Temp1 Prüfung würde alles überschreiben was die Start Prüfung gesetzt hat. Und Temp2 überschriebt Temp1, usw. Das kannst du auf verschiedene Arten verhindern. z.b. indem du statt einzelnen if-Anweisungen eine if - else if - else if - Kette baust. Dann wird nur ein einziger eintretender Fall bearbeitet, wobei die Reihenfolge in der du sie schreibst die Priorität wiedergibt.

Die Intervallsteuerung in deinem ursprünglichen Code kann auch nicht funktionieren. Du prüfst für jeden TempN einzeln ob das Intervall vorbei ist, setzt aber gleich bei Temp1 die prev Variable neu, so dass die Prüfung bei allen weiteren TempN immer negativ ausfällt. Du solltest erst ein einziges Mal prüfen ob das Intervall vorüber ist, und dann innerhalb dieser If-Anweisung die einzelnen TempN prüfen.

ich habe dein Sketch mal ein wenig umgeschrieben und die internen Pullup's aktiviert, d.h. du mußt die Schalter gegen GND schalten.

#include <Wire.h>
#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prev = 0;
const int intervalTemp = 15000;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,     INPUT_PULLUP);
pinMode(zweiPin,     INPUT_PULLUP);
pinMode(dreiPin,     INPUT_PULLUP);
pinMode(vierPin,     INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);


digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =   digitalRead(dreiPin);
vierState =   digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;

Serial.print(" val=");
Serial.println(Temp);

// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }


// Temp1 Modus
if(!einsState)
   {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 80)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
// Temp2 Modus
if(!zweiState)
  {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 100)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
  }
// Temp3 Modus
if(!dreiState)
   {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 120)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
// Temp4 Modus
if(!vierState)
  {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 140)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
  }   
// Temp5 Modus
if(!fuenfState);
  {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 160)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
  } 
// Abschalt-Modus
if(!shutdownState)
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  digitalWrite(luefterPin, LOW);
  }
delay(100);
}

gsezz:
Nur eine Stil Sache, aber man sollte sich bei der Namensgebung auf einen Stil festlegen und ihn durch das gesamte Projekt beibehalten. In C++ gibt es keinen vorgeschriebenen Stil, sehr verbreitet ist aber z.B.:Vor allem die kompletten Großbuchstaben für Makros sind in der Arduino Welt etabliert (HIGH, LOW, OUTPUT, INPUT,...). Deshalb würde ich davon absehen noch etwas anderes in komplett Großbuchstaben zu bezeichnen. Das sorgt für Verwirrung.
Hier würde sich z.b. anbieten für die Pin Nummer "pEins" oder "pinEins" zu nehmen, und für den Wert "eins", oder "wertEins".

Ist das was du zuletzt gepostet hast nun die gesamte loop()? Denn da wird niemals irgendwas auf LOW gesetzt. Bei START == HIGH gehen Schnecke und Heizung = HIGH, und Temp1 spielt keine Rolle, weil nichts anderes passieren kann als die Schnecke, die schon HIGH ist, nochmal HIGH zu setzen.
Aber richtig, deine Temp1 Prüfung würde alles überschreiben was die Start Prüfung gesetzt hat. Und Temp2 überschriebt Temp1, usw. Das kannst du auf verschiedene Arten verhindern. z.b. indem du statt einzelnen if-Anweisungen eine if - else if - else if - Kette baust. Dann wird nur ein einziger eintretender Fall bearbeitet, wobei die Reihenfolge in der du sie schreibst die Priorität wiedergibt.

Die Intervallsteuerung in deinem ursprünglichen Code kann auch nicht funktionieren. Du prüfst für jeden TempN einzeln ob das Intervall vorbei ist, setzt aber gleich bei Temp1 die prev Variable neu, so dass die Prüfung bei allen weiteren TempN immer negativ ausfällt. Du solltest erst ein einziges Mal prüfen ob das Intervall vorüber ist, und dann innerhalb dieser If-Anweisung die einzelnen TempN prüfen.

Vielen Dank!!

ardubu:
ich habe dein Sketch mal ein wenig umgeschrieben und die internen Pullup's aktiviert, d.h. du mußt die Schalter gegen GND schalten.

#include <Wire.h>

#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prev = 0;
const int intervalTemp = 15000;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,     INPUT_PULLUP);
pinMode(zweiPin,     INPUT_PULLUP);
pinMode(dreiPin,     INPUT_PULLUP);
pinMode(vierPin,     INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);

digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =   digitalRead(dreiPin);
vierState =   digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;

Serial.print(" val=");
Serial.println(Temp);

// Start Modus
if(!startState)
 {
 digitalWrite(heizungPin, HIGH);
 digitalWrite(schneckePin, HIGH);
 }

// Temp1 Modus
if(!einsState)
  {
 if(current - prev > intervalTemp);
     prev = current;
     if(Temp < 80)
     digitalWrite(schneckePin, HIGH);
     else
     digitalWrite(schneckePin, LOW);
  }
// Temp2 Modus
if(!zweiState)
 {
 if(current - prev > intervalTemp);
     prev = current;
     if(Temp < 100)
     digitalWrite(schneckePin, HIGH);
     else
     digitalWrite(schneckePin, LOW);
 }
// Temp3 Modus
if(!dreiState)
  {
 if(current - prev > intervalTemp);
     prev = current;
     if(Temp < 120)
     digitalWrite(schneckePin, HIGH);
     else
     digitalWrite(schneckePin, LOW);
  }
// Temp4 Modus
if(!vierState)
 {
 if(current - prev > intervalTemp);
     prev = current;
     if(Temp < 140)
     digitalWrite(schneckePin, HIGH);
     else
     digitalWrite(schneckePin, LOW);
 }  
// Temp5 Modus
if(!fuenfState);
 {
 if(current - prev > intervalTemp);
     prev = current;
     if(Temp < 160)
     digitalWrite(schneckePin, HIGH);
     else
     digitalWrite(schneckePin, LOW);
 }
// Abschalt-Modus
if(!shutdownState)
 {
 digitalWrite(heizungPin, LOW);
 digitalWrite(schneckePin, LOW);
 digitalWrite(luefterPin, LOW);
 }
delay(100);
}

Bin beeindruckt!
DANKE

Habe noch die ein oder andere Frage:

"Luefter" soll immer HIGH sein(ausgenommen SHUTDOWN, da soll er sich nach 10min abschalten)
Wodurch aber wird in deinem Sketch der Lüfter am Beginn auf HIGH gesetzt?

Woran könnte es liegen, dass "schneckePin" im Start-Modus nicht auf HIGH gesetzt wird? (flackert ganz schwach)
Für "heizungPin" funktioniert es perfekt.
In den verschiedenen Temp-Modi funktioniert "schneckePin" auch problemlos.

Wie bekomm ich die Intervalsteuerung zum Laufen?
Möchte am liebsten das delay() am Ende einfach weg und sonst alle 15sek die Temperatur messen.

  • im Shutdown-Modus alles auf LOW ausgenommen "luefterPin", dieser eben erst nach 10min
    Außerdem tut die delay-Funktion den zukünftig verbauten Relais sicher nicht gut.

Die Zeile am Beginn vom loop() verstehe ich leider auch nicht:

if (shutdownState) digitalWrite(luefterPin, HIGH);

Hier nochmal der gesamte, aktuelle Sketch:

#include <Wire.h>
#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prev = 0;
const int intervalTemp = 15000;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,     INPUT_PULLUP);
pinMode(zweiPin,     INPUT_PULLUP);
pinMode(dreiPin,     INPUT_PULLUP);
pinMode(vierPin,     INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);


digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =   digitalRead(dreiPin);
vierState =   digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;

Serial.print(" val=");
Serial.println(Temp);

// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }
else
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  }
  
// Temp1 Modus
if(!einsState)
   {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 80)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
// Temp2 Modus
if(!zweiState)
  {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 100)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
  }
// Temp3 Modus
if(!dreiState)
   {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 120)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
// Temp4 Modus
if(!vierState)
  {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 140)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
  }   
// Temp5 Modus
if(!fuenfState);
  {
  if(current - prev > intervalTemp);
      prev = current;
      if(Temp < 160)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
  } 
// Abschalt-Modus
if(!shutdownState)
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  digitalWrite(luefterPin, LOW);
  }
  delay(100);
}

Ich werde inzwischen weiterhin mein Glück versuchen :smiley:

Alle Probleme gelöst!!!

Dafür ein neues produziert haha.

Und zwar möchte ich, dass als Beispiel im Temp1-Modus die Schnecke aktiv bleibt wenn Temp < 80.
Zum jetzigen Zeitpunkt bewirkt es nur ein kurzes blinken der LED.
Das liegt scheinbar an der millis()-Funktion

Die Idee:

Temp1-Modus ist aktiv.
Temp wird gemessen -> "Temp < 80" -> "schneckePin HIGH" -> 15sek nichts (schneckePin bleibt HIGH) ->
Temp wird erneut gemessen -> "Temp > 80" -> "schneckePin LOW" ... und so weiter

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =   digitalRead(dreiPin);
vierState =   digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung

Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;

Serial.print(" val=");
Serial.println(Temp);

// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }
else
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  }
  
// Temp1 Modus
if(!einsState)
   {
  if(current - prev > intervalTemp)
      {
      prev = current;
      if(Temp < 80)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
      }
   }

mit dieser Zeile
if (shutdownState) digitalWrite(luefterPin, HIGH); schaltest du den Lüfter ein wenn kein Shutdown. Durch die internen Pullup's hast du inverse Logik:

Bei den 5 Zeitberechnungen verwendest du immer die gleiche Variable, du brauchst 5.

so in der Art:

// Temp1 Modus
if(!einsState)
   {
  static uint32_t prev1;
  if(millis() - prev1 > intervalTemp);
      prev1 = millis();
      if(Temp < 80)
      digitalWrite(schneckePin, HIGH);
      else
      if(Temp>81) digitalWrite(schneckePin, LOW);//2 Kelvin Hysterese
   }

ardubu:
so in der Art:

// Temp1 Modus

if(!einsState)
  {
  static uint32_t prev1;
  if(millis() - prev1 > intervalTemp);
      prev1 = millis();
      if(Temp < 80)
      digitalWrite(schneckePin, HIGH);
      else
      if(Temp>81) digitalWrite(schneckePin, LOW);//2 Kelvin Hysterese
  }

Ich habe jetzt die Temperaturmessung getaktet und alle millis-Funktionen aus den Temp-Modi entfernt.
Läuft jetzt genau so wie es soll.

Hysterese wird auch noch eingefügt.

#include <Wire.h>
#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prev = 0;
const int intervalTemp = 5000;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,     INPUT_PULLUP);
pinMode(zweiPin,     INPUT_PULLUP);
pinMode(dreiPin,     INPUT_PULLUP);
pinMode(vierPin,     INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);


digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =   digitalRead(dreiPin);
vierState =   digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung

if(current - prev > intervalTemp)
{
prev = current;
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;
Serial.print(" val=");
Serial.println(Temp);
}



// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }
else
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  }
  
// Temp1 Modus
if(!einsState)
   {
      if(Temp < 80)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Temp2 Modus
if(!zweiState)
   {
      if(Temp < 100)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Temp3 Modus
if(!dreiState)
   {
  if(current - prev > intervalTemp)
   {
      if(Temp < 120)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Temp4 Modus
if(!vierState)
   {
      if(Temp < 140)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Temp5 Modus
if(!fuenfState);
   {
      if(Temp < 160)
      digitalWrite(schneckePin, HIGH);
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Abschalt-Modus
if(!shutdownState)
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  delay(5000);
  digitalWrite(luefterPin, LOW);
  }

}

DANKE

wenn Temp < 80 Schnecke an; Temp > 81 Schnecke aus und sofort wieder an, da Temp < 100.
Die Schnecke geht erst aus, wenn Temp > 160.
dummes Zeug, du hast ja einen anderen Modus.

ardubu:
wenn Temp < 80 Schnecke an; Temp > 81 Schnecke aus und sofort wieder an, da Temp < 100.
Die Schnecke geht erst aus, wenn Temp > 160.
dummes Zeug, du hast ja einen anderen Modus.

Hatte ich noch garnicht gelesen :wink:

Letzte Frage dann bin ich ruhig.

Wie könnte ich den gleichen Tempsensor in den Sketch einbinden und aus beiden einen Mittelwert errechnen?
Er hat die selbe Adresse

Mit der selben Adresse ginge das nur mit sehr viel Aufwand. Ein zweites Interface schreiben, oder die elektrisch Verbinung wechseln. Es gibt doch mehr als genug Tempsensoren, nimm einfach einen anderen.

gsezz:
Mit der selben Adresse ginge das nur mit sehr viel Aufwand. Ein zweites Interface schreiben, oder die elektrisch Verbinung wechseln. Es gibt doch mehr als genug Tempsensoren, nimm einfach einen anderen.

ich bleibe einfach bei einem Sensor :smiley:

NEUES PROBLEMCHEN

Alles lief wie geplant, bis ich drauf gekommen bin, dass es schlecht wäre wenn sich die Förderschnecke sooo lange dreht bis die Temperatur des Pellets-Grill erreicht ist. Inzwischen wäre die Brennkammer 3x übergegangen.

Konkret: INTERVALLSTEUERUNG

IF Temp1 gewählt
IF Temp < 80)

dann dreh dich Schnecke für 15sek, warte 65sek, Temp < 80, dreh dich 15sek, ....

Folgend ein Ausschnitt des relevanten Teils
Recht weit unten findet ihr den Abschnitt "// Temp1 Modus"
und um genau den gehts:

#include <Wire.h>
#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prevT = 0;
unsigned long prevP = 0;
unsigned long prevA = 0;
const int intervalTemp = 2000;
const int intervalPause = 2000;
const int intervalAuger = 2000;

const int prev = 0;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,     INPUT_PULLUP);
pinMode(zweiPin,     INPUT_PULLUP);
pinMode(dreiPin,     INPUT_PULLUP);
pinMode(vierPin,     INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);


digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =   digitalRead(dreiPin);
vierState =   digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung

if(current - prevT > intervalTemp)
{
prevT = current;
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;
Serial.print(" val=");
Serial.println(Temp);
}



// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }
else
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  }
  
// Temp1 Modus
if(!einsState)
  {
  if(Temp < 500)
    {
    if(current - prevP > intervalPause)
      {
      prevP = current;
      digitalWrite(schneckePin, HIGH);
      if(current - prevA >= intervalAuger)
        {        
        prevA = current;
        digitalWrite(schneckePin, LOW);
        }            
      } 
    }    
   else
   digitalWrite(schneckePin, LOW);
   }

ich habe deine Bedingungen mal eingebaut, probier es mal

#include <Wire.h>
#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prevT = 0;
unsigned long prevP = 0;
unsigned long prevA = 0;
const int intervalTemp = 2000;
const int intervalPause = 2000;
const int intervalAuger = 2000;

const int prev = 0;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,     INPUT_PULLUP);
pinMode(zweiPin,     INPUT_PULLUP);
pinMode(dreiPin,     INPUT_PULLUP);
pinMode(vierPin,     INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);


digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =   digitalRead(dreiPin);
vierState =   digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung

if(current - prevT > intervalTemp)
{
prevT = current;
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;
Serial.print(" val=");
Serial.println(Temp);
}



// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }
else
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  }
 
// Temp1 Modus
if(!einsState)
  {
  if(Temp < 80)
    {
     schnecke(15000,65000); // 15 sec. an, 65 sec. aus
    }   
   else
   digitalWrite(schneckePin, LOW);
   }
} 
 void schnecke(const uint16_t onZeit, const uint32_t offZeit)
 {
 digitalWrite(schneckePin,(millis()%(onZeit+offZeit))<onZeit);
 }

ardubu:
ich habe deine Bedingungen mal eingebaut, probier es mal

#include <Wire.h>

#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prevT = 0;
unsigned long prevP = 0;
unsigned long prevA = 0;
const int intervalTemp = 2000;
const int intervalPause = 2000;
const int intervalAuger = 2000;

const int prev = 0;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,    INPUT_PULLUP);
pinMode(zweiPin,    INPUT_PULLUP);
pinMode(dreiPin,    INPUT_PULLUP);
pinMode(vierPin,    INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);

digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =  digitalRead(dreiPin);
vierState =  digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung

if(current - prevT > intervalTemp)
{
prevT = current;
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;
Serial.print(" val=");
Serial.println(Temp);
}

// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }
else
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  }

// Temp1 Modus
if(!einsState)
  {
  if(Temp < 80)
    {
    schnecke(15000,65000); // 15 sec. an, 65 sec. aus
    } 
  else
  digitalWrite(schneckePin, LOW);
  }
}
void schnecke(const uint16_t onZeit, const uint32_t offZeit)
{
digitalWrite(schneckePin,(millis()%(onZeit+offZeit))<onZeit);
}

Danke!
Setze ich „void schnecke“ ans Ende meines Sketches?

Habe ja insgesamt 5 Temp-Modi
(Das einsetzen in alle ist kein Problem!)

  • der Abschaltmodus
    & danach setze ich „void Schnecke“?

Setze ich „void schnecke" ans Ende meines Sketches?

entweder vor Setup, oder nach Loop.
Ich habe extra eine Funktion geschrieben, damit du sie aus allen Temp Modi aufrufen kannst.

ardubu:
ich habe deine Bedingungen mal eingebaut, probier es mal

#include <Wire.h>

#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prevT = 0;
unsigned long prevP = 0;
unsigned long prevA = 0;
const int intervalTemp = 2000;
const int intervalPause = 2000;
const int intervalAuger = 2000;

const int prev = 0;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,    INPUT_PULLUP);
pinMode(zweiPin,    INPUT_PULLUP);
pinMode(dreiPin,    INPUT_PULLUP);
pinMode(vierPin,    INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);

digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =  digitalRead(dreiPin);
vierState =  digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung

if(current - prevT > intervalTemp)
{
prevT = current;
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;
Serial.print(" val=");
Serial.println(Temp);
}

// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }
else
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  }

// Temp1 Modus
if(!einsState)
  {
  if(Temp < 80)
    {
    schnecke(15000,65000); // 15 sec. an, 65 sec. aus
    } 
  else
  digitalWrite(schneckePin, LOW);
  }
}
void schnecke(const uint16_t onZeit, const uint32_t offZeit)
{
digitalWrite(schneckePin,(millis()%(onZeit+offZeit))<onZeit);
}

Läuft perfekt!
Könntest du mir noch in ein paar Wörtern den Hintergrund erklären?
Möchte es verstehen und nicht nur copy paste. :slight_smile:

Jedoch sind leider 2 neue, kleine Fragen aufgetaucht.

  1. Wenn ich den Arduino an die Spannungsversorgung stecke muss ich immer den "Reset"-Button am Board drücken sonst läuft nix. Woran kann das liegen?

  2. Ist jetzt immer "schneckePin = HIGH" ohne aktiviertem Modus trotzdem beim Anschließen bzw nach besagtem "Reset" kurz aktiv und geht nach 2sek aus.

Danke!!

#include <Wire.h>
#define DEV_ID 0x78
int Th,Tl = 0;
double val = 0;

const byte schneckePin = 2;
const byte heizungPin = 3;
const byte luefterPin = 4;
const byte startPin = 6;
const byte einsPin = 8;
const byte zweiPin = 10;
const byte dreiPin = 11;
const byte vierPin = 12;
const byte fuenfPin = 13;
const byte shutdownPin = 22;
bool startState;
bool einsState;
bool zweiState;
bool dreiState;
bool vierState;
bool fuenfState;
bool shutdownState;
double Temp = 0;
unsigned long prevT = 0;
const int intervalTemp = 2000;

const int prev = 0;

void setup() {

Serial.begin(9600);
Wire.begin();

pinMode(schneckePin, OUTPUT);
pinMode(heizungPin,  OUTPUT);
pinMode(luefterPin,  OUTPUT);
pinMode(startPin,    INPUT_PULLUP);
pinMode(einsPin,     INPUT_PULLUP);
pinMode(zweiPin,     INPUT_PULLUP);
pinMode(dreiPin,     INPUT_PULLUP);
pinMode(vierPin,     INPUT_PULLUP);
pinMode(shutdownPin, INPUT_PULLUP);


digitalWrite(heizungPin, LOW);
digitalWrite(schneckePin, LOW);
}

void loop() {

unsigned long current = millis();
startState = digitalRead(startPin);
einsState = digitalRead(einsPin);
zweiState = digitalRead(zweiPin);
dreiState =   digitalRead(dreiPin);
vierState =   digitalRead(vierPin);
fuenfState =  digitalRead(fuenfPin);
shutdownState = digitalRead(shutdownPin);

if (shutdownState) digitalWrite(luefterPin, HIGH);

// Temperaturmessung

if(current - prevT > intervalTemp)
{
prevT = current;
Wire.requestFrom(DEV_ID,2);
Th = Wire.read();
Tl = Wire.read();
Temp = double(((Th<<8 | Tl))/64.0) - 32.0;
Serial.print(" val=");
Serial.println(Temp);
}



// Start Modus
if(!startState)
  {
  digitalWrite(heizungPin, HIGH);
  digitalWrite(schneckePin, HIGH);
  }
else
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  }
  
// Temp1 Modus
if(!einsState)
  {
  if(Temp < 80)
    {
     schnecke(15000,65000); // 15 sec. an, 65 sec. aus
    }   
   else
   digitalWrite(schneckePin, LOW);
   }
   
// Temp2 Modus
if(!zweiState)
   {
      if(Temp < 100)
    {
     schnecke(15000,65000); 
    }
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Temp3 Modus
if(!dreiState)
   {
      if(Temp < 120)
    {
     schnecke(15000,65000);
    }
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Temp4 Modus
if(!vierState)
   {
      if(Temp < 140)
    {
     schnecke(15000,65000);
    }
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Temp5 Modus
if(!fuenfState);
   {
      if(Temp < 160)
    {
     schnecke(15000,65000);
    }
      else
      digitalWrite(schneckePin, LOW);
   }
   
// Abschalt-Modus
if(!shutdownState)
  {
  digitalWrite(heizungPin, LOW);
  digitalWrite(schneckePin, LOW);
  delay(600000);
  digitalWrite(luefterPin, LOW);
  }
}

void schnecke(const uint16_t onZeit, const uint32_t offZeit)
 {
 digitalWrite(schneckePin,(millis()%(onZeit+offZeit))<onZeit);
 }