Go Down

Topic: hoe een delay aan je sensor te geven nadat er iets waargenomen (Read 266 times) previous topic - next topic

AngelinaNoLee

nihou, wij hebben een programma gemaakt met een sprekende nachtlamp. wij willen graag dat als de pir sensor 1 keer iets ''gezien'' heeft hij 14 seconden wacht met opnieuw lezen van de sensor. hoe kunnen wij dat het beste in het programma toevoegen?






 
Code: [Select]
int sensorPin = A0; // select the input pin for LDR
int sensorValue = 0; // variable to store the value coming from the sensor
int led1 = 7;
int inputPin = 2;               // choose the input pin (for PIR sensor)
int pirState = LOW;             // we start, assuming no motion detected
int val = 0;                    // variable for reading the pin status
int speaker = 8;
int relais = 3;



void setup() {
Serial.begin(9600); //sets serial port for communication
pinMode(inputPin, INPUT);     // declare sensor as input
pinMode(relais, OUTPUT);
}
void loop() {

val = digitalRead(inputPin);  // read input value
sensorValue = analogRead(sensorPin); // read the value from the sensor
Serial.println(sensorValue); //prints the values coming from the sensor on the screen
delay(100);



 
   if  (sensorValue < 250 && val == HIGH)
 
 
  {

 
  digitalWrite (led1, HIGH);
  digitalWrite (relais, HIGH);
  tone(speaker, 1000, 500);
  Serial.println(val);
 
 
 
  }

  else if  ( sensorValue > 250 && val == LOW)
  Serial.println(val);

 delay(2000);
  digitalWrite (led1, LOW);
  digitalWrite (relais, LOW);
 
  {}



 
  }

septillion

Laten we beginnen met dat wij in tegenstelling tot de compiler alleen warnings geven voor het ontbreken van hoofdletters. Maar we kunnen ze wel waarderen.

Daarnaast is dit denk ik HET moment om je code eens op te ruimen ;)

Maar wat heb jij geprobeerd? Al gehoord van millis() Daarmee kun je onthouden wanneer je iets gezien hebt en dus even niets doen.

Let wel, elke vorm van delay() wil bijna zeker roet in het eten gooien voor andere timing. Tijdens een delay() doet de Arduino niets, nada noppes*


* Afgezien van interrupts (en yield) maar geen reguliere flow/code.
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

shooter

denk aan je haakjes bij if else.
kijk ook eens hoe blink without delay werkt want dan kun je veel sneller kijken.
dus een timer (met millis()) starten en dan kijken na 13000 of het nog steeds is. Het voordeel is dat je een bounce kontakt ziet.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Koepel

Een delay of single shot timer kan met millis op deze manier: https://github.com/Koepel/Fun_with_millis/blob/master/millis_single_delay.ino.

Ik stel voor om de variabele 'enabled' anders te noemen, iets met "de delay met millis() is nu bezig", maar dan korter. Wat dacht je van "delayActive" ?
Vervolgens diezelfde variabele gebruiken om de pir sensor niet te lezen als de delay met millis() bezig is.

Het starten van de software timer:
Code: [Select]
previousMillis = currentMillis;
delayActive = true; // turn on software timer


Het lezen van de sensor:
Code: [Select]
if( !delayActive)
{
  val = digitalRead(inputPin);  // read input value
  ...
}


Het kijken of de tijd al om is:
Code: [Select]
if( delayActive)      // software timer is active ?
{
  if( currentMillis - previousMillis >= interval)
  {
    delayActive = false;     // stop software timer
  }
}

Go Up