Pages: [1] 2 3   Go Down
Author Topic: Delay ohne delay  (Read 3605 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
#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
« Last Edit: October 04, 2012, 05:47:44 am by strohhirn » Logged

Gruß

strohhirn

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 37
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

< Spannungsfest bis 1000V AC / Getestet bis 400V AC :-) >

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

entschuldigt die Pingelei.

Code:
  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
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Gruß

strohhirn

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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
Logged

Gruß

strohhirn

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4763
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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.
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Mfg

strohhirn
Logged

Gruß

strohhirn

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe jetzt mal mein programm fortgesetzt:
Code:
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
Logged

Gruß

strohhirn

Munich/Germany
Offline Offline
God Member
*****
Karma: 9
Posts: 642
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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()
Logged

_______
Manfred

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke,
so wie ich das jetzt verstanden habe habe ich das so auf mein beispiel übertragen;
Code:
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
Logged

Gruß

strohhirn

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4763
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

Gruß

strohhirn

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4763
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 261
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :

Code:
#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
Logged

Gruß

strohhirn

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4763
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Da dürfte dann so aussehen:

Code:
#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;
  }   
}
Logged

Pages: [1] 2 3   Go Up
Jump to: