Arduino - LED reageert op knopje
De schakeling
Extra benodigdheden:
- 1 LEDs
- 1 weerstand van 180Ω-220Ω
- 1 weerstand van 10kΩ
- 1 druknopje
De LED sluiten we met het lange pootje aan op pin 7 van de Arduino. Het korte pootje van de LEDs sluiten we via een weerstand van ongeveer 200Ω aan op de nul-rail van het breadboard die vervolgens wordt verbonden met de GND ingang van de Arduino. Het knopje kunnen we ook in het breadboard prikken. Dat sluiten we aan de ene kant aan op pin 1 van de Arduino en aan de andere kant aan de plus-rail van het breadboard. De weerstand van 10kΩ leggen we tussen pin 1 van de Arduino en de nul-rail van het breadboard.
Als de schakelaar niet is ingedrukt staat hij open en is er dus geen verbinding met de plus-rail. Als je de verbindingen goed volgt zie je dat pin 1 van de Arduino dan via de 10kΩ weerstand aan de nul hangt. Als het knopje nu wordt ingedrukt, hangt pin 1 ineens aan de plus en zal dus 5 Volt worden. De 10kΩ weerstand zorgt dat er maar weinig stroom kan gaan lopen, want de plus hangt nu via die weerstand aan de nul. Zonder die weerstand zou er kortsluiting ontstaan! Het idee van deze schakeling is dat het programma kan zien dat de spanning op pin 1 verandert en daarop kan reageren.
|
|
| Verbindingen in het breadboard met een bijbehorende schema tekening |
Naast een illustratief plaatje van de verbindingen in het breadboard hebben we een schema-tekening toegevoegd. Het grote blok daarop staat voor de Arduino. In rood hebben we de 5 Volt verbinding getekend en in zwart de nul-verbinding. De groene lijn geeft aan hoe de LED is aangesloten en de oranje lijn geeft de aanlsuiting van het knopje. Kun je alle onderdelen herkennen?
Het programma
Hieronder staat weer het programma, klaar om te uploaden. Als de knop wordt ingedrukt gaat het lampje aan en blijft dan heel even aan.
int ledpin = 7; // aansluitpin van de LED
int btnpin = 1; // aansluitpin van de knop
int wait = 500; // minimale duur dat het lampje aan blijft
void setup()
{
pinMode(ledpin, OUTPUT);
pinMode(btnpin, INPUT);
}
void loop()
{
bool val=digitalRead(btnpin); // lees de stand van de knop: ingedrukt of niet
if (val==LOW) // LOW => de knop is niet ingedrukt
{
digitalWrite(ledpin,LOW); // zet het lampje uit
}
else // hier gaat het programma verder als val niet LOW is!
{
digitalWrite(ledpin,HIGH); // zet het lampje aan
delay(wait); // wacht om het lampje even aan te laten
}
}
Hier is nog een alternatief programma. Als de knop wordt ingedrukt gaat het lampje aan als het uit was of uit als het aan was. Daarna blijft het in die toestand.
int ledpin = 7; // aansluitpin van de LED
int btnpin = 1; // aansluitpin van de knop
int staat = LOW; // onthoud aan of het lampje aan is of uit
int wait = 200; // minimale wachttijd (ms) tussen twee knop-drukken
void setup()
{
pinMode(ledpin, OUTPUT);
pinMode(btnpin, INPUT);
digitalWrite(ledpin,LOW); // zet het lampje uit
staat = LOW;
}
void loop()
{
bool val=digitalRead(btnpin); // lees de stand van de knop: ingedrukt of niet
if (val==HIGH) // HIGH => de knop is ingedrukt
{
if (staat==LOW)
{
staat=HIGH; // verander in HIGH => lampje aan
}
else
{
staat=LOW; // verander in LOW => lampje uit
}
digitalWrite(ledpin,staat); // zet het lampje nu echt aan of uit
delay(wait); // wacht zodat het knopje niet meteen weer ingedrukt kan worden
}
}
Uitleg van het programma
Veel van de beide versies van het programma moet nu bekend en begrijpelijk zijn. Er zijn weer drie delen: definieren van variabelen, de setup() en de loop() functie. In de stetup() functie staat iets nieuws. Daar wordt de btnpin op INPUT ingesteld. INPUT betekent dat de waarde ervan niet wordt bepaald door wat het programma in de Arduino wil, maar door iets anders en dat de Arduino de waarde kan inlezen. In de loop() functie zien we dat terug:
val=digitalRead(btnpin);
De functie digitalRead() leest de stand van de btnpin en komt dan met een waarde HIGH of LOW. Het resultaat wordt in variabele val gestopt die van het type bool is. Dit is een speciaal type dat maar twee waarden kan hebben: HIGH en LOW. Anders uitgelegd mag je ook zeggen Waar/Onwaar, True/False, of Ja/Nee. Dit lezen van een (digitale) waarde kan omdat btnpin op INPUT is gezet. Als de knop is ingedrukt, zal de waarde HIGH zijn, zo niet dan is die LOW. Bij HIGH wordt het lampje aan gezet en als de knop weer wordt losgelaten gaat het lampje weer uit.
In het alternatieve programma wordt een extra variabele gebruikt om de stand van het lampje te onthouden. De ledpin staat op OUTPUT waardoor de Arduino die stand (vreemd genoeg) niet kan bekijken. Vandaar dus dat we een extra variabele gebruiken. Als nu het knopje wordt ingedrukt, wordt de stand van het lampje veranderd: als het aan was gaat het uit en vice versa.
Beetje spelen
- Bij de tweede variant, waarbij het lampje met het knopje aan- en uitgezet kan worden, staat op regel 28
delay(wait); // wacht zodat het knopje niet meteen weer ingedrukt kan worden
Probeer eens hoe het programma werkt nadat deze regel is weggehaald en bedenk dan eens hoe dat komt.
- Om erachter te komen wat het probleem is kunnen we de Arduino boodschappen laten sturen aan de computer via seriele communicatie:
Serial.println("knopje weer omgezet");
Vergeet dan niet om Serial.begin(9600); toe te voegen aan setup()!
Na het testen van het programma zul je zien dat de knop nu helemaal niet meer werkt en het lampje altijd aan staat of snel knippert zonder de knop te gebruiken. Dat is natuurlijk vreemd! De oorzaak hierachter verdient wat extra uitleg. De seriele communicatie van de Arduino met de computer verloopt weliswaar via de USB aansluiting, maar die is zelf weer verbonden met digitale pins 0 en 1. De seriele communicatie van de processor gebruiken deze pins, waar de USB poort op het bordje feitelijk ook aan hangt. We moeten de btnpin veranderen in wat anders, bijvoorbeeld pin 4:
int btnpin = 4; // aansluitpin van de knop
Sluit ook het groene draadje dat tot nu toe in pin 1 stak in pin 4. Daarna werkt het weer en kun je via de Serial Monotor zien wat er gebeurt en waarom het lampje soms wel en soms niet van stand veranderd als de knop wordt ingedrukt.
- Je kunt je misschien wel een derde variant voorstellen waarbij een lamp met een drukknop aan- en uitgezet kan worden, maar waarbij de lamp ook kan worden gedimd. In dat geval moet je onderscheid maken tussen kort indrukken => aan/uitzetten en lang indrukken => dimmen. Ook moet de dimmer de lamp zowel zachter als harder kunnen laten branden. Voor dat laatste kun je denken dat hij steeds heen en weer gaat: zachter tot bijna uit, dan weer harder tot vol aan, en dan weer zachter. Denk er eerst even zelf over na maar hier kun je ook een oplossing vinden.
Zie je dat je voor dezelfde schakeling verschillende programmaatjes kunt maken met heel verschillende gebruiksmogelijkheden. Dat komt door het gebruik van software. Software is "zacht" en maakt het geheel vrij kneedbaar. Hardware veranderen is doorgaans meer werk.

