Arduino Led dimmen

Hoi,

Ik wil graag een looplicht maken voor op voertuigen(signalisatie).
Toevallig heb ik COB led's gevonden via aliexpress.
(
https://nl.aliexpress.com/item/Big-Promotion-High-Power-10W-COB-LED-St…
)

Ik stuur deze led's op 12V met behulp van mosfet's via een arduino.
Ik heb zelf een soort "PWM"-sturing gemaakt waardoor ik de leds min of meer kan dimmen, dit lijkt allemaal goed te werken maar nu wil ik meerdere programma's maken voor mijn looplicht en hier gaat het mis.
Met 1 drukknop zou ik een integer willen laten optellen die zo de verschillende casen in mijn programma stuurt. Het probleem is dat wanneer mijn sturing bezig is aan een programma en ik wil een ander programma selecteren hij deze puls meestal overslaat. Waarschijnlijk zal ik dit probleem niet kunnen wegkrijgen zolang ik de delay functie blijf gebruiken. Ik vind hier niet echt een oplossing voor waarbij ik mijn eigen PWM-modulatie kan behouden. Het gebruik van een Led driver zou ook een oplossing zijn maar hier heb ik geen enkele ervaring mee. Ik hoop dat ik hier wat extra input kan vergaren, alvast bedankt!

c code:


#include "Arduino.h"






int programma = 0; // case number
int knopstatus = LOW; // button status
int vorigeknopstatus = LOW; // last button status
unsigned int aantijd = 9; // on time PWM pulse
unsigned int uittijd = 1; // off time PWM pulse
long knipper = 0; // PWM counter
long knippering = 5000; // max PWM
int schakelaar = 13; // button pin

void setup(/* arguments */) {
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(13, INPUT);
}
void loop(/* arguments */) {
  knopstatus = digitalRead(schakelaar);

while ((knopstatus != vorigeknopstatus) && (knopstatus == HIGH)) {
programma++;
delay(200);
vorigeknopstatus = knopstatus;

}



 /* code */


switch (programma) {

  case 1:
  {

  do {
    digitalWrite(2, HIGH);
    delayMicroseconds(aantijd);
    digitalWrite(2, LOW);
    delayMicroseconds(uittijd);
    knipper++;
  } while(knipper < knippering);
  delay(100);
  knipper = 0;

  do {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    delayMicroseconds(aantijd);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    delayMicroseconds(uittijd);
    knipper++;
  } while(knipper < knippering);
  delay(50);
  knipper = 0;

  do {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    delayMicroseconds(aantijd);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    delayMicroseconds(uittijd);
    knipper++;
  } while(knipper < knippering);
  delay(100);
  knipper = 0;

  do {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    delayMicroseconds(aantijd);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    delayMicroseconds(uittijd);
    knipper++;
  } while(knipper < knippering);
  delay(100);
  knipper = 0;

  do {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
    digitalWrite(6, HIGH);
    delayMicroseconds(aantijd);
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);

    delayMicroseconds(uittijd);
    knipper++;
  } while(knipper < knippering);
  delay(700);
  knipper = 0;
}
  break;

  case 2:
{
  digitalWrite(2, HIGH);
  digitalWrite(3, HIGH);
  digitalWrite(4, HIGH);
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  delay(200);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  delay(200);
}
  break;

  case 3:
{
  programma = 1;
}
  default:
  {
    programma = 1;
  }
  break;

}




}

je kan op de arduino site het blink without delay voorbeeld zoeken.
hierin staat uitgelegd hoe je geen knoppen meer mist.

je kan beter de hardware PWM gebruiken.
http://circuitdigest.com/sites/default/files/inlineimages/Arduino-PWM-Pins.jpg

als je deze pins gebruikt, kun je met analogwrite(pin, waarde) de pwm laten doen, compleet zonder delay, zodat je programma doorloopt.

GMT+1

bedankt voor je input! ik ben me er inderdaad bewust van dat ik de blink without delay manier zal moeten gebruiken. ik zal dan ook een 12V driver nodig hebben voor mijn cob led's. heeft hier iemand misschien een tip voor. Ik vond deze bij farnell maar zijn wat prijzig...
http://uk.farnell.com/recom-power/rcd-24-0-30/led-driver-dc-dc-cc-0-3a…

ik zal dan ook een 12V driver nodig hebben voor mijn cob led's

het maakt toch niet uit of je software of hardware PWM gebruikt voor je LEDS?

GMT+1