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

Ich habe jetzt mal die bibliothek aktualisiert und das neu programm ausprobiert.
Das faden geht geht jetzt wirklich schneller und die anzeige aktualisiert sich auch, aber den knopf kann ich nur zum anschalten benutzen nicht zum ausschalten während des programmes.
Wenn ich die verzögerung beim faden auf 3 stelle denn braucht es 8 sek um von 0 auf 51 zu faden, diese 8 sek verschieben aber auf dauer alles.
Währe es nicht möglich einfach folgendes einzufügen:
Code:
for(int fade = 51 ; fade <= 102; fade +=1) {
    analogWrite(ledPin, fade);             
    delay(30);   
  }
Das dauert nur 1 sek.
Desweitern wird der fadewert zum schluss nicht auf 0 gesetzt.
Verzei mir bitte meine pingeligkeit.
Ich danke dir für deine Arbeit und weiß deine Mühe zu schätzen.
Logged

Gruß

strohhirn

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Das dauert nur 1 sek.

Das dauert zum einen über 1.5s, zum anderen wird dann wieder alles gestoppt.

Quote
Ich habe jetzt mal die bibliothek aktualisiert und das neu programm ausprobiert.

Welche Version? Diejenige von mir oder die angepasste mit der Bibliotheksfunktion?

Quote
aber den knopf kann ich nur zum anschalten benutzen nicht zum ausschalten während des programmes

Davon wusste ich nichts. Was soll denn ausgeschaltet werden? Alles, also eine Art Reset-Knopf? Vergiss nicht, wir wissen immer noch nicht, wozu das alles dienen soll.

Quote
Wenn ich die verzögerung beim faden auf 3 stelle denn braucht es 8 sek um von 0 auf 51 zu faden, diese 8 sek verschieben aber auf dauer alles.

Das ist so, ist aber auch sehr seltsam. Wir müssten jetzt herausfinden, was soviel Zeit braucht.
Versuche mal, die loop()-Funktion durch diese hier auszutauschen:

Code:
void loop(){
  // check if conversion is done
  static uint32_t sensorTime = millis() + 200;
  if (millis() > sensorTime && oneWire.read_bit()) {

    uint8_t i;
    sensorTime += 200;
    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   ");
      }
    }
    // start next conversion
    sensors.requestTemperatures();
 
    mpx = analogRead(mpxPin);
    pkPa = (mpx/1023.0-0.04)/0.0018;
    lcd.setCursor(10, 0);
    lcd.print(pkPa);
    lcd.print("mb   ");
  }
   
  buttonState = digitalRead(knopf1);
  if (buttonState != lastButtonState && buttonState == HIGH) {
    buttonPushCounter++;
  }
  lastButtonState = buttonState;
  if (buttonPushCounter % 2 == 0 && status == 0) {
    digitalWrite(k[0], HIGH);
  } else {
    programm1();
  }
}

Dadurch wird die Temperatur höchstens alle 0.2s ermittelt, selbst wenn eine höhere Rate möglich wäre. Das sollte die Fades deutlich beschleunigen und trotzdem einen häufigen Update des Displays ermöglichen.

Quote
Desweitern wird der fadewert zum schluss nicht auf 0 gesetzt.

Das wird er doch auch bei der meiner Lösung nicht. Oder verstehe ich da auch etwas falsch?
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe jetzt die aktuelle version der DallasTemperatue-Bibliothek : 372Beta
Ich hatte das programm mit dem code "if (oneWire.read_bit()) {" benutzt.
Mit dem neuen programm geht das auf jedenfall schon deutlich schneller , nur noch 3,6 sek um von 0 auf 51 zu kommen, das ist aber immerboch ziemlich viel.
Verzeihung fals ich etwas noch nicht erwähnt habe.
Ich möchte den knopf als an und ausschalt knopf für das programm1 benutzen. d.h. der knopf soll beim drücken während des proggrammes1 als eine art reset knopf fungieren.
Und wenn das programm1 am ende ist soll das programm1 resetet werden (also auch fade auf 0) und verlassen werden, so das ich es wiederverwenden kann wenn ich den knopf drücke.
Eigentlich wollte ich das programm auch  an einer beliebigen  stelle pausieren und fortsetzen können, aber das wurde mir als unmöglich erklärt, deswegen habe ich mir das erst mal aus dem kopf geschlagen.
Logged

Gruß

strohhirn

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Und wenn das programm1 am ende ist soll das programm1 resetet werden (also auch fade auf 0) und verlassen werden, so das ich es wiederverwenden kann wenn ich den knopf drücke.

Definiere "am Ende ist". Ist das gleich Status 9 erreicht? Vergiss nicht, die Routine programm1 wird jetzt mehrere zehntausend Mal durchlaufen, bevor Status 9 erreicht ist.

Quote
Mit dem neuen programm geht das auf jedenfall schon deutlich schneller , nur noch 3,6 sek um von 0 auf 51 zu kommen, das ist aber immerboch ziemlich viel.

Mit der Änderung aus dem letzten Post?

Hier die Version von loop(), die den Knopf als Status-Reset walten lässt.

Code:
void loop(){
  // check if conversion is done
  static uint32_t sensorTime = millis() + 200;
  if (millis() > sensorTime && oneWire.read_bit()) {

    uint8_t i;
    sensorTime += 200;
    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   ");
      }
    }
    // start next conversion
    sensors.requestTemperatures();
 
    mpx = analogRead(mpxPin);
    pkPa = (mpx/1023.0-0.04)/0.0018;
    lcd.setCursor(10, 0);
    lcd.print(pkPa);
    lcd.print("mb   ");
  }
   
  buttonState = digitalRead(knopf1);
  if (buttonState != lastButtonState && buttonState == HIGH) {
    buttonPushCounter++;
  }
  lastButtonState = buttonState;
  if (buttonPushCounter % 2 == 0) {
    status = 0;
    analogWrite(ledPin, 0);
    digitalWrite(k[0], HIGH);
  } else {
    programm1();
  }
}

Quote
Eigentlich wollte ich das programm auch  an einer beliebigen  stelle pausieren und fortsetzen können, aber das wurde mir als unmöglich erklärt, deswegen habe ich mir das erst mal aus dem kopf geschlagen.

Mit der jetzigen Struktur sollte das eigentlich problemlos möglich sein. Definiere aber bitte, was Du unter pausieren verstehst. Was genau soll pausieren? Der ganze Sketch? Nur der Status der Subroutine "programm1"?
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das ende des programmes ist:
Code:
if (sensors.getTempC(Sensor[0]) >= 28.0 && thresholdMillis == 0) {
    digitalWrite(k[1], HIGH);
    thresholdMillis = millis() + 60000L;
  } else if (thresholdMillis && millis() > thresholdMillis) {
    digitalWrite(k[2], HIGH);
    digitalWrite(k[3], HIGH);
    analogWrite(ledPin, 0);
    thresholdMillis = 0;
    nextMillis = 0;
    status = 0;
  }   
}
wenn dieser teil zu ende ist also status = 0;

Quote
Mit der Änderung aus dem letzten Post?
Ja mit der änderung aus dem letzten post.
Quote
Definiere aber bitte, was Du unter pausieren verstehst.
Ich wollte anfangs das ich nur das programm1 an einer beliebigen stelle anhalten kann z.B fade ist auf 51 und es muss 2 min gewartet werden bis es sich auf 102 steigert, bei 1,20 min drücke ich den pausen/start knopf, das programm bleibt an dieser stelle stehen, das display aktualisiert sich weiterhin, nach ner beliebigen zeit drücke ich wieder den knopf und das programm geht an der pausierten stelle weiter also wartet es die  restlichen 0,8 min. So würde ich das gerne haben. Ist das möglich?
Und der reset knopf während des programms funktioniert auch nicht, die led fadet komischerweise nicht und die relais ( k1,..) bleiben auch an.
Logged

Gruß

strohhirn

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Und wenn das programm1 am ende ist soll das programm1 resetet werden (also auch fade auf 0) und verlassen werden, so das ich es wiederverwenden kann wenn ich den knopf drücke.

Nach Deiner Definition von Ende passiert das bereits:

Code:
analogWrite(ledPin, 0);

Die Variable wird zwar nicht auf 0 gesetzt, das passiert aber beim nächsten Durchlaufen der Routine programm1 automatisch, wenn sie wieder gebraucht wird.

Quote
Und der reset knopf während des programms funktioniert auch nicht, die led fadet komischerweise nicht und die relais ( k1,..) bleiben auch an.

Ich denke, es wird Zeit, dass Du erklärst, wass die Relais machen, welche Temperatur wofür gemessen wird, etc. Damit kann ich mir ein Bild machen, was das eigentlich abläuft und kann erkennen, was sinnvoll ist. Im Moment ist das Programm so gestaltet, dass es das macht, was Du beschrieben hast. Da Deine Beschreibung scheinbar nur einen Teil der Wirklichkeit enthält, macht das Programm noch nicht was Du willst. Das bessert sich hoffentlich, wenn ich auch verstehe, was dahinter steckt.

Diese Version sollte Deine Pause enthalten, Du musst aber einen neuen Taster für die Pause anschliessen.
Code:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h>


#define ONE_WIRE_BUS 30  // Temperatursensor pin 30
#define FADE_DELAY 3 // Verzögerung beim Faden
#define SENSOR_PERIODE 400 // wie oft werden die Sensoren ausgelesen
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 startButton = 34;
uint8_t pauseButton = 30;
uint8_t startButtonPushCounter = 0;
uint8_t pauseButtonPushCounter = 0;
uint8_t lastStartButtonState = 0;
uint8_t lastPauseButtonState = 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;
uint32_t sensorTime = 0;
uint32_t nextMillis = 0;
uint32_t thresholdMillis = 0;
uint32_t nmSave = 0;
uint32_t tmSave = 0;

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);
 
  status=0;
  sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  sensorTime = millis() + SENSOR_PERIODE;
}

void loop(){
  // check if conversion is done
  if (millis() > sensorTime && oneWire.read_bit()) {

    uint8_t i;
    sensorTime += SENSOR_PERIODE;
    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   ");
      }
    }
    // start next conversion
    sensors.requestTemperatures();
 
    mpx = analogRead(mpxPin);
    pkPa = (mpx/1023.0-0.04)/0.0018;
    lcd.setCursor(10, 0);
    lcd.print(pkPa);
    lcd.print("mb   ");
  }
   
  uint8_t buttonState = digitalRead(startButton);
  if (buttonState != lastStartButtonState && buttonState == HIGH) {
    startButtonPushCounter++;
  }
  lastStartButtonState = buttonState;
  buttonState = digitalRead(pauseButton);
  if (buttonState != lastPauseButtonState && buttonState == HIGH) {
    pauseButtonPushCounter++;
  }
  lastPauseButtonState = buttonState;

  if (pauseButtonPushCounter & 0x01) {
    // activate paused state
    nmSaved = nextMillis;
    nextMillis = 0;
    tmSaved = thresholdMillis;
    thresholdMillis = 0;
  } else {
    // recover after paused state
    nextMillis = nmSaved;
    nmSaved = 0;
    thresholdMillis = tmSaved;
    tmSaved = 0;
  }
  if (startButtonPushCounter & 0x01 == 0) {
    // deactivate all relays, turn off LED and reset status
    status = 0;
    analogWrite(ledPin, 0);
    for (uint8_t i = 0; i < 4; i++) {
      digitalWrite(k[i], HIGH);
    }
  } else if (nmSaved == 0) { // run programm1 only if not in paused state
    programm1();
  }
}

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

Offline Offline
Sr. Member
****
Karma: 8
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Relais k1 schaltet eine heizung an die ja solange heizt bis 25,8°C ereicht werden denn wird sie aus geschaltet und nach 1 min schalten sich k2-4 an, k2 ist eine andere Heizung bei der die stromstärke dur fade reguliert wird, k3 ist ein lüfter und für k4 habe ich erst mal keine verwendung.Die temperatur sensoren dienen der überwachung der heizungen, wobei sensor1 ja am wichtigsten sind die anderen dienen nur der information genauso wie der drucksensor.

Das neue programm hat einen paar fehler, programm1 ist sofort an ohne knopfdruck und sobald gefadet wird klettert der wert gleich auf 255 ohne zwischenpausen und der pausenknopf, den ich an pin 36 angeschlossen habe und mit einem 10k wiederstand versehen habe, funktioniert auch nicht.

kleine randbemerkungen:
in den letzten programmen hast du immer die fade anzeige vergessen:
Code:
lcd.setCursor(10, 1);
  lcd.print(fade);
und eigentlich soll ja beim programm1 start immer k1 angehen, aber da habe ich mir immer so weitergeholfen:
Code:
if(start < 2){
    digitalWrite(k[0], LOW);
    start++;
  }
Und weiterhin Danke für deine Mühe und Hilfe.
Logged

Gruß

strohhirn

Switzerland
Offline Offline
Faraday Member
**
Karma: 108
Posts: 5144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier eine leicht korrigierte und kommentierte Fassung:

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


#define ONE_WIRE_BUS 30  // Temperatursensor pin 30
#define FADE_DELAY 3 // Verzögerung beim Faden
#define SENSOR_PERIODE 400 // wie oft werden die Sensoren ausgelesen
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 startButton = 34; // Startknopf an Pin 34
uint8_t pauseButton = 30; // Pauseknopf an Pin 30
uint8_t startButtonPushCounter = 0;
uint8_t pauseButtonPushCounter = 0;
uint8_t lastStartButtonState = 0;
uint8_t lastPauseButtonState = 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;
uint32_t sensorTime = 0;
uint32_t nextMillis = 0;
uint32_t thresholdMillis = 0;
uint32_t nmSave = 0;
uint32_t tmSave = 0;

void setup() {
  pinMode(backLight, OUTPUT);
  digitalWrite(backLight, HIGH);
  lcd.begin(20, 4);
  sensors.begin();
  uint8_t i;
  // all relays off (HIGH)
  for (i = 0; i < 4; i++) {
    pinMode(k[i], OUTPUT);
    digitalWrite(k[i], HIGH);
  }
  // button pins must be inputs
  pinMode(startButton, INPUT);
  pinMode(pauseButton, INPUT);
 
  status=0;
  sensors.setWaitForConversion(false);
  sensors.requestTemperatures();
  sensorTime = millis() + SENSOR_PERIODE;
}

void loop(){
  // check if conversion is done
  if (millis() > sensorTime && oneWire.read_bit()) {

    uint8_t i;
    sensorTime += SENSOR_PERIODE;
    // display values of all 4 temp sensors
    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   ");
      }
    }
    // start next conversion
    sensors.requestTemperatures();

    // display pressure value
    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);
  }

  // check start button
  uint8_t buttonState = digitalRead(startButton);
  if (buttonState != lastStartButtonState && buttonState == HIGH) {
    startButtonPushCounter++;
  }
  lastStartButtonState = buttonState;
  // check pause button
  buttonState = digitalRead(pauseButton);
  if (buttonState != lastPauseButtonState && buttonState == HIGH) {
    pauseButtonPushCounter++;
  }
  lastPauseButtonState = buttonState;

  if (pauseButtonPushCounter & 0x01) {
    // activate paused state
    nmSaved = nextMillis;
    nextMillis = 0;
    tmSaved = thresholdMillis;
    thresholdMillis = 0;
  } else {
    // recover after paused state
    nextMillis = nmSaved;
    nmSaved = 0;
    thresholdMillis = tmSaved;
    tmSaved = 0;
  }
  if (startButtonPushCounter & 0x01 == 0) {
    // deactivate all relays, turn off LED and reset status
    status = 0;
    analogWrite(ledPin, 0); // turn LED off
    for (uint8_t i = 0; i < 4; i++) {
      digitalWrite(k[i], HIGH); // turn all relays off
    }
  } else if (nmSaved == 0) { // run programm1 only if not in paused state
    programm1();
  }
}

void programm1() {
  if (sensors.getTempC(Sensor[0]) >= 25.8 && status == 0) {
// temp above 25.8 degrees and heating, turn R1 off
    digitalWrite(k[0], HIGH);
    status = 1;
    nextMillis = millis() + 60000L; // next state in 1 min
  } else if (status == 0) {
    // heat
    digitalWrite(k[0], LOW); // turn R1 on
  } else if (status == 1 && millis() > nextMillis) {
    // turn R2-4 on
    digitalWrite(k[1], LOW);
    digitalWrite(k[2], LOW);
    digitalWrite(k[3], LOW);
    fade = 0;
    analogWrite(ledPin, fade); // start fade loop
    nextMillis += FADE_DELAY;
    status = 2;
  } else if (status == 2 && millis() > nextMillis) {
    // fade loop
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    if (fade >= 51) {
      // fade value reached, next state
      status = 3;
      nextMillis = millis() + 120000L; // next state in 2 min
}
  } else if (status == 3 && millis() > nextMillis) {
    // start next fade loop
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    status = 4;
  } else if (status == 4 && millis() > nextMillis) {
    // fade loop
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    if (fade >= 102) {
      // fade value reached, next state
      status = 5;
      nextMillis = millis() + 180000L; // next state in 3 min
    }
  } else if (status == 5 && millis() > nextMillis) {
    // start next fade loop
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    status = 6;
  } else if (status == 6 && millis() > nextMillis) {
    // fade loop
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    if (fade >= 153) {
      // fade value reached, next state
      status = 7;
      nextMillis = millis() + 240000L; // next state in 4 min
    }
  } else if (status == 7 && millis() > nextMillis) {
    // start next fade loop
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    status = 8;
  } else if (status == 8 && millis() > nextMillis) {
    // fade loop
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    if (fade >= 255) {
      // fade value reached, next state and stay there
      status = 9;
    }
  }
  if (sensors.getTempC(Sensor[0]) >= 99.0 && thresholdMillis == 0) {
    // temp over 99 degrees, turn off R2
    digitalWrite(k[1], HIGH);
    thresholdMillis = millis() + 300000L; // next action in 5 min
  } else if (thresholdMillis && millis() > thresholdMillis) {
    // turn off R3 and R4, turn off LED, reset all states
    digitalWrite(k[2], HIGH);
    digitalWrite(k[3], HIGH);
    analogWrite(ledPin, 0);
    thresholdMillis = 0;
    nextMillis = 0;
    status = 0;
  }   
}

Mit den Kommentaren solltest Du in der Lage sein, weitere Änderungen selbst vorzunehmen. Dieses Forum ist eigentlich kein Programmierservice, sondern soll Hilfestellungen geben.
Die Fade-Zeiten kannst Du, wie erwähnt mittels verändern der Konstante FADE_DELAY selbst verändern.

Quote
der pausenknopf, den ich an pin 36 angeschlossen habe und mit einem 10k wiederstand versehen habe, funktioniert auch nicht.

Der Knopf kommt an Pin 30 (nach meinem Sketch). Von wo nach wo geht denn der 10k Widerstand?

Code:
if(start < 2){
    digitalWrite(k[0], LOW);
    start++;
  }

Dieser Code macht gar nichts, da die Variable start nicht definiert ist. Dies sollte einen Compiler-Fehler produzieren.
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 287
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
verzeihung das ich so lange nicht mehr zurückgeschrieben habe.Hab einfach kurz mal pause gemacht und mir das alles in ruhe angeschaut.
Quote
Dieses Forum ist eigentlich kein Programmierservice, sondern soll Hilfestellungen geben.
Ja ich weiss, anfangs war meine frage ja eigentlich nur wie man delay ohne delay hinbekommt, aber irgendwie hat sich das ganze ausgeweitet.
Quote
Der Knopf kommt an Pin 30 (nach meinem Sketch).
Selbstverständlich habe ich auch die entsprechende pin nummer im sketch auf 36 geändert. Und der Wiederstand geht vom GND des arduino zum knopfpin von dem auch ein kabel zum pin 36 führt.
Quote
Dieser Code macht gar nichts, da die Variable start nicht definiert ist.
Natürlich habe ich die variablenn definiert, ich habe es bloß nicht aufgeschrieben weil ich dachte das wäre selbstverständlich.

Mir ist aufgefallen das du den code für die knöpfe verändert hast, weswegen sie wahrscheinlich nicht funktionieren, denn das programm1 ist beim anschalten des arduino sofort an und lässt sich weder ausschalten noch pausieren.
Das programm1 läuft zwar aber ohne wartezeiten, d.h. nachdem k[0] ausgeganden ist und k[1-3] angehen, fadet die led in einer tour durch ohne wartezeiten.
Könnte das vielleicht daran liegen das du folgendes:
Code:
else if (status == 3 && millis() - previousMillis > 60000L)
beim aktuellsten sketch durch:
Code:
else if (status == 3 && millis() > nextMillis)
ersetzt hast?
Das mit den statusen habe ich jetzt einiger maßen verstanden deswegen habe ich programm1 ganz am anfang verändert, da ja beim start von programm1 k[0] angehen soll:
Code:
void programm1() {
  if (status == 0){
    digitalWrite(k[0], LOW);
    status = 1;
  } else if (sensors.getTempC(Sensor[0]) >= 25.8 && status == 1) {
    digitalWrite(k[0], HIGH);
    status = 2;
    nextMillis = millis() + 60000L;
  } else if (status == 2 && millis() > nextMillis) {
    digitalWrite(k[1], LOW);
    digitalWrite(k[2], LOW);
    digitalWrite(k[3], LOW);
    fade = 0;
    analogWrite(ledPin, fade);
    nextMillis += FADE_DELAY;
    status = 3;
  } else if (status == 3 && millis() > nextMillis) {
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    if (fade >= 51) {
status = 4;
nextMillis = millis() + 120000L;
}
  } else if (status == 4 && millis() > nextMillis) {
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    status = 5;
  } else if (status == 5 && millis() > nextMillis) {
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    if (fade >= 102) {
      status = 6;
      nextMillis = millis() + 180000L;
    }
  } else if (status == 6 && millis() > nextMillis) {
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    status = 7;
  } else if (status == 7 && millis() > nextMillis) {
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    if (fade >= 153) {
      status = 8;
      nextMillis = millis() + 240000L;
    }
  } else if (status == 8 && millis() > nextMillis) {
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    status = 9;
  } else if (status == 9 && millis() > nextMillis) {
    nextMillis += FADE_DELAY;
    analogWrite(ledPin, ++fade);
    if (fade >= 255) {
      status = 10;
    }
  }
  if (sensors.getTempC(Sensor[0]) >= 30.0 && thresholdMillis == 0) {
    digitalWrite(k[1], HIGH);
    thresholdMillis = millis() + 300000L;
  } else if (thresholdMillis && millis() > thresholdMillis) {
    digitalWrite(k[2], HIGH);
    digitalWrite(k[3], HIGH);
    analogWrite(ledPin, 0);
    thresholdMillis = 0;
    nextMillis = 0;
    status = 0;
  }  
}
« Last Edit: November 27, 2012, 12:20:46 pm by strohhirn » Logged

Gruß

strohhirn

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