Go Down

Topic: Zeitsteurung mit millis (Read 122 times) previous topic - next topic

Pauli58

Jan 22, 2018, 06:59 pm Last Edit: Jan 22, 2018, 11:13 pm by uwefed Reason: add CODE TAGs </>
Hallo,

ich möchte ein Ventil nit 2 Zeitvorgaben (Pausenzeit und Betriebszeit) ansteurn, die ich mittels Drehpotensiometer verändern kann. Dazu habe ich folgenden Sketch verfasst.
Die Sensorwerte werden erfasst aber der Relaispin ist immer auf HIGH. Kann den Fehler leider nicht finden.
Die auskommentierte Variante mit delay funktioniert zwar aber eigenartiger Weise nicht den Sensorwerten entsprechend sondern wesentlich langsamer.
Vielleicht kann wer helfen.
Code: [Select]
int PausenGeberPin = A0;
int BetriebszeitGeberPin = A1;
unsigned long PausenDauer = 0;
unsigned long BetriebsDauer = 0;
int RelaisPin = 13;
unsigned long VergangenePausenZeit=0;
unsigned long VergangeneBetriebsZeit=0;

void setup()
{
 Serial.begin(9600);
 pinMode(PausenGeberPin, INPUT);
 pinMode(BetriebszeitGeberPin, INPUT);
 pinMode(RelaisPin, OUTPUT);
}

void loop()
{
 PausenDauer = analogRead(PausenGeberPin)*1.0;
 BetriebsDauer = analogRead(BetriebszeitGeberPin)*1.0;
 Serial.print("PausenDauer: ");
 Serial.println(PausenDauer);
 Serial.print("BetriebsDauer: ");
 Serial.println(BetriebsDauer);
 Serial.println(VergangenePausenZeit);
 Serial.println(VergangeneBetriebsZeit);
 Serial.println("");

 

 if (millis() - VergangenePausenZeit > PausenDauer)
 {
   digitalWrite(RelaisPin, LOW);
   if (millis() - VergangeneBetriebsZeit > BetriebsDauer)
   {
       VergangenePausenZeit = millis();
       VergangeneBetriebsZeit = millis();
       digitalWrite(RelaisPin, HIGH);
    }
 }

 // delay(PausenDauer);
 //digitalWrite(RelaisPin, LOW);
 //delay(BetriebsDauer);
 //digitalWrite(RelaisPin, HIGH);
 
}

MfG

Gerald

combie

#1
Jan 22, 2018, 07:18 pm Last Edit: Jan 22, 2018, 07:22 pm by combie
Quote
Code: [Select]
 

  if (millis() - VergangenePausenZeit > PausenDauer)
  {
    digitalWrite(RelaisPin, LOW);
    if (millis() - VergangeneBetriebsZeit > BetriebsDauer)
    {
        VergangenePausenZeit = millis();
        VergangeneBetriebsZeit = millis();
        digitalWrite(RelaisPin, HIGH);
     }
  }
Diese Verschachtlung dürfte ein Problem darstellen...

Ich könnte dir meine TimerLib anbieten...
Aber ...
Auf der Straße des geringsten Widerstandes versagen die stärksten Bremsen.
Quelle: Stanislaw Jerzy Lec

Pauli58

#2
Jan 22, 2018, 09:44 pm Last Edit: Jan 22, 2018, 11:14 pm by uwefed Reason: add CODE TAGs </>
Habs hinbekommen,

If-Verschachtelung entfernt und in der zweiten Abfage die Zeiten addiert.
Soll mal ein automatischer Kettenöler fürs Motorrad werden.

Code: [Select]
int PausenGeberPin = A0;
int BetriebszeitGeberPin = A1;
unsigned long PausenDauer = 0;
unsigned long BetriebsDauer = 0;
int RelaisPin = 13;
unsigned long VergangeneZeit=0;

void setup()
{
 Serial.begin(9600);
 pinMode(PausenGeberPin, INPUT);
 pinMode(BetriebszeitGeberPin, INPUT);
 pinMode(RelaisPin, OUTPUT);
}

void loop()
{
 PausenDauer = analogRead(PausenGeberPin)*1.0;
 BetriebsDauer = analogRead(BetriebszeitGeberPin)*1.0;
 Serial.print("PausenDauer: ");
 Serial.println(PausenDauer);
 Serial.print("BetriebsDauer: ");
 Serial.println(BetriebsDauer);

 if (millis() - VergangeneZeit > PausenDauer)
 {
   digitalWrite(RelaisPin, LOW);
 }

 if (millis() - VergangeneZeit > PausenDauer+BetriebsDauer)
 {
     VergangeneZeit = millis();
     digitalWrite(RelaisPin, HIGH);
  }
}

Go Up