Schaltverzögerung programmieren

Hallo Mitforisten,

ich habe gerade eine kleine Bastelei laufen, um ein wenig über Infrarot-Sensoren PIR zu lernen.

Inzwischen habe ich den Bogen raus, wie ich den PIR anschließe und auslese. Woran ich im Augenblick noch rätsel ist, wie ich eine Kontrollstruktur basteln kann, die ein Dauerfeuer des Arduino verhindert.

Im Augenblick verwende ich eine LED an Anzeiger für einen Impuls vom PIR:

PIR bemerkt was, gibt einen Impuls an den Arduino und die LED geht an, solange PIR was meldet.

Nun würde ich gerne 2 Dinge umsetzen:

  1. Arduino bekommt einen Impuls vom Sensor, wartet aber eine gewisse Anzahl von Sekunden, ob der Impuls so lange anhält. Wenn ja, startet er eine Programmschleife, wenn nein wartet er auf einen ausreichend langen Impuls bevor die Programmschleife gestartet wird. Also eine Art Einschaltverzögerung, damit nicht jeder kurze Impuls zu einer Reaktion führt.

  2. Hat Arduino die Programmschleife durchlaufen, so möchte ich ihn gerne eine Zeit warten lassen, bevor er auf neuen Impulse reagiert, damit die Programmschleife nicht mehrfach und ohne Pause ausgelöst wird.

Vielen Dank schon einmal, wenn jemand so nett sein könnte mir das Brett vom Kopf zu entfernen.

VG CE

Kannst du bitte mal einen vernünftigen Titel wählen, so wird dein Beitrag nicht richtig zugeordnet.

Ist eigentlich ganz einfach, da man delay() nicht verwenden darf, nimmt man sich das BlinkWithoutDelay als Beispiel.

Bei so wenig Beiträgen kann man davon ausgehen dass es ein Neuling nicht nur mit nem Brett vorm Kopf ist sondern dass da noch mehr dahinter steckt :D

Ungetestet:

/* 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
 modified 11 Nov 2013
 by Scott Fitzgerald


 This example code is in the public domain.

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

// constants won't change. Used here to set a pin number :
const int ledPin =  13;      // the number of the LED pin
const int buttonPin = 2;     // the number of the pushbutton pin
// Variables will change :
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change :
const long wartezeit = 6000;           // interval at which to blink (milliseconds)
const long impuls_bekommen_wartezeit = 3000; 
int buttonState = 0;   

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

void loop() {
  // here is where you'd put code that needs to be running all the time.
  buttonState = digitalRead(buttonPin);
  // 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 (buttonState == HIGH) {
  if (currentMillis - previousMillis >= impuls_bekommen_wartezeit) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
if (buttonState == HIGH) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }
    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
    delay(wartezeit);
  }
 }


}

skorpi08: Bei so wenig Beiträgen kann man davon ausgehen dass es ein Neuling nicht nur mit nem Brett vorm Kopf ist sondern dass da noch mehr dahinter steckt :D

Ich habe nie etwas zur Dicke des Bretts gesagt....... ;)

So, ich habe mal versucht den Sketch zu blicken. Das dauert ein paar Minuten, aber schon einmal Danke für den Hinweis.

VG CE

So ist das in Ordnung, danke.

Zu 1. Wurde von Skorpi08 schon bestens erklärt. Zu 2. Die Programmschleife (hier Loop()) darfst du nie anhalten, auch nicht durch delay. In dieser Zeit macht der Controller nichts außer warten und reagiert auf keine Eingaben mehr. Damit nicht mehrfach auf Aktionen reagiert wird, musst du es durch entsprechende Programmierung verhindern.