LED per MILLIS blinken lassen. AN und AUS Zeit soll unterschiedlich sein

Nabend,

ich bin neu im Arduino-Universum.

Ich habe eine Schaltung zur Übung gesteckt. Es sollen zwei LEDs unabhängig voneinander blinken.
Mit "millis" habe ich das auch hinbekommen.

Allerdings fällt mir auf, das die LED immer genauso lang AN wie AUS ist.
Ich möchte aber letztendlich eine LED blinken lassen (also AN = AUS)
und eine soll blitzen (also kurz AN ... lange AUS)

Da komme ich irgendwie nicht weiter ...

Cappy

cappy0815:

Ich möchte aber letztendlich eine LED blinken lassen (also AN = AUS)
und eine soll blitzen (also kurz AN … lange AUS)

Die Schaltung hast Du ja scheinbar richtig hinbekommen. Was Du möchtest, betrifft den Sketch bzw. das Programm. Zeig am besten mal, was Du bisher hast. Fasse es in „Code-Tags“, damit es les- und scrollbar ist (im Editor ganz linkes Icon).

Gruß

Gregor

Hier wurde ein ähnliches Problem auch mit millis gelöst.

Flag ob LED an oder aus ist und das entsprechende Intervall nehmen.
Grüße Uwe

Hallo,
das ihr da nicht selbst nach suchen könnt…

// each "event" (LED) gets their own tracking variable
unsigned long previousMillisTonLED=0;
unsigned long previousMillisPauseLED=0;

// different intervals for each LED
int intervalTonLED = 500;
int intervalPauseLED = 1000;

// each LED gets a state varaible
boolean PauseLEDstate = false;     // the LED will turn ON in the first iteration of loop()
boolean TonLEDstate = false;     // need to seed the light to be OFF

void setup() {
   pinMode(13, OUTPUT);
   pinMode(12, OUTPUT);
}
void loop() {
   // get current time stamp
   // only need one for both if-statements
   unsigned long currentMillis = millis();

   // time to toggle LED on Pin 12?
   if ((unsigned long)(currentMillis - previousMillisTonLED) >= intervalTonLED) {
      TonLEDstate = !TonLEDstate;
      digitalWrite(12, TonLEDstate);
      // save current time to pin 12's previousMillis
      previousMillisTonLED = currentMillis;
   }

// time to toggle LED on Pin 13?
  if ((unsigned long)(currentMillis - previousMillisPauseLED) >= intervalPauseLED) {
      PauseLEDstate = !PauseLEDstate;
      digitalWrite(13, PauseLEDstate);
      // save current time to pin 12's previousMillis
      previousMillisPauseLED = currentMillis;
  }
}

Gruß und Spaß
Andreas

Mahlzeit,

ich habe Gestern noch etwas getüftel, gelesen, geklaut und umgebaut ...

Das Ergebnis ist dann das hier:

const int ledPin = 8;

int ledState = LOW;

unsigned long previousMillis = 0;

const long intervalAN = 50;
const long intervalAUS = 3000;

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

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= intervalAUS) {
    previousMillis = currentMillis;
    ledState = HIGH;
    digitalWrite(ledPin, ledState);
    } else if (currentMillis - previousMillis >= intervalAN) {
    //previousMillis = currentMillis;
    ledState = LOW;
    }
    digitalWrite(ledPin, ledState);
    
}

Das funktioniert soweit auch erstmal.
Jetzt möchte ich gerne 2 LEDs unabhängig voneinander blinken lassen.

Ich dachte mir, dass ich die if-Schleife irgendwie in eine Funktion packe, die dann für beide LEDs per Parameter die Millis abfragt ...

Macht das sinn?

Cappy

… was ich noch nicht so ganz schnalle.

Ich würde meine LED-Ausgänge einfach ledPin1 und ledPin2 nennen.

(Mir fällt gerade auf, dass bei zwei Ausgängen ja auch einfach beide im Programm nacheinander behandelt werden können … Naja … aber auch Prinzip, um es zuverstehen) …

Also würde ich es quasi so tun …

for (int i = 0; i < 2; i = i + x){
      if { ... dann ledState[i] = HIGH ...
      digitalWrite(ledPin[i], ledState);
      if (i == 2) x = 0;
   }

… das soll jeweils der hochgezählte Wert sein.
Ist das vom Ansatz her einigermaßen sinnig?
Cappy

cappy0815:
Ich würde meine LED-Ausgänge einfach ledPin1 und ledPin2 nennen.

Du meinst ledPin[0] und ledPin[1], das macht Sinn :slight_smile:

Ich dachte mir, dass ich die if-Schleife irgendwie in eine Funktion packe, die dann für beide LEDs per Parameter die Millis abfragt …

Auch eine nette Alternative zur Schleife über beide Led.

Hat den kleinen Nachteil, dass die Funktion jedesmal ihr eigenes previousMillis braucht und das auch noch ändern muss.
Da kannst du schön lernen, wie man eine class schreibt.

Wenn dich das erstmal erschreckt: Gib previousMillis als Parameter mit (als Referenz, weil es geändert wird)
z.B. so

boolean blink(unsigned int an, unsigned int zyklus, unsigned long & prevtime) {
   if (millis() - prevtime >= zyklus) {
       prevtime += zyklus;
   }
   if (millis() - prevtime < an) return true;
   else return false;
} 

unsigned long prevtime1, prevtime2;
void loop() {
  digitlaWrite (led1Pin, blink(20, 2000, prevtime1)); // ein Blitz alle 2 sec
  digitlaWrite (led2Pin, blink(100, 200, prevtime2));  // 50:50 mit 5 Hz
}

setup() und die Pin-Definitionen fehlen

Falls Dich das mit der Klasse verwirrt: Ich habe hier ein Beispiel für eine sehr einfache Klasse ins Netz gekippt. Vielleicht hilft das.

Gruß

Gregor

Ich habe hier ein Beispiel für eine sehr einfache Klasse

Es geht auch einfacher, und braucht auch keine Extra-Dateien

class Blink {
private:
  unsigned long prevtime;
  unsigned int zyklus;
  unsigned int an;
public:
   Blink(unsigned int _an, unsigned int _zyklus) { zyklus=_zyklus; an = _an;}
   boolean currentState () { 
     // sollte häufig aufgerufen werden, damit der jeweils aktuelle Zustand zurückgeliefert wird 
     if (millis() - prevtime >= zyklus) {
       prevtime = millis();
     }
     if (millis() - prevtime < an) return true;
     else return false;
   }  
};

Blink blitz(20,2000); // ein Blitz alle 2 sec
Blink schnell(100,200); // 50:50 mit 5 Hz

void loop() {
   digitalWrite(led1Pin, blitz.currentState() );
   digitalWrite(led2Pin, schnell.currentState() );
}

Hi

michael_x:
Es geht auch einfacher, und braucht auch keine Extra-Dateien

Musste die LED-Pins noch ‘einarbeiten’, dann lässt sich das Programm zu 960 Byte kompilieren.
Leider weigert sich gerade meine USB-Schnittstelle, dem UNO was Anderes beizubringen …

class Blink {
private:
  unsigned long prevtime;
  unsigned int zyklus;
  unsigned int an;
public:
   Blink(unsigned int _an, unsigned int _zyklus) { zyklus=_zyklus; an = _an;}
   boolean currentState () {
     // sollte häufig aufgerufen werden, damit der jeweils aktuelle Zustand zurückgeliefert wird
     if (millis() - prevtime >= zyklus) {
       prevtime = millis();
     }
     if (millis() - prevtime < an) return true;
     else return false;
   } 
};

  
  Blink blitz(20,2000); // ein Blitz alle 2 sec
  Blink schnell(100,200); // 50:50 mit 5 Hz

void setup(){
  #define led1Pin 2
  #define led2Pin 13
}

void loop() {
   digitalWrite(led1Pin, blitz.currentState() );
   digitalWrite(led2Pin, schnell.currentState() );
}

MfG und Danke für dieses Snippet :slight_smile:

void setup(){
  #define led1Pin 2
  #define led2Pin 13
}

#define Makros haben keinen Scope und sind immer immer global. Egal wo sie stehen. Und werden vor dem Compilieren abgearbeitet. Zur Laufzeit wird da nichts gemacht.
Die in setup() zu schreiben verwirrt da eher nur

Hallo,
habe mir den Sketch (oder war es das Sketch?) geschnappt, um zu verstehen…

Ergänzt um die Leds, Pin 10 und Pin 8.
hier der Sketch, daran anschliessend die Fehlermeldung.
die Fehlermeldung kann ich nicht aufdröseln, resp. versteh ich nicht.

byte led1Pin=10;
byte led2Pin= 8;

class Blink {
private: 
  unsigned long prevtime;
  unsigned int zyklus;
  unsigned int an;
public:
   Blink(unsigned int _an, unsigned int _zyklus) { zyklus=_zyklus; an = _an;}
   boolean currentState () {
     // sollte häufig aufgerufen werden, damit der jeweils aktuelle Zustand zurückgeliefert wird
     if (millis() - prevtime >= zyklus) {
       prevtime = millis();
     }
     if (millis() - prevtime < an) return true;
     else return false;
   } 
};

Blink blitz(20,2000); // ein Blitz alle 2 sec
Blink schnell(100,200); // 50:50 mit 5 Hz

void loop() {
   digitalWrite(led1Pin, blitz.currentState() );
   digitalWrite(led2Pin, schnell.currentState() );
}

Fehlermeldung:

C:\Users\JK\AppData\Local\Temp\cciUVOhx.ltrans0.ltrans.o: In function `main’:

C:\Users\JK\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.20\cores\arduino/main.cpp:43: undefined reference to `setup’

collect2.exe: error: ld returned 1 exit status

exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.

Was habe ich übersehen, vergessen oder fehlt mir?
Danke schon jetzt.
Flötzinger

kann es sein, das du das Setup vergessen hast.
Mach mal das

void setup()
{
  pinMode ( led1Pin,OUTPUT);
  pinMode ( led2Pin,OUTPUT);

vor void loop()

ahhrrggghhhhh. Vollhorst
Danke Ardubu.
Wer lesen kann...und nachdenken...
läuft.

…noche eine Frage (evtl. auch mehr):
die Codezeile :
Blink(unsigned int _an, unsigned int _zyklus)
läßt in dieser Zeile:
Blink blitz(20,1000);

für 20millies ein, für 1000 millies Pause passieren.
richtig?

Noch ne Variante:

if(millis()%(500+2000)<500)
{
tu dies
}
else
{
tu das
}

Hi

Nein - wenn ich den Code recht verstehe, ist die zweite Zahl die Perioden-Dauer.
Jupp, durch das Beispiel vom Michael_x

Michael_x:
Blink blitz(20,2000); // ein Blitz alle 2 sec
Blink schnell(100,200); // 50:50 mit 5 Hz

erzeugt die 2.te Zeile 100ms EIN und 100ms AUS (durch die angegebenen 50:50), wobei sich die AUS-Zeit durch Periodendauer minus AN-Zeit ergibt.

MfG

PS: Das Zitat dem falschen Progger zugeordnet - korrigiert

PPS: Die Variante von Klaus_ww gefällt mir irgendwie, hat was.

Ahh, Danke postmaster-ino.
Sehe jetzt auch, dass viele Wege ( Klaus ww sein trick) zum erfolg führen.
Nun, experimentiert, 3 LEDs blinken/ blitzen nun unterschiedlich.
Klasse.
THX.