Code zoeken

Les 98-3: Een toggle-LED aan/uitzetten met een drukknop en Arduino

Les 98-3: Een toggle-LED aan/uitzetten met een drukknop en Arduino

Drukknoppen zijn overal — in afstandsbedieningen, huishoudelijke apparaten en bedieningspanelen — en op het moment dat één knop meer dan één taak moet uitvoeren, heb je toggle-logica nodig. Dit project laat je zien hoe je met één drukknop een LED aanzet bij de eerste druk en uitzet bij de volgende, zodat het licht precies blijft waar je het hebt achtergelaten. Dat gedrag van "één keer drukken om te vergrendelen, nogmaals drukken om te ontgrendelen" is de basis van bijna elke menuknop, aan/uit-schakelaar en moduskeuzeschakelaar die je ooit zult bouwen.

LED met weerstand op breadboard verbonden met Arduino met een drukknop
LED met weerstand op breadboard verbonden met Arduino met een drukknop

Zodra je de toggle begrijpt, schaalt hetzelfde codepatroon naar echte hardware. Je kunt het gebruiken om:

  • Een relais te schakelen dat een AC-lamp of een bureaulamp bedient vanaf één paneelknop.
  • Een motor of een pomp te starten en te stoppen met één knop in plaats van twee.
  • Door bedrijfsmodi van een apparaat te bladeren (bijvoorbeeld langzaam / snel / uit).
  • Een vergrendelend alarm te bouwen dat aan blijft tot iemand het bevestigt.
  • Een mute-knop te maken voor een audioproject die zijn status onthoudt.
  • Te fungeren als een soft power-schakelaar voor een batterijgevoed gadget, ter vervanging van een mechanische schakelaar.

De instructeur merkt dit punt direct op in de video (in video op 19:52): het project gaat helemaal niet echt over de LED — het gaat over de toggle-techniek, die je kunt richten op een relais, een motor driver of elke andere uitgang.

LED-5mm-groen

Hardware en componenten

De onderdelenlijst is bewust minimaal, dus dit is een geweldig project als je net begint. Je hebt nodig:

  • Een Arduino-bord — Uno, Nano of Mega werken allemaal.
  • Eén LED, 3 mm of 5 mm, elke kleur.
  • Eén weerstand voor de LED, ergens tussen 200 Ω en 1000 Ω. Het transcript legt de redenering uit (in video op 03:49): een LED verliest ongeveer 2 V en trekt ongeveer 10 mA, dus bij een 5 V-voeding moet de resterende 3 V door de weerstand worden opgenomen. De wet van Ohm geeft 3 V ÷ 0,01 A = 300 Ω, en alles van 300 Ω tot 1000 Ω werkt — hogere waarden maken de LED gewoon dimmer.
  • Eén drukknopschakelaar. De video toont zowel het kleine vierpins tactile type als een versie met langere pinnen (in video op 12:43). Als je geen drukknop hebt, werkt een gewone schakelaar ook — zoek gewoon de twee aansluitingen die het circuit maken en verbreken.
  • Een breadboard en wat DuPont jumperdraden.

Een praktische tip uit de video (in video op 07:50): de vierpins tactile knop heeft twee paren intern verbonden pinnen. Gebruik een multimeter in continuïteitsmodus om te vinden welke twee pinnen samen piepen — dat is één kant van de schakelaar. Verbind één kant met de ingangspin en de andere kant met aarde.

Bedradingsgids

Arduino-schema voor LED met een drukknopschakelaar
Arduino-schema voor LED met een drukknopschakelaar
Arduino-bedrading voor LED met een drukknopschakelaar
Arduino-bedrading voor LED met een drukknopschakelaar

De bedrading is hetzelfde als de eenvoudige LED- en drukknopcircuits, met de knop erbovenop toegevoegd. De anode van de LED (het langere pootje) gaat naar pin 3, en de kathode (het kortere pootje, aan de platte kant van het lichaam) wordt via de weerstand met aarde verbonden. De drukknop wordt tussen pin 2 en aarde aangesloten — er is niets anders nodig, omdat de code de interne pull-up weerstand van de Arduino inschakelt.

Die interne pull-up is het begrijpen waard: zonder deze zou een zwevende ingangspin willekeurige ruis lezen. Het inschakelen van INPUT_PULLUP houdt de pin op 5 V terwijl de knop open is, en het indrukken van de knop trekt deze naar 0 V. Dit is waarom de code een LOW-uitlezing behandelt als "ingedrukt" — de logica is omgekeerd vergeleken met een gewone schakelaar naar aarde met een externe weerstand.

Code-uitleg

De volledige sketch is beschikbaar onder dit artikel. Hier richten we ons op de delen die je daadwerkelijk wilt aanpassen.

Bovenaan het bestand worden de twee pin-toewijzingen gedefinieerd als constanten. Als je je draden naar andere pinnen verplaatst, is dit de enige plek die je hoeft te bewerken:

const int pushButtonPin = 2;//define a pin number for push button
const int LEDPin = 3;//define a pin that is connected to LED

Vervolgens komen de drie statusvariabelen. Je hoeft deze normaal niet te wijzigen, maar het helpt om te weten wat ze doen:

int pushButtonStatus = 0; // push value from pin 2
int lightStatus = 0;//light status
int pushed = 0;//push status

pushButtonStatus slaat elke keer door de loop de ruwe uitlezing van de knop-pin op. lightStatus onthoudt wat de knop-pin bij de vorige doorgang uitleesde, wat de manier is waarop de sketch het moment van een nieuwe druk detecteert in plaats van continu te reageren. pushed is de eigenlijke toggle-vlag — deze schakelt tussen 0 en 1 en bepaalt of de LED aan of uit moet zijn.

De toggle zelf wordt gedaan met een nette rekenkundige truc (in video op 18:30). Door de vlag van één af te trekken wordt deze omgekeerd: 1 - 0 geeft 1, en 1 - 1 geeft 0. Dus één regel schakelt de toestand elke keer dat een nieuwe druk wordt gedetecteerd:

pushed = 1-pushed;//toggle the pushed value
delay(100);//give some time for finger to press

De vertraging van 100 ms is er om je vinger van de knop te laten komen. Zonder deze zou één fysieke druk meerdere keren kunnen worden geteld. Als je knop onbetrouwbaar aanvoelt of je vinger trilt, verhoog dan deze waarde (in video op 40:39).

De voorwaarde die de toggle activeert is de sleutel tot de hele sketch. Deze wordt alleen geactiveerd wanneer de knop niet is ingedrukt (HIGH, vanwege de pull-up) en de vorige uitlezing LOW was — wat betekent dat de knop net is losgelaten na een druk:

if(pushButtonStatus == HIGH && lightStatus == LOW){
  pushed = 1-pushed;//toggle the pushed value
  delay(100);//give some time for finger to press
}

Ten slotte wordt de LED aangestuurd vanuit de toggle-vlag, en de huidige knopuitlezing wordt opgeslagen voor de volgende vergelijking:

lightStatus = pushButtonStatus;
if(pushed == HIGH){
  Serial.println("Light ON");
  digitalWrite(LEDPin, HIGH); //turn the LED ON
}else{
  Serial.println("Light OFF");
  digitalWrite(LEDPin, LOW);//turn the LED OFF
}

Je kunt ook de Seriële Monitor openen op 9600 baud om de berichten "Light ON" en "Light OFF" te bekijken terwijl je op de knop drukt.

Live demonstratie

In de video (in video op 19:41) kun je het gedrag in actie zien: de eerste druk zet de LED aan en deze blijft aan nadat de vinger is losgelaten. De volgende druk zet deze uit, en deze blijft uit. Het is niet nodig om de knop ingedrukt te houden, wat precies het verschil is tussen dit project en de eenvoudigere "ingedrukt houden om te laten branden"-versie die wordt behandeld in Les 98-2: Hoe je een LED aan en uit zet met een drukknop en Arduino.

De video wijst er ook op dat je de LED kunt vervangen door een relaismodule om apparaten op netspanning te schakelen, of door een motor driver om een motor te starten en te stoppen. De toggle-logica verandert niet — alleen het uitvoerapparaat verandert.

Andere variaties die in dezelfde video worden getoond — het faden van de LED, het wipwap-patroon, het lopende licht, de spanningsbalkmeter en het verkeerslicht — worden elk behandeld in hun eigen tutorials, hieronder gelinkt.

Gerelateerde projecten uit deze video

Hoofdstukken

  • [00:00] Overzicht van de 10 LED-projecten
  • [01:00] Inleiding tot de Arduino stap-voor-stap cursus
  • [02:29] LED-basis: symbool, anode, kathode en weerstandsberekening
  • [05:53] Project 1: Een LED aan en uit zetten
  • [12:43] Project 2: Drukknop bedient de LED
  • [17:13] Project 3: Drukknop schakelt de LED aan en uit
  • [20:12] Project 4: Een LED faden
  • [23:20] Project 5: Een LED faden met een drukknop
  • [27:32] Project 6: Wipwap met twee LED's
  • [30:47] Project 7: Lopend licht met vijf LED's
  • [36:41] Project 8: Lopend licht geavanceerd met drukknop
  • [42:25] Project 9: LED-spanningsniveaumeter met potentiometer
  • [49:25] Project 10: Arduino verkeerslicht

Afbeeldingen

push-button-and-finger
push-button-and-finger
Arduino schematic for LED
Arduino schematic for LED
Arduino wiring for LED with a push button switch
Arduino wiring for LED with a push button switch
Arduino schematic for LED with a push button switch
Arduino schematic for LED with a push button switch
LED-5mm-green
LED-5mm-green
LED met weerstand op breadboard aangesloten op Arduino met een drukknop
LED met weerstand op breadboard aangesloten op Arduino met een drukknop
935-Lessson 98-LED-3: Arduino code push button toggles LED ON/OFF
Taal: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

Bestanden📁

Arduino-bibliotheken (zip)

Gebruikershandleiding