wiedermal millis() ; in anderer Funktion nutzen

Hallo zusammen, ich komme gerade mit millis nicht weiter. Ich verwende es in der loop ohne Probleme aber wenn ich es in einer anderen Funktion verwenden will, klappt es nicht.
Ich möchte in der wcspuelung Funktion eine Sicherheitschaltung einbauen. Also wenn die Funktion aufgerufen wird und es nach 2s immer noch EIN ist, dann soll alles auf null gesetzt werden. Ich glaube das mein Versuch so nicht geht! Wenn ich den Sensor schnell bewege, bleibt wcMAG und pumpe HIGH oder LOW.
Ist es vielleicht sinnvoller die Zeitabfrage weiteroben einzufügen? Muss ich noch irgendwelche Variablen mit übergeben, wenn ich es in anderen Funktionen nutzen will?
BlinkwithoutDelay kenne ich schon. :wink:

 int wcspuelung(int wert_mag)
{	
	if (wert_mag == LOW)
		{
		digitalWrite(wcMAG, HIGH);
		digitalWrite(pumpe, HIGH);
		}
			
		
			if ((millis() - zeitletzterMessung3 >= 1000) && (wert_mag == LOW))
			{
				zeitletzterMessung3 = millis();
				digitalWrite(wcMAG, LOW);
				digitalWrite(pumpe, LOW);
			}
			
	//Serial.println(wert_mag);
}

den gesamten Code habe ich angehängt.
Die Variablentypen werden später noch geändert.

MfG Marco

saalesteuerung_2014.ino (3.18 KB)

Danke Für den gesamten Sketch

Millis() müßte so schon funktionieren.

Die Variable zeitletzterMessung3 wird im Setup und in der Funktion wcspuelung() mit dem aktuellen Wert von millis() geladen.
Die Funktion wcspuelung() wird aber nur bei Änderung des Zustandes auf LOW des Wcfuellsensor aufgerufen.

int wc_wert = Wcfuellsensor.read();	
	if (wc_wert != alt_wc_Wert)
	{
	   if (wc_wert == LOW)
		{
			wcspuelung(wc_wert);
		}		
	alt_wc_Wert = wc_wert;	
	Serial.println(wc_wert);
	 }

Also wird die Funktion wcspuelung() sehr selten aufgerufen (nehme ich mal wegen des Namens an).
Erklährst Du nochmal wie Du Dir die Programmlogik vorstellst.
Kommentierst Du etwas Deinen Sketch? Wenigstens was die Eingänge und Ausgänge bedeuten.

Grüße Uwe

Was mir auffällt: (hat aber mit deinen millis() nix zu tun)

du bildest an verschiedenen Stellen einen Durchschnitt in dem du in einer for schleife einen analogen Wert 20mal ausliest.
Da eine Messung etwa 112µs dauert bekommst du hier einen Mittelwert aus 2,2ms Messdauer.
Besser wäre es meiner Meinung nach, bei jedem Funktionsaufruf nur einmal zu Messen, und nach dem 20. Funktionsaufruf den Mittelwert zu bilden.
also z.B.:

 void aussenlicht() {	
   static int count, lichtSum;	 
		 lichtSum+= analogRead(ldrSensor);
		 count++;
		 if (count >20){
		     count = 0;
	   	     lichtWert = lichtSum/ 20;
 		 ...

Drück mal hin und wieder “Apfel-T”, bzw. “Strg-T” oder “cmd-T”. :expressionless:

Gruß Chris