INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Blinklichter asynchron
17.01.2020, 10:30
Beitrag #1
Blinklichter asynchron
Hallo,

ich möchte 3 Blinklichter mit dem Nono steuern.
An sich kein Problem.

Aber ich möchte die Blinkintervalle nicht sychron haben.
Jedes einzelen Blinklicht soll mi einer eigenen Frequenz laufen.
Z.B. 1x/s und 1,2x/s und 1,5x/s

Ich hatte das bis jetzt hardwaremäßig mit 3 NE555 realisiert.

Nchdem ich noch "Anfänger" in der Arduino Welt bin,
weiß ich nicht wie man das da lösen kann.

Für Ratschläge wäre ich deshalb dankbar.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2020, 10:38
Beitrag #2
RE: Blinklichter asynchron
Hallo berny46,
(17.01.2020 10:30)berny46 schrieb:  Hallo,

ich möchte 3 Blinklichter mit dem Nono steuern.
An sich kein Problem.

Aber ich möchte die Blinkintervalle nicht sychron haben.
Jedes einzelen Blinklicht soll mi einer eigenen Frequenz laufen.
Z.B. 1x/s und 1,2x/s und 1,5x/s

Ich hatte das bis jetzt hardwaremäßig mit 3 NE555 realisiert.

Nchdem ich noch "Anfänger" in der Arduino Welt bin,
weiß ich nicht wie man das da lösen kann.

Für Ratschläge wäre ich deshalb dankbar.
Da würde ich Dir die Library MobaTools von unserem Mitglied MicroBahner empfehlen. Mit dem darin enthaltenen MOBaTimer (EggTimer) lässt sich das sehr elegant lösen. Es ist dort auch ein schönes Beispiel vorhanden, das in Deine Richtung geht.

Grüße
Roland
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2020, 10:50 (Dieser Beitrag wurde zuletzt bearbeitet: 17.01.2020 10:55 von MicroBahner.)
Beitrag #3
RE: Blinklichter asynchron
Schau dir in der IDE das Beispiel BlinkWithoutDelay an.
( Beispiele->02.Digital->BlibkWithoutDelay )
Da wird gezeigt, wie man eine Led ohne die Delay-Funktion blinken lassen kann.
Das kann man dann einfach auf mehrere Led's erweitern. Entweder mit Array und Index ( ok, am Anfang vielleicht noch nicht .. ). Oder Du schreibst die Anweisungen zum Blinkenlassen einfach mehrfach hintereinander. Du brauchst dann nur für jede Led getrennte Variable für den 'ledPin', 'previousMillis' und 'intervall'.

Edit: Ok, mit meinen MobaTools geht's auch Wink - da ist auch ein Beipiel für 2 Led's mit dabei.
( Beispiele->MobaTools->Zeitgeber_01 )
Die Lib musst Du aber vorher installieren ( Bibliotheksmanager aufrufen mit Strg-Umschalt-I ) und dann nach 'MobaTools' suchen )

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2020, 14:44
Beitrag #4
RE: Blinklichter asynchron
Hallo Berny46,
ich habe dir mal eine kleine Demo dazu geschrieben...

Viel Spaß
Shrimps
Code:
// Hardware NANO V3


boolean led1, led2, led3;


boolean Timer1(long interval) {
  static int oldValue;
  int value = millis() % interval;
  boolean q = value < oldValue;
  oldValue = value;
  return q;
}
boolean Timer2(long interval) {
  static int oldValue;
  int value = millis() % interval;
  boolean q = value < oldValue;
  oldValue = value;
  return q;
}
boolean Timer3(long interval) {
  static int oldValue;
  int value = millis() % interval;
  boolean q = value < oldValue;
  oldValue = value;
  return q;
}


void setup() {
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
}

void loop() {
  if (Timer1(1000))  led1 = ! led1;
  if (Timer2(1200))  led2 = ! led2;
  if (Timer3(1500))  led3 = ! led3;

  digitalWrite(7, led1 == true ? HIGH : LOW);
  digitalWrite(8, led2 == true ? HIGH : LOW);
  digitalWrite(9, led3 == true ? HIGH : LOW);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2020, 16:52
Beitrag #5
RE: Blinklichter asynchron
Hallo shrimps,

das ist ganau das was ich suche.
Funktioniert.

DANKE !

Da muß ich mich aber schon noch etwas einarbeiten, Vieles ist mirda noch unbekannt.

Wäre es noch möglich für die LED die Ein- und Auszeit verschieden einstellen zu können.
Noch besser wäre es, wenn man dafür eine Tabelle vorgeben könnte.

z.B.
10 ein, 40 aus,10 ein , 40 aus, 10 ein ,100 aus, 0 ein, 100 aus, 0 ein, 100 aus - dann von vorne ...
oder
200 ein, 100 aus, 0 ein , 100 aus, 0 ein ,100 aus, 0 ein, 100 aus, 0 ein, 100 aus - dann von vorne ...
Vorgabe also
200,100,0,100,0,100,0,100,0,100

Ich möchte damit eine Flugzeugbeleuchtung ansteuern.

Bis ich soweit bin wird es doch noch etwas dauern ...

Möglich ?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.01.2020, 17:20 (Dieser Beitrag wurde zuletzt bearbeitet: 17.01.2020 19:49 von Tommy56.)
Beitrag #6
RE: Blinklichter asynchron
Du musst nicht nur die Zeiten, sondern auch den Pin mitgeben.
Das könnte so aussehen:

Code:
struct LED {
  public:
    // Konstruktor: ledPin, anZeit (ms), ausZeit(ms)
    LED(const byte ledPin, const uint32_t anTime, const uint32_t ausTime):
        ledPin(ledPin), anTime(anTime), ausTime(ausTime) {}      

    // Pin setzen
    void init() {
      pinMode(ledPin,OUTPUT);
    }
    
    // LED schalten
    void run() {
      uint32_t aktMillis = millis();
      uint32_t intervall;
      if (status) intervall = anTime;
      else intervall = ausTime;
      
      if (aktMillis - lastMillis >= intervall) {
        lastMillis = aktMillis;
        status = !status;
        digitalWrite(ledPin,status);
        // Serial.print(ledPin);
        // Serial.print(" ");
        // Serial.println(status);
      }    
    }
    
    private:
      const byte ledPin;
      const uint32_t anTime;
      const uint32_t ausTime;
      uint32_t lastMillis = 0;
      bool status = false;
};

// Die LEDs anlegen
struct LED leds[] = {  // ledPin, anZeit, ausZeit in ms
                {7, 1000, 1000},
                {8, 500, 2000},
                {9, 2000, 1000}
};

const byte anzahlLED = sizeof(leds)/sizeof(leds[0]);
void setup() {
  // Serial.begin(115200);
  // Serial.println("Start");
  
  // LEDs initialisieren
  for(byte i=0; i<anzahlLED;i++) leds[i].init();
}

void loop() {
  // LEDs steuern
  for(byte i=0; i<anzahlLED;i++) leds[i].run();
}

Gruß Tommy

Edit: Evtl. könnte man noch den Einschaltzustand (aus/an) mit vorgeben.
Edit2: Wenn Du damit Flugzeugbeleuchtungen (ich hoffe Modell) steuern willst, wird das wohl noch nicht ausreichen. Da wirst Du die BlinkLED auch aus- und wieder einschalten wollen. Da müsste noch etwas spezifiziert werden.

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2020, 09:34 (Dieser Beitrag wurde zuletzt bearbeitet: 18.01.2020 09:46 von MicroBahner.)
Beitrag #7
RE: Blinklichter asynchron
Hallo,
das geht aber auch deutlich einfacher - und auch mit einer erweiterbaren Tabelle :
(Klassen und 'struct' habe ich mir jetzt mal aufgrund des 'Anfängerstatus' noch gespart Wink )
Code:
//Blinkmuster
#include <MobaTools.h>
const byte ledPins[] = {  7,   8,   9};
const int anZeit[]  =  {100, 800, 500};   // in ms
const int ausZeit[] =  {600, 400, 500};   //in ms
const byte ledAnzahl = sizeof(ledPins);   // ledPins muss typ byte sein

MoToTimer ledTimer[ledAnzahl];

void setup() {
  // put your setup code here, to run once:
  for ( auto ledIx: ledPins ) {
    pinMode( ledIx, OUTPUT );
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  for ( byte i=0; i<ledAnzahl; i++ ) {
    // Schleife über alle Led's
    if ( !ledTimer[i].running() ) {
      // Zeit abgelaufen
      if ( digitalRead( ledPins[i] ) ) {
        // Led war eingeschaltet, ausschalten und Timer auf AUS-Zeit setzen
        digitalWrite( ledPins[i], LOW );
        ledTimer[i].setTime( ausZeit[i] );
      } else {
        // Led war ausgeschaltet, einschalten und Timer auf EIN-Zeit setzen
        digitalWrite( ledPins[i], HIGH );
        ledTimer[i].setTime( anZeit[i] );
      }
    }
  }
}
Wenn Du mehr Led's schalten willst, oder andere Blinkmuster, musst Du nur die 3 Arrays am Anfang anpassen. Sie müssen nur alle gleich viel Elemente enthalten.

Das Ein- und Ausschalten musst Du dann noch je nach Bedarf hinzufügen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.01.2020, 11:13 (Dieser Beitrag wurde zuletzt bearbeitet: 18.01.2020 11:14 von Tommy56.)
Beitrag #8
RE: Blinklichter asynchron
Scheinbar einfacher, weil Du das Zeitmanagement in die MoBaTools ausgelagert hast. Wink

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  OneWire "asynchron"? da_user 5 2.539 15.10.2018 11:33
Letzter Beitrag: Sepp

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste