Go Down

Topic: 2 acties tegelijkertijd uitvoren. (Read 1 time) previous topic - next topic

WouterPieper

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);
}

nicoverduin

#1
Apr 05, 2016, 04:05 pm Last Edit: Apr 05, 2016, 04:05 pm by nicoverduin
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.
Met vriendelijke groet / kindest regards
Nico Verduin
www.verelec.nl
Do not PM me for personal consultancy unless you are willing to pay for it.

S_v_L

#2
Apr 05, 2016, 11:32 pm Last Edit: Apr 05, 2016, 11:38 pm by S_v_L
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...
}

shooter

paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

Go Up