2 LED's mit unterschiedlicher Frequrenz blinken lassen?

Hallo Ihr, ich bin am überlegen wie ich 2 LED's mit unterschiedlicher Frequenz blinken lassen kann? Die LEDs sollen mit einer Frequenz von 1Hz und 1,2Hz blinken. Wie bewerkstellige ich das? :cold_sweat: Hätte gerne nur einen Anstubser, keinen fertigen Code. :) Dankeschön.

hi,

beispiel blinkwithoutdelay.

gruß stefan

true_Nic: ich bin am überlegen wie ich 2 LED's mit unterschiedlicher Frequenz blinken lassen kann? Die LEDs sollen mit einer Frequenz von 1Hz und 1,2Hz blinken. Wie bewerkstellige ich das? :cold_sweat: Hätte gerne nur einen Anstubser, keinen fertigen Code. :)

Wie Du das bewerkstelligen kannst, da gibt es viele Möglichkeiten.

Ich weiß nur, wie ich es machen würde. Da Du keinen fertigen Code möchtest, poste ich dann mal nur mal eine Datenstruktur, wie ich es für praktisch beliebig viele LEDs machen würde, die jede in ihrem eigenen Takt blinken soll:

// zu verwendende LED-Pins
byte leds[]   ={   8,    9,   11,   12,   13};
// LED Blinktakt in Millisekunden für diese Pins
long ledtakt[]={1500, 2200, 3333, 5000, 7100};
// Variablen zum Merken von millis()-Zeiten beim Schalten/Blinken
long ledtime[sizeof(leds)];

Und dann mache ich mir eine Funktion, die abhängig vom Stand des millis() Timers jede LED entweder ein- oder ausschaltet.

Hier einmal der Code den ich geschrieben habe. Glücklicherweise funktionierte er auf Anhieb. :)

void Blinken3(int t_an, int t_aus, int t_pause)
{
  unsigned long currentMillis = millis();
  
  switch(ledState1)
  {
    case 0:
    if(currentMillis - previousMillis1 > t_aus)
    {digitalWrite(led1,LOW);
    ledState1 = 1;
    previousMillis1 = currentMillis;}
    break;
    case 1:
    if(currentMillis - previousMillis1 > t_an)
    {digitalWrite(led1,HIGH);
    ledState1 = 0;
    previousMillis1 = currentMillis;}
    break;
  }
  switch(ledState2)
  {
    case 0:
    if(currentMillis - previousMillis2 > t_aus + t_dif)
    {digitalWrite(led2,LOW);
    ledState2 = 1;
    previousMillis2 = currentMillis;}
    break;
    case 1:
    if(currentMillis - previousMillis2 > t_an)
    {digitalWrite(led2,HIGH);
    ledState2 = 0;
    previousMillis2 = currentMillis;}
    break;
  }
   
}

kreative Kritik:

Ich finde switch-case für diesen Fall nicht angebracht. Ein if würde es besser machen.

statt:

switch(ledState2)
  {
    case 0:
    if(currentMillis - previousMillis2 > t_aus + t_dif)
    {digitalWrite(led2,LOW);
    ledState2 = 1;
    previousMillis2 = currentMillis;}
    break;
    case 1:
    if(currentMillis - previousMillis2 > t_an)
    {digitalWrite(led2,HIGH);
    ledState2 = 0;
    previousMillis2 = currentMillis;}
    break;
  }

einfach:

if(ledState2)
  {
    if(currentMillis - previousMillis2 > t_aus + t_dif)
    {
    digitalWrite(led2,LOW);
    ledState2 = 1;
    previousMillis2 = currentMillis;
    }
  }
else  
  {
    if(currentMillis - previousMillis2 > t_an)
    {
    digitalWrite(led2,HIGH);
    ledState2 = 0;
    previousMillis2 = currentMillis;
    }    
  }

Grüße Uwe

Guckst Du hier http://blog.blinkenlight.net/2013/03/01/lighthouses/ bzw. hier: http://blog.blinkenlight.net/2013/03/01/lighthouses/.