Kürzung des Neopixel-Routinecodes
Ich habe an einem Füllstandsmesser mit einem Neopixel-Streifen (WS2812) gearbeitet.
Der Code ist sehr einfach: Lesen eines Potentiometers, Zuordnen des Eingangs und Anzeigen des Ausgangs im LED-Streifen.
So weit, ist es gut. Der Code, den ich unten einfüge, funktioniert gut, ist aber offensichtlich hässlich und wiederholt sich. Da meine Programmierkenntnisse sehr schwach sind, frage ich mich, ob es eine Möglichkeit gibt, den Code zu kürzen. Bitte beachten Sie, dass die sieben LEDs unterschiedliche Farben haben. Eigentlich ist dies der verwirrende Punkt für mich, eine Schleife zu erstellen. Irgendeine Idee, Leute?
Ja, ich weiß auch, dass die Verwendung so vieler Verzögerungen nicht die eleganteste Lösung ist, aber die Geräteleistung nicht beeinträchtigt und das Erscheinen der Balkenführung sehr schön ist.
void leveller () {
int millivolts;
int level;
millivolts = analogRead(A3);
level = map(millivolts, 0, 1024, 0, 7);
if (level <=0){
strip.clear();
strip.setPixelColor(0, 128, 0, 0);
strip.show ();
}
else if ((level > 0)&&(level<1)) {
strip.clear();
strip.setPixelColor(0, 128, 0, 0);
delay(30);
strip.show ();
strip.setPixelColor(1, 128, 32, 0);
delay(30);
strip.show ();
}
else if ((level>= 1)&&(level<2)) {
strip.clear();
strip.setPixelColor(0, 128, 0, 0);
delay(30);
strip.show ();
strip.setPixelColor(1, 128, 32, 0);
delay(30);
strip.show ();
strip.setPixelColor(2, 128, 64, 0);
delay(30);
strip.show ();
}
else if ((level>= 2)&&(level<3)) {
strip.clear();
strip.setPixelColor(0, 128, 0, 0);
delay(30);
strip.show ();
strip.setPixelColor(1, 128, 32, 0);
delay(30);
strip.show ();
strip.setPixelColor(2, 128, 64, 0);
delay(30);
strip.show ();
strip.setPixelColor(3, 0, 128, 0);
delay(30);
strip.show ();
}
else if ((level>= 3)&&(level<4)) {
strip.clear();
strip.setPixelColor(0, 128, 0, 0);
delay(30);
strip.show ();
strip.setPixelColor(1, 128, 32, 0);
delay(30);
strip.show ();
strip.setPixelColor(2, 128, 64, 0);
delay(30);
strip.show ();
strip.setPixelColor(3, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(4, 0, 128, 0);
delay(30);
strip.show ();
}
else if ((level>= 4)&&(level<5)) {
strip.clear();
strip.setPixelColor(0, 128, 0, 0);
delay(30);
strip.show ();
strip.setPixelColor(1, 128, 32, 0);
delay(30);
strip.show ();
strip.setPixelColor(2, 128, 64, 0);
delay(30);
strip.show ();
strip.setPixelColor(3, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(4, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(5, 0, 128, 0);
delay(30);
strip.show ();
}
else if ((level>= 5)&&(level<6)) {
strip.clear();
strip.setPixelColor(0, 128, 0, 0);
delay(30);
strip.show ();
strip.setPixelColor(1, 128, 32, 0);
delay(30);
strip.show ();
strip.setPixelColor(2, 128, 64, 0);
delay(30);
strip.show ();
strip.setPixelColor(3, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(4, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(5, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(6, 0, 128, 32);
delay(30);
strip.show ();
}
else if (level>= 6) {
strip.clear();
strip.setPixelColor(0, 128, 0, 0);
delay(30);
strip.show ();
strip.setPixelColor(1, 128, 32, 0);
delay(30);
strip.show ();
strip.setPixelColor(2, 128, 64, 0);
delay(30);
strip.show ();
strip.setPixelColor(3, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(4, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(5, 0, 128, 0);
delay(30);
strip.show ();
strip.setPixelColor(6, 0, 128, 32);
delay(30);
strip.show ();
strip.setPixelColor(7, 0, 128, 64);
delay(30);
strip.show ();
}
}
Antworten
Zunächst eine kleine Bemerkung:
if ((level > 0)&&(level<1))
level ist eine Ganzzahl, und es gibt keine Ganzzahl, die sowohl streng größer als Null als auch kleiner als Eins ist.
if ((level>= 1)&&(level<2))
Es gibt nur eine Ganzzahl, die diesen Zustand überprüft. Es wäre dann klarer, nur zu schreiben
if (level == 1)
Nun zu Ihrer eigentlichen Frage: Ein Trick, der häufig dazu dient, sich wiederholenden Code zu verkürzen, besteht darin, Code in Daten umzuwandeln, die Daten in Arrays zu speichern und sie mit Schleifen zu durchlaufen. Hier kann die Farbfolge in einem Array gespeichert werden:
const uint8_t colors[8][3] = {
{128, 0, 0},
{128, 32, 0},
{128, 64, 0},
{ 0, 128, 0},
{ 0, 128, 0},
{ 0, 128, 0},
{ 0, 128, 32},
{ 0, 128, 64},
};
Sie können dann setPixelColor()innerhalb einer Schleife aufrufen , die durch das Array läuft. Da der Endpunkt der Schleife vom gemessenen Pegel abhängt, könnte er folgendermaßen geschrieben werden:
void leveller() {
int level = map(analogRead(A3), 0, 1024, 1, 9);
strip.clear();
for (int i = 0; i < level; i++) {
const uint8_t *color = colors[i];
strip.setPixelColor(i, color[0], color[1], color[2]);
strip.show();
delay(30);
}
}
Da die Ausgabe von analogRead()immer kleiner als 1024 ist, ist die Variable levelimmer kleiner als 9, dh sie nimmt Werte zwischen 1 und einschließlich 8 an. Und das ist die Anzahl der Farben, die angezeigt werden.