Muemmi:
... Denksport Aufgabe ...
Wie Du sicher bemerkt hast, gibt es da zwei recht gleiche Programmblöcke. Das ist nicht schlimm, das Programm sieht außer den paar Leuten hier im Forum ja niemand, nur das Ergebnis.
Solltest Du Lust auf noch etwas mehr Denksport haben, so möchte ich Dir meine Programmversion vorstellen. Sie basiert auf der Idee, gleichartige Programmteile als Funktion zusammenzufassen. Eigentlich ist das ein Standardvorschlag, den ich Dir machen wollte. Wenn ich mir den gestern fertig gewordenen Code aber so ansehe, kommen mir Zweifel, ob dieser Vorschlag ein guter wäre. Nach etwas Grübeln bin ich zu dem Schluß gekommen, Dich das selbst entscheiden zu lassen.
Um eine Kopie der Variablen zu vermeiden, habe ich eine Struktur von Zeigern an die Funktion übergeben. Praktisch ein Paket mit Zetteln, wo die Geschenke versteckt sind. Etwas irritierend sieht (*par) aus, dazu die Erklärung: "Da ... hier der Punktoperator verwendet wird, muss der Referenzzeiger par zwischen zwei Klammern gestellt werden, da der Ausdruck zwischen den Klammern die höhere Bindungskraft hat und zuerst ausgewertet wird." (Quelle)
#include "FastLED.h"
#define NUM_LEDS 2
#define DATA_PIN1 2
#define DATA_PIN2 3
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
#define BRIGHTNESS 96
struct turm
{
uint32_t warteMillis;
uint32_t wartezeit;
uint32_t blinkMillis;
uint32_t blinkzeit;
bool an;
bool flag;
CRGB farben[NUM_LEDS];
CRGB farbeA;
CRGB farbeB;
} p1, p2;
const uint32_t WARTEZEITMIN = 3000, WARTEZEITMAX = 12000, BLINKZEITMIN = 40, BLINKZEITMAX = 500;
uint32_t aktuell;
bool updateLeds;
void setup() {
FastLED.addLeds<LED_TYPE, DATA_PIN1, COLOR_ORDER>(p1.farben, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
FastLED.addLeds<LED_TYPE, DATA_PIN2, COLOR_ORDER>(p2.farben, NUM_LEDS).setCorrection(TypicalLEDStrip); // initializes LED strip
FastLED.setBrightness(BRIGHTNESS);// global brightness
FastLED.show();
randomSeed(analogRead(A3)); // Eingang A3 als Elektronenfänger, da darf nicht angeschlossen sein!
p1.farbeA = CRGB::Orange;
p1.farbeB = CRGB::Red;
p2.farbeA = CRGB::Orange;
p2.farbeB = CRGB::Yellow;
}
void anzeige(struct turm *par) {
if (aktuell - (*par).warteMillis >= (*par).wartezeit) {
(*par).warteMillis = aktuell;
(*par).wartezeit = random(WARTEZEITMIN, WARTEZEITMAX);
(*par).an = !(*par).an;
if (!(*par).an) {
(*par).farben[0] = CRGB::Black;
(*par).farben[1] = CRGB::Black;
updateLeds = true;
}
}
if ((*par).an && (aktuell - (*par).blinkMillis >= (*par).blinkzeit)) {
(*par).blinkMillis = aktuell;
(*par).blinkzeit = random(BLINKZEITMIN, BLINKZEITMAX);
if ((*par).flag) {
(*par).farben[0] = (*par).farbeA;
(*par).farben[1] = (*par).farbeB;
} else {
(*par).farben[0] = (*par).farbeB;
(*par).farben[1] = (*par).farbeA;
}
(*par).flag = !(*par).flag;
updateLeds = true;
}
}
void loop() {
aktuell = millis();
anzeige(&p1);
anzeige(&p2);
if (updateLeds) {
FastLED.show();
updateLeds = false;
}
}
Zeiten mußt Du für Dich anpassen. Viel Spaß beim Denksport!
@Alle: Fehler bitte melden! Wäre blöd, wenn ein Zeiger durch den Speicher galoppiert.