Arduino-opdrachten/Button-3
Button-3
Leerdoelen | schakelaar met pulldown-weerstand; IF; toestand |
Voorkennis | Arduino-opdrachten/Button-0 |
Onderdelen |
LED, weerstand 220 ohm (rood-rood-bruin-goud), weerstand 10k ohm (bruin-zwart-oranje-goud), drukknopschakelaar |
Libraries en functies |
Inleiding
In de vorige sketch hebben we een drukknopschakelaar (button) op een erg eenvoudige manier gebruikt: de LED brandt alleen als je de schakelaar ingedrukt houdt.
In deze sketch leer je hoe je met een enkele schakelaar de LED aan- en uit kunt schakelen.
Hiervoor moet je de toestand van de LED bijhouden: als deze uit was, moet je die aanzetten; als deze aan was, moet je die uitzetten. Voor het bijhouden van de toestand van de LED gebruik je een variabele (ledState
). Door middel van een toekenning (in de blokjestaal: "Set", in de Arduino-taal =
) kun je de waarde van die variabele veranderen.
Opbouwen van de schakeling
Deze schakeling is gelijk aan de schakeling van Button-0.
- Plaats een LED met serieweerstand op het breadboard;
- Verbind de LED met pin 13 van de Arduino;
- Plaats een schakelaar (4 pootjes) over de lege middenrij;
- Verbind de linkerkolom van de schakelaar met pin 2 van de Arduino.
- Plaats een weerstand van 10k Ohm tussen deze linkerkolom en de 0V rij (pulldown-weerstand).
- Verbind de rechterkolom van de schakelaar met de 5V-rij.
- Verbind de voedingsrijen (0V, 5V) van het breadboard met de bijbehorende pinnen van de Arduino.
Schema
Programma
int led = 13;
int button = 2;
int ledState = LOW;
void setup() {
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}
void loop() {
if (digitalRead(button) == HIGH) {
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
delay(200);
}
digitalWrite(led, ledState);
}
Uitleg van het programma
We gebruiken hier een schakelaar met een externe pulldown-weerstand.
- in
setup
initialiseren we de button-pin metpinMode(button, INPUT);
- het lezen van deze pin via
digitalRead(button)
geeft de waardeHIGH
als de knop ingedrukt is.- "active HIGH"
Met dit programma kun je de LED met één knop aan- en uitzetten.
We houden de toestand van de LED (aan: HIGH of uit: LOW) bij in de variabele ledState
, met als waarden LOW
en HIGH
. Als de knop ingedrukt is, keren we de waarde van deze variabele om.
We schrijven de waarde van deze variabele naar de output (LED).
IF-statement
We gebruiken hier twee voorbeelden van het if-statement. Dit heeft de vorm:
if (conditie) {
opdracht1;
} else {
opdracht2;
}
De betekenis hiervan is:
- reken de waarde van de conditie uit
- als deze waarde
true
is, voer danopdracht1
uit; - als deze waarde
false
is, voer danopdracht2
uit.
Met andere woorden: slechts één van deze twee opdrachten wordt uitgevoerd.
Een voorbeeld van een conditie is: ledState == HIGH
. Het teken ==
staat voor "is gelijk aan". Deze vergelijking heeft true
als resultaat wanneer ledState
gelijk is aan HIGH
; in alle andere gevallen is het resultaat false
.
Toestand van de uitvoer
We houden de toestand van de uitvoer (LED) bij in de variabele ledState
. Aan de hand van de invoer en aan de hand van de vorige toestand berekenen we dan de nieuwe toestand. Deze kopiëren we naar de uitvoer (LED).
Deze vorm zullen we vaker tegenkomen:
if (input == X) {
state = newState(state, X);
setOutput(state);
}
Complement
Merk op dat je het if-statement voor het omdraaien van ledState
ook kunt schrijven als:
ledState = 1 - ledState;
(zie de opdrachten).
Vragen en opdrachten
Eerste experimenten
- kun je de opdracht
digitalWrite(led, ledState);
ook binnen het (buitenste) IF-statement plaatsen? Maakt dit verschil in het gedrag van het programma?