Led na bepaalde tijd uit zetten ook al blijft input High.

Arduino specifieke Software
Berichten: 7
Geregistreerd: 16 Okt 2016, 09:38

Led na bepaalde tijd uit zetten ook al blijft input High.

Berichtdoor Vansman » 16 Okt 2016, 10:11

Hallo,

Ik ben bezig om een mijn elektrische poort te bedienen via de Arduino.
Een onderdeel daarvan is het aansturen van een bel die geactiveerd wordt als de IR sluis onderbroken wordt op de oprit.
Nu wil ik het zo maken dat als er bv een auto in de straal geparkeerd wordt de bel na een bepaalde periode stopt (ondanks dat de sensor Input nog high is) En dat hij weer naar de beginstatus moet gaan als de sensor Input low wordt.

Ik ben nieuw met programmeren en heb ondertussen al een aantal uurtjes zitten testen met Millis()
Wat ik ervan begrijp is dat deze tijd continue doorloopt en je deze waarde niet zomaar kunt resetten naar nul, maar dat je voorwaarde moet laten berekenen op basis van de vorige tijdwaarde.

Wat moet het programmadeel doen;

Als sensor is Low , LED uit
Als sensor is High, LED aan
Als sensor is High langer dan 5 seconden, LED weer uit en wachten tot sensor Low is geweest.

Alvast bedankt voor de tips.

Groet,
Leon

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor nicoverduin » 16 Okt 2016, 10:33

Vansman schreef:Hallo,

Ik ben bezig om een mijn elektrische poort te bedienen via de Arduino.
Een onderdeel daarvan is het aansturen van een bel die geactiveerd wordt als de IR sluis onderbroken wordt op de oprit.
Nu wil ik het zo maken dat als er bv een auto in de straal geparkeerd wordt de bel na een bepaalde periode stopt (ondanks dat de sensor Input nog high is) En dat hij weer naar de beginstatus moet gaan als de sensor Input low wordt.

Ik ben nieuw met programmeren en heb ondertussen al een aantal uurtjes zitten testen met Millis()
Wat ik ervan begrijp is dat deze tijd continue doorloopt en je deze waarde niet zomaar kunt resetten naar nul, maar dat je voorwaarde moet laten berekenen op basis van de vorige tijdwaarde.

Wat moet het programmadeel doen;

Als sensor is Low , LED uit
Als sensor is High, LED aan
Als sensor is High langer dan 5 seconden, LED weer uit en wachten tot sensor Low is geweest.

Alvast bedankt voor de tips.

Groet,
Leon

millis is gewoon een teller die tot 2^32-1 telt en dan weer 0 wordt. Je bewaard millis op enig moment en daarna test je in de loop af of deze met een x aantal groter is geworden. resetten hoeft dus helemaal niet.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 7
Geregistreerd: 16 Okt 2016, 09:38

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor Vansman » 16 Okt 2016, 20:42

Het is gelukt.
Na nog een hele tijd testen, de serial monitor ingeschakeld om te kijken of het allemaal goed liep met de millis functie.
Uiteindelijk zat het probleem in wat accolades die ontbraken in de ELSE functie.
Beginnersfoutje, bedankt :-)

Groet Leon

Berichten: 7
Geregistreerd: 16 Okt 2016, 09:38

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor Vansman » 16 Okt 2016, 22:15

Het valt me nu op dat de LED heel zwak knippert/brandt als hij in de Low status gaat na de verlopen tijd.
Wat moet ik aan de onderstaande code veranderen omdat te verhelpen?




Code: Alles selecteren
const int switchPin = 2;
const int ledPin = 13;
int state = 0;
int lastState = 0;

unsigned long currentTime = 0;
unsigned long sensorTime = 0;
int interval = 5000;

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);
 
}
void loop() {
state = digitalRead(switchPin);

 {
if (state == HIGH)    {
 
  currentTime = millis();
 
   {
  digitalWrite (ledPin, HIGH);
 if (currentTime - sensorTime > interval){
  digitalWrite (ledPin, LOW);
 
}
 }
    }

  else { digitalWrite (ledPin, LOW);
    sensorTime = currentTime ;
  }
 
 
}
}

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

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor Koepel » 17 Okt 2016, 05:36

Zou je altijd op dezelfde manier willen inspringen ? En beter gebruik maken van lege regels. Dan zie je gemakkelijker wat het programma doet. Druk op Ctrl+T of kies in het menu: Hulpmiddelen / Automatische opmaak.

Dit is precies hetzelfde, is dit gemakkelijker te lezen ?
cpp code
const int switchPin = 2;
const int ledPin = 13;

int state = 0;
int lastState = 0;

unsigned long currentTime = 0;
unsigned long sensorTime = 0;
int interval = 5000;

void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);
}

void loop()
{
state = digitalRead(switchPin);

if (state == HIGH)
{
currentTime = millis();
{
digitalWrite (ledPin, HIGH);
if (currentTime - sensorTime > interval)
{
digitalWrite (ledPin, LOW);
}
}
}
else
{
digitalWrite (ledPin, LOW);
sensorTime = currentTime ;
}
}

Ik gebruik de haakjes '{' en '}' anders, maar dat is alleen maar omdat ik een '{' achteraan een regel niet mooi vind. Ik begrijp niet eens waarom sommigen de '{' achteraan een regel zetten :? Dat komt nog uit de tijd dat een beeldscherm 24 regels had, en scrollen langzaam en lastig was :shock:

Het moment detecteren dat de ingang HIGH wordt kan met dit: https://www.arduino.cc/en/Tutorial/StateChangeDetection
Met millis() is de tijd te bepalen, zoals bijvoorbeeld om een ledje te laten knipperen: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay.
Beide dingen zie ik niet terug in jouw sketch.

Kun je eerst die StateChangeDetection er goed in zetten ? Op dit moment gebruik je de 'lastState' niet.
Vervolgens kun je toevoegen dat er iets actief wordt die de led een tijdje laat branden. Dan heb dus de 'sensorTime' nodig, maar ook een variabele die aangeeft dat het actief is.

Het gemakkelijkst is om een Arduino Uno te gebruiken, om de werking te testen. Je kunt bijvoorbeeld een knop aan de ingang hangen, en dan de ingang INPUT_PULLUP maken. Je kunt ook allerlei berichten naar de seriële monitor sturen, dan weet je wat er gaande is.

Berichten: 7
Geregistreerd: 16 Okt 2016, 09:38

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor Vansman » 18 Okt 2016, 23:21

CTRL+T kende ik nog niet. Daar wordt het een stuk leesbaarder van.
Ik ben een beginner op gebied van de Arduino en ook op programmeer gebied heb ik niet veel ervaring.

De onderstaande code doet bijna helemaal wat ik op dit moment ermee wil.
Alleen als de het IF statement if (currentTime - sensorTime > interval)
WAAR wordt dan moet de LED uit gaan ondanks dat de Input state op pin 2 nog HIGH is.
Alleen gaat hij nu heel zwak branden omdat de loop volgens mij telkens de LED op HIGH zet en daarna meteen ziet dat het IF statement WAAR is en de LED weer uit zet. Volgens mijn redenering gaat dit zo snel dat de LED heel zwak (gedimd) blijft branden.

Mijn vraag is;
Klopt mijn redenering?
En hoe kan ik dit oplossen?

Code: Alles selecteren
const int switchPin = 2;
const int ledPin = 13;
int state = 0;

unsigned long currentTime = 0;
unsigned long sensorTime = 0;
int interval = 5000;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(switchPin, INPUT);

}
void loop()
{
  state = digitalRead(switchPin);
  {
 if (state == HIGH) //controleren of de knop wordt ingedrukt
    {
      currentTime = millis();
      {
        digitalWrite (ledPin, HIGH);    //Hier lijkt het mis te gaan. Als de onderstaande if WAAR wordt.
        if (currentTime - sensorTime > interval) //Als de knop langer als 5 seconden ingedrukt blijft gaat  LED uit
        {
          digitalWrite (ledPin, LOW); //Zorgt ervoor dat LED uit gaat als bovenstaande IF waar is
        }
      }
    }
    else
    {
      digitalWrite (ledPin, LOW); //Als knop wordt losgelaten gaat of blijft LED uit en wordt de tijd bijgewerkt voor volgende keer als knop wordt ingedrukt
      sensorTime = currentTime ;
    }
  }
}





Aweer bedankt voor jullie evt reactie.

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

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor Koepel » 19 Okt 2016, 02:42

Als de knop is ingedrukt, dan weet je niet of die knop zojuist werd ingedrukt of dat de knop al een seconde is ingedrukt.
Het is echt nodig om het moment te weten waarop de knop wordt ingedrukt, want dan begint de tijd te lopen. Dus heb je toch dat State Change Detection voorbeeld nodig.

Berichten: 7
Geregistreerd: 16 Okt 2016, 09:38

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor Vansman » 22 Okt 2016, 00:28

Ik heb getest met de de change state detection, maar krijg het daarmee ook niet voor elkaar wat ik wil.
Als de knop is ingedrukt, dan weet je niet of die knop zojuist werd ingedrukt of dat de knop al een seconde is ingedrukt.
Het is echt nodig om het moment te weten waarop de knop wordt ingedrukt, want dan begint de tijd te lopen. Dus heb je toch dat State Change Detection voorbeeld nodig.


Code: Alles selecteren
 if (state == HIGH) //controleren of de knop wordt ingedrukt
    {
      currentTime = millis();


Hier gaat volgens mij de tijd lopen. Zo lang de knop high is blijft de tijd lopen.

Code: Alles selecteren
 if (state == HIGH) //controleren of de knop wordt ingedrukt
    {
      currentTime = millis();
      {
        digitalWrite (ledPin, HIGH);    //Hier lijkt het mis te gaan. Als de onderstaande if WAAR wordt.
        if (currentTime - sensorTime > interval) //Als de knop langer als 5 seconden ingedrukt blijft gaat  LED uit
        {
          digitalWrite (ledPin, LOW); //Zorgt ervoor dat LED uit gaat als bovenstaande IF waar is
        }
      }
    }


Zoals ik al eerder vermeld heb werkt hij op het eerste oog helemaal, maar zag dat in de LOW status na de 5 seconden de onboard LED heel zwak brandt. Volgens mij zit mijn fout in de positie van de regel, digitalWrite (ledPin, HIGH);.
Als de input HIGH blijft dan blijft hij in de HIGH is True loop, Daarin komt het programma telkens eerst digitalWrite (ledPin, HIGH); tegen om daarna meteen te ontdekken dat de tijd in if (currentTime - sensorTime > interval) verstreken is en de LED weer uit zet.
Daardoor blijft te LED zwak branden totdat de knop losgelaten wordt en het programma naar ELSE springt, de LED uit zet en de tijd 'reset'.
Code: Alles selecteren
 else
  {
    digitalWrite (ledPin, LOW);
    sensorTime = currentTime ;
  }


Ik denk dus dat ik het probleem wel weet, maar zie de oplossing niet. Heb al wat getest met de if (currentTime - sensorTime > interval) op een andere positie te zetten, als AND argument aan IF toe te voegen maar dan gaat de LED helemaal niet meer aan.

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

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor Koepel » 22 Okt 2016, 11:09

Uhm, als jij zegt dat het bijna werkt, dan zeg ik dat ik met je sketch niet uit de voeten kan en dat het niet gaat werken :?
Sorry, maar het gaat niet werken. Het is beter om dit stap voor stap op te lossen.

Kun je eerst die State Change Detection er in zetten, en dan de hele sketch laten zien.
Dan kijk ik of het klopt, en hoe vervolgens de millis() er bij gemaakt kan worden.

In één klap een werkend programma schrijven, dat doen zelfs ervaren programmeur niet. Als je alles opdeelt in aparte stukken, dan kun je later eenvoudiger dingen wijzigen en toevoegen.

Twee dingen zijn volgens mij belangrijk:
1 ) Het moment dat de knop wordt ingedrukt. Dus de millis() van dat tijdstip onthouden. Vervolgens nog een variabele die aangeeft dat het actief is (dat de tijd voor de led loopt). De variabel die de tijd onthoudt (previousMillis of currentMillis of zo iets) kan namelijk niet gebruikt worden om aan te geven dat het actief is.
2 ) Als de knop wordt losgelaten, dan meteen de led uit ?

Als je wilt kan ik misschien jouw sketch werkend krijgen door een variabele toe te voegen. Maar uiteindelijk kom je dan bij hetzelfde uit, maar dan slordiger.

Berichten: 7
Geregistreerd: 16 Okt 2016, 09:38

Re: Led na bepaalde tijd uit zetten ook al blijft input High

Berichtdoor Vansman » 27 Okt 2016, 23:18

Nou, daar ben ik weer.
Na een x aantal uren testen kom ik nog niet veel verder.
Ben met de change state detection bezig geweest.
Het standaard voorbeeld werkt met LED aan en uit schakelen met 1 drukknop.
En met het voorbeeld dat je 4x de drukknop moet indrukken voordat de LED aan gaat.

Deze heb ik zo aangepast zodat de de LED aan gaat als de Input High is, en de LED gaat uit als de Input Low wordt.
Tot zover.....

Daarna de tijdregels proberen erin te zetten, maar dit werkt nog niet echt bij mij.
Hier de laatste poging tot zover,

Code: Alles selecteren
/*
 The circuit:
   LED attached from pin 13 to ground
   pushbutton attached from pin 2 to +5V
   10K resistor attached from pin 2 to ground

   Note: On most Arduino boards, there is already an LED on the board
  connected to pin 13, so you don't need any extra components for this example.


  created 21 November 2006
  by David A. Mellis
  modified 30 Aug 2011
  by Limor Fried
  modified 28 Dec 2012
  by Mike Walters
  modified 30 Aug 2016
  by Arturo Guadalupi


  This example code is in the public domain.

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

// constants won't change. They're used here to
// set pin numbers:
const int buttonPin = 2;    // the number of the pushbutton pin
const int ledPin = 13;      // the number of the LED pin

// Variables will change:
unsigned long currentTime = 0;
unsigned long sensorTime = 0;
int interval = 5000;
int ledState = LOW;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned long's because the time, measured in miliseconds,
// will quickly become a bigger number than can't be stored in an int.
unsigned long lastDebounceTime = 50;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);

  // set initial LED state
  digitalWrite(ledPin, ledState);
}

void loop() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);
  currentTime = millis();

  Serial.print("buttonState = ");
  Serial.println(buttonState);
  Serial.print("lastButtonState = ");
  Serial.println(lastButtonState);
  Serial.print("reading = ");
  Serial.println(reading);
  Serial.print("currentTime : ");
  Serial.println(currentTime);
  Serial.print("sensorTime : ");
  Serial.println(sensorTime);
  Serial.print("Interval : ");
  Serial.println(interval);
  Serial.print("Teller = ");
  Serial.println(currentTime - sensorTime);
  delay(50);


  if (reading != buttonState) {
    buttonState = reading;
    ledState = !ledState;
    sensorTime = currentTime;
  }
  if (currentTime - sensorTime < interval) {
    ledState = !ledState;
  }
  else {
    ledState = LOW;
  }

  // set the LED:
  digitalWrite(ledPin, ledState);


}



De delay onder de serial.Print zet ik soms hoger om beter te kunnen zien wat er in de monitor gebeurt.

Wat zou het moeten doen.

In rust; LED is uit.
Sensor High; Led meteen aan
Sensor Low; Led meteen uit

Als Sensor langer als X-tijd HIGH blijft moet de LED uit gaan, en uit blijven totdat Sensor eerst LOW is geweest.

Ik wil het graag zelf proberen uit te zoeken, maar zie het nog even niet.

Alweer bedankt voor evt hulp

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 95 gasten