Arduino Uno · Analog → PWM

Potentiometer styrer LED-lysstyrke (analogRead → analogWrite)

Drej på potmeteret (A0) og justér LED-lyset i realtid via PWM på en ~-pin (D9). Først en simpel direkte mapping, derefter en glat version med let filtrering og “gamma”.

Det skal du bruge

  • Arduino Uno (klon er fint) + USB-kabel
  • Breadboard-shield/breadboard + jumperledninger
  • 10 kΩ potentiometer (B10K)
  • LED + 220–330 Ω seriemodstand
PWM-pins
Brug en pin med ~: ~3~5~6~9~10~11. Vi vælger ~9.

Forbindelser

Potentiometer → A0 (spændingsdeler), LED → D9 via modstand til GND.

5V ──┐
├──[ POT ]─── A0 ← midterben (wiper)
GND ──┘
D9 ──[ 220Ω ]──►|── GND

Drej mod 5V-siden ⇒ højere A0-værdi ⇒ højere PWM ⇒ lysere LED.

Vigtigt
LED skal altid have seriemodstand. Byt ikke rundt på 5V og GND på potentiometerets yderben.

Teori kort

  • analogRead(A0) giver 0…1023 (0…Vref ≈ 5 V).
  • analogWrite(9, x) forventer 0…255 (PWM duty cycle).
  • Vi skal altså mappe 0…1023 → 0…255 (ca. ÷4).

Program 1 · Direkte styring (simpel mapping)

Nem, responsiv – god som første version.

const int POT_PIN = A0;  // potentiometer (wiper)
const int LED_PIN = 9;   // PWM-pin (~)

void setup(){
  pinMode(LED_PIN, OUTPUT);
}

void loop(){
  int raw = analogRead(POT_PIN);     // 0..1023
  int pwm = raw / 4;                 // 0..255 (hurtig mapping)
  analogWrite(LED_PIN, pwm);
}
Alternativ mapping
Brug Arduino’s map(): int pwm = map(raw,0,1023,0,255); (husk at map() ikke klamper automatisk).

Program 2 · Glat regulering (lavpas + “gamma”)

Reducerer småhop og gør den nederste del af skalaen mere brugbar (øjet er ikke lineært).

const int POT_PIN = A0;
const int LED_PIN = 9;

// Low-pass filter (0..1). Mindre alpha = mere udglatning, langsommere respons.
const float ALPHA = 0.15f;
// Perceptuel “gamma” (1.8–2.4 er typisk). 1.0 = slået fra.
const float GAMMA = 2.2f;

float filtered = 0.0f; // 0..1

void setup(){
  pinMode(LED_PIN, OUTPUT);
}

void loop(){
  // Læs og normalisér 0..1023 -> 0..1
  int raw = analogRead(POT_PIN);
  float x = raw / 1023.0f;

  // Enkel low-pass: ny = ny*ALPHA + (1-ALPHA)*gammel
  filtered = ALPHA * x + (1.0f - ALPHA) * filtered;

  // Gamma-korrektion for jævnere lysfornemmelse
  float perceptual = pow(filtered, GAMMA);

  // Skaler til PWM 0..255
  int pwm = (int)(perceptual * 255.0f + 0.5f);
  if (pwm < 0) pwm = 0; else if (pwm > 255) pwm = 255;

  analogWrite(LED_PIN, pwm);
}
Tuning
Ønsker du hurtigere respons? Øg ALPHA. Ønsker du mere “følsomhed” i lavt lys? Øg GAMMA en smule.

Bonus · Min/Max-kalibrering

Nogle pots rammer ikke helt 0 og 1023. Her kan du klampe og re-mappe dit brugbare område.

const int POT_PIN = A0;
const int LED_PIN = 9;

int rawMin = 50;   // mål dine faktiske min/max i Serial Monitor
int rawMax = 980;

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

void loop(){
  int raw = analogRead(POT_PIN);
  raw = constrain(raw, rawMin, rawMax);
  int pwm = map(raw, rawMin, rawMax, 0, 255);
  analogWrite(LED_PIN, pwm);

  // valgfrit debug:
  // Serial.print("raw="); Serial.print(raw);
  // Serial.print("\tpwm="); Serial.println(pwm);
}
Sådan finder du værdierne
Lav midlertidigt en skitse der printer analogRead(A0) mens du drejer hele vejen – læs minimum og maksimum og indsæt dem ovenfor.

Fejlfinding

  • LED reagerer ikke: Brug en PWM-pin (~). Tjek at LED sidder i serie med 220–330 Ω.
  • Springer i lys: Brug Program 2 (ALPHA-filter) eller øg modstandslængden på ledningerne mindre.
  • Toppen/bunden nås ikke: Brug min/max-kalibrering.
  • Meget svagt lys generelt: For stor modstand (1 kΩ dæmper). Prøv 220–330 Ω.

Næste skridt

  • Styr tempoet for en breathing-animation med potmeteret.
  • Brug to potmeter-akser (joystick) til at styre to PWM-kanaler (fx D9/D10).
  • Gem favorit-lys i EEPROM og hent ved opstart.