Het gebruik van enums [OPGELOST]

Hallo allen

ik heb reeds met een variant van C geprogrammeerd en het gebruik van enums werd daar zeer vaak gebruikt, is het mogelijk om het zelfde in Arduino te doen?

Voor bijvoorbeeld dit:

enum ButtonState
{
  ButtonState,
  ButtonJustPressed,
  ButtonJustReleased,
  lastButtonState,
  timesButtonPushed,
}
int bState[MAX_BUTTONS][ButtonState];

Of is deze methode totaal niet bruikbaar in Arduino?

Dank bij voorbaat

Tuurlijk kan dat.
Ik doe dat heel vaak omdat ik vind dat het de code leesbaar maakt.

Met vriendelijke groet
Jantje

Ik doe niet anders.......

Kan prima,
echter ik heb wat bezwaren tegen de semantiek van je voorbeeld.
Een Buttonstate zou mijn insziens
enum ButtonState { Pressed, Released, Pressing, releasing, Unknown }
moeten zijn.
Verder lastButtonState, en timesButtonPushed, klinkt meer als variabelen
Naamgeving is cruciaal om code over 6 maanden te begrijpen :wink:

@!#$%^& new forum copy functionality ...

robtillaart:
Kan prima,
echter ik heb wat bezwaren tegen de semantiek van je voorbeeld.
Een Buttonstate zou mijn insziens
enum ButtonState { Pressed, Released, Pressing, releasing, Unknown }
moeten zijn.
Verder lastButtonState, en timesButtonPushed, klinkt meer als variabelen
Naamgeving is cruciaal om code over 6 maanden te begrijpen :wink:

De reden waarom ik trachtte het zo te doen is omdat ik 4 buttons heb, en ik tel het aantal keer een specifieke knop is ingedrukt.
Ik behoud graag de blokken omdat het in mijn ogen overzichtelijker is, dat ligt dan aan de persoonlijke smaak. Niet?

ik sluit me aan bij robtillaart. De semantiek van je voorbeeld is bedenkelijk.
Niet alleen de enums zelf (een state die ButtonState of timesButtonPushed noemt?) maar zeker ook

int bState[MAX_BUTTONS][ButtonState];

Wat bedoel je dan met bv

 bState[FirstButton,ButtonState]=1;

robtillaart:
@!#$%^& new forum copy functionality ...

Ook hier ben ik akkoord.

Jantje

Och ja lastXXXXState gebruik ik ook heel vaak maar dan wel als laatste state. Dan kan je iets doen als
for(state=0;state<lastXXXXstate;state++){ do something}
om bijvoorbeeld alles te wissen. Extra states bij voegen geeft dan geen code verandering.
Jantje

Volgens mij wil je eigenlijk een struct hebben

Struct button
{
  int pin;
  int state;
  int prevState;
  bool justPressed;
  bool justReleased;
  unsigned long count;
} buttons[MAX_BUTTONS];

for (int i=5; i<10; i++)
{
 buttons[i].prevState =  buttons[i].state
 buttons[i].state = digitalRead(buttons[i].pin);
 buttons[i].justPressed = (buttons[i].prevState == HIGH && buttons[i].state == LOW);
 buttons[i].justReleased = (buttons[i].prevState == LOW && buttons[i].state == HIGH);
 if (buttons[i].justReleased) buttons[i].count++;
}

Een stap verder is een button class maken die deze administratie intern (onzichtbaar) houdt.

Ja, dat werkt naar behoren. Het probleem nu is dat alleen de button aangesloten aan pin 0 werkt om de led van de ene kleur naar de andere te veranderen.

Een concreet voorbeeld:

Ik heb 1 RGB ledje waarvan blauw en groen zijn aangesloten aan mijn UNO board.
Ik heb daarbij 4 buttons geplaatst, ook aangesloten aan mijn UNO board aan pin 1, 2, 3 4 respectievelijk.

In mijn IDE heb ik een array gemaakt als volgt:

int pinButtons[4] = { 1, 2, 3, 4 };

//Ik heb i.p.v int ook al byte geprobeerd.

De struct, setup en loop volgen daarna.

buttons[MAX_BUTTONS];

//Dit heb ik veranderd naar buttons[sizeof(pinButtons)];

Alleen de button aangesloten aan pin 0 werkt naar behoren, de rest doet het niet.

Dank bij voorbaat.

Dan ben ik wel nieuwsgierig naar de gehele code.... Ik pleur mijn buttons vrijwel altijd in een tabel. Dus laat maar zien :slight_smile:

Hier is mijn code, voor 1 button constructief werkend naar de 4 buttons die ik op het einde wil hebben (Daarom zijn er alvast 4 pins in de array). Ook moet ik even melden dat ik de JustPressed en JustReleased er van tussen heb gelaten om het probleem met pin 0 te fixed (Wat me niet is gelukt):

const int ledBlue = 10;
const int ledGreen = 11;
const int ledRed = 12;
const int pinRelay = 7;

int pinButtons[4] = { 1, 2, 3, 4 };

struct buttonInfo {
  int pin;
  int state;
  int prevState;
  unsigned long count;
} bInfo[sizeof(pinButtons)];

void setup() {
  pinMode(ledBlue, OUTPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledRed, OUTPUT);
  pinMode(pinRelay, OUTPUT);
  for(int i = 0; i < sizeof(pinButtons); i++) {
    pinMode(bInfo[i].pin, INPUT);
  }
  digitalWrite(ledBlue, HIGH);
  digitalWrite(ledGreen, LOW);
  digitalWrite(pinRelay, HIGH);
}

void loop() {
  for(int i = 0; i < sizeof(pinButtons); i++) {
    bInfo[i].state = digitalRead(bInfo[i].pin);
    bInfo[i].prevState = bInfo[i].state;
    if(bInfo[i].prevState == LOW) {
      digitalWrite(ledBlue, LOW);
      digitalWrite(ledGreen, HIGH);
      digitalWrite(pinRelay, LOW);
    }
    if(bInfo[i].prevState == HIGH) {
      digitalWrite(pinRelay, HIGH);
      digitalWrite(ledGreen, LOW);
      digitalWrite(ledBlue, HIGH);
    }
  }

nicoverduin:
Dan ben ik wel nieuwsgierig naar de gehele code.... Ik pleur mijn buttons vrijwel altijd in een tabel. Dus laat maar zien :slight_smile:

Wat bedoel je met "een tabel"? Kan hier ook wat dieper op in gaan, indien mogelijk?

pas op pin 1 is je Serial waar je ook mee upload...

ik zou daar zeker een andere voor nemen

(assuming you're using UNO/MEGA)

robtillaart:
pas op pin 1 is je Serial waar je ook mee upload...

ik zou daar zeker een andere voor nemen

(assuming you're using UNO/MEGA)

Dus de pins in mijn array aanpassen naar een waarde boven de 1? Dus 2, 3, 4, 5 respectievelijk en dan mijn buttons ook in die volgorde aansluiten?
Ja, ik gebruik een UNO.

Volgens mij klopt het dat alleen pin 0 werkt. En dat is dan alleen nog toeval:
a) je hebt een tabel gemaakt met pin nummers
b) die pinnummers worden nimmer gezet in binfo en hebben toevallig allemaal de waarde 0 (RAM kan onvoorspelbaar zijn zonder initialisatie)
c) Je leest vervolgens de pinnen via bInfo[].pin. En dus elke keer alleen pin 0

Ik zou het dus zo gedaan hebben:

//
// pin definities
//
#define ledBlue 	10
#define ledGreen	11
#define ledRed		12
#define pinRelay	7
#define button1		1
#define button2		2
#define button3		3
#define button4		4


int pinButtons[4] = { button1, button2, button3, button4 };

struct buttonInfo {
	int pin;					// pin nummer
	int state;					// waarde van de pin (LOW/HIGH)
	int prevState;				// vorige waarde
	unsigned long count;		// teller
} bInfo[sizeof(pinButtons)];

void setup() {
	//
	// zet de pinnen op INPUT of OUTPUT
	//
	pinMode(ledBlue, OUTPUT);
	pinMode(ledGreen, OUTPUT);
	pinMode(ledRed, OUTPUT);
	pinMode(pinRelay, OUTPUT);
	for (int i = 0; i < sizeof(pinButtons); i++) {
		bInfo[i].pin = pinButtons[i];
		pinMode(bInfo[i].pin, INPUT);
	}
	//
	// LEDS op een default waarde
	//
	digitalWrite(ledBlue, HIGH);
	digitalWrite(ledGreen, LOW);
	digitalWrite(pinRelay, HIGH);
}

void loop() {
	//
	// loop alle buttons door
	//
	for (int i = 0; i < sizeof(pinButtons); i++) {
		//
		// bewaar de vorige waarde
		//
		bInfo[i].prevState = bInfo[i].state;		
		//
		// lees de nieuwe waarde
		//
		bInfo[i].state = digitalRead(bInfo[i].pin);
		//
		// zet de leds afhankelijk van de button state
		//
		if (bInfo[i].prevState == LOW) {
			digitalWrite(ledBlue, LOW);
			digitalWrite(ledGreen, HIGH);
			digitalWrite(pinRelay, LOW);
		} else {
			digitalWrite(pinRelay, HIGH);
			digitalWrite(ledGreen, LOW);
			digitalWrite(ledBlue, HIGH);
		}
	}
}

En zo werkt het naar behoren. Dank je wel: Jantje, Rob en Nico voor de hulp.
Ik heb geleerd dat ik pins beter apart kan definiëren en ze daarna in mijn array moet stoppen voor zulke toestanden (enkel pin 0 werkt) te vermijden. Daarbovenop heb ik de struct geleerd.