3 buttons, 3 led en ik kom er niet uit
5 berichten
• Pagina 1 van 1
3 buttons, 3 led en ik kom er niet uit
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:
De uitgangssituatie na het starten van het board is als volgt:
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.
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
Re: 3 buttons, 3 led en ik kom er niet uit
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:
ook op deze manier:
Je zou ook LED_ON en LED_OFF kunnen doen.
Dit:
dat is iets van jaren geleden. Tegenwoordig doen we:
Deze:
zou mijn voorkeur hebben met 'pin' in de naam. Dat voorkomt vergissingen in de sketch.
Wat dacht je van arrays ?
Dan verandert je code vanzelfsprekend.
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:
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:
kan netter zo:
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
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
Re: 3 buttons, 3 led en ik kom er niet uit
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
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.
Re: 3 buttons, 3 led en ik kom er niet uit
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.
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.
Re: 3 buttons, 3 led en ik kom er niet uit
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.
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
shooter@home.nl
5 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten