Arduino-programmering betyr å skrive små programmer, kalt skisser, som leser og styrer pinnene på et Arduino-kort. Du skriver koden i Arduino IDE 2, trykker Upload, og kortet kjører programmet med en gang. Guiden passer for nybegynnere og har kodeeksempler på tre nivåer for Uno R4 WiFi: fra en blinkende lysdiode via knapp og potensiometer til den innebygde LED-matrisen og en liten nettside over WiFi.
setup(), som kjører én gang, og loop(), som gjentas så lenge kortet har strøm. Sett alltid en motstand foran en LED, og på Uno R4 bør den være minst 470 Ω, helst 1 kΩ, fordi hver pinne bare tåler 8 mA. Bytt ut delay() med millis() så snart programmet skal gjøre flere ting samtidig.Arduino-programmering: slik er en skisse bygget opp
Arduino-språket består av funksjoner og strukturer bygget på C og C++, med tillegg for å styre maskinvaren. Et program kalles en skisse. Det lagres som en .ino-fil i en mappe med samme navn, og mappen kan inneholde flere filer, for eksempel en egen fil for WiFi-passordet.
void setup() {
// Kjører én gang etter strøm på eller reset:
// sett pinnemodus, start Serial og biblioteker.
}
void loop() {
// Kjører om og om igjen så lenge kortet har strøm.
}
Begge funksjonene må finnes, også når den ene er tom. Kompilatoren skiller mellom store og små bokstaver: Setup() er ikke det samme som setup(). Hver instruksjon slutter med semikolon, og krøllparentesene { } rammer inn det som hører til en funksjon, en if eller en løkke.
Kom i gang med Arduino IDE 2 og Uno R4 WiFi
- Last ned Arduino IDE 2 fra Arduinos programvareside. Den krever 64-bits Windows 10 eller nyere, macOS 10.15 eller nyere, eller 64-bits Linux.
- Installer pakken for kortet. Klikk på kortikonet i venstre kolonne for å åpne Boards Manager, søk etter «UNO R4 WiFi» og installer «Arduino UNO R4 Boards». Pakken inneholder også bibliotekene for LED-matrisen og WiFi.
- Koble til kortet med en USB-C-kabel som overfører data. En ren ladekabel gir strøm, men ingen port.
- Velg kort og port i nedtrekksmenyen ved siden av knappene øverst. Står navnet med fet skrift, er kortet tilkoblet. Finner du det ikke, bruk «Select other board and port…» eller Tools > Board og Tools > Port.
- Åpne Blink med File > Examples > 01.Basics > Blink.
- Trykk Verify og så Upload. Når konsollen nederst viser «Done uploading.», kjører programmet på kortet.
| Knapp eller meny | Hva den gjør | Når du bruker den |
|---|---|---|
| Verify (hake) | Kontrollerer og kompilerer skissen uten å laste den opp | Før hver opplasting, for å finne skrivefeil |
| Upload (pil mot høyre) | Kompilerer og laster den opp til kortet | Når koden er klar |
| Serial Monitor (øverst til høyre) | Viser tekst fra Serial.print() | Feilsøking og målinger |
| Serial Plotter (øverst til høyre) | Tegner tallene fra Serial som kurver | Analoge verdier, som potensiometeret i nivå 2 |
Menynavnene i guiden er de engelske navnene fra Arduinos dokumentasjon.
Nivå 1: blink den innebygde LED-en, så en ekstern LED
Blink med LED_BUILTIN
Kortet har en liten LED merket L. I koden heter den LED_BUILTIN, og på Uno R4 WiFi sitter den på pinne 13. Dette er Arduinos offisielle Blink-eksempel med norske kommentarer:
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // pinnen blir en utgang
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // LED på
delay(1000); // vent 1000 ms
digitalWrite(LED_BUILTIN, LOW); // LED av
delay(1000);
}
pinMode(..., OUTPUT)gjør pinnen til en utgang som kan settes høy eller lav.HIGHgir 5 V på pinnen og tenner LED-en, ogLOWgir 0 V.delay(1000)stopper programmet i ett sekund. Mens det venter, skjer ingenting annet. Det er greit her, men ikke i nivå 2.
Regn ut motstanden for 5 V-logikk
Uno R4 WiFi bruker 5 V på pinnene. Motstanden bestemmer strømmen gjennom LED-en etter Ohms lov: R = (5 V − Vf) / I, der Vf er spenningsfallet over LED-en. En rød LED har et spenningsfall på rundt 2,0 V. Ifølge Arduinos datablad tåler hver pinne på RA4M1-mikrokontrolleren høyst 8 mA, langt mindre enn på eldre Uno-kort. Det gir minst (5 V − 2,0 V) / 0,008 A = 375 Ω. Med margin for LED-er med lavere spenningsfall er 470 Ω den minste verdien du bør bruke.
| Motstand | Strøm med rød LED (Vf 2,0 V) | På Uno R4 |
|---|---|---|
| 220 Ω | (5 − 2,0) / 220 ≈ 13,6 mA | For mye, over grensen på 8 mA |
| 470 Ω | (5 − 2,0) / 470 ≈ 6,4 mA | Innenfor, men med liten margin |
| 1 kΩ | (5 − 2,0) / 1000 = 3,0 mA | Anbefalt: tydelig lys og god margin |
Koble en ekstern LED til pinne ~9
- Trekk ut USB-kabelen før du kobler opp.
- Sett motstanden fra kolonne 3 til kolonne 7 på koblingsbrettet. De fem hullene a til e i samme kolonne er koblet sammen.
- Sett LED-ens lange bein (anoden, +) i kolonne 7 og det korte beinet (katoden, −) i kolonne 8.
- Koble en ledning fra pinnen merket ~9 på kontakten merket DIGITAL til kolonne 3, og en ledning fra kolonne 8 til den blå minusskinnen øverst.
- Koble pinnen merket GND på samme kontakt, mellom AREF og 13, til den blå minusskinnen øverst.
| Fra | Til | Hvorfor |
|---|---|---|
| ~9 på DIGITAL-kontakten (D9 i koden) | Kolonne 3 | Styresignalet fra programmet |
| Motstand 1 kΩ | Kolonne 3 til 7 | Begrenser strømmen til rundt 3 mA |
| LED, langt bein (+) | Kolonne 7 | Anoden mot motstanden |
| LED, kort bein (−) | Kolonne 8, videre til minusskinnen øverst | Katoden mot jord |
| GND mellom AREF og 13 | Minusskinnen øverst | Felles jord for alle delene |
Endre Blink slik at pinnenummeret står i én konstant øverst. Da flytter du LED-en til en annen pinne ved å endre én linje:
const int LED_PIN = 9; // ekstern LED via 1 kΩ
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
}
Prøv selv: bytt ut digitalWrite(LED_PIN, HIGH) med analogWrite(LED_PIN, 64) og digitalWrite(LED_PIN, LOW) med analogWrite(LED_PIN, 0). Pinne ~9 har PWM, og verdien 0 til 255 styrer lysstyrken. Bruk analogWrite() i begge linjene: på Uno R4 slår ikke digitalWrite() av PWM som analogWrite() har startet.
Hvis det ikke virker: snu LED-en, kontroller at ledningen står i ~9 og ikke i 8, og sjekk at LED-beina ikke står i samme kolonne. Virket Blink med L, men ikke den eksterne LED-en, er feilen nesten alltid i koblingen.
Nivå 2: knapp med INPUT_PULLUP og potensiometer i Serial Plotter
Koble knappen mellom pinne 2 og GND
Med pinMode(2, INPUT_PULLUP) kobler kortet inn en intern motstand mot 5 V. Pinnen leser da HIGH når knappen er sluppet og LOW når du trykker, fordi knappen kobler pinnen til GND. Du trenger ingen ekstra motstand. Uten pull-up «flyter» inngangen og kan lese tilfeldig HIGH eller LOW.
- Sett knappen over midtsporet på koblingsbrettet, med beina i kolonne 13 og 15.
- Koble pinnen merket 2 til kolonne 13 i øvre halvdel.
- Koble pinnen GND under POWER til den blå minusskinnen nederst, og kolonne 15 i nedre halvdel til den samme skinnen. Da bruker du to bein som står på skrå overfor hverandre. På vanlige firebeinte knapper er det paret som alltid går gjennom selve bryteren.
Avprelling (debounce) med millis()
En mekanisk knapp spretter: kontakten slår av og på flere ganger i løpet av noen millisekunder, og programmet kan tro at du trykket flere ganger. Løsningen er å godta en ny tilstand først når den har vært stabil i 50 ms. Arduinos Debounce-eksempel gjør dette med millis(), som gir antall millisekunder siden programmet startet. Her er det tilpasset INPUT_PULLUP, så et trykk er LOW:
const int BUTTON_PIN = 2; // knapp mellom 2 og GND
const int LED_PIN = 9; // LED-en fra nivå 1
const unsigned long DEBOUNCE_MS = 50;
int ledState = LOW;
int buttonState = HIGH; // stabil tilstand, HIGH = sluppet
int lastReading = HIGH; // forrige råavlesning
unsigned long lastChange = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
if (reading != lastReading) {
lastChange = millis(); // signalet endret seg
}
if (millis() - lastChange > DEBOUNCE_MS) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) { // LOW = trykket
ledState = !ledState;
digitalWrite(LED_PIN, ledState);
}
}
}
lastReading = reading;
}
unsigned longbrukes til tid fordimillis()returnerer den typen. En vanligintblir for liten etter kort tid.millis() - lastChangeer tiden siden siste endring. Skriv alltid tidssjekken som en differanse, slik Arduinos eksempler gjør: medunsigned longblir svaret riktig også nårmillis()begynner på null igjen etter omtrent 50 dager.buttonStateer den stabile tilstanden. Den oppdateres bare når avlesningen har vært uendret i mer enn 50 ms.ledState = !ledStateveksler LED-en mellom av og på ved hvert nytt trykk, ikke hele tiden mens du holder knappen inne.- Løkken venter aldri. Derfor kan du legge mer kode i den uten at knappen blir treg.
Potensiometer på A0 og Serial Plotter
Et potensiometer er en spenningsdeler. Glideren i midten gir en spenning mellom 0 V og 5 V, og analogRead(A0) gjør den om til et tall. Standardoppløsningen er 10 bit, altså 0 til 1023, som på eldre Uno-kort. Koble pinnen 5V under POWER til den røde plusskinnen nederst, og koble aldri plusskinnen direkte til minusskinnen. Sett potensiometeret i nedre halvdel av koblingsbrettet, med beina i kolonne 20, 22 og 24.
| Potensiometerbein | Til | Merket på kortet |
|---|---|---|
| Ytre bein (kolonne 20) | Plusskinnen nederst, som kobles til 5 V | 5V under POWER |
| Midtre bein, glideren (kolonne 22) | Analog inngang 0 | A0 under ANALOG IN |
| Ytre bein (kolonne 24) | Minusskinnen nederst | GND (via skinnen) |
const unsigned long INTERVAL_MS = 20; // 50 målinger i sekundet
unsigned long lastSample = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (millis() - lastSample >= INTERVAL_MS) {
lastSample = millis();
int pot = analogRead(A0); // 0 til 1023
Serial.print("pot:"); // navn på kurven
Serial.println(pot); // tall og linjeskift
}
}
Serial.begin(9600)starter forbindelsen til PC-en. Velg samme hastighet, 9600 baud, i Serial Monitor."pot:"foran tallet blir navnet på kurven i Serial Plotter, ogprintlnavslutter hver måling med linjeskift, som plotteren trenger.- Åpne Serial Plotter øverst til høyre først når opplastingen er ferdig. Vri på potensiometeret, og kurven følger med.
- Uno R4 kan lese med høyere oppløsning: legg
analogReadResolution(14);isetup(), så går verdiene fra 0 til 16383.
Prøv selv: slå sammen knappeskissen og potensiometerskissen til én. Det går fordi ingen av dem bruker delay().
Hvis det ikke virker: virker knappen alltid trykket, eller reagerer den ikke, flytter du ledningen fra kolonne 15 til beinet på skrå overfor. Står verdien fast på 0 eller 1023, går A0-ledningen til et ytterbein i stedet for midtbeinet. Hopper verdien tilfeldig, mangler det trolig en ledning til A0 eller til en av skinnene.
Nivå 3: LED-matrise og en liten nettside over WiFi
Del A: potensiometeret som søyle på LED-matrisen
Matrisen har 12 × 8 røde punkter og styres med biblioteket Arduino_LED_Matrix, som følger med kortpakken. Den enkleste måten er å bruke et todimensjonalt bilde, der 1 er på og 0 er av:
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
uint8_t frame[8][12]; // 8 rader, 12 kolonner, alle 0
void setup() {
matrix.begin();
}
void loop() {
int pot = analogRead(A0); // 0 til 1023
int cols = map(pot, 0, 1023, 0, 12); // 0 til 12
for (int row = 0; row < 8; row++) {
for (int col = 0; col < 12; col++) {
frame[row][col] = (col < cols) ? 1 : 0;
}
}
matrix.renderBitmap(frame, 8, 12);
}
ArduinoLEDMatrix matrix;lager matriseobjektet, ogmatrix.begin()starter oppdateringen av punktene.map()gjør om 0 til 1023 til 0 til 12 kolonner. Den regner med heltall, så hele søylen tennes først når potensiometeret står helt i enden.- Uttrykket
(col < cols) ? 1 : 0tenner kolonnene til venstre for grensen og slukker resten. matrix.renderBitmap(frame, 8, 12)sender hele bildet til matrisen, med antall rader og kolonner.
Del B: en nettside som slår LED-en av og på
WiFi på Uno R4 WiFi håndteres av ESP32-S3-modulen, og i koden bruker du biblioteket WiFiS3. Skissen under bygger på Arduinos eksempel SimpleWebServerWiFi, med norske tekster, LED-en på ~9 og en statuslinje på siden.
- Åpne File > Examples > WiFiS3 > SimpleWebServerWiFi. Eksempelet har en ekstra fane,
arduino_secrets.h. - Skriv nettverksnavn og passord mellom anførselstegnene i den fanen:
#define SECRET_SSID "..."og#define SECRET_PASS "...". - Erstatt koden i hovedfanen med skissen under, lagre den under et eget navn og last den opp.
- Åpne Serial Monitor på 9600 baud. Når kortet er koblet til, skrives adressen ut, for eksempel
http://fulgt av en IP-adresse. Ser du den ikke, trykker du RESET på kortet mens Serial Monitor er åpen. - Åpne adressen i nettleseren på en mobil eller PC på samme nett, og trykk «Slå på» og «Slå av».
arduino_secrets.h: Arduino legger passordet i en egen fil nettopp for at du ikke skal dele det ved et uhell.// Basert på Arduinos WiFiS3-eksempel SimpleWebServerWiFi
#include "WiFiS3.h"
#include "arduino_secrets.h"
char ssid[] = SECRET_SSID; // nettverksnavn
char pass[] = SECRET_PASS; // passord
const int LED_PIN = 9;
bool ledOn = false;
int status = WL_IDLE_STATUS;
WiFiServer server(80); // vanlig HTTP-port
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
if (WiFi.status() == WL_NO_MODULE) {
Serial.println("Fant ikke WiFi-modulen");
while (true); // stopp her
}
String fv = WiFi.firmwareVersion();
if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
Serial.println("Oppdater WiFi-firmware");
}
while (status != WL_CONNECTED) {
Serial.print("Kobler til ");
Serial.println(ssid);
status = WiFi.begin(ssid, pass);
delay(10000); // gi tilkoblingen 10 s
}
server.begin();
Serial.print("Adresse: http://");
Serial.println(WiFi.localIP());
}
void sendPage(WiFiClient &client) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html; charset=utf-8");
client.println();
client.print("<p>LED-en er ");
client.print(ledOn ? "på" : "av");
client.println("</p>");
client.println("<p><a href=\"/H\">Slå på</a></p>");
client.println("<p><a href=\"/L\">Slå av</a></p>");
client.println();
}
void loop() {
WiFiClient client = server.available();
if (!client) return; // ingen besøkende nå
String line = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
if (c == '\n') {
if (line.length() == 0) { // tom linje: slutt
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
sendPage(client);
break;
}
line = "";
} else if (c != '\r') {
line += c;
}
if (line.endsWith("GET /H")) ledOn = true;
if (line.endsWith("GET /L")) ledOn = false;
}
}
client.stop();
}
WiFi.status() == WL_NO_MODULEbetyr at hovedprosessoren ikke får kontakt med WiFi-modulen. Da stopper skissen iwhile (true);i stedet for å prøve videre.WiFi.firmwareVersion()sammenlignes med versjonen biblioteket forventer. Ser du «Oppdater WiFi-firmware», bruk Tools > Firmware Updater i IDE-en. Verktøyet sletter skissen på kortet, så last den opp på nytt etterpå.WiFi.begin(ssid, pass)kobler til et WPA-nett. Løkken prøver på nytt hvert tiende sekund til statusen erWL_CONNECTED. Her erdelay()greit, fordi ingenting annet skal skje før nettet er oppe.server.available()gir enWiFiClientnår en nettleser kobler til. Ellers avsluttes denne runden avloop()med en gang.- Nettleseren sender en forespørsel linje for linje. Første linje begynner med
GET /HellerGET /Lnår du trykker på en lenke, ogendsWith()fanger det opp mens linjen bygges. - En tom linje betyr at forespørselen er ferdig. Først da blir LED-en slått av eller på, og siden sendes: svarkoden, innholdstypen, en tom linje og selve HTML-en.
charset=utf-8gjør at «på» og «Slå» vises riktig, ogclient.stop()lukker forbindelsen før neste besøkende.
Prøv selv: vis potensiometerverdien fra analogRead(A0) på siden, eller tenn en figur på LED-matrisen når LED-en er på.
Hvis det ikke virker: blir Serial Monitor stående på «Kobler til», kontroller navn og passord, og at nettet er på 2,4 GHz. Lastes ikke siden inn, sjekk at telefonen eller PC-en er på samme nett som kortet, ikke på et gjestenett.
Vanlige feil og løsninger
| Det du ser | Sannsynlig årsak | Gjør dette |
|---|---|---|
| Kortet vises ikke under Port | Ladekabel uten data, USB-hub eller dårlig kontakt | Bruk en datakabel direkte i PC-en, koble fra og til, og åpne portlisten på nytt |
| Opplastingen feiler, eller porten forsvinner | Skissen forstyrrer USB, eller porten er opptatt | Trykk RESET to ganger raskt for å starte bootloader-modus. Velg porten på nytt og last opp. Lukk andre programmer som bruker porten |
was not declared in this scope | Skrivefeil, feil store og små bokstaver, eller en variabel som er laget inne i en annen funksjon | Sjekk stavingen, og flytt variabelen øverst i skissen hvis flere funksjoner bruker den |
expected ';' before ... eller expected '}' | Manglende semikolon eller krøllparentes | Se på linjen over den IDE-en peker på |
No such file or directory for Arduino_LED_Matrix.h eller WiFiS3.h | Feil kort valgt, eller kortpakken mangler | Velg Arduino UNO R4 WiFi og installer «Arduino UNO R4 Boards» |
| Knappen reagerer tilfeldig | Inngangen flyter, eller du bruker to bein som alltid er koblet sammen | Bruk INPUT_PULLUP og to bein på skrå |
Arduinos egne feilsøkingssider forklarer flere feilmeldinger: når skissen ikke kompilerer og når skissen ikke lastes opp.
Hvilket kort og sett bør du velge?
Alle eksemplene er skrevet for Uno R4 WiFi. Nivå 1 og 2 virker også på Uno R3 og andre Uno-kort med 5 V, men LED-matrisen og WiFiS3 krever R4 WiFi, og 14-bits analoglesing krever et Uno R4. Har du allerede et kort, holder det med et komponentsett for Arduino, som har LED-er, motstander på 220 Ω, 1 kΩ og 10 kΩ, knapper, et potensiometer, ledninger hann-hann og et koblingsbrett, men ikke selve kortet.
Vil du ha et strukturert kurs, er Arduino Student Kit bygget rundt Uno Rev3, med ni leksjoner på engelsk og et multimeter. Startsettet med robotchassis passer når du vil gå videre til motorer. Motorer styres alltid gjennom en driver, se guiden om L298N, MOSFET og PWM. Flere kort finner du i Arduino-kategorien, og valgguiden for Arduino, ESP32 og Raspberry Pi hjelper deg med å velge plattform.
Vanlige spørsmål
Hvilket språk bruker Arduino?
Arduino-språket er en forenklet variant av C++ med egne funksjoner for pinner, tid og kommunikasjon. Du skriver vanlig C++-syntaks, og IDE-en kompilerer koden til maskinkode for kortet.
Hvorfor ikke bare bruke delay()?
Under delay() står programmet stille: det leser ingen knapper og gjør ingen nye beregninger. Med millis() sjekker du om det er tid for neste oppgave, og ellers går programmet videre, slik at flere oppgaver kan dele samme loop().
Hvordan får jeg tilbake animasjonen på LED-matrisen?
Uno R4 WiFi leveres med en animasjon på matrisen, og den blir borte når du laster opp en egen skisse. Last opp File > Examples > LED_Matrix > MatrixIntro for å få den tilbake.
Kan jeg ødelegge kortet?
Ja, hvis en pinne må levere mer enn 8 mA, eller hvis du kobler 5V direkte til GND. Koble alltid om med USB-kabelen trukket ut, bruk motstand foran LED-er, og ikke koble mer enn 3,3 V til Qwiic-kontakten eller ESP-kontakten ved USB-porten.
Trenger jeg å lodde?
Nei. Alle eksemplene bygges på et loddefritt koblingsbrett med ledninger hann-hann.
Kilder og videre lesing
Pinner, strømgrense og kontakter er kontrollert mot databladet for Uno R4 WiFi og Arduinos brukerhåndbok for kortet. Kodeeksemplene bygger på Arduinos innebygde eksempler, guiden for LED-matrisen og WiFi-eksemplene for Uno R4 WiFi.
Vil du få noe til å bevege seg, viser guiden om trinnmotor med Arduino hvordan Uno R4 WiFi styrer fart, retning og vinkel med den samme potensiometer- og knappekoblingen som her.
Et annet neste steg er å lese en ekte sensor: guiden om jordfuktighetssensor med Arduino eller ESP32 bruker den samme analogRead() som potensiometeret. Når skissene blir store, viser Arduino IDE, PlatformIO eller ESP-IDF hvordan du organiserer prosjektet, og oversikten over programmering med elektronikk viser hvilke plattformer du kan prøve etterpå.




