Hoe kan ik deze while loop breken?

algemene C code
Berichten: 27
Geregistreerd: 08 Okt 2017, 21:48

Hoe kan ik deze while loop breken?

Berichtdoor Gester1989 » 08 Okt 2017, 22:04

Ik heb als eerst een infinite loop toegevoegd. Dugme is een variable voor de loop. Maar ik kan de loop niet breken. Dat is waarom als ik de loop inga dat ik het niet kan afsluiten. Ik wil dus een automatische modus en een handmatige modus met de applicatie die ik gebruik.

Dit is de loop die voor de automatische modus zorgt:

Code: Alles selecteren
void mode1()
{
    long duration, distance;
    while(looppp==1)
    {
        int distanceR = 0;
        int distanceL =  0;
        delay(40);
        if(distance<=24)
        {
            moveStop();
            delay(100);
            moveBackward();
            delay(300);
            moveStop();
            delay(200);
            distanceR = lookRight();
            delay(200);
            distanceL = lookLeft();
            delay(200);
            if(distanceR>=distanceL)
            {
                turnRight();
                moveStop();
            }
            else
            {
                turnLeft();
                moveStop();
            }
        }
        else
        {
            moveForward();
        }
        distance = readPing();
    }
}


Dit is de code als ik weer druk op dezelfde knop dat alle motors dan uit moeten gaan.
Code: Alles selecteren
void modestop()
{
    looppp=0
    motor1.setSpeed(0);
    motor2.run(RELEASE); //turn motor1 off
    motor2.setSpeed(0);
    motor2.run(RELEASE); //turn motor2 off
}


Dit is de code waar de functie van een toets ingaat:

Code: Alles selecteren
void loop(){
   if(Serial.available() > 0){
    command = Serial.read();
    Stop();
    switch(command){
    case 'F': 
      forward();
      break;
    case 'B': 
       back();
      break;
    case 'L': 
      left();
      break;
    case 'R':
      right();
      break;
     case 'X': 
      mode1();
      break;
    case 'x': 
      modestop();
      break;
    }
  }
}


En looppp:

staat boven aan zoals
Code: Alles selecteren
 int looppp=1;
en
Code: Alles selecteren
looppp
is alleen in void mode en in modestop
Code: Alles selecteren
while(looppp==1)


Ik ben net 4 weken bezig en ik heb echt geen idee hoe ik dit moet doen. Kan iemand mij hierbij helpen? Ik wil jullie bedanken voor jullie tijd.

MVG,

Gester

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Hoe kan ik deze while loop breken?

Berichtdoor nicoverduin » 08 Okt 2017, 22:43

Ala je break; doet springt hij uit de loop. Maarrrrr het zegt wel iets over jouw ontwerp van de sketch.....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Hoe kan ik deze while loop breken?

Berichtdoor Koepel » 08 Okt 2017, 22:57

Het woord dat je zoekt is: "millis".
Vier weken bezig, en dan al millis gaan gebruiken :? Dat is misschien een beetje snel.

Hallo en welkom op dit forum.
Hoe is je programmeerkennis ? Je wilt een vorm van multitasking.
Welk Arduino board heb je ?

Bij embedded systemen wordt er vaak gewerkt met interrupts en buffers. Bij de Arduino is dat niet zo. In de loop van jaren heeft zich een manier uitgekristalliseerd om met millis() meerdere dingen te kunnen doen. Dus bijvoorbeeld kijken of een knop is ingedrukt, tegelijkertijd een bepaalde sequence met motors uitvoeren, tegelijkertijd sensoren lezen en verwerken, tegelijkertijd een melodie afspelen, enzovoorts.

Het is natuurlijk mogelijk om uit een functie te springen zodra een knop wordt ingedrukt. Dat kan door een delay(300) te vervangen door 300 keer delay(1) en ook 300 keer naar de knop kijken. Geef een return als de knop ingedrukt wordt en je bent uit de functie.
Uit een while- of for-loop springen kan met break;
Heb je geen knop maar een commando van de seriële poort, dan wordt het al iets ingewikkelder.
Je zit uiteindelijk wel vast aan die ene specifieke situatie.

Met millis() is de code veel flexibeler. Daarvoor is het nodig om de delay() uit de code te verwijderen, en de sequence met de motoren kun je dan het beste in een tabel zetten. In dit geval is dat iets voor een gevorderde programmeur.
Of je een knop gebruikt of een commando van een seriële poort, dat maakt dan weinig meer uit.
Begin met BlinkWithoutDelay: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Berichten: 27
Geregistreerd: 08 Okt 2017, 21:48

Re: Hoe kan ik deze while loop breken?

Berichtdoor Gester1989 » 08 Okt 2017, 23:06

nicoverduin schreef:Ala je break; doet springt hij uit de loop. Maarrrrr het zegt wel iets over jouw ontwerp van de sketch.....


Als ik break gebruik dan rijdt de robot niet meer verder en kijkt hij niet weer om zich heen terwijl hij rijdt etc. Hoe kan ik ervoor zorgen dat als ik op een knop druk dat die while loop eindigt en de motors stoppen zodat ik weer de handmatige toetsen kan gebruiken?

Berichten: 27
Geregistreerd: 08 Okt 2017, 21:48

Re: Hoe kan ik deze while loop breken?

Berichtdoor Gester1989 » 08 Okt 2017, 23:14

Koepel schreef:Het woord dat je zoekt is: "millis".
Vier weken bezig, en dan al millis gaan gebruiken :? Dat is misschien een beetje snel.

Hallo en welkom op dit forum.
Hoe is je programmeerkennis ? Je wilt een vorm van multitasking.
Welk Arduino board heb je ?

Bij embedded systemen wordt er vaak gewerkt met interrupts en buffers. Bij de Arduino is dat niet zo. In de loop van jaren heeft zich een manier uitgekristalliseerd om met millis() meerdere dingen te kunnen doen. Dus bijvoorbeeld kijken of een knop is ingedrukt, tegelijkertijd een bepaalde sequence met motors uitvoeren, tegelijkertijd sensoren lezen en verwerken, tegelijkertijd een melodie afspelen, enzovoorts.

Het is natuurlijk mogelijk om uit een functie te springen zodra een knop wordt ingedrukt. Dat kan door een delay(300) te vervangen door 300 keer delay(1) en ook 300 keer naar de knop kijken. Geef een return als de knop ingedrukt wordt en je bent uit de functie.
Uit een while- of for-loop springen kan met break;
Heb je geen knop maar een commando van de seriële poort, dan wordt het al iets ingewikkelder.
Je zit uiteindelijk wel vast aan die ene specifieke situatie.

Met millis() is de code veel flexibeler. Daarvoor is het nodig om de delay() uit de code te verwijderen, en de sequence met de motoren kun je dan het beste in een tabel zetten. In dit geval is dat iets voor een gevorderde programmeur.
Of je een knop gebruikt of een commando van een seriële poort, dat maakt dan weinig meer uit.
Begin met BlinkWithoutDelay: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay


Ik heb een arduino uno board. Ik vind het een mooie antwoord die je geeft maar of ik het begrijp weet ik niet haha. Bedankt voor je tijd iniedergeval. Dus ik moet de delay gaan vervangen met millis? Want een break werkt niet omdat hij dan niet in die loop blijft dat hij met sensoren en servo rond moet gaan kijken. Maar er is dus geen code ik er makkelijk bij kan zetten waardoor de wiel gewoon stoppen en dan de handmatige besturing kan worden gebruikt? Ik wil het namelijk nu weten en niet morgen. Ik vraag mijn leraar wel of hij me kan helpen dan, ik denk dat dat beter is. Ik had geen geduld om nog een dag te wachten. Iniedergeval bedankt voor je antwoord, ik zal er zelf naar kijken om de code te leren begrijpen. Ik weet zelf wel hoe ik een webite moet maken, html,css en php en javascript een klein beetje, de laatste 2 niet genoeg. Ik wens u een fijne avond.

Groetjes,

Gester

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

Re: Hoe kan ik deze while loop breken?

Berichtdoor Koepel » 08 Okt 2017, 23:22

Helaas, er niet even snel een oplossing. Behalve dan die lelijke oplossing om delay(300) te vervangen door 300 keer delay(1) en naar een knop kijken. Je zou een macro kunnen gebruiken.

Javascript komt in de buurt, maar Arduino heeft zo zijn eigen eigenaardigheden.

Je hoeft trouwens niet alles te quoten, wat wij hebben geschreven, dat staat er al ;)


Mijn hersenspinsel (het is nog niet perfect):
Code: Alles selecteren
// Vervang delay() door de macro delayOrExit().
// De functie testCommand() kijkt of er een commando is om het af te breken.
// Met return wordt meteen uit de functie gesprongen.
#define delayOrExit(a) for(unsigned long ul=0; ul<a; ul++, delay(1)) if(testCommand()) return

Berichten: 27
Geregistreerd: 08 Okt 2017, 21:48

Re: Hoe kan ik deze while loop breken?

Berichtdoor Gester1989 » 09 Okt 2017, 01:05

Oohoke, ja dan vraag ik het maandagmiddag wel een mijn arduino leraar. Bedankt voor de reacties!

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 12 gasten