Het is te adviseren om je pinnen van te voren te definieren en logsche name te geven. Dit is aan klein programma, maar denk er eens aan wat je moet doen als je in de toekomst een schakelaar of led op een andere pin moet aansluiten (om wat voor reden dan ook)? Dan moet je door je hele code gaan om te zien waar bv 2 is gebruikt als een ingang en alles veranderen. Verder maakt het het programma makkelijker om te lezen omdat je nu weet wat de functie van de pinnen is; hieronder zijn, wat ik denk, namen gebruikt voor de pinnen die de functie reflecteren.
Aangepaste code:
const byte buttonPlayer1 = 2;
const byte buttonPlayer2 = 4;
const byte buttonPlayer3 = 6;
const byte buttonPlayer4 = 8;
const byte ledPlayer1 = 3;
const byte ledPlayer2 = 5;
const byte ledPlayer3 = 7;
const byte ledPlayer4 = 9;
int DELAY = 3500;
void setup() {
//Serial.begin(9600);
pinMode(buttonPlayer1, INPUT);
pinMode(ledPlayer1, OUTPUT);
pinMode(buttonPlayer2, INPUT);
pinMode(ledPlayer2, OUTPUT);
pinMode(buttonPlayer3, INPUT);
pinMode(ledPlayer3, OUTPUT);
pinMode(buttonPlayer4, INPUT);
pinMode(ledPlayer4, OUTPUT);
}
void playWinner(int pin) {
for (int i = 0; i < 8; i++) {
digitalWrite(pin, HIGH);
delay(75);
digitalWrite(pin, LOW);
delay(75);
}
digitalWrite(pin, HIGH);
delay(DELAY);
digitalWrite(pin, LOW);
}
void loop() {
if (digitalRead(buttonPlayer1) == HIGH) {
playWinner(ledPlayer1);
} else if (digitalRead(buttonPlayer2) == HIGH) {
playWinner(ledPlayer2);
} else if (digitalRead(buttonPlayer3) == HIGH) {
playWinner(ledPlayer3);
} else if (digitalRead(buttonPlayer4) == HIGH) {
playWinner(ledPlayer4);
}
}
Niet getest ;)
Als je nu een led of schakelaar naar een andere pin moet verhuizen is het een kwestie van het aanpassen op een (1) plek.
Het 'const' keyword geeft aan dat de variabele niet kan worden veranderd in het programma. Als je b.v. later in je programma probeert om een nieuwe waarde aan bv ledPlayer1 te geven zal de compiler daar over klagen.
Verder, niet zo relevant in dit geval omdat je programma klein is en weinig RAM geheugen gebruikt, maar als je ooit aan grotere programmas gaat werken kan elke byte tellen. Daarom zijn de variabelen voor de pinnen van het type 'byte' en niet van het type 'int'.
Daarna kun je overwegen om je programma verder te optimaliseren. Als je variabelen hebt die genummerd zijn zou je eigenlijk arrays moeten gebruiken. Een array kun je zien als een ladenkast en in iedere la plaats je een pin nummer. Je kunt dan door het array itereren met een for-loop om iets met een pin te doen. In onderstaand programma worden twee arrays gebruikt, een voor de knoppen en een voor de leds. Het is belangrijk dat de arrays hetzelfde aantal elementen hebben.
const byte playerButtonPins[] = {2, 4, 6, 8};
const byte playerLedPins[] = {3, 5, 7, 9};
int DELAY = 3500;
void setup()
{
Serial.begin(9600);
// controleer of arrays hetzelfde aantal 'elementen' bevat
if (sizeof(playerButtonPins) != sizeof(playerLedPins))
{
// informeer gebruiker
Serial.println("Aantal playerButtonPins komt niet overeen met aantal playerLedPins");
// hang hier voor eeuwig
for (;;);
}
// doorloop de arrays om de pinnen te configureren
for (byte cnt = 0; cnt < sizeof(playerButtonPins); cnt++)
{
pinMode(playerButtonPins[cnt], INPUT);
pinMode(playerLedPins[cnt], OUTPUT);
}
}
void playWinner(int pin) {
for (int i = 0; i < 8; i++) {
digitalWrite(pin, HIGH);
delay(75);
digitalWrite(pin, LOW);
delay(75);
}
digitalWrite(pin, HIGH);
delay(DELAY);
digitalWrite(pin, LOW);
}
void loop()
{
// doorloop de knoppen en neem actie als een knop is ingedrukt
for (byte cnt = 0; cnt < sizeof(playerButtonPins); cnt++)
{
// als we een ingedrukte knop vinden
if (digitalRead(playerButtonPins[cnt]) == HIGH)
{
// geef aan welke speler gewonnen heeft
playWinner(playerLedPins[cnt]);
// niet verder zoeken naar een ingedrukte knop
break;
}
}
}
Een groot voordeel is dat je geen repeterende code meer hebt (if/else if/else if/else).