Tilbake
3.7
Arduino-programmering og prosjekter

3.7 Arduino-programmering og prosjekter

Programmering av Arduino med sensorer, aktuatorer og praktiske prosjekter.

65 min
6 oppgaver
SensoravlesningMotorstyringLED-styringSeriell kommunikasjonBiblioteker
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

Arduino-programmering og prosjekt

Arduino er ei mikrokontrollarplattform som gjer det enkelt å byggje elektroniske prosjekt. Med ein Arduino kan du lese av sensorar, styre motorar og LED-ar, og kommunisere med ei datamaskin – alt med nokre få linjer kode.

Arduino blir programmert i C/C++ og har ein enkel grunnstruktur med to hovudfunksjonar:
- setup() – køyrer éin gong når programmet startar
- loop() – køyrer om og om igjen etter setup

I dette kapittelet skal du lære:
- Grunnleggjande Arduino-programmering (C/C++ syntax)
- Lese av sensorar med analogRead() og digitalRead()
- Styre LED-ar og motorar med analogWrite() (PWM)
- Kommunisere med datamaskina via seriell kommunikasjon

Grunnstrukturen i Arduino-programmet

Alle Arduino-program har same grunnstruktur:

// Globale variabler deklareres her
int ledPin = 13;

void setup() {
  // Kjøres én gang ved oppstart
  pinMode(ledPin, OUTPUT);    // Sett pinne 13 som utgang
  Serial.begin(9600);         // Start seriell kommunikasjon
}

void loop() {
  // Kjøres om og om igjen
  digitalWrite(ledPin, HIGH); // Slå på LED
  delay(1000);                // Vent 1 sekund (1000 ms)
  digitalWrite(ledPin, LOW);  // Slå av LED
  delay(1000);                // Vent 1 sekund
}

Viktige funksjonar:

FunksjonSkildring
pinMode(pin, modus)Set ein pinne som INPUT eller OUTPUT
digitalWrite(pin, verdi)Set ein digital utgang til HIGH eller LOW
digitalRead(pin)Les ein digital inngang (returnerer HIGH eller LOW)
analogRead(pin)Les ein analog inngang (returnerer 0–1023)
analogWrite(pin, verdi)Set PWM-verdi på ein pinne (0–255)
delay(ms)Pause i millisekund

✏️Blinke-LED med knapp

Skriv eit Arduino-program som les ein trykknapp på pinne 2 og slår på ein LED på pinne 13 når knappen blir trykt.

int knappPin = 2;
int ledPin = 13;

void setup() {
  pinMode(knappPin, INPUT_PULLUP); // Inngang med intern pull-up
  pinMode(ledPin, OUTPUT);
}

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

  if (knappStatus == LOW) {    // LOW betyr knappen er trykket
    digitalWrite(ledPin, HIGH); // Slå på LED
  } else {
    digitalWrite(ledPin, LOW);  // Slå av LED
  }
}

Forklaring:
- INPUT_PULLUP aktiverer ein intern motstand som held pinnen HIGH når knappen ikkje er trykt
- Når knappen blir trykt, blir pinnen kopla til jord (GND), og verdien blir LOW
- if/else sjekkar statusen til knappen og styrer LED-en deretter

📝Oppgave 1

Kva for ein funksjon blir brukt til å lese verdien frå ein analog sensor i Arduino?

Sensoravlesing

Arduino kan lese to typar sensorsignal:

Digitale sensorar gir anten HIGH (1) eller LOW (0):
- Trykknappar
- Rørslesensorar (PIR)
- Reed-kontaktar (magnetbrytarar)

Analoge sensorar gir ein verdi mellom 0 og 1023:
- Temperatursensorar (t.d. TMP36)
- Lyssensorar (LDR)
- Potensiometer
- Fuktssensorar

Eksempel – lese temperatursensor (TMP36):

int sensorPin = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int raVerdi = analogRead(sensorPin);
  float spenning = raVerdi * (5.0 / 1023.0);
  float temperatur = (spenning - 0.5) * 100.0;

  Serial.print("Temperatur: ");
  Serial.print(temperatur);
  Serial.println(" °C");

  delay(1000);
}

Formelen (spenning - 0.5) * 100 er spesifikk for TMP36-sensoren. Andre sensorar har andre omrekningsformlar.

📝Oppgave 2

Ein analog sensor gir verdien 512 når du bruker analogRead(). Kva for ei spenning svarar dette omtrent til (med 5V referanse)?

PWM – pulsbreiddemodulasjon
PWM (Pulse Width Modulation) er ein teknikk der vi raskt slår ein digital utgang av og på for å simulere ei analog spenning. analogWrite() bruker PWM til å styre lysstyrke på LED-ar eller fart på motorar.

Korleis PWM fungerer:
- Verdien 0 betyr alltid AV (0% duty cycle)
- Verdien 127 betyr halvparten av tida PÅ (50% duty cycle)
- Verdien 255 betyr alltid PÅ (100% duty cycle)

int ledPin = 9; // Må være en PWM-pinne (~)

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // Gradvis øk lysstyrke
  for (int i = 0; i <= 255; i++) {
    analogWrite(ledPin, i);
    delay(10);
  }
  // Gradvis senk lysstyrke
  for (int i = 255; i >= 0; i--) {
    analogWrite(ledPin, i);
    delay(10);
  }
}

Viktig: PWM fungerer berre på visse pinnar, merkte med ~ på Arduino-kortet (typisk pinne 3, 5, 6, 9, 10, 11 på Arduino Uno).

✏️Styre LED med potensiometer

Bruk eit potensiometer til å styre lysstyrken på ein LED. Potensiometeret er kopla til analog pinne A0 og LED-en til PWM-pinne 9.

int potPin = A0;
int ledPin = 9;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int potVerdi = analogRead(potPin);      // 0–1023
  int lysstyrke = potVerdi / 4;            // 0–255 (1023/4 ≈ 255)
  analogWrite(ledPin, lysstyrke);
  delay(10);
}

Forklaring:
- analogRead() returnerer verdiar frå 0 til 1023
- analogWrite() tek verdiar frå 0 til 255
- Vi deler på 4 for å konvertere mellom dei to områda
- Alternativt kan ein bruke map(potVerdi, 0, 1023, 0, 255)

📝Oppgave 3

Skriv eit Arduino-program som les ein lyssensor (LDR) på pinne A0, og slår på ein LED på pinne 13 når det er mørkt (sensorverdi under 300). Bruk seriell kommunikasjon til å skrive ut sensorverdien kvart sekund.

Seriell kommunikasjon

Seriell kommunikasjon lèt Arduino-en sende og ta imot data til/frå ei datamaskin via USB-kabelen. Dette er heilt essensielt for feilsøking og datalogging.

Sende data:

Serial.begin(9600);         // Start med 9600 baud
Serial.print("Verdi: ");   // Skriv uten linjeskift
Serial.println(42);         // Skriv med linjeskift

Ta imot data:

void loop() {
  if (Serial.available() > 0) {
    char tegn = Serial.read();
    Serial.print("Mottok: ");
    Serial.println(tegn);
  }
}

Serial Monitor i Arduino IDE viser data som blir sendt frå Arduino-en, og lèt deg sende tekst tilbake. Han blir opna med Ctrl+Shift+M (eller Verktøy → Serial Monitor).

Seriell kommunikasjon er spesielt nyttig for:
- Feilsøking – sjå verdiar frå sensorar i sanntid
- Datalogging – lagre målingar over tid
- Styring – sende kommandoar frå datamaskina til Arduino-en

📝Oppgave 4

Kva er skilnaden mellom Serial.print() og Serial.println() i Arduino?

Oppsummering

I dette kapittelet har du lært grunnleggjande Arduino-programmering:

- Grunnstruktur: setup() køyrer éin gong, loop() køyrer i ei evig løkke
- Digital I/O: digitalRead() og digitalWrite() for av/på-signal
- Analog lesing: analogRead() gir verdiar 0–1023 frå analoge sensorar
- PWM: analogWrite() gir verdiar 0–255 for å simulere analog utgang
- Seriell kommunikasjon: Serial.print() for å sende data til datamaskina

Nøkkelomgrep


OmgrepForklaring
setup()Funksjonen som køyrer éin gong ved oppstart
loop()Funksjonen som køyrer om og om igjen
pinMode()Set ein pinne som inngang eller utgang
analogRead()Les analog verdi (0–1023)
analogWrite()Set PWM-verdi (0–255)
PWMPulsbreiddemodulasjon – simulerer analog utgang med raske digitale pulsar
Serial MonitorVerktøy for å vise seriell data frå Arduino
📝Oppgave 5

Design eit Arduino-basert alarmsystem som bruker ein PIR-rørslesensor (digital, pinne 2) og ein buzzer (pinne 8). Når rørsle blir oppdaga, skal buzzeren pipe i 2 sekund, og ei melding skal skrivast til seriell monitor. Skriv fullstendig kode med kommentarar.

📝Oppgave 6

Skriv eit Arduino-program som les ein temperatursensor (TMP36) på pinne A0 og styrer ei vifte (motor) på PWM-pinne 9. Vifta skal:
- Stå stille under 20 °C
- Gå på halv fart mellom 20–25 °C
- Gå på full fart over 25 °C
Skriv temperaturen og viftefarten til seriell monitor.

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.