Arduino Uno · Digital Input

Trykknap & Logik · true/false · Pull-down & Pull-up

Lær hvad true/false betyder i elektronik og kode, forbind en trykknap korrekt, og læs brugerens tryk på en input-pin. Vi starter med ekstern pull-down og viser derefter intern pull-up (uden ekstra modstand).

Det skal du bruge

  • Arduino Uno (klon er fint) + USB-kabel.
  • Breadboard-shield eller lille breadboard + jumperledninger.
  • 1 × trykknap (tactile switch, 4 ben) eller 2-ben pushbutton.
  • 10 kΩ modstand (til ekstern pull-down-varianten).
  • 1 × LED + 220–330 Ω modstand (til visuel feedback på D8/D9 – valgfrit men anbefalet).
Hurtigt overblik
Vi bruger D2 som input-pin for knappen. LED på D8 viser tilstanden.

Teori: true/false, HIGH/LOW og binær logik

  • I kode repræsenteres sand/falsk af true / false (bool).
  • På en digital pin er HIGH ≈ 5 V og LOW ≈ 0 V.
  • digitalRead(pin) returnerer HIGH eller LOW.
  • En “svævende” pin (ikke trukket op eller ned) giver tilfældige værdier. Derfor bruger vi pull-down eller pull-up.
// Sand/falsk i kode
bool t = true;
bool f = false;
if (t && !f) { /* begge udtryk er sande her */ }

Del A · Ekstern pull-down (anbefalet for at “se” kredsløbet)

Pin D2 læser knappen. Vi bruger en 10 kΩ pull-down til GND, så D2 er stabilt LOW når knappen ikke trykkes.

5V ──[ Knap ]──●── D2
[10kΩ]
GND

● = knudepunktet, hvor både D2 og modstanden er forbundet.

LED som output
Til feedback kan du sætte LED på D8 via 220–330 Ω til GND (pin → modstand → LED → GND).
1

Forbindelser (pull-down)

  • Knap: den ene side til 5V.
  • Samme knaps anden side til et knudepunkt → herfra til D2.
  • Fra knudepunktet: 10 kΩ modstand til GND.
  • (Valgfrit) LED: D8 → 220Ω → LED → GND.
2

Kode: Læs knap og tænd LED (pull-down)

const int LED_PIN    = 8;   // D8: ekstern LED (valgfrit)
const int BUTTON_PIN = 2;   // D2: læser knappen (ekstern pull-down)

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT); // vi bruger ekstern 10k pull-down
  digitalWrite(LED_PIN, LOW);
  Serial.begin(9600);
}

void loop() {
  int knap = digitalRead(BUTTON_PIN); // HIGH når trykket, LOW når ikke
  digitalWrite(LED_PIN, knap == HIGH ? HIGH : LOW);
  Serial.println(knap == HIGH ? "TRYK = TRUE (HIGH)" : "TRYK = FALSE (LOW)");
  delay(10); // lille ro på seriel monitor
}
Tjek
Hvis LED aldrig tænder: byt knapben eller tjek at 10 kΩ virkelig går fra knudepunkt til GND.

Del B · Intern pull-up (ingen ekstern modstand)

Arduino kan aktivere en intern pull-up. Så trækker vi knappen fra D2 til GND. Logikken vendes: ikke trykket = HIGH; trykket = LOW.

D2 ──[ Knap ]── GND
↑ intern pull-up → holder D2 = HIGH når knappen er åben
3

Kode: Intern pull-up & vendt logik

const int LED_PIN    = 8;
const int BUTTON_PIN = 2;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP); // aktiver intern pull-up
  digitalWrite(LED_PIN, LOW);
}

void loop() {
  int knap = digitalRead(BUTTON_PIN); // LOW når trykket, HIGH når ikke
  bool trykket = (knap == LOW);       // vend logik til "true når trykket"
  digitalWrite(LED_PIN, trykket ? HIGH : LOW);
}
Hvornår vælge hvad?
Ekstern pull-down er god at lære først (man ser kredsløbet). Intern pull-up er hurtigt og kræver færre dele.

Debounce: undgå “flimren” ved et enkelt tryk

Mekaniske kontakter hopper elektrisk i få millisekunder. Her er en enkel tidsbaseret software-debounce med millis().

const int LED_PIN    = 8;
const int BUTTON_PIN = 2;

const unsigned long DEBOUNCE_MS = 30;

bool  stableState = HIGH; // antag pull-up-kode (skift til LOW ved pull-down)
bool  lastRead    = HIGH;
unsigned long lastChangeMs = 0;

void setup(){
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP); // skift til INPUT + ekstern pull-down hvis du bruger Del A
}

void loop(){
  int raw = digitalRead(BUTTON_PIN);

  if (raw != lastRead) {
    lastChangeMs = millis();
    lastRead = raw;
  }

  if (millis() - lastChangeMs > DEBOUNCE_MS) {
    if (stableState != raw) {
      stableState = raw; // ændring godkendt efter debounce
      bool trykket = (stableState == LOW); // for pull-up: LOW = tryk
      digitalWrite(LED_PIN, trykket ? HIGH : LOW);
    }
  }
}
Note
Bruger du ekstern pull-down? Sæt pinMode(BUTTON_PIN, INPUT) og tolk trykket = (stableState == HIGH).

Bonus: Toggle ved hvert tryk (edge detection)

LED skifter tilstand kun når du går fra “ikke trykket” → “trykket”. Virker sammen med debounce-idéen.

const int LED_PIN    = 8;
const int BUTTON_PIN = 2;

const unsigned long DEBOUNCE_MS = 30;
bool ledOn = false;

int  lastStable = HIGH; // antag pull-up
int  lastRead   = HIGH;
unsigned long lastChangeMs = 0;

void setup(){
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  digitalWrite(LED_PIN, LOW);
}

void loop(){
  int raw = digitalRead(BUTTON_PIN);
  if (raw != lastRead) { lastChangeMs = millis(); lastRead = raw; }

  if (millis() - lastChangeMs > DEBOUNCE_MS) {
    if (raw != lastStable) {
      lastStable = raw;
      // faldende flanke: HIGH -> LOW (tryk)
      if (lastStable == LOW) {
        ledOn = !ledOn;
        digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
      }
    }
  }
}
Tilpas til pull-down
Bruger du ekstern pull-down, er en “stigende flanke” (LOW→HIGH) selve trykket. Tjek i stedet if(lastStable == HIGH).

Fejlfinding

  • Pin skifter tilfældigt: Indgang er svævende. Brug ekstern 10 kΩ pull-down (Del A) eller INPUT_PULLUP (Del B).
  • Knappen gør ingenting: Byt ben på knappen (4-ben tactile har to interne par). Tjek at knudepunktet går både til pin og modstand.
  • Logik virker omvendt: Pull-up vender logikken. Tolk LOW som trykket i koden.
  • LED lyser konstant: Kortslutning pin→5V/GND? LED skal være i serie med modstand.
  • “Dobbeltklik” ved ét tryk: Tilføj debounce (se afsnittet ovenfor).
Vigtigt
Brug ikke D0/D1 til knapper under upload—de er seriel linje (USB). D2 er et godt standardvalg.

Næste skridt

  • Styr blinkhastighed med knap (kort tryk = hurtigere, langt tryk = langsommere).
  • To knapper → AND/OR-logik: tænd LED kun hvis begge (AND) eller mindst én (OR).
  • Brug en buzzer i stedet for LED for lydlig feedback.