Verwendung von Arduino für gleichzeitige Lichteffekte

7

Ich baue einen Computer für meinen Sohn (mich). Ich versuche, sein Interesse an Computertechnologie zu wecken, daher ist meine Idee, mehrere Gehäuse-Lichteffekte mit einem Mikroprozessor oder Controller zu steuern. Ich ging mit dem Arduino wegen der Einfachheit des Systems über den Pi.

Es gibt mehrere Lichteffekte, die ich gleichzeitig fahren möchte, und hier frage ich mich, ob das Arduino gut geeignet ist, da die Effekte delay () verwenden müssen, und da es sich um Single-Threaded handelt, habe ich Schwierigkeiten, es herauszufinden herausfinden, wie jeder Ausgang unabhängig betrieben werden kann.

Um Ihnen eine Vorstellung davon zu geben, was der Mikrocontroller gleichzeitig fahren muss:

  1. Flimmermuster mit zufälligen Verzögerungswerten für die Beleuchtung des Außengehäuses
  2. Herzschlagmuster für CPU-Kühlblock
  3. Schwarzlicht- / UV-LED-Beleuchtung für Kühlmittelleitungen.
  4. Blinkende LEDs, die auf die Lüfter gerichtet sind, damit sie stationär aussehen.

Der Versuch, alle diese Effekte in einer linearen Schleife mit delay () -Operatoren auszuführen, scheint einfach nicht machbar zu sein.

Muss ich für jeden Effekt eine UNO bekommen? Oder gibt es eine Möglichkeit, diese Ausgänge unabhängig voneinander zu betreiben?

Jonathan Hart
quelle

Antworten:

6

Vermeiden Sie delay () und verwenden Sie bestimmte Zeiten für die nächsten Aktionen und vergleichen Sie sie mit millis (). Stellen Sie für eine zufällige Zeit Folgendes ein:

now=millis();
...
if(nextFlicker < now) {
   toggleFlicker();
   nextFlicker=now+random(10000);
}
if(nextPulse < now) {
   nextPulse=now+ isPulseOn? 100 : 1000 ;
   togglePulse();
}

...

Wenn Sie mehr als die 50-tägige Rollover-Zeit von millis () ausführen, müssen Sie möglicherweise vorsichtig sein, um die Überläufe zu behandeln. Siehe http://playground.arduino.cc/Code/TimingRollover

Untersuchen Sie für die Strobing-LEDs die zeitgesteuerten Ausgänge.

Dave X.
quelle
2

Richten Sie das Muster auf die Zeit, anstatt Verzögerungen zu verwenden. Wenn beispielsweise die aktuelle Zeit in Sekunden ungerade ist, sollte die LED eingeschaltet sein. Wenn es gerade ist, sollte es ausgeschaltet sein. Dies erzeugt einen blinkenden LED-Effekt ohne Verzögerung.

Ein Beispielcode:

long seconds = millis()/1000;
if( (seconds % 2)==0 )// even
  digitalWrite(led, HIGH);
else // odd
  digitalWrite(led, LOW);

Um es beispielsweise schneller blinken zu lassen, wechseln Sie 1000zu einem niedrigeren Wert.

ZB um die LED kürzer zu machen als bei Änderung %2auf zB %4(dh 1 Sekunde an, 3 Sekunden aus)

usw.

Gerben
quelle