Looping/repeat in void

Beste Arduino gebruikers!!

Ik heb een probleem met de programmering van de loop.

Even alleen naar de totale programma van de servo1() ---->

Zoals er u staat zal wanneer W hoog word het programma van servo1 draaien.
Echter het probleem is dat na 1 maal W hoog het programma ook maar 1 keer zijn cyclus maakt!
We willen dat na 1 maal W hoog het programma servo1 telkens in zijn cylcus blijft tot dat kleine w hoog word --> Kleine w hoog reset de groote W

Ik hoop dat jullie me kunnen helpen!!!!

cpp code

#include <Servo.h>

#include <Adafruit_NeoPixel.h>
#define PIN 10

Servo servoMain;
int wheels1high = 4;
int wheels1 = 5;
int wheels2 = 6;
int wheels2high = 7;
int doserenhigh = 8;
int doseren = 9;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

char command;

void setup(){

Serial.begin(9600);
servoMain.attach(10);

strip.begin();
strip.show(); // Initialize all pixels to 'off'

pinMode (wheels1high, OUTPUT);
pinMode (wheels1, OUTPUT);
pinMode (wheels2, OUTPUT);
pinMode (wheels2high, OUTPUT);
pinMode (doserenhigh, OUTPUT);
pinMode (doseren, OUTPUT);

}

void loop(){

if (Serial.available() > 0){
command = Serial.read();
Serial.write(command);

switch(command){

case 'W':
servo1()
break;
}
}
}

void wielen1(){

digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 200);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 200);
delay (2000);
digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 100);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 200);
delay (2000);

}

void wielen2(){

digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 100);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 200);
delay (2000);
digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 150);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 100);
delay (2000);

}

void wielen3(){

digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 250);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 250);
delay (2000);
digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 100);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 250);
delay (2000);

}

void wielen4(){

digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 150);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 100);
delay (2000);
digitalWrite (wheels1high,HIGH);
analogWrite (wheels1, 200);
digitalWrite (wheels2high,HIGH);
analogWrite (wheels2, 250);
delay (2000);

}

void servo1(){

servoMain.write(45); // Turn Servo Left to 45 degrees
delay(500); // Wait 1 second
servoMain.write(60); // Turn Servo Left to 0 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second
servoMain.write(115); // Turn Servo Right to 135 degrees
delay(500); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 180 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second

}

void servo2(){

servoMain.write(45); // Turn Servo Left to 45 degrees
delay(500); // Wait 1 second
servoMain.write(60); // Turn Servo Left to 0 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second
servoMain.write(115); // Turn Servo Right to 135 degrees
delay(500); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 180 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second

}

void servo3(){

servoMain.write(45); // Turn Servo Left to 45 degrees
delay(500); // Wait 1 second
servoMain.write(60); // Turn Servo Left to 0 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second
servoMain.write(115); // Turn Servo Right to 135 degrees
delay(500); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 180 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second

}
void servo4(){

servoMain.write(45); // Turn Servo Left to 45 degrees
delay(500); // Wait 1 second
servoMain.write(60); // Turn Servo Left to 0 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second
servoMain.write(115); // Turn Servo Right to 135 degrees
delay(500); // Wait 1 second
servoMain.write(135); // Turn Servo Right to 180 degrees
delay(500); // Wait 1 second
servoMain.write(90); // Turn Servo back to center position (90 degrees)
delay(500); // Wait 1 second

}

void doseren1(){

digitalWrite (doserenhigh,HIGH);
analogWrite (doseren, 10);
delay (2000);

}

void doseren2(){

digitalWrite (doserenhigh,HIGH);
analogWrite (doseren, 10);
delay (2000);

}

void doseren3(){

digitalWrite (doserenhigh,HIGH);
analogWrite (doseren, 10);
delay (2000);

}

void doseren4(){

digitalWrite (doserenhigh,HIGH);
analogWrite (doseren, 10);
delay (2000);

}

Volgende keer even in code tags plaatsen :slight_smile: (Of nog beter, even je post aanpassen.)

Maar simpel, onthoud dat je servo1 aan het doen bent in een variabele en doe dat de volgende keer dan weer. Of eventueel check je dan of je een ander commando hebt gekregen via Serial.

Maar drie grote tips die ik je mee wil geven. Zodra je variabele nummers gaat geven, altijd overstappen naar array's. Maakt alles een stuk makkelijker!

En zelfde geldt voor de functies, als je die nummers gaat lopen geven terwijl ze 99% hetzelfde zijn had je dat verschil als parameter kunnen gebruiken. Maar in dit geval zijn ze zelfs 100% hetzelfde....

En leer af om delays() te gebruiken. Tijdens een delay() kan je heeeeeeelemaal niets doen. Het is alsof je je kop in het zand steekt. Leer klokkijken en gebruik millis() :slight_smile:

Hoi en welkom allemaal (je zegt 'we' en ik weet niet wie jullie zijn).

Je wil wel wat er iets gebeurt bij W, maar ook bij w.
Waarom kijk je dan alleen naar W ?

Verder helemaal eens met septilion.

Hallo,

Dit lijkt er al meer op.

// Arduino.cc IDE 1.6.13, Arduino Uno

#include <Servo.h>
#define PIN 10

Servo servoMain;

void setup()
{
  Serial.begin( 9600);     // opens serial port, sets data rate to 9600 bps
  Serial.println( "Started");

}

void loop()
{
  // Check if new serial data has arrived:
  if( Serial.available() > 0)
  {
    // read the incoming byte:
    int incomingByte = Serial.read();

    switch( incomingByte)
    {
      case 'W':
        Serial.println( "Een grote 'W' ontvangen.");
        digitalWrite; 
        break;
      case 'w':
        Serial.println( "Een kleine 'w' ontvangen.");
        digitalWrite; 
        break;
      default:
        Serial.println( "Iets anders ontvangen.");
        break;
    }
  }
}

void servo1(){
  
   
   servoMain.write(45);  // Turn Servo Left to 45 degrees
   delay(500);          // Wait 1 second
   servoMain.write(60);   // Turn Servo Left to 0 degrees
   delay(500);          // Wait 1 second
   servoMain.write(90);  // Turn Servo back to center position (90 degrees)
   delay(500);          // Wait 1 second
   servoMain.write(115); // Turn Servo Right to 135 degrees
   delay(500);          // Wait 1 second
   servoMain.write(135); // Turn Servo Right to 180 degrees
   delay(500);          // Wait 1 second
   servoMain.write(90);  // Turn Servo back to center position (90 degrees)
   delay(500);          // Wait 1 second   
   }

Nu kom ik niet verder met de waarde van W en w om te zetten in Servo1() in de loop en Servo1() uit de loop. Hoop dat jullie me kunnen helpen

Je stuurt alleen een tekst naar serial als je een of andere w hebt gezien.
Je doet er verder niets mee.

Wat bedoel je met "Servo1() in de loop en Servo1() uit de loop" ?

Servo1() word schijnbaar nooit aangeroepen.
Das maar goed ook, want er gebeurt 48.000.000 (miljoen dus) keer niets, en laten we zeggen iets van 24 keer wel wat.

Als je wil dat er 2 verschillende dingen gebeuren, moet je of met een variabele werken die aangeeft wat er gedaan moet worden als je de servo gaat aansturen, of je moet met 2 verschillende functies werken (ligt aan de complexiteit van de functie).

Wanneer je commentaar gebruikt, zorg dan dat dat kloppend commentaar is, of laat het helemaal weg.
Nu klopt er niets van.

dank je,

Met dit programma word servo1() nooit aangestuurd, dat begrijp ik.
Echter wil ik dat waar nu digital write staat een variable komt die de servo1() loop kaan aansturen.

Met loop aan en loop uit bedoel ik dat de void servo1() hoog word en laag word.

Hoop dat je me met de comminucatie tussen de servo1() en W/w kan helpen

Ik heb de heren op het andere forum al aangegeven dat er toch wel wat meer verwacht mag worden van 4e jaars studenten. zie : Het Nederlandstalig Arduino forum - Bekijk onderwerp - Void Cyclus Repeat
Mijn mijn mening daarover moge duidelijk zijn. Maar in plaats van energie te steken in kennis vergaring/opbouw/onderzoek lijkt het erop dat ze het maar hier proberen om zo eenvoudig hun huiswerk te laten maken.
Dat kan niet de bedoeling zijn......

We willen zo veel mogenlijk informatie verschaffen Nicoverduin......

Daar gaat het niet om. Het gaat erom dat je zelf niet zo veel informatie vergaart :wink:

En als je hetzelfde wilt doen voor W en w kan je toupper() of tolower() gebruiken :slight_smile:

En je hebt eigenlijk niets met me tips gedaan... Je hebt arrays vermeden door voor nu alle andere acties weg te halen. Maar een functienaam als servo1() (wat een slechte naam is overigens, het moet uitleggen wat het doet) verraad dat je meer wilt gaan doen :wink:

En ook staat het nog steeds vol delay() en niet zo'n klein beetje ook. Tijdens een delay() kan je helemaal niets, nada, noppes. Je zit met je kop in het zand te wachten tot je klaar bent. Wat er in de tussentijd gebeurd, geeeeeeeeeeeen idee. Stuur je een andere letter? Dat moet maar wachten. Enz.

Ik zou zeggen, ga daar eerst een mee aan de slag :slight_smile: