Arduino Forum

International => Nederlands => Topic started by: WouterPieper on Apr 05, 2016, 03:56 pm

Title: 2 acties tegelijkertijd uitvoren.
Post by: WouterPieper on Apr 05, 2016, 03:56 pm
Hallo,

Ik zou graag een servo motor 10x laten "sweepen", dus van 0 naar 180 graden en van 180 weer naar 0 graden.
Terwijl dit gebeurd zou ik graag een LED willen laten knipperen.
Daarna de led uit en 10 seconden vertraging
Hoe kan ik dit doen?

(de led moet redelijk snel knipperen, als ik hem bij pos 180 naar 0 uit laat gaan knippert hij te langzaam)

Dit is de code die ik tot nu toe heb, de led brand nu continue:


void loop() {
  for (int i=0; i<10; i++){
  for (pos = 0; pos <= 180; pos += 1) {
   
    myservo.write(pos);             
    delay(15);
    digitalWrite(13, HIGH);
    }
   
    for (pos = 180; pos >= 0; pos -= 1) {
    myservo.write(pos);             
    delay(15);                     
    }
  }
   
  digitalWrite(13, LOW);
  delay(10000);
}
Title: Re: 2 acties tegelijkertijd uitvoren.
Post by: nicoverduin on Apr 05, 2016, 04:05 pm
Ik zou eens naar blink-without-delay kijken. dat is een sketch die vrijwel de hele tijd niets doet tenzij er iets moet gebeuren. Jij gaat rustig 15 milliseconden wachten en niets doen. Alle tijd van de wereld om naar iets anders te kijken en te doen.
Title: Re: 2 acties tegelijkertijd uitvoren.
Post by: S_v_L on Apr 05, 2016, 11:32 pm
Je zit een beetje verkeerd te denken, een Arduino UNO kan geen twee dingen tegelijk doen, want het heeft maar 1 thread en maar 1 core. Je zult dus in de programmering moeten zorgen dat ze hij het 'tegelijk' doet. Dit is de code die ik hier ook ooit voor gebruikt heb, een beetje aangepast, kijk maar of je er wat aan hebt :).

Code: [Select]

static const byte msOffTime = 500; //Variabele die bepaalt hoe lang de LED uit is
static const byte msOnTime = 500; //Variabele die de bepaalt hoe lang de LED aan is
unsigned long lastSwitched = 0; //Variabele om te onthouden wanneer de LED voor het laatst is omgezet

bool ledOn = false; //Flag om te onthouden of de LED aan is
bool servoPosUpward = true; //Onthouden of de Servo signalen krijgt van 0 - 180 of andersom
byte servoPos = 0; //Onthouden hoe hoog de positie van de servo is

void loop() {
if (ledOn) { //Als de LED aan staat
if (millis() - lastTime > misOnTime) { //Als de LED langer aan staat dan msOnTime (500 ms)
digitalWrite(13, LOW);
lastTime = millis(); //Onthoud wanneer de LED voor het laatst geswitched is
ledOn = false; //Onthoud dat de LED nu uit staat
}
} else {
if (millis() - lastTime > msOffTime) {
digitalWrite(13, HIGH);
lastTime = millis();
ledOn = true;
}
}

if (servoPosUpward) { //Als de servo van 0 - 180 gaat
if (servoPos == 180) { //Als servoPos de top heeft bereikt, zal servoPos weer naar beneden moeten
servoPosUpward = false;
servoPos -= 1;
} else {
servoPos += 1;
}
} else { //Als de servo van 180 - 0 gaat
if (servoPos == 0) {
servoPosUpward = true;
servoPos += 1;
} else {
servoPos -=1;
}
}
myServo.write(pos); //De positie naar de servo sturen
delay(15); //Even wachten...
}
Title: Re: 2 acties tegelijkertijd uitvoren.
Post by: shooter on Apr 07, 2016, 09:39 am
svl zie nico