Tilbake
4.6
Sensorer og målinger

4.6 Sensorer og målinger

Temperatursensorer, lyssensorer, avstandssensorer og analoge signaler.

30 min
5 oppgaver
SensorerTemperaturLysAvstandAnalog-digital
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 5 oppgaver

Sensorer og målinger

En mikrokontroller alene kan ikke gjøre noe nyttig – den trenger inndata fra omverdenen. Det er her sensorer kommer inn. En sensor er en komponent som registrerer en fysisk størrelse (temperatur, lys, avstand, trykk, fuktighet) og omdanner den til et elektrisk signal som mikrokontrolleren kan lese.

I dette kapittelet skal du lære om noen av de vanligste sensorene brukt med Arduino: temperatursensor, lyssensor, avstandssensor og potensiometer. Du lærer hvordan de kobles til, hvordan du leser av verdiene, og hvordan du konverterer rå sensordata til meningsfulle fysiske verdier.

Sensor

En sensor (også kalt giver eller transducer) er en komponent som konverterer en fysisk størrelse til et elektrisk signal.

Sensorer kan deles i to hovedtyper ut fra signaltypen:

Analoge sensorer:
- Gir en kontinuerlig spenning proporsjonal med den fysiske størrelsen
- Leses med analogRead() (0–1023)
- Eksempler: TMP36 (temperatur), LDR (lys), potensiometer

Digitale sensorer:
- Gir data som digitale verdier via en kommunikasjonsprotokoll
- Bruker egne biblioteker for avlesning
- Eksempler: DHT11 (temperatur + fuktighet), DS18B20 (temperatur), HC-SR04 (avstand)

Sensorens overføringsfunksjon beskriver sammenhengen mellom den fysiske størrelsen og det elektriske signalet, for eksempel: «TMP36 gir 10 mV per °C med en offset på 500 mV.»

✏️Eksempel: Temperaturmåling med TMP36

Koble en TMP36 temperatursensor til Arduino og skriv et program som måler og viser temperaturen. TMP36 gir en spenning der T=(U0,5)×100T = (U - 0{,}5) \times 100 °C.

Kobling:
- TMP36 har tre bein: Vcc (5 V), Vout (signal), GND
- Koble Vcc til 5 V, GND til GND, og Vout til A0

Programkode:

// Temperaturmåling med TMP36
// Vout tilkoblet analog pinne A0

void setup() {
  Serial.begin(9600);
  Serial.println("Temperaturmåling med TMP36");
}

void loop() {
  int raVerdi = analogRead(A0);        // Les analog verdi (0-1023)

  // Konverter til spenning
  float spenning = raVerdi * (5.0 / 1024.0);

  // Konverter til temperatur (TMP36-formel)
  float temperatur = (spenning - 0.5) * 100.0;

  Serial.print("Rå verdi: ");
  Serial.print(raVerdi);
  Serial.print("  Spenning: ");
  Serial.print(spenning, 2);
  Serial.print(" V  Temperatur: ");
  Serial.print(temperatur, 1);
  Serial.println(" °C");

  delay(1000);  // Mål hvert sekund
}

Forklaring av konverteringen:
1. analogRead(A0) gir en verdi 0–1023.
2. Multipliser med 5,0/10245{,}0 / 1024 for å få spenningen i volt.
3. TMP36-formelen: T=(U0,5)×100T = (U - 0{,}5) \times 100 gir temperaturen i °C.

Ved romtemperatur (ca. 22 °C) vil TMP36 gi ca. 0,72 V, som gir analogRead ≈ 147.

📝Oppgave 1

En TMP36-sensor gir en spenning på 0,75 V. Hva er temperaturen?

Lyssensor – LDR (Light Dependent Resistor)
En LDR (lysavhengig motstand) er en sensor der motstanden endres med lysintensiteten:

- Mye lys: Lav motstand (typisk noen hundre ohm)
- Mørke: Høy motstand (typisk flere hundre kilohm)

For å lese en LDR med Arduino lager vi en spenningsdeler med en fast motstand:

5V --- [LDR] --- A0 --- [10 kΩ] --- GND

Spenningen på A0 avhenger av forholdet mellom LDR-motstanden og den faste motstanden:
UA0=5,0×RfastRLDR+RfastU_{A0} = 5{,}0 \times \frac{R_{\text{fast}}}{R_{\text{LDR}} + R_{\text{fast}}}

Mer lys → lavere RLDRR_{\text{LDR}} → høyere UA0U_{A0} → høyere analogRead-verdi.

Bruksområder for lyssensorer

Lyssensorer brukes i mange hverdagslige anvendelser:

- Gatelys: Tennes automatisk når det blir mørkt
- Smarttelefoner: Justerer skjermlysstyrken etter omgivelsene
- Solcellesystemer: Sporer solens posisjon for optimal vinkel
- Sikkerhetssystemer: Lysbom som registrerer når noe bryter lysstrålen
- Veksthus: Styrer kunstig belysning basert på naturlig lys

Med Arduino kan vi enkelt lage slike systemer selv!

✏️Eksempel: Automatisk nattlys med LDR

Skriv et program som leser en LDR koblet til A0 og tenner en LED på pinne 9 når det er mørkt (lav analogverdi).

// Automatisk nattlys med LDR og LED
// LDR med spenningsdeler på A0, LED på pinne 9

const int LDR_PIN = A0;
const int LED_PIN = 9;
const int MORK_GRENSE = 300;  // Juster etter forholdene

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int lysVerdi = analogRead(LDR_PIN);

  Serial.print("Lysverdi: ");
  Serial.println(lysVerdi);

  if (lysVerdi < MORK_GRENSE) {
    // Det er mørkt – tenn LED
    digitalWrite(LED_PIN, HIGH);
    Serial.println("Mørkt → LED PÅ");
  } else {
    // Det er lyst – slukk LED
    digitalWrite(LED_PIN, LOW);
    Serial.println("Lyst → LED AV");
  }

  delay(500);
}

Forklaring:
- analogRead(A0) gir en verdi fra 0 (helt mørkt) til ~1000 (sterkt lys), avhengig av spenningsdeleren.
- Vi sammenligner med en terskelverdi (MORK_GRENSE) og slår på LED-en når verdien er under terskelen.
- Terskelverdien 300 er et utgangspunkt – den må kalibreres for de faktiske lysforholdene i rommet.

📝Oppgave 2

I en spenningsdeler med en LDR og en 10 kΩ motstand: hva skjer med spenningen som Arduino leser på analoginngangen når det blir lysere?

Ultralydsensor – HC-SR04
HC-SR04 er en populær avstandssensor som bruker ultralyd til å måle avstand:

Virkemåte:
1. Sensoren sender ut en kort ultralydbølge (40 kHz)
2. Bølgen treffer en gjenstand og reflekteres tilbake
3. Sensoren måler tiden det tar før ekkoet kommer tilbake
4. Avstanden beregnes fra tiden og lydhastigheten

Formelen:
d=vt2d = \frac{v \cdot t}{2}

der v=343v = 343 m/s (lydhastighet i luft ved 20 °C) og tt er tiden for tur-retur.

Vi deler på 2 fordi lyden reiser frem og tilbake.

Tilkobling:
- VCC → 5 V
- Trig → Digital pinne (f.eks. pinne 7) – sender triggersignal
- Echo → Digital pinne (f.eks. pinne 6) – mottar ekko
- GND → GND

Måleområde: 2 cm – 400 cm

✏️Eksempel: Avstandsmåling med HC-SR04

Skriv et Arduino-program som måler avstand med en HC-SR04-sensor og skriver resultatet til Serial Monitor.

// Avstandsmåling med HC-SR04
// Trig på pinne 7, Echo på pinne 6

const int TRIG_PIN = 7;
const int ECHO_PIN = 6;

void setup() {
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  Serial.begin(9600);
  Serial.println("Avstandsmåling med HC-SR04");
}

void loop() {
  // Send en 10 µs puls på Trig
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  // Mål varigheten av Echo-pulsen (i mikrosekunder)
  long varighet = pulseIn(ECHO_PIN, HIGH);

  // Beregn avstand i cm
  // Lydhastighet ≈ 343 m/s = 0,0343 cm/µs
  // Avstand = (tid × hastighet) / 2
  float avstand = varighet * 0.0343 / 2.0;

  Serial.print("Avstand: ");
  Serial.print(avstand, 1);
  Serial.println(" cm");

  delay(200);
}

Forklaring:
1. Vi sender en kort puls (10 µs) på Trig-pinnen for å starte målingen.
2. pulseIn(ECHO_PIN, HIGH) måler hvor lenge Echo-pinnen er HIGH – dette er tur-retur-tiden i mikrosekunder.
3. Vi konverterer med d=t×0,0343/2d = t \times 0{,}0343 / 2 for å få avstanden i cm.

Eksempel: Hvis objektet er 20 cm unna: t=2×20/0,03431166t = 2 \times 20 / 0{,}0343 \approx 1166 µs. Programmet beregner: 1166×0,0343/220,01166 \times 0{,}0343 / 2 \approx 20{,}0 cm.

📝Oppgave 3

En HC-SR04-sensor måler at ultralydbølgen bruker 1160 µs (tur-retur). Lydhastigheten er 343 m/s. Hva er avstanden til objektet?

Analog-til-digital-konvertering og presisjon

Når vi leser analoge sensorer med Arduino, foregår en analog-til-digital-konvertering (ADC). Det er viktig å forstå begrensningene:

Oppløsning:
Arduino Uno har 10-bits ADC som gir 210=10242^{10} = 1024 steg mellom 0 V og 5 V. Hvert steg tilsvarer:
ΔU=5,0 V10244,9 mV\Delta U = \frac{5{,}0 \text{ V}}{1024} \approx 4{,}9 \text{ mV}

For TMP36: Sensoren gir 10 mV/°C, men ADC-ens oppløsning er ca. 4,9 mV. Det betyr at den minste temperaturendringen vi kan registrere er omtrent 0,490{,}49 °C – altså ca. en halv grad.

Støy og midling: Analoge avlesninger kan variere noen steg på grunn av elektrisk støy. For mer stabile avlesninger kan vi ta gjennomsnittet av flere målinger:

int lesStabil(int pin, int antall) {
  long sum = 0;
  for (int i = 0; i < antall; i++) {
    sum += analogRead(pin);
    delay(10);
  }
  return sum / antall;
}

Å ta gjennomsnittet av f.eks. 10 målinger gir vesentlig mer stabile resultater.

Oppsummering – Sensorer og målinger

Sensorer konverterer fysiske størrelser til elektriske signaler:
- Analoge sensorer (TMP36, LDR, potensiometer) gir varierende spenning → analogRead()
- Digitale sensorer (HC-SR04, DHT11) kommuniserer med egne protokoller

Temperatursensor (TMP36):
- Gir 10 mV/°C med 500 mV offset
- Formel: T=(U0,5)×100T = (U - 0{,}5) \times 100 °C

Lyssensor (LDR):
- Motstanden endres med lysintensiteten
- Kobles i spenningsdeler med fast motstand
- Mer lys → lavere motstand → høyere analogRead-verdi

Avstandssensor (HC-SR04):
- Bruker ultralyd (lydbølger) til å måle avstand
- d=vt/2d = v \cdot t / 2 der v=343v = 343 m/s
- Rekkevidde 2–400 cm

ADC-begrensninger:
- 10-bits oppløsning: 4,9 mV per steg
- Midling av flere målinger reduserer støy

I neste kapittel skal vi se på aktuatorer – komponentene som lar Arduino-en påvirke den fysiske verden!

📝Oppgave 4

Du bygger en enkel værstasjon med Arduino. Du har en TMP36 temperatursensor (koblet til A0) og en LDR med 10 kΩ motstand (koblet til A1). Skriv et program som leser begge sensorene hvert 2. sekund og skriver resultatene til Serial Monitor i formatet: «Temperatur: XX.X °C | Lysverdi: XXX».

📝Oppgave 5

Arduino-ens ADC har 10-bits oppløsning (0–1023) og referansespenning 5,0 V. a) Beregn spenningen per ADC-steg. b) TMP36 gir 10 mV per °C. Hva er den minste temperaturendringen Arduino kan registrere? c) Forklar én metode for å forbedre presisjonen uten å bytte maskinvare.

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.