Beginnersvraag: werken met een timer
11 berichten
• Pagina 1 van 2 • 1, 2
Beginnersvraag: werken met een timer
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
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
Re: Beginnersvraag: werken met een timer
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.
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
shooter@home.nl
Re: Beginnersvraag: werken met een timer
@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
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:
Je if-statement laat niet meer de motor draaien, maar zet de software timer:
De stepper motor draait als de software timer bezig is:
Vervolgens in de loop() ook nog kijken wanneer de timer is afgelopen:
(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)
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
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)
Re: Beginnersvraag: werken met een timer
ja loene en dat is nou precies de bedoeling.
paul deelen
shooter@home.nl
shooter@home.nl
Re: Beginnersvraag: werken met een timer
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!!
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;
}
}
Re: Beginnersvraag: werken met een timer
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:
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.
}
}
}
Re: Beginnersvraag: werken met een timer
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
shooter@home.nl
Re: Beginnersvraag: werken met een timer
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.
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.
Re: Beginnersvraag: werken met een timer
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
11 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten