Pin wieder auf LOW setzen nach fester Zeit

Hi , ich steh gerade auf dem Schlauch und komme nicht weiter.
Mein Problem: ich möchte eine Pumpe einschalten und mach ca.2 Minuten wieder ausschalten.
Mein Problem, ich kann nur millis mit Interval (also Blinking LED) aber das möchte ich nicht. Ich komm nicht drauf, wo die aktulle Zeit gespeichert werden soll, also in welchem Teil vom Code.
Wenn altMillis die Zeit hat und ich komm erst in 1h wieder an die abfrage, dann ist die differenz immer größer und die Pumpe geht wieder aus.
Ich hatte es schon mal hin bekommen, aber ich weiß nicht mehr wie.
Es ist nur ein Auszug vom Code und es geht mir nur darum, wie ich High -> zeit-> Low hinbekomme.

Hilfe :confused:

MfG Marco

void blumenkasten()

{
	static int Blumengiesen = 0;
	static int AltBlumengiesen = 0;
	static int AltBoden_Data = 0;
	static unsigned long aktMillis = 0;
	static unsigned long altMillis = 0;
	static unsigned long GiessZeit = 2000; // gieszeit �ndern
	
	if (Boden_Data != AltBoden_Data)
	{
		
		if (Boden_Data == 0)
		{
			Blumengiesen = 0; // nicht giesen	
		}
		
		if (Boden_Data == 1)
		{
			Blumengiesen = 1; //giesen
			
		}
	
    }
	
	AltBoden_Data = Boden_Data;
	
	if ((Blumengiesen == 1) && (wc_Wert == 1) && (reedSensor_wert == 1))//Blumen trocken-> Blumengiesen = 1 ; wc_Wert ->Sp�lkasten Voll = 1  ; reedSensor Regenfa�  voll = 1;
	{
		BereitZumGiesen = 1; // giesen wasserbedarf
		
	}
	else
	{
		BereitZumGiesen = 0; // irgend eine St�rung oder kein Wasser oder Wc
	}

if (blume_MAG == HIGH) // wenn Pumpen_Pin High ist, dann merke dir die Zeit
{
	//millis() z�hlt von anfang an 
	//hier in eine Variable schreiben bringt nichts
	
	if (millis() - altMillis >= GiesZeit) // wenn 1 Minute High war, dann schalte Pumpen_Pin auf Low
	{									   // bis irgendwann  Pumpen_Pin wieder High ist		
		BereitZumGiesen = 0;
		altMillis = millis();
		// komme ich noch 10 Minuten wieder in diese Funktion, dann ist Gieszeit immer gr��er und der Pin wird wieder Low
	}
	
	
}
	
}

Versteh ich nicht.
millis merken beim Pumpe einschalten. Dann nachschauen ob 2 min vorbei sind. Wenn ja Pumpe aus.

Wo ist das Problem genau?
Bau doch mal nen Sketch der nur das macht, ohne das Zeug drumrum. Dann isses sicher klar wie Kloßbrühe.

Da ich wieder zu faul bin um einen Taster dran zu basteln, erfolgt das Einschalten wenn man irgendein Zeichen auf Serial eingibt:

const unsigned long anZeit = 2 * 1000UL;    //für Minuten nochmal * 60 machen

void setup() 
{
  Serial.begin(9600);

}

void loop() 
{
  static unsigned long einschaltZeitpunkt;
  
  if (Serial.available())
  {
    Serial.read();
    
    Serial.print("Pumpe an: "); Serial.println(millis());
    einschaltZeitpunkt = millis();
  }

  if (einschaltZeitpunkt > 0 && millis() - einschaltZeitpunkt > anZeit)
  {
    Serial.print("Pumpe aus: "); Serial.print(millis());  Serial.print(", Zeit: "); Serial.println(millis() - einschaltZeitpunkt);
    einschaltZeitpunkt = 0;
  }
}

Auf eine extra Variable für den Status der Pumpe habe ich mal verzichtet.

Hier nochmal mit Taster und LED:

const byte pinTaster = 8, pinLED = 13;
bool aktTaster, altTaster;
unsigned long aktMillis, anMillis;
const unsigned long anZeit = 2 * 1000UL;    //für Minuten nochmal * 60 machen

void setup()
{
  pinMode(pinLED, OUTPUT);
  pinMode(pinTaster, INPUT_PULLUP);
  aktTaster = digitalRead(pinTaster);
  altTaster = aktTaster;
}

void loop()
{
  aktMillis = millis();
  altTaster=aktTaster;
  aktTaster = digitalRead(pinTaster);
  if (!altTaster && aktTaster)
  {
    digitalWrite(pinLED, HIGH);
    anMillis = aktMillis;  // diese Zeile startet das Zeitintervall
  }

  if (aktMillis - anMillis >= anZeit)
  {
    // anMillis = aktMillis;  diese Zeile würde zum Blinken führen
    digitalWrite(pinLED, LOW);
  }
}

Hier nochmal mit Taster und LED

agmues Beispiel sollte sogar ohne Entprellen gehen:

2 sek nach Loslassen des Tasters geht die LED wieder aus.

Dank Taster-Prellen geht sie schon beim Drücken an.

Wenn man mutwillig den Taster lange drückt, geht sie auch nach 2 sec Drücken erstmal aus, beim Loslassen dann wieder für 2 sec. an.

michael_x:
agmues Beispiel sollte sogar ohne Entprellen gehen:

Ich liebe feine Ironie. Da wäre das Prellen ja mal richtig nützlich :slight_smile:

Da die meisten Fragesteller "gedrückter Taster = HIGH" denken, werte ich INPUT_PULLUP zum Trotz die steigende Flanke aus. Meine Taster liegen irgendwo in der Starterpaket-Grabbelbox, daher ziehe ich ein Kabel aus dem Steckbrett und vice versa. Funktioniert prima :slight_smile:

Das Bewässerungsprogramm wird vom TO nur fragmentarisch gezeigt, daher vermute ich, es geht nicht um ein Tastersignal, sondern um ein Flag. Und Flags müssen normalerweise nicht entprellt werden. :grin:

Sollte der TO doch einen entprellten Taster benötigen, gibt es ja auch Kondensatoren, bounce-Bibliothek und oder ein kleines delay(30). :wink: