Aansturen output met vertraging.

Geef hier suggesties voor extra onderwerpen of andere dingen die je graag gewijzigd zou willen zien
Berichten: 2
Geregistreerd: 14 Apr 2019, 16:30

Aansturen output met vertraging.

Berichtdoor Vanhellum » 14 Apr 2019, 16:40

Hoi,

Ik ben een beginner mbt de Arduino en kan wel wat opstarthulp gebruiken.

Ik wil met een lichtsensor een motor sturen om het kippehok te openen en te sluiten maar daar moet ongeveer een 10 minuten vertraging in zitten.
Sensor is aan, dan 10 minuten wachten en dan een poort hoog
Als Sensor uit is moet na de timer de poort weer laag worden.

Hoe kan ik dat het beste aanpakken?

Alvast bedankt,

Henk

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Aansturen output met vertraging.

Berichtdoor Koepel » 14 Apr 2019, 18:47

Hallo, en welkom op dit forum.

Heb je programmeerervaring ?

Moet het precies 10 minuten zijn, of mag het bijvoorbeeld 9..11 minuten zijn ?

Wat als de lichtsensor slechts 1 minuut aan is, moet dan de poort na tien minuten ook 1 minuut hoog worden ?
Als dat niet hoeft, dan kun je het misschien anders beschrijven. Bijvoorbeeld: De poort pas hoog maken als de lichtsensor gedurende 10 minuten aan is.

Je wilt dus beginnen met het tellen van de minuten op het moment dat de lichtsensor aan gaat.
Dat is het "State Change Detection" voorbeeld: https://www.arduino.cc/en/Tutorial/StateChangeDetection.
De tien minuten zou met millis() kunnen, begin daarvoor met het "Blink Without Delay" voorbeeld: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay.

Er zijn verschillende mogelijkheden.
Als er verder niets gedaan hoeft te worden, dan zou je een delay() in de loop kunnen zetten zodat de loop() nog maar één keer per seconde of één keer per minuut gedaan wordt. Dan is het tellen totdat je tien minuten bij elkaar hebt.
Als je ook nog andere dingen wilt doen (de temperatuur op een display zetten, drukknoppen inlezen, enzovoorts) dan blijft alleen millis() over om de tien minuten te doen.

Berichten: 2
Geregistreerd: 14 Apr 2019, 16:30

Re: Aansturen output met vertraging.

Berichtdoor Vanhellum » 14 Apr 2019, 19:39

Hoi, Dank voor je reactie.

Ik heb weinig programmeer ervaring. Jaren gelede wel in PHP geschreven. Ik zie wel enige overeenkomsten maar ik moet er weer helemaal induiken.

Als bv pen 2 hoog wordt door de lichtsensor kan het zijn dat die binnen bv 1 minuut toch weer laag wordt. ( bv door licht van autolampen die de sensor beschijnen.)
Om te voorkomen dat het luik van het kippehok door lichtvariaties steeds open en dicht gaat wil ik de timers er in hebben om denderen te voorkomen.
Ik ga uit van 10 minuten maar kan natuurlijk ook 15 of 20 zijn. dat is om het even.

pen 2(input) hoog dan 10 minuten wachten en dan pen 13(output)hoog. Als er binnen die 10 minuten poort 2 dendert begint die 10 minuten opnieuw.
Na die 10 minuten wordt het omgedraaid. wordt 2 laag , dan moet 13 ook laag worden.

grtz,
Henk

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: Aansturen output met vertraging.

Berichtdoor Koepel » 14 Apr 2019, 23:45

Ik zie vooral heel veel verschillende mogelijkheden.

Je kunt bijvoorbeeld zeggen: Als de ingang 10 minuten stabiel is, dan pas de waarde overnemen.

Je kunt ook zeggen: De ingang debouncen.
Er is namelijk heel veel code om het denderen van knoppen tegen te gaan.
Een variatie daarop is bijvoorbeeld met een laag-doorlaat-filter in software.
Als je de lichtintensiteit meet, bijvoorbeeld als percentage van 0 tot 100, dan is een laag-doorlaat-filter net zo handig.

In plaats van een laag-doorlaat-filter kun je ook iedere minuut een sample nemen en 10 samples opslaan. Dan kun je steeds kijken naar de laatste 10 samples. Zelfs een moving-average of voortschrijdend gemiddelde is dan mogelijk ( https://nl.wikipedia.org/wiki/Voortschrijdend_gemiddelde ).

Zo zijn er nog veel meer mogelijkheden.

Heb je een Arduino Uno, een weerstand van 10k en een drukknopje ?
Verbind dan de weerstand aan pin 2 en GND en de drukknop aan pin 2 en 5V.

Het onderstaande voorbeeld is met millis(). Dat werkt heel precies. De led gaat pas aan of uit, als de knop 5 seconden stabiel is.
Heb je die "Blink Without Delay" en "State Change Detection" voorbeelden al bekeken, ik gebruikt ze allebei voor de sketch hieronder.
Een sketch is pas een echte sketch als de "Blink Without Delay" en "State Change Detection" gebruikt worden :lol:

cpp code
// Arduino Uno onboard led connected to pin 13
// A resistor from pin 2 to GND and a button from pin 2 to 5V.
//

const int pinLed = LED_BUILTIN;
const int pinButton = 2;

unsigned long previousMillis;
const unsigned long interval = 5000UL; // 5 seconds
int lastInputState = LOW; // LOW is default, button not pressed
bool delayActive = false; // this is true when 5 seconds delay is busy

void setup()
{
pinMode( pinLed, OUTPUT);
pinMode( pinButton, INPUT);
}


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

int inputState = digitalRead( pinButton);
if( inputState != lastInputState)
{
previousMillis = currentMillis; // update every time the button is pressed or released
delayActive = true;

lastInputState = inputState;
}

if( delayActive)
{
if( currentMillis - previousMillis >= interval)
{
// The input was steady during the delay, accept it for the output.
digitalWrite( pinLed, inputState);

delayActive = false; // don't need the delay anymore
}
}
}


Een laag-doorlaat-filter kan ook. Zo'n filter werkt het beste als met vaste intervallen een sample genomen wordt. Bijvoorbeeld iedere seconde of iedere minuut. Iets doen met vast intervallen is vanzelfsprekend weer iets voor millis(). Ik heb hieronder even een delay() gebruikt in plaats van millis(). Het denderen van de ingang wordt mooi gedempt, maar het is niet precies 5 seconden.

cpp code
// Arduino Uno onboard led connected to pin 13
// A resistor from pin 2 to GND and a button from pin 2 to 5V.
//

const int pinLed = LED_BUILTIN;
const int pinButton = 2;

float average;
int outputState = LOW; // default output pin is LOW

void setup()
{
Serial.begin( 9600);
Serial.println( "Sketch has started");

pinMode( pinLed, OUTPUT);
pinMode( pinButton, INPUT);

// Set start value to the current actual input
// and imediately set the output according to it.
average = getInputPercentage( pinButton);
setOutputWithHysteresis( pinButton, average);
}


void loop()
{
float input = getInputPercentage( pinButton);

// Low pass filter
average = 0.8 * average + 0.2 * input;

setOutputWithHysteresis( pinButton, average);

Serial.print(F( "average = "));
Serial.println( average);

// During a delay, nothing can be done
// Slow down the loop() to once per second
delay( 1000);
}


float getInputPercentage( int pin)
{
float percentage;

int inputState = digitalRead( pin);
if( inputState == HIGH)
{
percentage = 100.0;
}
else
{
percentage = 0.0;
}

return( percentage);
}


void setOutputWithHysteresis( int pin, float value)
{
// hyteresis
if( outputState == LOW && average > 80.0)
{
outputState = HIGH;
digitalWrite( pinLed, HIGH);
}
else if( outputState == HIGH && average < 20.0)
{
outputState = LOW;
digitalWrite( pinLed, LOW);
}
}

Terug naar Forum suggesties

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 5 gasten