Richting omkeren in Arduino

Voor een orientatieonderdeel op mijn opleiding wordt er gewerkt met Arduino.
Onderstaand heb ik een opstelling gemaakt + Code.

De opdracht is als volgt:

9.1.1 Sluit drie LED’s (of één RGB LED) aan en maak een programma zodat de LED’s één
voor één oplichten. Na LED nummer drie licht LED nummer één weer op enz. Maak
hierbij handig gebruik van een variabele!

9.1.2 Voeg een button toe aan de vorige challenge en zorg dat met elke druk op de button
de volgende LED of kleur gaat branden (dus niet meer automatisch). Na LED nummer
drie licht LED nummer één weer op. De volgorde is dus 1 – 2 – 3 – 1 – 2 enz.
LET OP! Deze challenge is misschien lastiger dan je denkt. Het kan zijn dat je nog
eens moet kijken naar challenges 8.1 hierboven.

Tot en met hier werkt het prima. 9.1.3 is de uitbreiding van deze opdracht.

9.1.3 Uitbreiding van de vorige challenge: voeg nog een button toe en zorg ervoor dat bij
een druk op deze button de richting van het oplichten van de LED’s telkens omkeert.
Na de eerste druk op de ‘omkeer’ button wordt de volgorde dus 3 – 2 – 1 – 3 – 2 enz.
Na nóg een druk op de ‘omkeer’ button is de volgorde weer 1 – 2 – 3 – 1 – 2 enz.
Tip:
Gebruik een extra variabele waarin je de richting opslaat.

De linkerbutton moet er voor gaan zorgen dat de richting wordt omgekeerd.
Zijn er bepaalde manieren om dit simpel en effectief uit te voeren?

Ik heb op veel verschillende manieren gezocht maar het niveau is dan te gevorderd om het te begrijpen

const int buttonPin =  4;     // the number of the pushbutton pin
const int buttonPin2 = 2;

const int GreenLed        = 13;      // the number of the LED pin
const int YellowLed      = 12;
const int RedLed      = 8;

// variables will change:
int  initial    = 0;       //hold current  initial
int oldstate    = 0;       //hold last  initial
int buttonstate = 0;      // variable for reading the pushbutton status

void setup() {
  pinMode(GreenLed, OUTPUT);   // initialize the LED pin as an output:
  pinMode(YellowLed, OUTPUT);
  pinMode(RedLed, OUTPUT);
  pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input:
}
void loop() {
  //debouncing routline to read button
  buttonstate = digitalRead(buttonPin);  //state the  initial of button
  buttonstate = digitalRead(buttonPin2);

  if (buttonstate == HIGH) {             //check if it has been pressed
    delay(50);
    buttonstate = digitalRead(buttonPin);//state button again
    if (buttonstate == LOW) {            //if it is 0 considered one press
      initial = oldstate + 1;        //increase  initial by 1
      if (buttonstate == HIGH) {             //check if it has been pressed
        delay(50);
        buttonstate = digitalRead(buttonPin2);//state button again
        if (buttonstate == LOW) {            //if it is 0 considered one press
          initial = oldstate - 1;        //decrease  initial by 1
        }
      } else {                         //check if it has been NOT pressed
        delay(100);
      }
      switch (initial) {              //react to button press a  initial
        case 1:                     //if  initial is 1
          digitalWrite(GreenLed, HIGH);//on
          digitalWrite(YellowLed, LOW);//off
          digitalWrite(RedLed, LOW);//off
          oldstate =  initial;               //set oldstate  initial as current  initial
          break;
        case 2:
          digitalWrite(GreenLed, LOW);
          digitalWrite(YellowLed, HIGH);
          digitalWrite(RedLed, LOW);
          oldstate =  initial;
          break;
        case 3:
          digitalWrite(GreenLed, LOW);
          digitalWrite(YellowLed, LOW);
          digitalWrite(RedLed, HIGH);
          oldstate =  initial;
          break;
        default:                      //if  initial is not 1 2 3
          digitalWrite(GreenLed, LOW);  //off
          digitalWrite(YellowLed, LOW);
          digitalWrite(RedLed, LOW);
          oldstate = 0;                    //reset to all off/initial 0
          break;
      }
    }
  }
}

Gebruik een extra variabele die de richting aangeeft; de waarde 1 betekent omhoog, de waarde -1 betekend omlaag.

Vervolgens kun je de waarde van die variabele optellen bij initial.

Ik zou het nog iets anders aanpakken.
Er komt dan een heel klein stukje wiskunde bij kijken.
Maar voordat ik mijn verhaal ga afsteken, heb ik nog de opmerking dat je code tot nog toe niet zal werken, en wanneer het wel zou werken is het niet erg efficiënt.
Voor wat de efficiëntie betreft denk ik dat dat verderop in de lesstof pas behandeld gaat worden en daarom gaan wij ons er nu nog niet druk om maken.

Je controleert in je code of knop 1 is ingedrukt.
Wanneer dat het geval is, controleer je ook of knop 2 is ingedrukt.
In beide gevallen bewerk je met jouw uitkomst dezelfde variabele.
Dat kan niet juist (oftewel volgens de opdracht) werken.

De les die je hier schijnbaar moet leren, is hoe "handig" variabelen kunnen zijn.
Dus gaan we met variabelen aan de slag.
Tot nog toe heb je dat ook wel gedaan, maar niet consequent (nou ja, het kan dus nog meer dan wat je tot nog toe gedaan hebt).
Uiteraard moet je de opdracht heel goed lezen (een paar keer lezen kan helpen).
Je doet nu een bewerking door een getal bij een oude variabele op te tellen.
Maar je kunt ook een variabele bij een andere variabele optellen.
Doe dat altijd wanneer die knop is ingedrukt.
Je bewerkt dan dus de ene variabele met de andere.
Voor de andere knop kun je hetzelfde doen: de andere variabele bewerken met weer een andere variabele.
Dus gooien we er een stukje wiskunde tegenaan:
Wanneer de tweede knop wordt ingedrukt, vermenigvuldig dan de andere variabele met -1.
De knoppen 1 en 2 moeten altijd worden uitgelezen, en onafhankelijk van elkaar (dat is nu dus nog niet zo in jouw code).
En op de manier waarop je het nu doet, klopt er helemaal niets van wat je binnenhaalt.
Let daarom heel goed op jouw variabelen en wat je daar fout zou kunnen doen.
Beste is dat je dat nu eerst oplost, voordat je met sterretje of mijn antwoorden aan de slag gaat.

Ik mis de controle als de laatste led gedaan is zowel in de plus als in de negatieve richting.
verder is buttonstate kun je niet twee keer een andere variabele achter elkaar inlezen.
je zou het ook kunnen oplossen met een array

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.