Temperatursensorer, lyssensorer, avstandssensorer og analoge signaler.
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.
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.»
Koble en TMP36 temperatursensor til Arduino og skriv et program som måler og viser temperaturen. TMP36 gir en spenning der °C.
- 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 for å få spenningen i volt.
3. TMP36-formelen: gir temperaturen i °C.
Ved romtemperatur (ca. 22 °C) vil TMP36 gi ca. 0,72 V, som gir analogRead ≈ 147.
En TMP36-sensor gir en spenning på 0,75 V. Hva er temperaturen?
- 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Ω] --- GNDSpenningen på A0 avhenger av forholdet mellom LDR-motstanden og den faste motstanden:
Mer lys → lavere → høyere → 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!
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.
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?
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:
der m/s (lydhastighet i luft ved 20 °C) og 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
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 for å få avstanden i cm.
Eksempel: Hvis objektet er 20 cm unna: µs. Programmet beregner: cm.
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 steg mellom 0 V og 5 V. Hvert steg tilsvarer:
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 °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.
| Sensor | Måler | Type | Tilkobling |
|---|---|---|---|
| TMP36 | Temperatur | Analog | A0–A5 |
| LDR | Lys | Analog (spenningsdeler) | A0–A5 |
| HC-SR04 | Avstand | Digital (puls) | Digitale pinner |
| DHT11 | Temp. + fuktighet | Digital (protokoll) | Digital pinne |
| Potensiometer | Posisjon/vinkel | Analog | A0–A5 |
| Piezo | Vibrasjon/trykk | Analog | A0–A5 |
| IR-sensor | Nærhet/fjernkontroll | Digital | Digital pinne |
| Jordfuktighet | Vanninnhold i jord | Analog | A0–A5 |
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: °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
- der 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!
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».
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.