[arduino] Meerdere buttons in een buttonstate switch

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • daanb14
  • Registratie: December 2013
  • Laatst online: 24-07 11:49
Mijn vraag
Ik heb op dit moment drie knoppen die op true gaan wanneer de digitalRead low is. Ik heb een PULL UP schakeling gebruikt. Het is de bedoeling dat het programma van released, naar check pressed, naar pressed, naar check released gaat. Het is de bedoeling dat één tab dit voor alle buttons controleert.

Relevante software en hardware die ik gebruik
Arduino IDE
Arduino UNO
drie buttons

Wat ik al gevonden of geprobeerd heb
Het controleren of een buttondown of up true is. Dat werkt, maar niet zogauw ik in een if-statement met || ga werken.
C++: button.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const int NUMBEROFBUTTONS = 3;
const int BUTTON_STATE_RELEASED = 1;
const int BUTTON_STATE_CHECK_PRESSED = 2;
const int BUTTON_STATE_PRESSED = 3;
const int BUTTON_STATE_CHECK_RELEASED = 4;
int button_State;
const int BUTTON_TIME = 10;
unsigned long button_Previous;
boolean button_Click;
int ledNumber;

void buttonSetup() {
  button_State = BUTTON_STATE_RELEASED;
  button_Released_Entry();
  ledNumber = -1;
}

void button_Loop() {
  switch (button_State) {
    case BUTTON_STATE_RELEASED:
      button_Released_Do();
      if (buttonHardware_Down_car_left() == true) {
        button_Released_Exit();
        button_State = BUTTON_STATE_CHECK_PRESSED;
        button_Check_Pressed_Entry();
      }
      break;
    case BUTTON_STATE_CHECK_PRESSED:
      button_Check_Pressed_Do();
      if (buttonHardware_Up_car_left() == true) {
        button_Check_Pressed_Exit();
        button_State = BUTTON_STATE_RELEASED;
        button_Released_Entry();
      }
      else if ((buttonHardware_Down_car_left() == true) &&(millis() - BUTTON_TIME >= button_Previous)) {
        button_Check_Pressed_Exit();
        button_State = BUTTON_STATE_PRESSED;
        button_Pressed_Entry();
      }
                                                                                                        
      break;
    case BUTTON_STATE_PRESSED:
      button_Pressed_Do();
      if (buttonHardware_Up_car_left() == true) {
        button_Pressed_Exit();
        button_State = BUTTON_STATE_CHECK_RELEASED;
        button_Check_Released_Entry();
      }
      break;
    case BUTTON_STATE_CHECK_RELEASED:
      button_Check_Released_Do();
      if (buttonHardware_Down_car_left() == true) {
        button_Check_Released_Exit();
        button_State = BUTTON_STATE_PRESSED;
        button_Pressed_Entry();
      } else if ((buttonHardware_Up_car_left() == true) &&(millis() - BUTTON_TIME >= button_Previous)) {
        button_Check_Released_Exit();
        button_State = BUTTON_STATE_RELEASED;
        // On this transition the click has occured.
        button_Click = true;
        button_Released_Entry();
      }
      break;
  }
}

Beste antwoord (via daanb14 op 30-06-2018 13:45)


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:22
Geef elke button z'n eigen state:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Button {
public:
    enum State { UNKNOWN, BUTTON_STATE_RELEASED, BUTTON_STATE_PRESSED };

    Button() : _state (UNKNOWN) {

    }


    State getState() const { return _state; }

    void update() {

        if( buttonPinIsLow() ) {
            _state = BUTTON_STATE_PRESSED;
        } else {
            ...
        }
    }
private:
    State _state;
};

Button buttons[ 3 ];

void update() {
    for( auto& button : buttons ) {
        button.update();
    }
}

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Alle reacties


Acties:
  • 0 Henk 'm!

  • CCJJVV
  • Registratie: Maart 2016
  • Nu online
De code die je nu hebt lijkt op een typische huiswerk opdracht breidt deze code die het denderen voor een button tegen gaat uit naar meerdere buttons.

Daarom allereerst de vraag wat heb je zelf al bedacht hoe je dit kan oplossen?
Waar loop je vast en wat heb je al geprobeerd?

Je leert er natuurlijk niks van als je andere jouw opdrachten laat maken.

Acties:
  • 0 Henk 'm!

  • daanb14
  • Registratie: December 2013
  • Laatst online: 24-07 11:49
CCJJVV schreef op vrijdag 13 april 2018 @ 17:21:
De code die je nu hebt lijkt op een typische huiswerk opdracht breidt deze code die het denderen voor een button tegen gaat uit naar meerdere buttons.

Daarom allereerst de vraag wat heb je zelf al bedacht hoe je dit kan oplossen?
Waar loop je vast en wat heb je al geprobeerd?

Je leert er natuurlijk niks van als je andere jouw opdrachten laat maken.
Ik heb geprobeerd de buttons in een for-loop uit te lezen, maar dat werkt niet. Ik heb geprobeerd de buttons een overkoepelende boolean te geven en die te gebruiken, maar dat werkte ook niet. Het gaat om een beroepsproduct wat ingeleverd moet worden. Ik heb al flink wat uur zitten debuggen.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:22
Geef elke button z'n eigen state:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Button {
public:
    enum State { UNKNOWN, BUTTON_STATE_RELEASED, BUTTON_STATE_PRESSED };

    Button() : _state (UNKNOWN) {

    }


    State getState() const { return _state; }

    void update() {

        if( buttonPinIsLow() ) {
            _state = BUTTON_STATE_PRESSED;
        } else {
            ...
        }
    }
private:
    State _state;
};

Button buttons[ 3 ];

void update() {
    for( auto& button : buttons ) {
        button.update();
    }
}

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • +2 Henk 'm!

  • daanb14
  • Registratie: December 2013
  • Laatst online: 24-07 11:49
Het is me uiteindelijk gelukt met een enkele state voor drie buttons en een variabele die buttonpressed overneemt in de boolean voor de knoppen. Uiteindelijk heb ik na veel uren frustratie mijn project in kunnen leveren. Arduino's kunnen nogal frustrerend zijn |:(

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:22
+1 voor de volhouder .....

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • ThinkCreative
  • Registratie: Oktober 2009
  • Nu online
En het uitleggen van de oplossing. :)

Acties:
  • 0 Henk 'm!

  • Koffie32
  • Registratie: Juni 2017
  • Laatst online: 24-12-2021
ThinkCreative schreef op dinsdag 29 mei 2018 @ 15:13:
[...]

En het uitleggen van de oplossing. :)
Edit: slecht gelezen. Zie nu pas dat je tevreden was met zijn uitleg van de oplossing. Dacht dat je vroeg naar de oplossing.

Ik vermoed dat ik de uitwerking wel ken kijkende naar de termen die topic plaatser hanteert en de vraag, vermoed ik dat ik weet naar welke school hij gaat. :+

Ik heb de code enigszins aangepast zodat hij niet 1 op 1 kan worden overgenomen door mensen die met de betreffende opdracht bezig zijn (door timer controles te verwijderen). Het beroepsproduct is namelijk het eindproduct dat moet worden opgeleverd voor een cijfer naast het tentamen door deze student.

Hij zal iets hebben gedaan in de richting van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// STATES 
const int BUTTON_RELEASED = 0;
const int BUTTON_CHECK_PRESSED = 1;
const int BUTTON_PRESSED = 2;
const int BUTTON_CHECK_RELEASED = 3;
const int AANTAL_BUTTONS = 4;
// TIMER VARIABLES
const int ONTDENDEREN_CONTROLETIJD = 10;
unsigned long timerArray[AANTAL_BUTTONS] = {0,0,0,0};
// VARIABELEN 
int buttonState[4] = {BUTTON_RELEASED, BUTTON_RELEASED, BUTTON_RELEASED, BUTTON_RELEASED};
// LOOP 
void Ontdenderen_Loop(){
  for(int i = 0; i < AANTAL_BUTTONS; i++){
  unsigned long currMillis = millis();
  switch(buttonState[i]){
    case BUTTON_RELEASED:
    if(buttonHardware_Down(i)){
      buttonState[i] = BUTTON_CHECK_PRESSED;
      timerArray[i] = currMillis;
    }
    break;
    case BUTTON_CHECK_PRESSED:
    if(buttonHardware_Up(i)){
      buttonState[i] = BUTTON_RELEASED;
    }
    else if(buttonHardware_Down(i)){
      buttonState[i] = BUTTON_PRESSED;
    }
    break;
    case BUTTON_PRESSED:
    if(buttonHardware_Up(i)){
      buttonState[i] = BUTTON_CHECK_RELEASED;
      timerArray[i] = currMillis;
    }
    break;
    case BUTTON_CHECK_RELEASED:
    if(buttonHardware_Down(i)){
      buttonState[i] = BUTTON_PRESSED;
    }
    else if(buttonHardware_Up(i)){
      // ontdenderd
    }
    break;
  }
}
}
// Aansluiting op analoge poort
boolean buttonHardware_Down(int i) {
  return (analogRead(i) > 200 );
}
boolean buttonHardware_Up(int i) {
  return !buttonHardware_Down(i);
}

[ Voor 4% gewijzigd door Koffie32 op 30-06-2018 13:22 ]


Acties:
  • 0 Henk 'm!

  • daanb14
  • Registratie: December 2013
  • Laatst online: 24-07 11:49
Koffie32 schreef op zaterdag 30 juni 2018 @ 13:19:
[...]

Edit: slecht gelezen. Zie nu pas dat je tevreden was met zijn uitleg van de oplossing. Dacht dat je vroeg naar de oplossing.

Ik vermoed dat ik de uitwerking wel ken kijkende naar de termen die topic plaatser hanteert en de vraag, vermoed ik dat ik weet naar welke school hij gaat. :+

Ik heb de code enigszins aangepast zodat hij niet 1 op 1 kan worden overgenomen door mensen die met de betreffende opdracht bezig zijn (door timer controles te verwijderen). Het beroepsproduct is namelijk het eindproduct dat moet worden opgeleverd voor een cijfer naast het tentamen door deze student.

Hij zal iets hebben gedaan in de richting van:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// STATES 
const int BUTTON_RELEASED = 0;
const int BUTTON_CHECK_PRESSED = 1;
const int BUTTON_PRESSED = 2;
const int BUTTON_CHECK_RELEASED = 3;
const int AANTAL_BUTTONS = 4;
// TIMER VARIABLES
const int ONTDENDEREN_CONTROLETIJD = 10;
unsigned long timerArray[AANTAL_BUTTONS] = {0,0,0,0};
// VARIABELEN 
int buttonState[4] = {BUTTON_RELEASED, BUTTON_RELEASED, BUTTON_RELEASED, BUTTON_RELEASED};
// LOOP 
void Ontdenderen_Loop(){
  for(int i = 0; i < AANTAL_BUTTONS; i++){
  unsigned long currMillis = millis();
  switch(buttonState[i]){
    case BUTTON_RELEASED:
    if(buttonHardware_Down(i)){
      buttonState[i] = BUTTON_CHECK_PRESSED;
      timerArray[i] = currMillis;
    }
    break;
    case BUTTON_CHECK_PRESSED:
    if(buttonHardware_Up(i)){
      buttonState[i] = BUTTON_RELEASED;
    }
    else if(buttonHardware_Down(i)){
      buttonState[i] = BUTTON_PRESSED;
    }
    break;
    case BUTTON_PRESSED:
    if(buttonHardware_Up(i)){
      buttonState[i] = BUTTON_CHECK_RELEASED;
      timerArray[i] = currMillis;
    }
    break;
    case BUTTON_CHECK_RELEASED:
    if(buttonHardware_Down(i)){
      buttonState[i] = BUTTON_PRESSED;
    }
    else if(buttonHardware_Up(i)){
      // ontdenderd
    }
    break;
  }
}
}
// Aansluiting op analoge poort
boolean buttonHardware_Down(int i) {
  return (analogRead(i) > 200 );
}
boolean buttonHardware_Up(int i) {
  return !buttonHardware_Down(i);
}
toon volledige bericht
De school is er inderdaad wel uit te halen ;)
Ik heb meer dan drie weken zitten debuggen, maar het bleef gewoon niet werken. Dat kan natuurlijk gigantisch frustrerend zijn. Het doel was dan ook kleine hints om verder te komen. Uiteindelijk bleek er ook nog een void methode van de knoppen in de void setup() niet goed aangeroepen te zijn, () vergeten |:( Even galspugen: Natuurlijk geeft de Arduino IDE altijd heerlijk samenhangende foutmeldingen die zeer relevant zijn met de daadwerkelijke fout :) Maarja, na veel uren is het uiteindelijk toch zelf gelukt en dat voelt gigantisch goed :)

Acties:
  • 0 Henk 'm!

  • Koffie32
  • Registratie: Juni 2017
  • Laatst online: 24-12-2021
daanb14 schreef op zaterdag 30 juni 2018 @ 13:42:
[...]

De school is er inderdaad wel uit te halen ;)
Ik heb meer dan drie weken zitten debuggen, maar het bleef gewoon niet werken. Dat kan natuurlijk gigantisch frustrerend zijn. Het doel was dan ook kleine hints om verder te komen. Uiteindelijk bleek er ook nog een void methode van de knoppen in de void setup() niet goed aangeroepen te zijn, () vergeten |:( Even galspugen: Natuurlijk geeft de Arduino IDE altijd heerlijk samenhangende foutmeldingen die zeer relevant zijn met de daadwerkelijke fout :) Maarja, na veel uren is het uiteindelijk toch zelf gelukt en dat voelt gigantisch goed :)
Dat is waar het om gaat.

Ga je ook de richting ESD in of toch maar niet? P-periode is ook voorbij nu dus lekker aan het genieten van je vakantie of moet je herkansen?

Acties:
  • 0 Henk 'm!

  • daanb14
  • Registratie: December 2013
  • Laatst online: 24-07 11:49
Op een ding na alles gehaald dit jaar en ruim over. Heerlijk vakantie vieren.

Acties:
  • 0 Henk 'm!

  • Koffie32
  • Registratie: Juni 2017
  • Laatst online: 24-12-2021
daanb14 schreef op zaterdag 30 juni 2018 @ 13:55:
Op een ding na alles gehaald dit jaar en ruim over. Heerlijk vakantie vieren.
Wat is dat ene ding als ik zo brutaal mag zijn mag hopen niet het project?

Maarre, leuk hier een van de personen te zien die het 1e jaar overleeft heeft. Heb er aardig wat zien sneuvelen om mij heen.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:22
daanb14 schreef op zaterdag 30 juni 2018 @ 13:42:
[...]
Even galspugen: Natuurlijk geeft de Arduino IDE altijd heerlijk samenhangende foutmeldingen die zeer relevant zijn met de daadwerkelijke fout :)
Ik vermoed dat je de foutmeldingen van de compiler bedoelt: dit is in feite de output van g++, de GNU C++ compiler. Arduino heeft daar weinig mee te maken.
Koffie32 schreef op zaterdag 30 juni 2018 @ 13:19:
[...]
Hij zal iets hebben gedaan in de richting van:
Ik vind het geen geweldige code moet ik zeggen; "Arduino" is in essentie C++ en wat mij betreft is mis kansen met betrekking tot encapsulation en decoupling, dat soort dingen. Ook een boel "modern C++" mogelijkheden lijk je te missen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Koffie32
  • Registratie: Juni 2017
  • Laatst online: 24-12-2021
farlane schreef op zaterdag 30 juni 2018 @ 15:19:
Ik vind het geen geweldige code moet ik zeggen; "Arduino" is in essentie C++ en wat mij betreft is mis kansen met betrekking tot encapsulation en decoupling, dat soort dingen. Ook een boel "modern C++" mogelijkheden lijk je te missen.
Het is code op het niveau 1e jaars met weinig ervaring en geen enkele affiniteit met embedded software development.

Het vak is een kennismaking met embedded software dus veel kan er niet verwacht worden. Het is tevens de eerste keer dat er ervaring op wordt gedaan met C++. Daarvoor is er alleen een basis gelegd met wat Java (met name gericht op condities, controlestructuren en datatypen) in een vak over gestructureerd programmeren en PHP in een kennismakingsvak over web-development.

OO-principes (basis) komen in een ander vak aan bod dat naast embedded development wordt gegeven (zelfde tijdblok). De kennismaking met embedded software richt zich met name op state-machines, software timers, ontdenderen, PWM, de Arduino hardware, het verschil in werken met analoge en digitale input, output-signalen ook digitaal en analoog en nog wat andere dingetjes.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11:22
Koffie32 schreef op zaterdag 30 juni 2018 @ 15:29:
[...]
Het is code op het niveau 1e jaars met weinig ervaring en geen enkele affiniteit met embedded software development.
Je begrijpt dat ik het over jouw code had?
Het vak is een kennismaking met embedded software dus veel kan er niet verwacht worden. Het is tevens de eerste keer dat er ervaring op wordt gedaan met C++. Daarvoor is er alleen een basis gelegd met wat Java (met name gericht op condities, controlestructuren en datatypen) in een vak over gestructureerd programmeren en PHP in een kennismakingsvak over web-development.

OO-principes (basis) komen in een ander vak aan bod dat naast embedded development wordt gegeven (zelfde tijdblok). De kennismaking met embedded software richt zich met name op state-machines, software timers, ontdenderen, PWM, de Arduino hardware, het verschil in werken met analoge en digitale input, output-signalen ook digitaal en analoog en nog wat andere dingetjes.
Ja prima, als dat voor jullie werkt (y)

Maar echt, "ontdenderen", wordt dat woord echt gebruikt? Ik zou toch echt aanraden om Engelse termen te gaan gebruiken, net als de rest van de technische (niet-Duitse >:) ) wereld.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Koffie32
  • Registratie: Juni 2017
  • Laatst online: 24-12-2021
farlane schreef op zaterdag 30 juni 2018 @ 18:04:
Je begrijpt dat ik het over jouw code had?
Dat begrijp ik.

Jij begrijpt dat het dit na een paar weekjes C++ en embedded systems moet worden geschreven (in een course die zich niet direct op de C++ taal richt maar op de mogelijkheden m.b.t. input/output) in een introductievak en dat je je daarbij moet houden een bepaalde eisen die aan het product gesteld worden (geen OO-principes oa.)? Dan begrijpen we elkaar.

Daarnaast worden Engelse en Nederlandse termen beide gebruikt. Nederlands kan vaak helpen om dingen te verduidelijken.
Pagina: 1