Programmering av Arduino med sensorer, aktuatorer og praktiske prosjekter.
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
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:
| Funksjon | Skildring |
|---|---|
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 |
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
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.
Ein analog sensor gir verdien 512 når du bruker analogRead(). Kva for ei spenning svarar dette omtrent til (med 5V referanse)?
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).
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)
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 linjeskiftTa 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
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
| Omgrep | Forklaring |
|---|---|
| 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) |
| PWM | Pulsbreiddemodulasjon – simulerer analog utgang med raske digitale pulsar |
| Serial Monitor | Verktøy for å vise seriell data frå Arduino |
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.
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.