3 buttons, 3 led en ik kom er niet uit

IDE gerelateerde berichten
Berichten: 2
Geregistreerd: 12 Jun 2019, 10:23

3 buttons, 3 led en ik kom er niet uit

Berichtdoor TinusNL » 18 Jun 2019, 20:27

Mede forumgangers,

Enige tijd geleden ben ik de wereld van Arduino ingedoken en het is zeker een boeiende wereld.
Alleen.....
ik probeer al enige tijd iets voor mekaar te krijgen en ik ben in het stadium aangekomen waarbij ik jullie kennis en kunde nodig heb.
Het gaat zich om een sein voor de Lego trein van mijn kleinzoon.
Belofte maakt schuld.....


De setup:

    Arduino Uno R3
    3x drukknoppen (groen, oranje, rood)
    3x leds (groen, oranje, rood)
    3x 220ohm weerstanden

De uitgangssituatie na het starten van het board is als volgt:

    Groene LED: aan
    Oranje LED: uit
    Rode LED: uit

Na het indrukken van de groene drukknop gaat het groene LED knipperen (overige LEDs gaan uit).
Nogmaals indrukken van de groene drukknop resulteert in het continu branden van het groene LED.
Enzovoorts.

Na het indrukken van de oranje drukknop gaat het oranje LED continu branden (overige LEDs gaan uit)
Nogmaals indrukken van de oranje drukknop resulteert in het knipperen van het oranje LED.
Nogmaals indrukken van de oranje drukknop resulteert in het continu branden van het oranje LED.
Enzovoorts.

Na het indrukken van de rode drukknop gaat het rode LED continu branden (overige LEDs gaan uit).

Ik heb al verschillende codes gecombineerd en tot nu toe branden alle LEDs, of knipperen ze.
Het lukt niet om bij het indrukken van een drukknop de andere LEDs laag te krijgen.

Onderstaand mijn laatste probeersel van gecombineerde codes.
De LEDs branden of knipperen, naar gelang het aantal drukken. En dat is het ook.
Tijdens het indrukken van de drukknoppen knipperen de LEDs even om daarna weer de code te volgen.
Waarom knipperen de LEDs als ik een drukknop indruk? Heeft dat te maken met de if-statements?

Alvast bedankt voor jullie feedback.

Code: Alles selecteren
#define pressed   LOW
#define released  HIGH

#define ledOn1    HIGH
#define ledOn2    HIGH
#define ledOn3    HIGH

#define ledOff1   LOW
#define ledOff2   LOW
#define ledOff3   LOW

const byte button1 = 2;     //  green push button on pin 2
const byte button2 = 3;     //  orange push button on pin 3
const byte button3 = 4;     //  red push button on pin 4

const byte led1 = 8;        //  green LED on pin 8
const byte led2 = 9;        //  orange LED on pin 9
const byte led3 = 10;       //  red LED on pin 10

byte buttonState1;          //  current state of the green push button
byte lastButtonState1;      //  previous state of the green push button
byte buttonPushCounter1;    //  counter for the green push button

byte buttonState2;          //  current state of the orange push button
byte lastButtonState2;      //  previous state of the orange push button
byte buttonPushCounter2;    //  counter for the orange push button

byte buttonState3;          //  current state of the red push button
byte lastButtonState3;      //  previous state of the red push button

unsigned long blinkMillis1;
unsigned long blinkMillis2;

unsigned long switchMillis;

void setup()
{
  pinMode(button1, INPUT);          //  set the green push button as an input
  digitalWrite(button1, HIGH);      //  enable the internal pullup for the green push button

  pinMode(button2, INPUT);          //  set the orange push button as an input
  digitalWrite(button2, HIGH);      //  enable the internal pullup for the orange push button

  pinMode(button3, INPUT);          //  set the red push button as an input
  digitalWrite(button3, HIGH);      //  enable the internal pullup for the red push button

  pinMode(led1, OUTPUT);            //  set the green LED as an output
  digitalWrite(led1, ledOff1);      //  as default the green LED is OFF

  pinMode(led2, OUTPUT);            //  set the orange LED as an output
  digitalWrite(led2, ledOff2);      //  as default the orange LED is OFF

  pinMode(led3, OUTPUT);            //  set the red LED as an output
  digitalWrite(led3, ledOff2);      //  as default the red LED is OFF
}

void loop()
{
  ledBlink1();
  ledBlink2();


  if (millis() - switchMillis >= 50ul)      //  check the buttons every 50ms
  {
    switchMillis = millis();                //  reset the timing

    if (checkButton1(button1, lastButtonState1) == true)     //  check the green push button
    {
      digitalWrite(led2, ledOff2);
      digitalWrite(led3, ledOff3);
      buttonPushCounter1++;     //  increment the counter for the green push button
      delay(100);
      digitalWrite(led1, ledOn1);
     
    }
   
    if (checkButton2(button2, lastButtonState2) == true)     //  check the orange push button
    {
      digitalWrite(led1, ledOff1);
      digitalWrite(led3, ledOff3);
      buttonPushCounter2++;     //  increment the counter for the orange push button
      delay(100);
      digitalWrite(led2, ledOn2);
    }

    if (checkButton3(button3, lastButtonState3) == true)     //  check the green push button
    {
      digitalWrite(led1, ledOff1);
      digitalWrite(led2, ledOff2);
      delay(100);
      digitalWrite(led3, ledOn3);
    }
  }

  if (buttonPushCounter1 % 2 == 0)
  {
    digitalWrite(led1, ledOn1);
  }

  else
  {
    ledBlink1();
  }

  if (buttonPushCounter2 % 2 == 0)
  {
    digitalWrite(led2, ledOn2);
  }

  else
  {
    ledBlink2();
  }
}

void ledBlink1()
{
  if (millis() - blinkMillis1 < 500ul)
  {
    //nothing to do yet
    return;
  }

  blinkMillis1 = millis();      //  reset the timing

  digitalWrite(led1, !digitalRead(led1));
}

void ledBlink2()
{
  if (millis() - blinkMillis2 < 500ul)
  {
    //nothing to do yet
    return;
  }

  blinkMillis2 = millis();      //  reset the timing

  digitalWrite(led2, !digitalRead(led2));
}

bool checkButton1(byte button1, byte &lastState)
{
  byte thisSwitchState = digitalRead(button1);

  if (thisSwitchState != lastState)
  {
    lastState = thisSwitchState;

    if (thisSwitchState == pressed)
    {
      return true;
    }

    else
    {

    }
  }

  return false;

}

bool checkButton2(byte button2, byte &lastState)
{
  byte thisSwitchState = digitalRead(button2);

  if (thisSwitchState != lastState)
  {
    lastState = thisSwitchState;

    if (thisSwitchState == pressed)
    {
      return true;
    }

    else
    {

    }
  }

  return false;

}

bool checkButton3(byte button3, byte &lastState)
{
  byte thisSwitchState = digitalRead(button3);

  if (thisSwitchState != lastState)
  {
    lastState = thisSwitchState;

    if (thisSwitchState == pressed)
    {
      return true;
    }

    else
    {

    }
  }

  return false;

}

Advertisement

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

Re: 3 buttons, 3 led en ik kom er niet uit

Berichtdoor Koepel » 19 Jun 2019, 05:02

Als er meerdere leds knipperen, wil je dan dat ze tegelijk knipperen of allemaal op hun eigen tijd ? Of weet je zeker dat er maar één led tegelijk knippert ? Dan kun je dus het knipperen regelen met drie variabelen, een variabele die aangeeft of er geknipperd moet worden en een variabele die aangeeft welke led moet knipperen en een 'previousMillis'.

Ik heb alvast een paar tips:

Je mag in de sketch HIGH en LOW gebruiken. Teveel abstractie toevoegen werkt bij Arduino niet zo goed. Als je toch met een define 'On' en 'Off' wilt doen, dan is het waarschijnlijk nooit nodig om dat voor iedere led apart te definiëren.
Waarschijnlijk kan dit:
Code: Alles selecteren
#define ledOn1    HIGH
#define ledOn2    HIGH
#define ledOn3    HIGH

#define ledOff1   LOW
#define ledOff2   LOW
#define ledOff3   LOW

ook op deze manier:
Code: Alles selecteren
#define ledOn    HIGH
#define ledOff   LOW

Je zou ook LED_ON en LED_OFF kunnen doen.

Dit:
Code: Alles selecteren
pinMode(button1, INPUT);          //  set the green push button as an input
digitalWrite(button1, HIGH);      //  enable the internal pullup for the green push button

dat is iets van jaren geleden. Tegenwoordig doen we:
Code: Alles selecteren
pinMode(button1, INPUT_PULLUP);   //  set the green push button as an input and enable internal pullup


Deze:
Code: Alles selecteren
const byte button1 = 2;     //  green push button on pin 2
const byte button2 = 3;     //  orange push button on pin 3
const byte button3 = 4;     //  red push button on pin 4

const byte led1 = 8;        //  green LED on pin 8
const byte led2 = 9;        //  orange LED on pin 9
const byte led3 = 10;       //  red LED on pin 10

zou mijn voorkeur hebben met 'pin' in de naam. Dat voorkomt vergissingen in de sketch.
Code: Alles selecteren
const byte buttonPin1 = 2;     //  green push button on pin 2
...
const byte ledPin1 = 8;        //  green LED on pin 8
...


Wat dacht je van arrays ?
Code: Alles selecteren
const byte buttonPins[3] = { 2, 3, 4 };  //  pins for green, orange, red button
const byte ledPins[3] = { 8, 9, 10 };    //  pins for green, orange, red led
unsigned long previousMillis[3];

Dan verandert je code vanzelfsprekend.
Code: Alles selecteren
led1 wordt ledPins[0]
button1 wordt buttonPins[0]

In de taal 'c' en 'c++' begint een array met index 0.
Als je nergens in je sketch zo iets als "led1" gebruikt, dan voorkom je verwarring. Dan wordt het dat "ledPins[0]" hoort bij de "groene led".
De beste benadering is dan om een sketch te maken voor één led, en als dat werkt dan pas omzetten naar arrays zodat alle leds mee doen.

Als je arrays gaat gebruiken, dan zou je defines voor de kleuren kunnen maken:
Code: Alles selecteren
#define GREEN 0
#define ORANGE 1
#define RED 2


Je hoeft geen arrays te gebruiken, je mag het gerust uitschrijven. Als je eerder geprogrammeerd hebt (het maakt niet uit welke taal), dan zijn arrays wel zo handig.

Bij een conditie die 'true' of 'false' is, hoef je niet te vergelijken met 'true' of 'false'
Dus dit:
Code: Alles selecteren
if (checkButton1(button1, lastButtonState1) == true)     //  check the green push button

kan netter zo:
Code: Alles selecteren
if (checkButton1(button1, lastButtonState1))     //  check the green push button


Ik gebruik graag 'bool' variabelen om dingen aan en uit te zetten. Een 'bool' variabele is 'true' of 'false'.
Dan kun je in het eerste deel het knipperen met die 'bool' variabele aan of uitzetten, en onderin de loop() knipperen of niet, afhankelijk van die 'bool' variabele. Zoals hier: https://github.com/Koepel/Fun_with_millis/blob/master/millis_within_millis.ino.

Ik zie dat je de State Change Detection (https://www.arduino.cc/en/Tutorial/StateChangeDetection) gebruikt. En het lezen van de knoppen gebeurt iedere 50ms, dat voorkomt problemen met het denderen van de knoppen.
In de Arduino IDE zit een "Bibliotheek Beheer". Daar zit een "Bounce2" library en die library heeft het debouncen en de State Change Detection al in zich. Je zou dat kunnen gebruiken, of wil dat liever zelf in je eigen code zien gebeuren ?

Nou, dat is wel even genoeg om op te kauwen :lol:

Berichten: 2
Geregistreerd: 12 Jun 2019, 10:23

Re: 3 buttons, 3 led en ik kom er niet uit

Berichtdoor TinusNL » 19 Jun 2019, 16:57

Koepel schreef:Als er meerdere leds knipperen, wil je dan dat ze tegelijk knipperen of allemaal op hun eigen tijd ? Of weet je zeker dat er maar één led tegelijk knippert ? Dan kun je dus het knipperen regelen met drie variabelen, een variabele die aangeeft of er geknipperd moet worden en een variabele die aangeeft welke led moet knipperen en een 'previousMillis'.

Ik heb alvast een paar tips:

....

Nou, dat is wel even genoeg om op te kauwen :lol:


Bedankt voor jouw reactie. Ik zal het eens gaan bestuderen.
Dit is voor het eerst dat ik ga programmeren, maar dat mag de pret niet drukken.

Sommige termen zijn voor mij niet zo vanzelfsprekend, al is er genoeg van terug te vinden op internet.

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

Re: 3 buttons, 3 led en ik kom er niet uit

Berichtdoor Koepel » 19 Jun 2019, 17:28

Vraag gerust wat niet duidelijk is.
De vraag is nu eerst of je wel of niet de Bounce2 library wilt gaan gebruiken.
Dit is een voorbeeld: https://github.com/thomasfredericks/Bounce2/blob/master/examples/bounce2buttons/bounce2buttons.ino.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 3 buttons, 3 led en ik kom er niet uit

Berichtdoor shooter » 19 Jun 2019, 18:57

Dit vraagt om een state machine.
die kun je maken met switch x:
case 1 etc.
dan heb je voor elke situatie een state dat is makkelijk werken. je kunt dan van de ene status naar de andere springen als er aan de vooorwaarde is voldaan.

je kunt ook eens kijken naar Mblock dat is een simpeler maar wel een goede manier om in te stappen.
paul deelen
shooter@home.nl

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten