Programmering av Arduino med sensorer, aktuatorer og praktiske prosjekter.
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
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:
| Funksjon | Beskrivelse |
|---|---|
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 |
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
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.
En analog sensor gir verdien 512 når du bruker analogRead(). Hvilken spenning tilsvarer dette omtrent (med 5V referanse)?
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).
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)
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 linjeskiftMotta 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
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
| Begrep | Forklaring |
|---|---|
| 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) |
| PWM | Pulsbreddemodulasjon – simulerer analog utgang med raske digitale pulser |
| Serial Monitor | Verktøy for å vise seriell data fra Arduino |
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.
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.