Digital input

Knapp, INPUT_PULLUP, if/else och en buzzer som tjuter på kommando. Arduinon börjar lyssna på världen och fatta beslut.

Vad du lärde dig

Träff 3 i konkreta byggstenar:

Input ≠ output Hittills har Arduinon bara skickat ut. Nu läser den in. Samma pinMode, annat argument: INPUT_PULLUP.
Varför pullup behövs En "flytande" pin läser slumpmässigt. INPUT_PULLUP bygger in en mjuk dragning till HIGH inuti Arduinon. Tryckt = LOW.
if / else Programmet fattar beslut: OM knappen är LOW, gör A. ANNARS, gör B. Två vägar — koden väljer.
= vs == Ett likhetstecken sätter värdet. Två jämför. Glömt det andra = den klassiska nybörjar-buggen. Andra jämförelse-operatorer: != olika, < mindre, > större. Kombinera med && (och) eller || (eller). Invertera ett bool-värde med !.
Flankdetektion Reagera inte på att knappen "är" nere — på att den just nu gick från HIGH till LOW. Spara förra läget, jämför.

Knappkretsen

Två ben från knappen — ett till pin 9, ett till GND. Ingen extern pulldown-resistor behövs; pinMode(knappPin, INPUT_PULLUP) bygger in en mjuk dragning till 5 V inuti Arduinon. När knappen trycks kortsluts pinnen till GND, läsningen blir LOW.

Fritzing-koppling: tryckknapp på breadboard, ena benet till D9, andra till GND.
Tryckknapp: ben → D9, andra benet → GND.
button.ino Ladda ner ↓
const int knappPin = 9;

void setup() {
  pinMode(knappPin, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if (digitalRead(knappPin) == LOW) {
    // knappen tryckt (LOW eftersom INPUT_PULLUP — andra benet drar till GND)
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

Aktiv buzzer — Arduinons röst

En aktiv buzzer behöver ingen frekvens från koden — den tjuter när den får ström. digitalWrite(buzzerPin, HIGH) = pip, LOW = tyst.

VARNING: Buzzern är från fabriken klistrad med en gul "REMOVE SEAL AFTER WASHING"-lapp. Dra inte bort lappen. Den sitter där som fabriksdämpare — utan den blir buzzern obekvämt högljudd i klassrummet.
Foto av aktiv buzzer med gul lapp där det står REMOVE SEAL AFTER WASHING.
Den gula lappen sitter där den ska — rör den inte.
Fritzing-koppling av aktiv buzzer: plusben till D12, minusben till GND.
Buzzern: +ben (markerad +) → D12, −ben → GND.

Larm-mönstret — flank-detektion

Det här mönstret återanvänds direkt i hackathon-projektet. En knapptryckning ska växla larmet — av/på, av/på — inte hålla det av så länge fingret är nere. Lösningen: reagera bara på flanken, ögonblicket när knappen byter läge.

larm-toggle.ino Ladda ner ↓
const int knappPin  = 9;
const int buzzerPin = 12;

bool larmPaslaget = false;
int  lastState    = HIGH;

void setup() {
  pinMode(knappPin, INPUT_PULLUP);
  pinMode(buzzerPin, OUTPUT);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  int state = digitalRead(knappPin);

  if (state == LOW && lastState == HIGH) {
    // fallande flank → toggla larmet
    larmPaslaget = !larmPaslaget;
  }

  digitalWrite(buzzerPin,   larmPaslaget ? HIGH : LOW);
  digitalWrite(LED_BUILTIN, larmPaslaget ? HIGH : LOW);

  lastState = state;
  delay(10);   // enkel debounce
}

Tre nyckelrader att förstå:

  • if (state == LOW && lastState == HIGH) — bara sann i ett enda loop-varv per tryck. Det är flanken.
  • larmPaslaget = !larmPaslaget — bool-toggle. Utropstecknet inverterar: true blir false och tvärtom.
  • buzzerPin, larmPaslaget ? HIGH : LOW — kort if/else. "Om larmPaslaget är sant: HIGH. Annars: LOW."
Variabel-typer: const int = sätts en gång, ändras aldrig (pin-nummer). int = vanligt heltal som kan ändras (lastState). bool = sant eller falskt (larmPaslaget). Bilaga A i kompendiet har hela datatyp-tabellen.
Nästa
Träff 4 — Analog input

Fotocell, spänningsdelare, tilt-sensor och Serial Monitor.

Träff 4 →