Arduino-opdrachten/Button-dimmer
Naar navigatie springen
Naar zoeken springen
Button-dimmer
Leerdoelen | IF, variabele, min, max |
Voorkennis | Arduino-opdrachten/Sweep |
Onderdelen |
LED, weerstand 220 ohm (rood-rood-bruin-goud), weerstand 10K ohm (bruin-zwart-oranje-goud) * 2, drukknopschakelaar * 2 |
Libraries en functies | min, max |
Inleiding
In dit project combineren we twee dingen die we eerder gezien hebben:
- twee buttons: één voor het ophogen van de lichtsterkte, één voor het aflagen (zie Button-2);
- analoge uitvoer (PWM) (zie Arduino-opdrachten/Sweep).
Op deze manier maak je een eenvoudige dimmer.
Je kunt de lichtsterkte niet verhogen boven het maximum (255) of verlagen onder het minimum (0).
- In de schets hiernaast houden we daarmee nog geen rekening. In het programma hieronder wel.
In een latere versie gebruiken we een potmeter (draaiknop) voor een analoge dimmer.
Opbouwen van de schakeling
Dit is dezelfde schakeling als gebruikt in Arduino-opdrachten/Button-2
- Plaats een LED met serieweerstand op het breadboard.
- Plaats een drukknopschakelaar op het breadboard, over de lege middenrij;
- verbind de ene zijde (kolom) van de schakelaar met pin 2;
- plaats een weerstand (10kOhm) tussen deze kolom en de 0V rij;
- verbind de andere zijde van de schakelaar met de 5V rij.
- Plaats een tweede drukknopschakelaar op het breadboard;
- verbind de ene zijde met pin3;
- plaats een weerstand (10kOhm) tussen deze kolom en de 0V rij;
- verbind de andere zijde met de 5V rij.
- Verbing de 5V rij met de Arduini 5V pin.
- Verbind de beide 0V rijen (onderaan en bovenaan).
- Verbind de 0v rij met de Arduino GND pin.
Je kunt de schakeling testen:
- test de LED door de LED-draad uit pin 9 tijdelijk te verplaatsen naar de Arduino 5V.
- de LED moet dan gaan branden;
- als de LED niet brandt:
- controleer of alle 0V verbindingen aanwezig zijn;
- controleer of de LED in de juiste richting gemonteerd is;
- controleer of je overal de juiste kolommen gebruikt hebt.
Schema
De schakeling bestaat uit drie onderdelen:
- een LED met serieweerstand, verbonden aan pin 9;
- een button met pulldown-weerstand naar 0V, verbonden met pin 2; andere kolom verbonden aan 5V;
- een button met pulldown-weerstand naar 0V, verbonden met pin 3; andere kolom verbonden aan 5V.
Programma
int upButton = 2; // pin nr of "on" button
int downButton = 3; // pin nr of "off" button
int led = 9; // pin nr of LED
int ledStatus = 0;
void setup() {
pinMode(led, OUTPUT); // initialize LED pin as output
pinMode(upButton, INPUT); // initialize button pin as input
pinMode(downButton, INPUT); // initialize button pin as input
}
void loop() {
if (digitalRead(upButton) == HIGH) {
ledStatus = min(ledStatus + 25, 255);
delay(200);
}
if (digitalRead(downButton) == HIGH) {
ledStatus = max(ledStatus - 25, 0);
delay(200);
}
analogWrite(led, ledStatus);
}
Uitleg van het programma
- We gebruiken de variabele
ledState
om de lichtsterkte weer te geven. Deze neemt waarden aan tussen 0 (LED uit) en 255 (LED vol aan). - Deze variabele gebruiken we als "analoge uitvoer" naar de LED. Deze "analoge waarde" is eigenlijk een PWM (pulsbreedte modulatie)-waarde: de LED knippert aan en uit met een hoge frequentie, onzichtbaar voor ons oog. Hierbij varieert de duty cycle: het deel van een cyclus dat de LED aan is (van 0% naar 100%).
- Als
upButton
ingedrukt is (activeHIGH
) wordt de variabeleledState
opgehoogd, tot een maximum van 255. - we gebruiken een
delay(200)
om te voorkomen dat de variabele direct weer opgehoogd wordt, bij een volgende herhaling vanloop
. Computers zijn erg snel!
Als downButton
ingedrukt is (active HIGH
) wordt de variabele ledState
afgelaagd, tot een minimum van 0.
- De functie
max(a, b)
heeft het maximum (grootste waarde) van deze getallen als resultaat. Voorbeelden:max(3, 100)
= 100;max(3, -1)
= 3. - De functie
min(a, b)
heeft het minimum (kleinste waarde) van deze getallen als resultaat. Voorbeelden:min(3, 100)
= 3;min(3, -1)
= -1.
Vragen en opdrachten
- Welke waarde heeft
min(ledStatus + 25, 255)
alsledStatus
de waarde 100 heeft? En als deze de waarde 245 heeft?
Eerste experimenten
- wat gebeurt er als je een knop ingedrukt houdt?
- wat gebeurt er als je beide knoppen ingedrukt houdt?
- wat gebeurt er als je de waarde van de delay verhoogt? En als je deze verlaagt, bijvoorbeeld tot 10 msec?
- wat gebeurt er als je de waarde van de stap verhoogt, bijvoorbeeld van 25 naar 50?
- wat gebeurt er als je de opdracht
analogWrite(led, ledState);
aan het begin van de loop-body plaatst, in plaats van aan het eind?