Hallo,
an meinem Nano ist ein APA102C Lichtband mit 64 Lichtpunkten (RGB) angeschlossen. Dafür habe ich ein kleines Programm als Anregung geschrieben. Wird ein Taster (Ersatz für IR-Sensor) gedrückt, werden die zugehörigen 16 Lichtpunkte nacheinander grün, wird er losgelassen, werden sie nacheinander rot.
/* APA102 Anfang */
#include "FastLED.h"
FASTLED_USING_NAMESPACE
#define LED_TYPE APA102
#define COLOR_ORDER BGR
#define BRIGHTNESS 30
#define NUM_LEDS 320
CRGB leds[NUM_LEDS];
/* APA102 Ende */
#define ZEIT1 50
#define ZEIT2 50
const byte anzBecher = 20, anzLedsproRing = 16;
const byte IRsensorPin[anzBecher] = {2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; // Der Nano hat nicht genügend Eingänge.
byte led[anzBecher];
byte becher;
byte status[anzBecher];
bool aktIRsensor[anzBecher];
bool altIRsensor[anzBecher];
unsigned long aktMillis, altMillis[anzBecher], intervall[anzBecher];
enum {OHNEBECHER, ANIMATION1, MITBECHER, ANIMATION2};
void setup() {
Serial.begin(9600);
for (becher = 0; becher < anzBecher; becher++) {
pinMode(IRsensorPin[becher], INPUT_PULLUP);
aktIRsensor[becher] = digitalRead(IRsensorPin[becher]);
altIRsensor[becher] = aktIRsensor[becher];
}
becher = 0;
/* APA102 Anfang */
FastLED.addLeds<LED_TYPE, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
LEDS.showColor(CRGB(0, 0, 0));
/* APA102 Ende */
}
void loop() {
aktMillis = millis();
altIRsensor[becher] = aktIRsensor[becher];
aktIRsensor[becher] = digitalRead(IRsensorPin[becher]);
if (aktMillis - altMillis[becher] >= intervall[becher]) {
switch (status[becher]) {
case OHNEBECHER:
if (altIRsensor[becher] && !aktIRsensor[becher]) {
delay(30); // einfaches Entprellen
intervall[becher] = ZEIT1;
led[becher] = 0;
status[becher] = ANIMATION1;
}
break;
case ANIMATION1:
altMillis[becher] = aktMillis;
leds[becher * anzLedsproRing + led[becher]] = CRGB::Green;
FastLED.show();
led[becher]++;
if (led[becher] >= anzLedsproRing) {
status[becher] = MITBECHER;
}
break;
case MITBECHER:
if (!altIRsensor[becher] && aktIRsensor[becher]) {
delay(30); // einfaches Entprellen
intervall[becher] = ZEIT2;
led[becher] = 0;
status[becher] = ANIMATION2;
}
break;
case ANIMATION2:
altMillis[becher] = aktMillis;
leds[becher * anzLedsproRing + led[becher]] = CRGB::Red;
FastLED.show();
led[becher]++;
if (led[becher] >= anzLedsproRing) {
status[becher] = OHNEBECHER;
}
break;
}
}
becher++;
becher = becher % anzBecher;
}
Meldung der IDE:
Der Sketch verwendet 5.856 Bytes (19%) des Programmspeicherplatzes. Das Maximum sind 30.720 Bytes.
Globale Variablen verwenden 1.480 Bytes (72%) des dynamischen Speichers, 568 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.
Sport mit Bier aus Plastikbecher, in dem vorher ein PingPong-Ball schwammm 
Aber jeder wie er mag, ich freue mich auf das nächste Grillen mit Freunden und einem Bier aus einer Glastulpe 