Arduino-opdrachten/Button-3

Uit basis
Naar navigatie springen Naar zoeken springen
Arduino opdrachten

Zie ook Regels en richtlijnen
Zie ook Artikelen bewerken

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

Schakel LED aan en uit

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

Button met interne pullup weerstand

Deze schakeling is gelijk aan de schakeling van Button-0.

  1. Plaats een LED met serieweerstand op het breadboard;
  2. Verbind de LED met pin 13 van de Arduino;
  3. Plaats een schakelaar (4 pootjes) over de lege middenrij;
  4. Verbind de linkerkolom van de schakelaar met pin 2 van de Arduino.
  5. Plaats een weerstand van 10k Ohm tussen deze linkerkolom en de 0V rij (pulldown-weerstand).
  6. Verbind de rechterkolom van de schakelaar met de 5V-rij.
  7. Verbind de voedingsrijen (0V, 5V) van het breadboard met de bijbehorende pinnen van de Arduino.

Schema

Button met pulldown-weerstand

Programma

int led = 13;
int button = 2;

int ledState = LOW;
int buttonState = LOW;
int prevButtonState = LOW;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(button, INPUT);
}

void loop() {
  prevButtonState = buttonState;
  buttonState = digitalRead(button);
  if (prevButtonState == LOW && buttonState == HIGH) {
    ledState = 1 - ledState;
    digitalWrite(led, ledState);
    delay(10);     // debounce button
  }
  // digitalWrite(led, ledState);
}

Uitleg van het programma

We houden in dit programma de toestand van de led bij (aan of uit), en de vorige toestand van de button. Alleen bij een overgang van LOW naar HIGH (het indrukken van de button) reageren we door de toestand van de led om te draaien.

Toestand van de button

In de variabele prevButtonState houden we de vorige toestand van de button bij. Als de vorige toestand LOW is, en de huidige toestand is HIGH, detecteren we het indrukken van de button. In dat geval veranderen we de toestand van de LED.

Toestand van de uitvoer

We houden de toestand van de uitvoer (LED) bij in de variabele ledState. 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?

Verdiepingsvragen