Funktion PIR pumpe mit millis()

hallo

versucher gerade mit hilfe von Millis eine pumpe zusteuern. Zirkkulationspumpe soll nur alle 30min für 3 minuten laufen. Wenn sich auch jemand im Haus bewegt. PIR(high) - > pumpe lauft 3min-> warten 30min habs hier mit probiert

/* Blink without Delay

 Turns on and off a light emitting diode(LED) connected to a digital  
 pin, without using the delay() function.  This means that other code
 can run at the same time without being interrupted by the LED code.

 The circuit:
 * LED attached from pin 13 to ground.
 * Note: on most Arduinos, there is already an LED on the board
 that's attached to pin 13, so no hardware is needed for this example.


 created 2005
 by David A. Mellis
 modified 8 Feb 2010
 by Paul Stoffregen

 This example code is in the public domain.


 http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
 */

// constants won't change. Used here to 
// set pin numbers:
const int ledPin =  13;      // the number of the LED pin
const int ledPin2 =  12;
// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 5000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);  
pinMode(ledPin2, OUTPUT);  
}

void loop()
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
  unsigned long currentMillis = millis();

  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
    
  }
  
  if (ledState == LOW)
  digitalWrite(ledPin2, HIGH);
  else
     digitalWrite(ledPin2, LOW);
  
  
}

Probieren sie mal

#define PUMPON  0
#define PUMPOFF 1

const int pumpPin =  12;
const int pirPin =  11;
int state = PUMPOFF;   
long previousMillis = 0;

unsigned long dryInterval = 30 * 1000UL;
unsigned long wetInterval = 3 * 1000UL;

void setup() 
{
  Serial.begin(115200); // debugging
  Serial.println("Start pupmpe steurung 0.1");

  pinMode(pirPin, INPUT);
  pinMode(pumpPin, OUTPUT);
}

void loop()
{
  unsigned long now = millis();

  if ((now - previousMillis > dryInterval)  && (state == PUMPOFF)) 
  {
    previousMillis = now;
    state = PUMPON;  
    digitalWrite(pumpPin, HIGH);
  }

  if ((digitalRead(pirPin) == HIGH) && (state == PUMPOFF))
  {
    previousMillis = now;
    state = PUMPON;  
    digitalWrite(pumpPin, HIGH);
  }

  if ((now - previousMillis > wetInterval)  && (state == PUMPON)) 
  {
    previousMillis = now;
    state = PUMPOFF;  
    digitalWrite(pumpPin, LOW);
  }
}

Grr. War auch gerade daran das zu schreiben

Hier fehlt aber noch ein * 60

unsigned long dryInterval = 30 * 1000UL;
unsigned long wetInterval = 3 * 1000UL;

Es sollten Minuten sein. Nicht Sekunden

Serenifly: Grr. War auch gerade daran das zu schreiben

Hier fehlt aber noch ein * 60

unsigned long dryInterval = 30 * 1000UL;
unsigned long wetInterval = 3 * 1000UL;

Es sollten Minuten sein. Nicht Sekunden

:blush: :blush: :blush: :)

danke für die den code. könntet ihr mir den vielleicht auch noch ein wenig kommentieren? Einiges ist mir schon klar,nur das mit dem Millis verstehe ich nicht so ganz. gruß und dank

http://arduino.cc/de/Reference/Millis

karl77: könntet ihr mir den vielleicht auch noch ein wenig kommentieren? Einiges ist mir schon klar,nur das mit dem Millis verstehe ich nicht so ganz.

Dann liest Du am besten im Tutorial nach, da sind auch weiterführende Links vorhanden, z.B. zu "millis()": http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Im übrigen scheinen alle, die Dir bisher geantwortet haben, nicht so ganz verstanden zu haben, dass das Hauptproblem bei Dir nicht das "Blinken" ist, also das Ein- und Ausschalten der Pumpe in einem gewissen Schaltrhythmus. Sondern das Problem liegt im Wesentlichen bei der Synchronisation der Anwesenheit mit den Pumpenlaufzeiten.

Denn Du möchtest ja womöglich nicht, dass Anwesenheitsfeststellung und Pumpentakt asynchron und unabhängig voneinander laufen, z.B.

5:00:00 Uhr: Keine Bewegung im Haus in der letzten halben Stunde, Pumpe bleibt aus 5:30:00 Uhr: Keine Bewegung im Haus in der letzten halben Stunde, Pumpe bleibt aus 6:00:00 Uhr: Keine Bewegung im Haus in der letzten halben Stunde, Pumpe bleibt aus 6:05:00 Uhr: Bewegung im Haus erkannt 6:30:00 Uhr: Es war in der letzten halben Stunde eine Bewegung im Haus, Pumpe geht an 6:33:00 Uhr: Pumpe geht aus

Sondern Du möchtest womöglich, dass wenn um 6 der Wecker klingelt und um 6:05 Uhr eine Bewegung erkannt wird und die Pumpe vorher stundenlang aus war, dass die Pumpe dann sofort um 06:05 anspringt, zusammen mit der ersten erkannten Bewegung nach etlichen Stunden. Dann läuft es so:

5:00:00 Uhr: Keine Bewegung im Haus in der letzten halben Stunde, Pumpe bleibt aus 5:30:00 Uhr: Keine Bewegung im Haus in der letzten halben Stunde, Pumpe bleibt aus 6:00:00 Uhr: Keine Bewegung im Haus in der letzten halben Stunde, Pumpe bleibt aus 6:05:00 Uhr: Bewegung im Haus erkannt 6:05:00 Uhr: Pumpe geht an 6:08:00 Uhr: Pumpe geht aus Nächster Prüfpunkt wäre dann um 6:35:00, ob innerhalb der letzten halben Stunde Bewegung war, also eine halbe Stunde, nachdem die Pumpe erstmals an dem Tag angesprungen ist.

So dass die Pumpe nach dem Aufstehen womöglich schon umwälzt, bevor Du nach dem Aufstehen das Badezimmer benutzen möchtest, und nicht erst danach.

Den Schwerpunkt sehe ich also auf der Synchronisation nach längerer Stillstandszeit mit der erkannten Anwesenheit, so dass unmittelbar nach Beginn einer Anwesenheit nach längerem Stillstand mit einem neuen Pumpentakt begonnen wird.

Falls Dir zündende Ideen für eine Programmlogik fehlen, sag Bescheid, dann kann ich Dir mal ein Demoprogramm dazu machen, wie es mit der Synchronisation von Anwesenheits- und Pumpentaktung laufen könnte.

Hallo karl77,
ich kann dir meinen Sketch geben, der seit zwei Jahren im Betrieb ist.
Macht das, was du suchst und ist auch dokumentiert.
gruß
Bernward

@jurs danke für die genau beschreibung meines vorhabens. werde es mal selber probiern, will es auch selber verstehen für die zukunft.

@Bernward danke die habe ich doch schon vo dir bekommen. Nur ist die für mich zu umfangreich.

wie gesagt, will ich vieles selber erstellen und nicht übernehmen. Ist der Lernfaktor so klein.