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 prosjekter

Arduino er en mikrokontrollerplattform som gjør det enkelt å bygge elektroniske prosjekter. Med en Arduino kan du lese av sensorer, styre motorer og LED-er, og kommunisere med en datamaskin – alt med noen få linjer kode.

Arduino programmeres i C/C++ og har en enkel grunnstruktur med to hovedfunksjoner:
- setup() – kjøres én gang når programmet starter
- loop() – kjøres om og om igjen etter setup

I dette kapittelet skal du lære:
- Grunnleggende Arduino-programmering (C/C++ syntax)
- Lese av sensorer med analogRead() og digitalRead()
- Styre LED-er og motorer med analogWrite() (PWM)
- Kommunisere med datamaskinen via seriell kommunikasjon

Arduino-programmets grunnstruktur

Alle Arduino-programmer har samme 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 funksjoner:

FunksjonBeskrivelse
pinMode(pin, modus)Setter en pinne som INPUT eller OUTPUT
digitalWrite(pin, verdi)Setter en digital utgang til HIGH eller LOW
digitalRead(pin)Leser en digital inngang (returnerer HIGH eller LOW)
analogRead(pin)Leser en analog inngang (returnerer 0–1023)
analogWrite(pin, verdi)Setter PWM-verdi på en pinne (0–255)
delay(ms)Pause i millisekunder

✏️Blinke-LED med knapp

Skriv et Arduino-program som leser en trykkknapp på pinne 2 og slår på en LED på pinne 13 når knappen trykkes.

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 en intern motstand som holder pinnen HIGH når knappen ikke er trykket
- Når knappen trykkes, kobles pinnen til jord (GND), og verdien blir LOW
- if/else sjekker knappens status og styrer LED-en deretter

📝Oppgave 1

Hvilken funksjon brukes til å lese verdien fra en analog sensor i Arduino?

Sensoravlesning

Arduino kan lese to typer sensorsignaler:

Digitale sensorer gir enten HIGH (1) eller LOW (0):
- Trykkknapper
- Bevegelsessensorer (PIR)
- Reed-kontakter (magnetbrytere)

Analoge sensorer gir en verdi mellom 0 og 1023:
- Temperatursensorer (f.eks. TMP36)
- Lyssensorer (LDR)
- Potensiometre
- Fuktighetssensorer

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 sensorer har andre omregningsformler.

📝Oppgave 2

En analog sensor gir verdien 512 når du bruker analogRead(). Hvilken spenning tilsvarer dette omtrent (med 5V referanse)?

PWM – pulsbreddemodulasjon
PWM (Pulse Width Modulation) er en teknikk der vi raskt slår en digital utgang av og på for å simulere en analog spenning. analogWrite() bruker PWM til å styre lysstyrke på LED-er eller hastighet på motorer.

Hvordan PWM fungerer:
- Verdien 0 betyr alltid AV (0% duty cycle)
- Verdien 127 betyr halvparten av tiden 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 bare på bestemte pinner, merket med ~ på Arduino-kortet (typisk pinne 3, 5, 6, 9, 10, 11 på Arduino Uno).

✏️Styre LED med potensiometer

Bruk et potensiometer til å styre lysstyrken på en LED. Potensiometeret er koblet 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 verdier fra 0 til 1023
- analogWrite() tar verdier fra 0 til 255
- Vi deler på 4 for å konvertere mellom de to områdene
- Alternativt kan man bruke map(potVerdi, 0, 1023, 0, 255)

📝Oppgave 3

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

Seriell kommunikasjon

Seriell kommunikasjon lar Arduino-en sende og motta data til/fra en datamaskin via USB-kabelen. Dette er 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

Motta 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 sendes fra Arduino-en, og lar deg sende tekst tilbake. Åpnes med Ctrl+Shift+M (eller Verktøy → Serial Monitor).

Seriell kommunikasjon er spesielt nyttig for:
- Feilsøking – se verdier fra sensorer i sanntid
- Datalogging – lagre målinger over tid
- Styring – sende kommandoer fra datamaskinen til Arduino-en

📝Oppgave 4

Hva er forskjellen mellom Serial.print() og Serial.println() i Arduino?

Oppsummering

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

- Grunnstruktur: setup() kjøres én gang, loop() kjøres i en evig løkke
- Digital I/O: digitalRead() og digitalWrite() for av/på-signaler
- Analog lesning: analogRead() gir verdier 0–1023 fra analoge sensorer
- PWM: analogWrite() gir verdier 0–255 for å simulere analog utgang
- Seriell kommunikasjon: Serial.print() for å sende data til datamaskinen

Nøkkelbegreper


BegrepForklaring
setup()Funksjonen som kjøres én gang ved oppstart
loop()Funksjonen som kjøres om og om igjen
pinMode()Setter en pinne som inngang eller utgang
analogRead()Leser analog verdi (0–1023)
analogWrite()Setter PWM-verdi (0–255)
PWMPulsbreddemodulasjon – simulerer analog utgang med raske digitale pulser
Serial MonitorVerktøy for å vise seriell data fra Arduino
📝Oppgave 5

Design et Arduino-basert alarmsystem som bruker en PIR-bevegelsessensor (digital, pinne 2) og en buzzer (pinne 8). Når bevegelse detekteres, skal buzzeren pipe i 2 sekunder, og en melding skrives til seriell monitor. Skriv fullstendig kode med kommentarer.

📝Oppgave 6

Skriv et Arduino-program som leser en temperatursensor (TMP36) på pinne A0 og styrer en vifte (motor) på PWM-pinne 9. Viften skal:
- Stå stille under 20 °C
- Gå på halv hastighet mellom 20–25 °C
- Gå på full hastighet over 25 °C
Skriv temperaturen og viftehastigheten 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.