Delay ohne delay

Guten Tag,
Ich habe das problem das mein lcd display bei einer if-abfrage nicht aktualisiert.
Es soll wenn das Arduino angeschlossen wird immer 4 Temperaturen anzeigen, die sich ständig aktualiesieren.
Hier mal der sketch:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 30  // Temperatursensor pin 30
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Sensor1 = {0x28, 0xCD, 0x9B, 0xDA, 0x03, 0x00, 0x00, 0xF2};
DeviceAddress Sensor2 = {0x28, 0x1F, 0xA3, 0xDA, 0x03, 0x00, 0x00, 0xE2};
DeviceAddress Sensor3 = {0x28, 0x2D, 0xB9, 0xDA, 0x03, 0x00, 0x00, 0xA0};
DeviceAddress Sensor4 = {0x28, 0x37, 0x88, 0xDA, 0x03, 0x00, 0x00, 0x7D};

int backLight = 29;
int k1 = 31;   //relais HIGH = Aus; LOW = An
int k2 = 32;   //relais
int k3 = 33; //relais

int knopf1 = 34;
int buttonState = 0; //knopf
int buttonPushCounter = 0; 
int lastButtonState = 0;




void setup() {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
  sensors.begin();
  pinMode(k1, OUTPUT);
  pinMode(k2, OUTPUT);
  pinMode(k3, OUTPUT);
  pinMode(knopf1, INPUT);
  digitalWrite(k1, HIGH);
  digitalWrite(k2, HIGH);
  digitalWrite(k3, HIGH);
 
}

void loop(){
    sensors.requestTemperatures();
  if (sensors.isConnected(Sensor1)){
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print(sensors.getTempC(Sensor1));
  lcd.print("C");
  }else {
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print("AUS   ");}
    
  if (sensors.isConnected(Sensor2)){
    lcd.setCursor(0, 1);
  lcd.print("T2:");
  lcd.print(sensors.getTempC(Sensor2));
  lcd.print("C");
  }else {
    
  lcd.setCursor(0, 1);
  lcd.print("T2:");
  lcd.print("AUS   ");}
  
  if (sensors.isConnected(Sensor3)){
    lcd.setCursor(0, 2);
  lcd.print("T3:");
  lcd.print(sensors.getTempC(Sensor3));
  lcd.print("C");
  }else {
   
  lcd.setCursor(0, 2);
  lcd.print("T3:");
  lcd.print("AUS   ");}
  
  if (sensors.isConnected(Sensor4)){
    lcd.setCursor(0, 3);
  lcd.print("T4:");
  lcd.print(sensors.getTempC(Sensor4));
  lcd.print("C");
  }else {
  lcd.setCursor(0, 3);
  lcd.print("T4:");
  lcd.print("AUS   ");}
  
  
  buttonState = digitalRead(knopf1);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
    } 
    else {}
  }
  lastButtonState = buttonState;
  if (buttonPushCounter % 2 == 0) {
   digitalWrite(k1, HIGH);
} else {
programm1 ();
  }
}

void programm1 (){
 if (sensors.getTempC(Sensor1) >= 27){
   digitalWrite(k1, HIGH);
   
 delay(6000); //60000 millisekunden = 1min
 digitalWrite(k2, LOW);
 digitalWrite(k3, LOW);
 }
   else{digitalWrite(k1, LOW);
 digitalWrite(k2, HIGH);
 digitalWrite(k3, HIGH);}
  
}

So, nun funktioniert alles bis ich das programm1 starte und Sensor1 27° überschreitet, denn geht realis1 aus (HIGH= aus) und nach 6 sek. gehen k2 und k3 an. Aber in diesen 6 sek.(verkürtzter testwert)aktualisiert sich das display nicht, es ist wie eingefrorren.

Was muss ich machen damit das Display zu jeder zeit die aktuell gemessenen Temperaturwerte anzeigt.

Mfg

strohhirn

Hallo Strohirn,

ich würde sagen dein Problem ist :
----------Schnipp -----------Schnapp -------------
delay(6000); //60000 millisekunden = 1min
----------Schnipp -----------Schnapp -------------

im Programm1.

Da frierst du deinen Arduino für 1 Minute ein, wo er nur wartet und nix mehr tut.

Mach das ganze über eine mili() Überwachung und es müsste klappen.

Mfg.

Klaus

entschuldigt die Pingelei.

  delay(6000); //60000 millisekunden = 1min

6000 millisekunden sind 6 Sekunden nicht 60 Sekunden bzw 1 Miunte

strohhirn mach die Wartezeit ohne delay wie im Beispiel http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Da kannst Du die Temperaturwerte updaten und gleichzeitig eine 6 (60) Sekunden Warteschleife haben.

Grüße Uwe

Vielen Dank für die Antworten, aber ich schaffe es nicht das Beispiel "Blink Without Delay" auf meinen sketch zu übertragen.
Kann mir da bitte jemand helfen?

Mfg

strohhirn

Das prinzip habe ich jetzt glaube ich verstanden und es folgendermaßen in meinen sketch eingefügt;

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 30  // Temperatursensor pin 30
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Sensor1 = {0x28, 0xCD, 0x9B, 0xDA, 0x03, 0x00, 0x00, 0xF2};
DeviceAddress Sensor2 = {0x28, 0x1F, 0xA3, 0xDA, 0x03, 0x00, 0x00, 0xE2};
DeviceAddress Sensor3 = {0x28, 0x2D, 0xB9, 0xDA, 0x03, 0x00, 0x00, 0xA0};
DeviceAddress Sensor4 = {0x28, 0x37, 0x88, 0xDA, 0x03, 0x00, 0x00, 0x7D};

int backLight = 29;
int k1 = 31;   //relais HIGH = Aus; LOW = An
int k2 = 32;   //relais
int k3 = 33; //relais

int knopf1 = 34;
int buttonState = 0; //knopf
int buttonPushCounter = 0; 
int lastButtonState = 0;

long previousMillis = 0;
long interval = 60000;

void setup() {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
  sensors.begin();
  pinMode(k1, OUTPUT);
  pinMode(k2, OUTPUT);
  pinMode(k3, OUTPUT);
  pinMode(knopf1, INPUT);
  digitalWrite(k1, HIGH);
  digitalWrite(k2, HIGH);
  digitalWrite(k3, HIGH);
 
}

void loop(){
    sensors.requestTemperatures();
  if (sensors.isConnected(Sensor1)){
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print(sensors.getTempC(Sensor1));
  lcd.print("C");
  }else {
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print("AUS   ");}
    
  if (sensors.isConnected(Sensor2)){
    lcd.setCursor(0, 1);
  lcd.print("T2:");
  lcd.print(sensors.getTempC(Sensor2));
  lcd.print("C");
  }else {
    
  lcd.setCursor(0, 1);
  lcd.print("T2:");
  lcd.print("AUS   ");}
  
  if (sensors.isConnected(Sensor3)){
    lcd.setCursor(0, 2);
  lcd.print("T3:");
  lcd.print(sensors.getTempC(Sensor3));
  lcd.print("C");
  }else {
   
  lcd.setCursor(0, 2);
  lcd.print("T3:");
  lcd.print("AUS   ");}
  
  if (sensors.isConnected(Sensor4)){
    lcd.setCursor(0, 3);
  lcd.print("T4:");
  lcd.print(sensors.getTempC(Sensor4));
  lcd.print("C");
  }else {
  lcd.setCursor(0, 3);
  lcd.print("T4:");
  lcd.print("AUS   ");}
  
  
  buttonState = digitalRead(knopf1);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
    } 
    else {}
  }
  lastButtonState = buttonState;
  if (buttonPushCounter % 2 == 0) {
   digitalWrite(k1, HIGH);
} else {
programm1 ();
  }
}

void programm1 (){
 if (sensors.getTempC(Sensor1) >= 27){
   digitalWrite(k1, HIGH);  
    
    if (millis() - previousMillis > interval) {
    previousMillis = millis();
    
 digitalWrite(k2, LOW);
 digitalWrite(k3, LOW);
   }
    
  } 
else{digitalWrite(k1, LOW);
 digitalWrite(k2, HIGH);
 digitalWrite(k3, HIGH);}
}

Aber irgendwie klappt es nicht. Das Display aktualiesiert sich schon mal während des wartens, das problem ist jetzt aber das nicht 60 sek. gewartet wird so wie ich es im interval vorgegeben habe sondern beliebig.
Mal gehen k2 und k3 nach 30 sek. und mal nach 20 sek. aber sie sollen genau nach 60 sek. angehen.
Also was habe ich jetzt schon wieder falsch gemacht und wie verbessere ich es?

Mfg

strohhrin

Da Du nicht bekannt gegeben hast, was Deine Routine genau tun soll, habe ich einfach mal eine Annahme getroffen und das ausformuliert:

void programm1() {
  static uint32_t previousMillis = 0;
  if (previousMillis == 0) {
    if (sensors.getTempC(Sensor1) >= 27) {
      digitalWrite(k1, HIGH);  
    } else {
      digitalWrite(k1, LOW);
      digitalWrite(k2, HIGH);
      digitalWrite(k3, HIGH);
      previousMillis = millis();
    }
  } else {
    if (millis() - previousMillis > interval) {
      digitalWrite(k2, LOW);
      digitalWrite(k3, LOW);
      previousMillis = 0;
    }
  }
}

Hiermit wird, wenn Sensor1 einen Wert grösser gleich 27 hat, k1 gelöscht und k2/k3 auf HIGH gesetzt. Eine Minute später werden k2/k3 wieder auf LOW gesetzt und die Überprüfung von Sensor1 wieder gestartet. Wenn das nicht Deine Absicht war, musst Du den Code entsprechend anpassen oder uns mitteilen, was der Code tun soll.

Vielen Dank, klappt jetzt endlich so wie ich es wollte. :slight_smile:

Mfg

strohhirn

Ich habe jetzt mal mein programm fortgesetzt:

void programm1 (){ 
 static uint32_t previousMillis = 0;
 if(start<2){
    if (sensors.getTempC(Sensor1) >= 25.8) {
      digitalWrite(k1, HIGH);
      start++;
    } else {
      digitalWrite(k1, LOW);
      digitalWrite(k2, HIGH);
      digitalWrite(k3, HIGH);
      previousMillis = millis();
    }
 }
    if (millis() - previousMillis > interval) {
      digitalWrite(k2, LOW);
      digitalWrite(k3, LOW);
      previousMillis = 0;
      start2++;
    }

if(start2 >1){
    for(int fade = 0 ; fade <= 51; fade +=1) { 
    analogWrite(ledPin, fade);             
    delay(30);
    lcd.setCursor(10, 1);
    lcd.print(fade);
    }
    previousMillis = 0;
   }
    if(millis() - previousMillis > zeit){
    for(int fade = 51 ; fade <= 255; fade +=1) { 
    analogWrite(ledPin, fade);             
    delay(30);
    lcd.setCursor(10, 1);
    lcd.print(fade);
    }
    previousMillis = 0;
   }
   
}

Das gleiche wie bei den relaise habe ich versucht auf die LED zu übertragen. Ich möchte das die led mit ca 1V (51 PWM) aufleuchtet für 30 sek. und denn auf ca 5V (255 PWM) steigt.
Dafür habe ich zeit den wert 31000 zugewiesen. Aber irgendwie klappt es nicht.
Könnt ihr mir sagen was ich falsch gemacht habe?

Mfg

strohhirn

Wie der Name der Variable ja schon andeutet ziehst Du hier den alten millis Wert vom aktuellen millis Wert ab:
if(millis() - previousMillis > zeit){

previousMillis darfst Du somit nicht auf 0 setzen.
Richtig wäre:
previousMillis = millis()

Danke,
so wie ich das jetzt verstanden habe habe ich das so auf mein beispiel übertragen;

void programm1 (){ 
 static uint32_t previousMillis = 0;
 if(start<2){
    if (sensors.getTempC(Sensor1) >= 25.8) {
      digitalWrite(k1, HIGH);
      start++;
    } else {
      digitalWrite(k1, LOW);
      digitalWrite(k2, HIGH);
      digitalWrite(k3, HIGH);
      previousMillis = millis();
    }
 }
    if (millis() - previousMillis > interval) {
      digitalWrite(k2, LOW);
      digitalWrite(k3, LOW);
      
      start2++;
    }

if(start2 >1){
    for(int fade = 0 ; fade <= 51; fade +=1) { 
    analogWrite(ledPin, fade);             
    delay(30);
    lcd.setCursor(10, 1);
    lcd.print(fade);
    }
    previousMillis = millis();
   }
    if(millis() - previousMillis > zeit){
    for(int fade = 51 ; fade <= 255; fade +=1) { 
    analogWrite(ledPin, fade);             
    delay(30);
    lcd.setCursor(10, 1);
    lcd.print(fade);
    }
    
   }
   
}

Aber das klappt auch nicht

Jetzt hast Du den ganzen Prozess etwas komplizierter gemacht, somit funktioniert der Trick mit der Benutzung von previousMillis als Status-Speicher nicht mehr. Du musst eine Variable für den Status einführen, die festhält, in welchem Teil des Prozesses Du (oder besser Dein Arduino) gerade bist.

Du hast so etwas mit "start" und "start2" versucht, aber nicht konsequent durchgezogen. Du musst darauf achten, dass bei jedem Zeitvergleich auch der aktuelle Status verglichen wird. Zudem solltest Du den Status nicht einfach inkrementieren, sondern bewusst auf den nächsten Wert setzen. Also 0 als Startwert, wenn der Temperatur-Sensor angibt, auf 1 setzen, wenn die erste Zeitspanne verronnen ist, die Helligkeit wechseln und den Status auf 2 setzen. Wenn dann die Zeitspanne mit voller Helligkeit vorüber ist, den Status wieder auf 0 setzen, damit das Temperatur-Limit wieder aktiv wird.

Achte darauf, dass Du nach Möglichkeit für einen Prozess auch nur eine Status-Variable hast, sonst wird Dir die Komplexität schnell über den Kopf wachsen.

@pylon
Vielen Dank für deinen Ratschlag, aber ich schaffe es einfach nicht deine Lösungsvorschläge in die Tat umzusetzen könntest du mir bitte anhand eines Beispiels helfen?

Mfg

strohhirn

Ich kann's versuchen, aber formuliere bitte klar, was Du gerne umgesetzt haben willst. Du kannst das in normalem Deutsch machen, aber Du darfst keinen Zustand bzw keine Abhängigkeit vergessen, sonst wird sie nicht im Programm vorkommen.

Ich möchte ,dass das Program beim starten folgendes macht:
1.relais k1 einschalten (LOW = an)
2.wenn Sensor1 25.8 °C erreicht/überschreitet soll k1 aus gehen (HIGH = aus)
3.nachdem k1 aus ist soll eine minute gewartet werden(ohne delay),nach dieser minute sollen relais k2 , k3 und k4 angehen (also LOW)
4.gleichzeitig soll mit den relais k2 und k3 und k4 eine LED mit einem PWM signal von 51 aufleuchten, denn sollen 2min gewartet werden(ohne delay)
5.nach diesen 2 min soll die LED leuchtkraft auf ein PWM signal von 102 steigen,denn sollen 3 min gewartet werden(ohne delay)
6.nach diesen 3 min soll die LED leuchtkraft auf ein PWM signal von 153 steigen,denn sollen 4 min gewartet werden(ohne delay)
7.nach diesen 4 min soll die LED leuchtkraft auf ein PWM signal von 255 steigen und so bleiben bis das programm beendet ist
8.wenn Sensor1 99°C ereicht/überschreitet soll k2 ausgehen (HIGH)
9.denn sollen 5 min gewartet werden(ohne delay)
10.nach diesen 5 min soll k3 und k4 ausgehen(HIGH)
11.wenn nach diesen 5 min k3 un k4 aus sind soll das Programm1 verlassen werden

Das ganze programm soll ohne delay funktionieren da neben bei noch auf einem display die Temperaturen,der Druck (vom mpx 5050dp Luftdrucksensor) und der PWM wert angezeigt werden soll und die während des delay ja auch einfrieren.

Hier einmal mein ganzes bisheriges programm :

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 30  // Temperatursensor pin 30
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Sensor1 = {0x28, 0xCD, 0x9B, 0xDA, 0x03, 0x00, 0x00, 0xF2};
DeviceAddress Sensor2 = {0x28, 0x1F, 0xA3, 0xDA, 0x03, 0x00, 0x00, 0xE2};
DeviceAddress Sensor3 = {0x28, 0x2D, 0xB9, 0xDA, 0x03, 0x00, 0x00, 0xA0};
DeviceAddress Sensor4 = {0x28, 0x37, 0x88, 0xDA, 0x03, 0x00, 0x00, 0x7D};

int backLight = 29;
int k1 = 31;   //relais HIGH = Aus; LOW = An
int k2 = 32;   //relais
int k3 = 33;   //relais
int k4 = 35;   //relais

int knopf1 = 34;
int buttonState = 0; //knopf
int buttonPushCounter = 0; 
int lastButtonState = 0;

long previousMillis = 0;
long interval = 31000;
long zeit = 31000;

int   mpxPin =  5; //drucksensor
int   mpx;
float pkPa;

int ledPin = 9; // (kemo)
int fade;
int start;
int start2;
int start3;
void setup() {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
  sensors.begin();
  pinMode(k1, OUTPUT);
  pinMode(k2, OUTPUT);
  pinMode(k3, OUTPUT);
  pinMode(knopf1, INPUT);
  digitalWrite(k1, HIGH);
  digitalWrite(k2, HIGH);
  digitalWrite(k3, HIGH);
  digitalWrite(k4, HIGH);
  
  int start=0;
  int start2 = 0;
  int start3 = 0;
}

void loop(){
    sensors.requestTemperatures();
    
  if (sensors.isConnected(Sensor1)){
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print(sensors.getTempC(Sensor1));
  lcd.print("C");
  }else {
  lcd.setCursor(0, 0);
  lcd.print("T1:");
  lcd.print("AUS   ");}
    
  if (sensors.isConnected(Sensor2)){
    lcd.setCursor(0, 1);
  lcd.print("T2:");
  lcd.print(sensors.getTempC(Sensor2));
  lcd.print("C");
  }else {
    
  lcd.setCursor(0, 1);
  lcd.print("T2:");
  lcd.print("AUS   ");}
  
  if (sensors.isConnected(Sensor3)){
    lcd.setCursor(0, 2);
  lcd.print("T3:");
  lcd.print(sensors.getTempC(Sensor3));
  lcd.print("C");
  }else {
   
  lcd.setCursor(0, 2);
  lcd.print("T3:");
  lcd.print("AUS   ");}
  
  if (sensors.isConnected(Sensor4)){
    lcd.setCursor(0, 3);
  lcd.print("T4:");
  lcd.print(sensors.getTempC(Sensor4));
  lcd.print("C");
  }else {
  lcd.setCursor(0, 3);
  lcd.print("T4:");
  lcd.print("AUS   ");}
  
  mpx = (float)analogRead(mpxPin);
  pkPa = (mpx/(float)1023-0.04)/0.0018;
  lcd.setCursor(10, 0);
    lcd.print(pkPa);
    lcd.print("mb   ");
   
   lcd.setCursor(10, 1);
  lcd.print(fade); 
    
  buttonState = digitalRead(knopf1);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
    } 
    else {}
  }
  lastButtonState = buttonState;
  if (buttonPushCounter % 2 == 0) {
   digitalWrite(k1, HIGH);
} else {
programm1 ();
  }
}

void programm1 (){ 
 static uint32_t previousMillis = 0;
 if(start<2){
    if (sensors.getTempC(Sensor1) >= 25.8) {
      digitalWrite(k1, HIGH);
      start++;
    } else {
      digitalWrite(k1, LOW);
      digitalWrite(k2, HIGH);
      digitalWrite(k3, HIGH);
      previousMillis = millis();
    }
 }
    if (millis() - previousMillis > interval) {
      digitalWrite(k2, LOW);
      digitalWrite(k3, LOW);
      
      start2++;
    }

if(start2 >1){
    for(int fade = 0 ; fade <= 51; fade +=1) { 
    analogWrite(ledPin, fade);             
    delay(30);
    lcd.setCursor(10, 1);
    lcd.print(fade);
    }
    previousMillis = millis();
   }
    if(millis() - previousMillis > zeit){
    for(int fade = 51 ; fade <= 255; fade +=1) { 
    analogWrite(ledPin, fade);             
    delay(30);
    lcd.setCursor(10, 1);
    lcd.print(fade);
    }
    
   }
   
}

Wenn der Arduino angeht sollen nur auf dem display die ganzen werte angezeigt werden,auf knopfdruck soll denn programm1 starten und jede abfrage soll nur solange wiederhollt werden bis der gewünschte effekt eintrifft z.B. 1.abfrage solange bis k1 = HIGH,dabei sollen auf dem display immer die aktuellen werte(°C,druck,PWM) angezeigt werden.
und nachdem das programm1 verlassen wird sollen weiterhin die aktuellen werte angezeigt werden.
kurz gesagt auf dem display sollen immer die aktuellen werte stehen.

Ich hoffe ich habe alles verständlich beschrieben, ansonsten einfach fragen.

Mfg

strohhirn

Da dürfte dann so aussehen:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 30  // Temperatursensor pin 30
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Sensor[] = {{0x28, 0xCD, 0x9B, 0xDA, 0x03, 0x00, 0x00, 0xF2},
                          {0x28, 0x1F, 0xA3, 0xDA, 0x03, 0x00, 0x00, 0xE2},
                          {0x28, 0x2D, 0xB9, 0xDA, 0x03, 0x00, 0x00, 0xA0},
                          {0x28, 0x37, 0x88, 0xDA, 0x03, 0x00, 0x00, 0x7D}};

int backLight = 29;
uint8_t k[] = {31, 32, 33, 35};   //relais HIGH = Aus; LOW = An

uint8_t knopf1 = 34;
uint8_t buttonState = 0; //knopf
int buttonPushCounter = 0; 
uint8_t lastButtonState = 0;

uint32_t previousMillis = 0;
uint32_t interval = 31000;
uint32_t zeit = 31000;

int   mpxPin =  5; //drucksensor
int   mpx;
float pkPa;

uint8_t ledPin = 9; // (kemo)
uint8_t fade;
uint8_t status;

void setup() {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
  sensors.begin();
  uint8_t i;
  for (i = 0; i < 4; i++) {
    pinMode(k[i], OUTPUT);
    digitalWrite(k[i], HIGH);
  }
  pinMode(knopf1, INPUT);
  
  int status=0;
}

void loop(){
  sensors.requestTemperatures();

  uint8_t i;
  for (i = 0; i < 4; i++) {
    lcd.setCursor(0, i);
    lcd.print("T");
    lcd.print(i+1, DEC);
    lcd.print(":");
    if (sensors.isConnected(Sensor[i])) {
      lcd.print(sensors.getTempC(Sensor[i]));
      lcd.print("C");
    } else {
      lcd.print("AUS   ");
    }
  }
  
  mpx = analogRead(mpxPin);
  pkPa = (mpx/1023.0-0.04)/0.0018;
  lcd.setCursor(10, 0);
  lcd.print(pkPa);
  lcd.print("mb   ");
   
  lcd.setCursor(10, 1);
  lcd.print(fade); 
    
  buttonState = digitalRead(knopf1);
  if (buttonState != lastButtonState && buttonState == HIGH) {
    buttonPushCounter++; 
  }
  lastButtonState = buttonState;
  if (buttonPushCounter % 2 == 0 && status == 0) {
    digitalWrite(k1, HIGH);
  } else {
    programm1();
  }
}

void programm1() { 
  static uint32_t previousMillis = 0;
  static uint32_t thresholdMillis = 0;
  if (sensors.getTempC(Sensor[0]) >= 25.8 && status == 0) {
    digitalWrite(k[0], HIGH);
    status = 1;
    previousMillis = millis();
  } else if (status == 1 && millis() - previousMillis > 60000L) {
    digitalWrite(k[1], LOW);
    digitalWrite(k[2], LOW);
    digitalWrite(k[3], LOW);
    fade = 0;
    analogWrite(ledPin, fade);
    previousMillis = millis();
    status = 2;
  } else if (status == 2 && millis() - previousMillis > 30) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    if (fade >= 51) {
		status = 3;
	}
  } else if (status == 3 && millis() - previousMillis > 120000L) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    status = 4;
  } else if (status == 4 && millis() - previousMillis > 30) {
    previousMillis = millis();
    analogWrite(ledPin ++fade);
    if (fade >= 102) {
      status = 5;
    }
  } else if (status == 5 && millis() - previousMillis > 180000L) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    status = 6;
  } else if (status == 6 && millis() - previousMillis > 30) {
    previousMillis = millis();
    analogWrite(ledPin ++fade);
    if (fade >= 153) {
      status = 7;
    }
  } else if (status == 7 && millis() - previousMillis > 240000L) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    status = 8;
  } else if (status == 8 && millis() - previousMillis > 30) {
    previousMillis = millis();
    analogWrite(ledPin ++fade);
    if (fade >= 255) {
      status = 9;
    }
  }
  if (sensors.getTempC(Sensor[0]) >= 99.0 && thresholdMillis == 0) {
    digitalWrite(k[1], HIGH);
  } else if (thresholdMillis && millis() - thresholdMillis > 300000L) {
    digitalWrite(k[2], HIGH);
    digitalWrite(k[3], HIGH);
    analogWrite(ledPin, 0);
    thresholdMillis = 0;
    previousMillis = 0;
    status = 0;
  }   
}

Also erstmal vielen Dank für deine Mühe, da kann ich mir einiges abschauen.
Ich sitze schon Wochen an diesem sketch und du hast das so schnell hingekriegt. Wow!
Beim start von programm1 geht k[0] nicht an ,aber das habe ich korigiert.
Meine einziges probleme sind :der letzte teil wenn 30°C erreicht werden, denn geht k[1] aus ,aber nach 5 min gehen k[2] und k[3] nicht aus.
Und fade brauch relativ lang um den PWM wert zu erhöhen. Kann man das nicht etwas beschleunigen, sodass der PWM wert schneller steigt?
Und denn wollt ich fragen ob du mir erklären was es mit diesem "uint8_t" aufsich hat. Was bewirkt es?

Mfg

strohhirn

Sollte hier korrigiert sein:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 30  // Temperatursensor pin 30
#define FADE_DELAY 30 // Verzögerung beim Faden
LiquidCrystal lcd(22, 23, 24, 25, 26, 27, 28);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress Sensor[] = {{0x28, 0xCD, 0x9B, 0xDA, 0x03, 0x00, 0x00, 0xF2},
                          {0x28, 0x1F, 0xA3, 0xDA, 0x03, 0x00, 0x00, 0xE2},
                          {0x28, 0x2D, 0xB9, 0xDA, 0x03, 0x00, 0x00, 0xA0},
                          {0x28, 0x37, 0x88, 0xDA, 0x03, 0x00, 0x00, 0x7D}};

int backLight = 29;
uint8_t k[] = {31, 32, 33, 35};   //relais HIGH = Aus; LOW = An

uint8_t knopf1 = 34;
uint8_t buttonState = 0; //knopf
int buttonPushCounter = 0; 
uint8_t lastButtonState = 0;

uint32_t previousMillis = 0;
uint32_t interval = 31000;
uint32_t zeit = 31000;

int   mpxPin =  5; //drucksensor
int   mpx;
float pkPa;

uint8_t ledPin = 9; // (kemo)
uint8_t fade;
uint8_t status;

void setup() {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
  sensors.begin();
  uint8_t i;
  for (i = 0; i < 4; i++) {
    pinMode(k[i], OUTPUT);
    digitalWrite(k[i], HIGH);
  }
  pinMode(knopf1, INPUT);
  
  int status=0;
}

void loop(){
  sensors.requestTemperatures();

  uint8_t i;
  for (i = 0; i < 4; i++) {
    lcd.setCursor(0, i);
    lcd.print("T");
    lcd.print(i+1, DEC);
    lcd.print(":");
    if (sensors.isConnected(Sensor[i])) {
      lcd.print(sensors.getTempC(Sensor[i]));
      lcd.print("C");
    } else {
      lcd.print("AUS   ");
    }
  }
  
  mpx = analogRead(mpxPin);
  pkPa = (mpx/1023.0-0.04)/0.0018;
  lcd.setCursor(10, 0);
  lcd.print(pkPa);
  lcd.print("mb   ");
   
  lcd.setCursor(10, 1);
  lcd.print(fade); 
    
  buttonState = digitalRead(knopf1);
  if (buttonState != lastButtonState && buttonState == HIGH) {
    buttonPushCounter++; 
  }
  lastButtonState = buttonState;
  if (buttonPushCounter % 2 == 0 && status == 0) {
    digitalWrite(k[0], HIGH);
  } else {
    programm1();
  }
}

void programm1() { 
  static uint32_t previousMillis = 0;
  static uint32_t thresholdMillis = 0;
  if (sensors.getTempC(Sensor[0]) >= 25.8 && status == 0) {
    digitalWrite(k[0], HIGH);
    status = 1;
    previousMillis = millis();
  } else if (status == 1 && millis() - previousMillis > 60000L) {
    digitalWrite(k[1], LOW);
    digitalWrite(k[2], LOW);
    digitalWrite(k[3], LOW);
    fade = 0;
    analogWrite(ledPin, fade);
    previousMillis = millis();
    status = 2;
  } else if (status == 2 && millis() - previousMillis > FADE_DELAY) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    if (fade >= 51) {
		status = 3;
	}
  } else if (status == 3 && millis() - previousMillis > 120000L) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    status = 4;
  } else if (status == 4 && millis() - previousMillis > FADE_DELAY) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    if (fade >= 102) {
      status = 5;
    }
  } else if (status == 5 && millis() - previousMillis > 180000L) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    status = 6;
  } else if (status == 6 && millis() - previousMillis > FADE_DELAY) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    if (fade >= 153) {
      status = 7;
    }
  } else if (status == 7 && millis() - previousMillis > 240000L) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    status = 8;
  } else if (status == 8 && millis() - previousMillis > FADE_DELAY) {
    previousMillis = millis();
    analogWrite(ledPin, ++fade);
    if (fade >= 255) {
      status = 9;
    }
  }
  if (sensors.getTempC(Sensor[0]) >= 99.0 && thresholdMillis == 0) {
    digitalWrite(k[1], HIGH);
    thresholdMillis = millis();
  } else if (thresholdMillis && millis() - thresholdMillis > 300000L) {
    digitalWrite(k[2], HIGH);
    digitalWrite(k[3], HIGH);
    analogWrite(ledPin, 0);
    thresholdMillis = 0;
    previousMillis = 0;
    status = 0;
  }   
}

Kann man das nicht etwas beschleunigen, sodass der PWM wert schneller steigt?

Du kannst jetzt den Wert von FADE_DELAY anpassen. Kleinere Werte ergeben eine höhere Geschwindigkeit.

Und denn wollt ich fragen ob du mir erklären was es mit diesem "uint8_t" aufsich hat. Was bewirkt es?

Es ist eine sinnvollere Typ-Deklaration als "unsigned char" für ein Byte.

Edit: added some missing commas in the code.

Hallo wieder,
Ich war leider lange nicht mehr online.
Das ende funktioniert jetzt, aber welchen wert soll ich verändern um das faden zu verschnellern?
Wenn es "#define FADE_DELAY 30 // Verzögerung beim Faden" ist den klappt es schon mal nicht.
Oder welcher wert soll verändert werden ?

Mfg

strohhirn

Doch es ist FADE_DELAY, wenn Du das auf 3 runtersetzt, sollte das Faden ca. 10 Mal schneller sein.

Ich hatte noch einen Kopierfehler ausgemacht, da fehlten einige Kommas, habe ich korrigiert.

Wenn ich es auf 3 runtersetze denn steigt der PW; wert um 1 pro sekunde.
Der Wert soll aber innerhalb von einer oder mehreren sekunden von 0 auf 51 steigen können.
So wie im folgenden beispiel:

for(int fade = 0 ; fade <= 51; fade +=1) { 
    analogWrite(ledPin, fade);             
    delay(30);     
  }