Beginnersvraag: werken met een timer

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 3
Geregistreerd: 29 Nov 2016, 19:45

Beginnersvraag: werken met een timer

Berichtdoor Loene » 29 Nov 2016, 20:01

Beste,
Ik ben nieuw op dit forum en een beginner in arduino.
Mijn probleem. In onderstaande code gaat na de 'if' command mijn steppenmotor draaien. Die draait eindeloos door indien aan de 'if' voorwaarden voldaan wordt. Wat ik zou willen is, dat wanneer die volwaarden voldaan zijn, de motor 15 seconden draait en daarna stopt. Als na die 15 seconden, de voorwaarden opnieuw voldaan zijn, moet de motor weer 15 seconden draaien. Dus maw, iedere keer de voorwaarden 'getriggerd' worden, moet de motor 15 seconden draaien.
Hopelijk is mij uitleg duidelijk... Ik denk dat je dat met een timer ofzo wel klaar krijgt, probleem is dat ik dus totaal niet weet hoe zo'n timer te integreren in de code of hoe zo'n timer uberhaupt werkt...

Kan iemand mij helpen?
Alvast bedankt!!!

Mvg,
Bart

Code: Alles selecteren
int Pin0 = 10;
int Pin1 = 11;
int Pin2 = 12;
int Pin3 = 13;
int msDelay = 2;

int druksensor=0;
int druksensorReading;     
int valdruksensor=0;

int IRsensor=1;

void setup()
{
 pinMode(Pin0, OUTPUT);
 pinMode(Pin1, OUTPUT);
 pinMode(Pin2, OUTPUT);
 pinMode(Pin3, OUTPUT);
 Serial.begin(9600);
}
void loop()
{
  int val=analogRead(IRsensor);
  Serial.print("IR = ");
  Serial.println(val);
 
  valdruksensor=analogRead(druksensor);
  Serial.print("DRUKSENSOR = ");
  Serial.println(valdruksensor);
    if (valdruksensor>100 && val<200)
    {
       digitalWrite(Pin0, HIGH);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, LOW);
      delay(msDelay);
       digitalWrite(Pin0, HIGH);
       digitalWrite(Pin1, HIGH);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, LOW);     
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, HIGH);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, LOW);
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, HIGH);
       digitalWrite(Pin2, HIGH);
       digitalWrite(Pin3, LOW);     
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, HIGH);
       digitalWrite(Pin3, LOW);
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, HIGH);
       digitalWrite(Pin3, HIGH);     
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, HIGH);     
      delay(msDelay);
       digitalWrite(Pin0, HIGH);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, HIGH);
      delay(msDelay);
    }
 
}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Beginnersvraag: werken met een timer

Berichtdoor shooter » 29 Nov 2016, 21:24

zet die stepper eerst maar eens in een functie, en een aanroep in de loop.
de if loop zet een vlag=true;
en een timer start.
starttijd =millis()

in de loop komt nog een if en dat is dan de timer als (millis()-starttijd) >15000;
{vlag=false;}

en er komt nog een if (vlag){stappenmotor();}

ik vertel expres niet het programma want dn snap je nog niet wat arduino kan zijn.
paul deelen
shooter@home.nl

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

Re: Beginnersvraag: werken met een timer

Berichtdoor Koepel » 29 Nov 2016, 21:31

@Loene, Je hebt al wat ervaring met Arduino en programmeren zie ik. Je vraag is ook goed gesteld. Er is echter één ding waar ik over struikel: "...en daarna stopt".

Stel er zijn twee Minions. De eerste kijkt naar de afstand en de druk als de voorwaarden juist zijn dan zet hij een kookwekker op 15 seconden. De tweede draait aan de as van de motor zolang de kookwekker loopt.

Wil je dan er een derde Minion bij die op zijn horloge kijkt en iedere 15 seconden de tweede Minion op de schouders tikt om te stoppen, en dan ook nog een tweede kookwekker nodig heeft om bij te houden hoe lang de tweede Minion moet stoppen ?
Op mij komt dit over alsof ik door een stepper-motor-bos loop met een kabbelend millis-beekje en ik plotseling met een beer moet vechten :o

Ik hoop dat je mijn uitleg begrijpt. Ik probeer de verschillende onderdelen van de sketch voor me te zien en na te gaan hoe ze met elkaar samenwerken.
Je hebt vast wel eens van millis() gehoord, daarmee is een software timer te maken. Er zijn echter wel een aantal regels om millis() goed te laten werken: gebruik 'unsigned long' en je mag alleen het huidige moment onthouden en niet de tijd in de toekomst berekenen.

Voor de software timer zijn twee globale variabelen nodig:
Code: Alles selecteren
unsigned long previousMillis;
boolean timerActive;


Je if-statement laat niet meer de motor draaien, maar zet de software timer:
Code: Alles selecteren
  if (valdruksensor>100 && val<200)
  {
    previousMillis = millis();  // timestamp this moment
    timerActive = true; // enable the software timer
  }


De stepper motor draait als de software timer bezig is:
Code: Alles selecteren
  if( timerActive)
  {
    digitalWrite(Pin0, HIGH);
    digitalWrite(Pin1, LOW);
    digitalWrite(Pin2, LOW);
    digitalWrite(Pin3, LOW);
    delay(msDelay);
    digitalWrite(Pin0, HIGH);
    ...
  }


Vervolgens in de loop() ook nog kijken wanneer de timer is afgelopen:
Code: Alles selecteren
void loop()
{
  ...

  if( millis() - previousMillis >= 15000UL)    // 15 seconds, 'UL' means unsigned long
  {
    timerActive = false;      // disable the software timer.
  }

  ...
}


(Terwijl ik dit intik heeft shooter al precies hetzelfde geschreven. Oeps. Ik post het toch maar en nu maar hopen dat Loene er toch iets van leert. Sorry shooter)

Berichten: 3
Geregistreerd: 29 Nov 2016, 19:45

Re: Beginnersvraag: werken met een timer

Berichtdoor Loene » 30 Nov 2016, 09:35

Bedankt voor de snelle reacties!! Ik ga aan de slag! ;-)

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Beginnersvraag: werken met een timer

Berichtdoor shooter » 30 Nov 2016, 22:58

ja loene en dat is nou precies de bedoeling.
paul deelen
shooter@home.nl

Berichten: 3
Geregistreerd: 29 Nov 2016, 19:45

Re: Beginnersvraag: werken met een timer

Berichtdoor Loene » 06 Dec 2016, 11:33

Hey, ondertussen wat geprobeerd en het lijkt te lukken, bedankt!!. Het enige probleempje dat ik nog heb is het volgende:
als aan de voorwaarden wordt voldaan gaat de motor draaien. De timer begint echter pas te tellen wanneer er niet meer aan de voorwaarden wordt voldaan. Ik zou willen dat de timer begint te lopen, zodra aan de vwden wordt voldaan. Dus als na 15 sec de vwden nog voldaan zijn MOET de motor stoppen met draaien. Wat doe ik fout? Alvast bedankt voor alle hulp!!

Code: Alles selecteren
valdruksensor=analogRead(druksensor);
  Serial.print("DRUKSENSOR = ");
  Serial.println(valdruksensor);
    while (valdruksensor>150 && val<400)
    {
    previousMillis = millis(); 
    timerActive = true;
    Serial.println("While");
    valdruksensor=analogRead(druksensor);
    val=analogRead(IRsensor);
    }
     
    if (timerActive)
    {
       digitalWrite(Pin0, HIGH);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, LOW);
      delay(msDelay);
       digitalWrite(Pin0, HIGH);
       digitalWrite(Pin1, HIGH);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, LOW);     
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, HIGH);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, LOW);
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, HIGH);
       digitalWrite(Pin2, HIGH);
       digitalWrite(Pin3, LOW);     
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, HIGH);
       digitalWrite(Pin3, LOW);
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, HIGH);
       digitalWrite(Pin3, HIGH);     
      delay(msDelay);
       digitalWrite(Pin0, LOW);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, HIGH);     
      delay(msDelay);
       digitalWrite(Pin0, HIGH);
       digitalWrite(Pin1, LOW);
       digitalWrite(Pin2, LOW);
       digitalWrite(Pin3, HIGH);
      delay(msDelay);
    }
    if( millis() - previousMillis >= 14500UL)   
    {
    timerActive = false;   
    }
}

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

Re: Beginnersvraag: werken met een timer

Berichtdoor Koepel » 06 Dec 2016, 13:55

Dus je wilt toch die derde Minion ? en dat ik met een beer ga vechten ? brrrrrrr :?
Stel dat de hele tijd aan de voorwaarden wordt voldaan, dan is het nodig dat je het moment onthoudt waarop de voorwaarden beginnen met voldaan te worden (sorry voor de kromme zin).
Daarvoor is nodig dat je de vorige 'state' onthoudt, zoals bij deze StateChangeDetection : https://www.arduino.cc/en/Tutorial/StateChangeDetection.
In plaats van de 'state' van de button, gaat het bij jou om de 'state' of aan de voorwaarden is voldaan.

Hoe lang wil je dat de servo motor uit blijft ? Kan dat met een delay() of wil je dat ook met millis() ?

Kun je wat meer commentaar bij je code schrijven ?

De 'previousMillis' is alleen geldig als 'timerActive' true is. Zodra 'timerActive' false is, heeft de waarde van 'previousMillis' geen betekenis meer. Kun je het uitbreiden met dit:
Code: Alles selecteren
    if( timerActive)        // is the software timer running ?
    {
        if( millis() - previousMillis >= 14500UL)   // check the time
        {
            timerActive = false;   // disable the software timer.
        }
    }
}

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Beginnersvraag: werken met een timer

Berichtdoor shooter » 06 Dec 2016, 23:35

als voorwaarden dan reset je de timer door previous millis, maar zogauw de timer actiev is dan geen previous meer zetten.
paul deelen
shooter@home.nl

Berichten: 2
Geregistreerd: 19 Aug 2020, 12:28

Re: Beginnersvraag: werken met een timer

Berichtdoor dwang » 19 Aug 2020, 12:36

Previous Millis reset je na de de opdracht,

if( millis() - previousMillis >= 14500UL) // check the time

PreviousMillis = millis() // previousMillis resetten.

Dan wordt previousMillis gelijk gezet aan millis en kan het tellen weer op nieuw beginnen.

Nadeel van deze manier is wel dat de tijd nooit gelijk is aan de 14,5 sec.

De looptijd van het programma zit er dan ook tussen.

Berichten: 2
Geregistreerd: 19 Aug 2020, 12:28

Re: Beginnersvraag: werken met een timer

Berichtdoor dwang » 19 Aug 2020, 12:47

dwang schreef:Previous Millis reset je na de de opdracht,

if( millis() - previousMillis >= 14500UL) // check the time

PreviousMillis = millis() // previousMillis resetten.

Dan wordt previousMillis gelijk gezet aan millis en kan het tellen weer op nieuw beginnen.

Nadeel van deze manier is wel dat de tijd nooit gelijk is aan de 14,5 sec.

De looptijd van het programma zit er dan ook tussen.



Zat nog even te kijken.

Maar de tijd telling wordt aan en uit gezet zag ik.
Dat ga ik ook even proberen.

Weer wat wijzer geworden :D

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 21 gasten