Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.




Loop in case?
 
Deel:
Meldingen
Alles wissen

Loop in case?

9 Berichten
2 Gebruikers
1 Vind-ik-leuks
861 Bekeken
(@djdeeno)
Eminent Member
Deelgenomen: 3 jaar geleden
Berichten: 27
Topic starter  

Goedendag,

 

Ik heb een vraagje, nu heb ik een sketch gemaakt wat op zich prima werk, doormiddel van indrukken van button zijn er 3 mogelijkheden, 3 cases, de eerst is om een led aan te zetten, als men nog een keer opdrukt gaat led uit, en als men nog keer op drukt dan kan met een servo besturen doormiddel van een joystick. 

Echter bij case3 werkt de joystick niet, dit komt vermoedelijk omdat er geen loop in de case loopt, als deze case los week en in aparte skect zet werkt het wel prima.

Hoe krijg ik het zo voor elkaar dat de loopt actief is in de case 3 en terwijl case 3 loopt, als ik vervolgens weer op de de button klik hij weer terug gaat naar case 1 (dat doet hij nu ook al prima, alleen de joystick functie werkt niet).

Nu had ik het ook geprobeerd om de optie for (int j = 0; j < 2; j++ ) in een case te zetten, dat werkt ergens ook wel maar dan komt hij weer niet uit de loop van case 3 wanneer 10000 is bereikt en natuurlijk is dit niet de juiste nette oplossing, het was ook even spelen om te kijken wat het doet, maar dat ter informatie.

 

alvast bedankt weer!!!

groetjes Marcel

#include <Servo.h>

const int buttonPin = 12;     // the pin that the pushbutton is attached to
const int ledPin = 11;         // the pin that the LED is attached to

Servo servo1;
Servo servo2;
int joyX = 0;
int joyY = 1;

int servoVal;
int buttonState = 0;
int flag = 0;

int buttonPushCounter1 = 2;    // counter for the number of button presses. Start at 0 (will loop around first)
bool buttonState1;

void setup() {
  Serial.begin(9600);
  Serial.println("Started");
  servo1.attach(9);
  servo2.attach(10);
  pinMode(ledPin, OUTPUT); // Pin led is een output naar de IRLZ24
  pinMode(buttonPin, INPUT_PULLUP);
  buttonState1 = false;
}

void loop() {
  if (digitalRead(buttonPin) == LOW)    // if the current state is LOW (use of pullups) then the button
  {
    if (buttonState1 == false) {         // allows button to be read and will wait until release
      buttonPushCounter1++;
      if (buttonPushCounter1 == 3) {
        buttonPushCounter1 = 0;
      }
      buttonState1 = true;
    }
    switch (buttonPushCounter1) {

      case 0:
        analogWrite(ledPin, 30); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led aan");
        break;

      case 1:
        analogWrite(ledPin, 0); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led uit");
        break;

      case 2:
        {
          servoVal = analogRead(joyX);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo1.write(servoVal);
          servoVal = analogRead(joyY);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo2.write(servoVal);
          Serial.println("hier gaat joystick aank");
          break;
        }

    }
  } else {
    buttonState1 = false;
  }
}

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2660
 

Ik begin net aan m;n eerste koffie vanmorgen dus ik kan het mis hebben ... 😉 

Bij de derde knop druk wordt eenmalig de servo actie gedaan. Ik neem aan dat deze code in de aparte sketch, die je vermelde, in de loop staat en dus steeds blijft herhalen.

Je zou een loop met een break kunnen doen - ik weet niet precies hoe die derde knop druk werkt.
Zolang de knop ingedrukt blijft, moet de servo gestuurd worden?
Zo ja, dan zou je een do-while loop kunnen overwegen.

Dat zou er dan zo uit zien: voer de analogread stap uit (en wat er nog bij moet komen als je de servo gaat aansturen) en blijf dit herhalen tot de digitalRead(buttPin) == HIGH.

Zoiets als dit (niet getest, en onderweg naar m'n tweede bakkie koffie 😉 ) ...

void loop() {
  int buttonValue = digitalRead(buttonPin);

  if (buttonValue == LOW)    // if the current state is LOW (use of pullups) then the button
  {
    if (buttonState1 == false) {         // allows button to be read and will wait until release
      buttonPushCounter1++;
      if (buttonPushCounter1 == 3) {
        buttonPushCounter1 = 0;
      }
      buttonState1 = true;
    }
    switch (buttonPushCounter1) {

      case 0:
        analogWrite(ledPin, 30); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led aan");
        break;

      case 1:
        analogWrite(ledPin, 0); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led uit");
        break;

      case 2:
        {
          do {
            servoVal = analogRead(joyX);
            servoVal = map(servoVal, 0, 1023, 0, 180);
            servo1.write(servoVal);
            servoVal = analogRead(joyY);
            servoVal = map(servoVal, 0, 1023, 0, 180);
            servo2.write(servoVal);
            Serial.println("hier gaat joystick aank");
            buttonValue = digitalRead(buttonPin); // button opnieuw testen
          } while (buttonValue==LOW); // herhaal zolang button is ingedrukt.
          
          break;
        }

    }
  } else {
    buttonState1 = false;
  }
}

   
BeantwoordenCiteren
(@djdeeno)
Eminent Member
Deelgenomen: 3 jaar geleden
Berichten: 27
Topic starter  

Goedemorgen Hans,

 

We zullen weer een donatie doen voor een extra bakje koffie, komt helemaal goed :-)

Bijna, er 1 drukknop, zoals je ziet 3 cases, als men in de 3e case (eigenlijk case2 in de sketch) aankomt mag men de servo bedienen, en de knop/button hoeft niet ingedrukt te blijven, nu heb je jou optie geprobeerd, alleen als ik de knop weer in drukt mag hij naar case 0, dat doet hij niet. Hij blijft in case2 hangen

code ziet er nu zo uit

 

#include 

const int buttonPin = 12;     // the pin that the pushbutton is attached to
const int ledPin = 11;         // the pin that the LED is attached to

Servo servo1;
Servo servo2;
int joyX = 0;
int joyY = 1;

int servoVal;
int buttonState = 0;
int flag = 0;

int buttonPushCounter1 = 2;    // counter for the number of button presses. Start at 0 (will loop around first)
bool buttonState1;

void setup() {
  Serial.begin(9600);
  Serial.println("Started");
  servo1.attach(9);
  servo2.attach(10);
  pinMode(ledPin, OUTPUT); // Pin led is een output naar de IRLZ24
  pinMode(buttonPin, INPUT_PULLUP);
  buttonState1 = false;
}

void loop() {
  int buttonValue = digitalRead(buttonPin);

  if (buttonValue == LOW)    // if the current state is LOW (use of pullups) then the button
  {
    if (buttonState1 == false) {         // allows button to be read and will wait until release
      buttonPushCounter1++;
      if (buttonPushCounter1 == 3) {
        buttonPushCounter1 = 0;
      }
      buttonState1 = true;
    }
    switch (buttonPushCounter1) {

      case 0:
        analogWrite(ledPin, 30); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led aan");
        break;

      case 1:
        analogWrite(ledPin, 0); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led uit");
        break;

      case 2:
        {
          do {
            servoVal = analogRead(joyX);
            servoVal = map(servoVal, 0, 1023, 0, 180);
            servo1.write(servoVal);
            servoVal = analogRead(joyY);
            servoVal = map(servoVal, 0, 1023, 0, 180);
            servo2.write(servoVal);
            Serial.println("hier gaat joystick aank");
            buttonValue = digitalRead(buttonPin); // button opnieuw testen
          } while (buttonValue==LOW); // herhaal zolang button is ingedrukt.
          
          break;
        }

    }
  } else {
    buttonState1 = false;
  }
}

 

Dit bericht is gewijzigd 2 jaar geleden door djdeeno

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2660
 

Haha 🤣 sorry - zo bedoelde ik de koffie niet - maar het wordt gewaardeerd 😉 

OK, dan had ik dat verkeerd begrepen ...
Dus als de knop voor de 3de keer wordt ingedrukt blijven we de joystick/servo doen tot de knop weer wordt ingedrukt?

In dat geval willen we de loop herhalen tot sint Juttemis, tot de knop weer wordt ingedrukt.

Optie 1:

case 2:
        do {
          servoVal = analogRead(joyX);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo1.write(servoVal);
          servoVal = analogRead(joyY);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo2.write(servoVal);
          Serial.println("hier gaat joystick aank");
        } while (digitalRead(buttonPin)==HIGH); // herhaal zolang de knop NIET is ingedrukt

 

Optie 2:

Deze optie is misschien beter, vooral als de servo stap steeds iets te veel tijd inneemt en het indrukken van de know net wel of net niet geregistreerd werd:

case 2:
        do {
          servoVal = analogRead(joyX);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo1.write(servoVal);
          servoVal = analogRead(joyY);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo2.write(servoVal);
          Serial.println("hier gaat joystick aank");
          if(digitalRead(buttonPin)==LOW) { 
            break; 
          } 
        } while (true); // herhaal oneindig, tot "break" wordt aangeroepen

 

Dus de loop test iedere keer op de knop weer is ingedrukt, en indien dat het geval is: exit (break) de loop.
Je zou hier eventueel de teller kunnen aanpassen.

N.b. het zou kunnen zijn dat het gebruik maken van een interrupt nog beter werkt - maar daarmee wordt het e.e.a. een klein beetje lastiger.


   
BeantwoordenCiteren
(@djdeeno)
Eminent Member
Deelgenomen: 3 jaar geleden
Berichten: 27
Topic starter  

Komt goed hoor Hans.

Beide opties geprobeerd en blijken goed te werken, althans hij springt idd uit zijn case op weg naar case0, wat ik wel merk dat hij heel snel naar de break wil., lijkt of debounce hier een rol heeft? 

als ik aantal keren de cases afloop gaat ene keer wel goed ander keer spring hij in Case2 en direct naar de break van Case2

 

 


   
BeantwoordenCiteren


 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2660
 

Debounce kan een issue zijn, maar het kan ook zijn dat timing een ding is ...
Dus b.v. dat case 2 zo snel afloopt dat je niet eens de kans hebt gehad de knop los te laten.

Dat is ook een reden waarom ik interrupts zou proberen.

Het idee daarbij is dat we een globale variabele hebben (jouw buttonPushCounter1) die we steeds controleren.
De interrupt zorgt ervoor dat als de knop wordt ingedrukt, een aparte (korte!) functie wordt uitgevoerd waarin we buttonPushCounter1 aanpassen.
Een werkend voorbeeld kun je o.a. zien in LED Effects All-in-one.

Dus zoiets als dit (niet getest) ...
Merk op:
1) ik weet niet of de interrupt op pin 12 werkt, ik gebruikte voorheen op mijn Uno pin 2 hiervoor.
2) als ik me niet vergis kan het zijn dat de Serial functies niet betrouwbaar werken vanwege de interrupt functie.
3) Zodra de knop wordt ingedrukt zou de functie "updateCounter()" automatisch worden aangeroepen, de counter ophogen, en dan weer verder gaan waar de sketch werd onderbroken.

#include <Servo.h>

const int buttonPin = 12;     // the pin that the pushbutton is attached to
const int ledPin = 11;         // the pin that the LED is attached to

Servo servo1;
Servo servo2;
int joyX = 0;
int joyY = 1;

int servoVal;
int buttonState = 0;
int flag = 0;

int buttonPushCounter1 = -1;    // counter for the number of button presses. Start at 0 (will loop around first)

void setup() {
  Serial.begin(9600);
  Serial.println("Started");
  servo1.attach(9);
  servo2.attach(10);
  pinMode(ledPin, OUTPUT); // Pin led is een output naar de IRLZ24
  pinMode(buttonPin, INPUT_PULLUP);
  attachInterrupt (digitalPinToInterrupt (buttonPin), updateCounter, CHANGE); // pressed
}

void updateCounter() {
  buttonPushCounter1++;
  if(buttonPushCounter1>2) { buttonPushCounter1 = 0; }
}

void loop() {
  // Debug:
  Serial.print("Button state = ");
  Serial.println(buttonPushCounter1);
  
  switch (buttonPushCounter1) {

      case 0:
        analogWrite(ledPin, 30); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led aan");
        break;

      case 1:
        analogWrite(ledPin, 0); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led uit");
        break;

      case 2:
        do {
          servoVal = analogRead(joyX);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo1.write(servoVal);
          servoVal = analogRead(joyY);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo2.write(servoVal);
          Serial.println("hier gaat joystick aank");
        } while(buttonPushCounter1==2);
    }
}

   
BeantwoordenCiteren
(@djdeeno)
Eminent Member
Deelgenomen: 3 jaar geleden
Berichten: 27
Topic starter  

Nu is debounce niet zon probleem hoor, daar moet ik wel uitkomen, op meerdere you tube films bespreken ze servo en bedienen met joystick en daar gebruiken ze button 12 voor, nu kan ik daar nu even niet in omdat de arduino weg gewerkt zit in de movinghead, om een beeld te krijgen er is een filmje van deze movingheads op .

Ik gebruik  3 cases, 1 in case0 om led aan te zetten, in case1 om de movinghead met joystick te bedienen en in laatste case 2, dat hij automatisch iets doet, ik heb de sketch net aangepast zoals het zou moeten zijn.

Nu werkt hij eigenlijk naar behoren, echter in CASE2 probeer ik ook de While functie te gebruiken om uit deze case te komen, dat werkt wel voor Case 1 waar we de handbediening hebben maar niet in Case 2, nu komt dat waarschijnlijk omdat er delays worden gebruikt, deze vind echt lastig aanpassen omdat deze in veel sketches word gebruikt bij servo's, je ziet nauwelijk servos die werken met millis.

Maar wat gaat er hier fout? of hoe kunnen we deze onderbreken, blijft immers in de laatste case hangen. Om een indruk te krijgen is hier een filmpje https://www.youtube.com/watch?v=ZWKkUnCbfYw

De code zoals hij er nu uitziet is als volgt en ik zal zo even zorgen dat er deze week  koffie gezet kan worden ha, komt goed dank je wel

#include <Servo.h>

const int buttonPin = 12;     // the pin that the pushbutton is attached to
const int ledPin = 11;         // the pin that the LED is attached to

Servo servo1;
Servo servo2;
int joyX = 0;
int joyY = 1;

int servoVal;

int pos = 0;    // variable
int pos1 = 0;    // variable

int buttonPushCounter1 = 2;    // counter for the number of button presses. Start at 0 (will loop around first)
bool buttonState1;

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  servo1.attach(9);
  servo2.attach(10);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  buttonState1 = false;
}

void loop() {
  int buttonValue = digitalRead(buttonPin);

  if (buttonValue == LOW)
  {
    if (buttonState1 == false) {
      buttonPushCounter1++;
      if (buttonPushCounter1 == 3) {
        buttonPushCounter1 = 0;
      }
      buttonState1 = true;
    }
    switch (buttonPushCounter1) {

      case 0:
        analogWrite(ledPin, 30); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led aan");
        break;

      case 1:
        do {
          Serial.println("hier gaat joystick aan voor handbediening");
          servoVal = analogRead(joyX);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo1.write(servoVal);
          servoVal = analogRead(joyY);
          servoVal = map(servoVal, 0, 1023, 0, 180);
          servo2.write(servoVal);
        } while (digitalRead(buttonPin) == HIGH);
        Serial.println("Einde case 1");
        break;

      case 2:
          Serial.print("naar links");
          for (pos = 40; pos <= 180; pos += 1) { // naar boven
            // in steps of 1 degree
            servo1.write(pos);
            delay(20);
          }
          Serial.print("naar rechts");
          for (pos = 180; pos >= 40; pos -= 1) { // naar beneden pos 40
            servo1.write(pos);
            delay(20);
          }        
        Serial.println("einde case 2");
        break;
    }
  }
  else {
    buttonState1 = false;
  }
}

   
BeantwoordenCiteren
(@djdeeno)
Eminent Member
Deelgenomen: 3 jaar geleden
Berichten: 27
Topic starter  

Goedemiddag, nou idd ik heb de movinghead uit elkaar gehaald en de button op pin 2 gezet, meteen op advies de sketch aangepast en nu lijkt alles wel te werken echt super blij mee. koffie muntje is onderweg :-)

 

#include 
#include 

const int buttonPin = 2;     // the pin that the pushbutton is attached to
const int ledPin = 11;         // the pin that the LED is attached to

Servo servo1;
Servo servo2;
int joyX = 0;
int joyY = 1;

int servoVal;

int pos = 0;    // variable
int pos1 = 0;    // variable

byte selectedEffect = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("Start");
  servo1.attach(9);
  servo2.attach(10);
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  attachInterrupt (digitalPinToInterrupt (buttonPin), changeEffect, CHANGE); // pressed
}

void loop() {
  EEPROM.get(0, selectedEffect);
  if (selectedEffect > 3) {
    selectedEffect = 0;
    EEPROM.put(0, 0);
  }

  switch (selectedEffect) {

    case 0  : {
        analogWrite(ledPin, 100); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("zet de led aan");
        break;
      }

    case 1  : {
        Serial.println("1");
        servoVal = analogRead(joyX);
        servoVal = map(servoVal, 0, 1023, 0, 180);
        servo1.write(servoVal);
        servoVal = analogRead(joyY);
        servoVal = map(servoVal, 0, 1023, 0, 180);
        servo2.write(servoVal);
        break;
      }

    case 2  : {
        Serial.println("naar links");
        for (pos = 0; pos <= 180; pos += 1) { // naar boven
          // in steps of 1 degree
          servo1.write(pos);
          delay(15);
        }
        Serial.println("naar rechts");
        for (pos = 180; pos >= 0; pos -= 1) { // naar beneden pos 40
          servo1.write(pos);
          delay(15);
        }
        break;
      }

    case 3  : {
        analogWrite(ledPin, 0); // zet de led aan, geef waarde mee in 0 t/m 254
        Serial.println("uit");
        break;
      }
  }
}
void changeEffect() {
  if (digitalRead (buttonPin) == HIGH) {
    selectedEffect++;
    EEPROM.put(0, selectedEffect);
    asm volatile ("  jmp 0");
  }
}
Dit bericht is gewijzigd 2 jaar geleden door djdeeno

   
Hans reageerde
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 11 jaar geleden
Berichten: 2660
 

Mooi! Helemaal top! 👍 😊 

Fijn om te horen dat het werkt zoals gewenst!


   
BeantwoordenCiteren

Bevalt je wat je hier ziet, en wil je graag helpen? 

Uiteraard is de beste manier van helpen, door anderen hier te helpen met hun vragen. Maar je kunt ons ook op andere manieren helpen:

- Shop bijvoorbeeld bij Amazon, het kost je niks extra, maar het kan zijn dat wij een kleine commissie ontvangen,
- stuur me een koffie via PayPal ($5, $10, $20, or zelf kiezen),
- je kunt ook een Patreon worden,
- of BitCoin (BTC), of BitCoinCash (BCH) doneren.

Deel: