Neopixel AppInventor NodeMCU

Hallo Zusammen,

ich habe einen Code zusammen gebastelt, der über eine App mittels NodeMCU eine Neopixel Strippe WS2812b steuert. Je nach dem welche Knopf in der App gedrückt wird, werden die Zahlen 1 bis 5 an NodeMCU gesendet. 1 = Pixel aus, 2 = Pixel rot, 3 = Pixel blau, 4 = Pixel weiss und bei 5 soll der Code-Abschnitt für das Lauflicht starten und genau mit 5. habe ich mein Problem. Wenn ich den Knopf für 5. drücke läuft der Abschnitt nur ein mal, aber super wäre wenn es im loop laufen würde. Vermutlich ist das hier falsch! else if (data == “5”) {

Über Hilfe bin ich euch dankbar!

Gruß,
Merzo

/* include library */
#include <ESP8266WiFi.h>

#include <Adafruit_NeoPixel.h>

//____________________________________________lauflicht
#ifdef __AVR__
#include <avr/power.h>
#endif

int i = 0;
int a = 2;
int b = 4;
int c = 6;
int d = 8;
int e = 10;
//_______________________________________________


#define PIN        15
#define NUMPIXELS  150

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int pause = 10; // 10 Millisekunden Pause bis zur Ansteuerung der nächsten LED.


//ROUTER VERBINDUNG_____________________________________
/* define port */
WiFiClient client;
WiFiServer server(80);

/* WIFI settings */
const char* ssid = "XXXX";
const char* password = "XXXXX";
IPAddress ip(192, 168, X, XX); //set IP
IPAddress gateway(192, XX, X, X); //set gateway
IPAddress subnet(255, 255, XXX, XXX);


/* data received from application */
String  data = "";
//________________________________________________________


void setup() {

  pixels.begin();


  //ROUTER VERBINDUNG_________________________________________
  Serial.begin(115200);
  delay(10);

  // Connection to wireless network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  /* start server communication */
  server.begin();
  Serial.println("Server started");

  // Print the IP address in serial monitor. It must be the same we entered above
  Serial.print("Type this address in URL to connect: ");
  Serial.print("http://");
  Serial.println(ip);
  Serial.println("/");


}

void loop()
{

  // If the server available, run the "checkClient" function */
  client = server.available();
  if (!client) return;
  data = checkClient ();

  /************************ Run function according to incoming data from application *************************/

  // If the incoming data is "1", aus
  if (data == "1") {
    Serial.println("Aus");
    pixels.setPixelColor(0, pixels.Color(0, 0, 0));
    //usw. für alle 150 Pixel

    pixels.show();


  }

  // If the incoming data is "2", rot
  else if (data == "2") {
    Serial.println("Rot");
    pixels.setPixelColor(50, pixels.Color(255, 0, 0));
    pixels.setPixelColor(51, pixels.Color(255, 0, 0));
    pixels.setPixelColor(52, pixels.Color(255, 0, 0));
    pixels.setPixelColor(53, pixels.Color(255, 0, 0));
    pixels.setPixelColor(54, pixels.Color(255, 0, 0));
    pixels.setPixelColor(55, pixels.Color(255, 0, 0));
    pixels.setPixelColor(56, pixels.Color(255, 0, 0));
    pixels.setPixelColor(57, pixels.Color(255, 0, 0));
    pixels.setPixelColor(58, pixels.Color(255, 0, 0));
    pixels.setPixelColor(59, pixels.Color(255, 0, 0));
    pixels.setPixelColor(60, pixels.Color(255, 0, 0));

    pixels.show();
  }

  // If the incoming data is "3", blau
  else if (data == "3") {
    Serial.println("Blau");
    pixels.setPixelColor(50, pixels.Color(0, 0, 255));
    pixels.setPixelColor(51, pixels.Color(0, 0, 255));
    pixels.setPixelColor(52, pixels.Color(0, 0, 255));
    pixels.setPixelColor(53, pixels.Color(0, 0, 255));
    pixels.setPixelColor(54, pixels.Color(0, 0, 255));
    pixels.setPixelColor(55, pixels.Color(0, 0, 255));
    pixels.setPixelColor(56, pixels.Color(0, 0, 255));
    pixels.setPixelColor(57, pixels.Color(0, 0, 255));
    pixels.setPixelColor(58, pixels.Color(0, 0, 255));
    pixels.setPixelColor(59, pixels.Color(0, 0, 255));
    pixels.setPixelColor(60, pixels.Color(0, 0, 255));

    pixels.show();
  }

  // If the incoming data is "4", weiss
  else if (data == "4") {
    Serial.println("Weiss");
    pixels.setPixelColor(50, pixels.Color(255, 255, 255));
    pixels.setPixelColor(51, pixels.Color(255, 255, 255));
    pixels.setPixelColor(52, pixels.Color(255, 255, 255));
    pixels.setPixelColor(53, pixels.Color(255, 255, 255));
    pixels.setPixelColor(54, pixels.Color(255, 255, 255));
    pixels.setPixelColor(55, pixels.Color(255, 255, 255));
    pixels.setPixelColor(56, pixels.Color(255, 255, 255));
    pixels.setPixelColor(57, pixels.Color(255, 255, 255));
    pixels.setPixelColor(58, pixels.Color(255, 255, 255));
    pixels.setPixelColor(59, pixels.Color(255, 255, 255));
    pixels.setPixelColor(60, pixels.Color(255, 255, 255));

    pixels.show();
  }

  // If the incoming data is "5", Lauflicht

  else if (data == "5") {
    Serial.println("Lauflicht");
    pixels.setPixelColor(i, pixels.Color(0, 150, 0)); // Grün
    pixels.setPixelColor(a, pixels.Color(155, 0, 0)); // Rot
    pixels.setPixelColor(b, pixels.Color(0, 0, 150)); // blau
    pixels.setPixelColor(c, pixels.Color(150, 150, 0)); // gelb
    pixels.setPixelColor(d, pixels.Color(0, 150, 150)); // türkis
    pixels.setPixelColor(e, pixels.Color(150, 150, 150)); // weiss

    pixels.setPixelColor(i - 1, pixels.Color(0, 0, 0)); // Der vorherige Pixel wird abgeschaltet
    pixels.setPixelColor(a - 1, pixels.Color(0, 0, 0)); // Der vorherige Pixel wird abgeschaltet
    pixels.setPixelColor(b - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(c - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(d - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(e - 1, pixels.Color(0, 0, 0));



    pixels.show(); // Durchführen der Pixel-Ansteuerung

    if (i == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0)); // Im Fall von Pixel "0" muss die vorherige (39) ausgeschaltet werden.
    if (a == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (b == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (c == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (d == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (e == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));

    pixels.show(); // Durchführen der Pixel-Ansteuerung
    delay (pause);

    i = i + 1; // Die Variable "i" wird um eine Zahl vergrößert. Die neue Zahl "i" ist dann die nächste LED im Led-Ring
    a = a + 1;
    b = b + 1;
    c = c + 1;
    d = d + 1;
    e = e + 1;




    if (i == 150) i = 0; // Wenn die Variable den Wert 40 erreicht hat, wird die Variable auf den Wert "0" zurück gesetzt, da die Nummerierung der LEDs nur von 0 bis 39 geht.
    if (a == 150) a = 0;
    if (b == 150) b = 0;
    if (c == 150) c = 0;
    if (d == 150) d = 0;
    if (e == 150) e = 0;
  }


}

/********************************** RECEIVE DATA FROM the APP ******************************************/
String checkClient (void)
{
  while (!client.available()) delay(1);
  String request = client.readStringUntil('\r');
  request.remove(0, 5);
  request.remove(request.length() - 9, 9);
  return request;
}

Der MC macht, was Du ihm sagst, nicht was Du von ihm willst ;)

Vorschlag: Merke Dir die übergebene Zahl als status. Wenn der status 5 ist, dann erledige im Loop jedes Mal das Lauflicht, auch wenn keine neue 5 kommt (das ist Dein Problem).

Wahrscheinlich brauchst Du noch eine Zeitsteuerung für das Lauflicht. Wenn Du delay nimmst, kannst Du in dieser Zeit keine Befehle empfangen. Also baue die Zeitsteuerung lieber mit millis(). Verstehe dazu BlinkWithoutDeley aus den Beispielen der IDE.

Gruß Tommy

Danke für die schnellen Antworten, habt ihr mir da ein Beispiel, wie ich das machen könnte?

Leider habe ich das mit dem togglen nicht verstanden. Daher habe ich heute versucht es mit while hinzubekommen, aber dann hat sich der loop nicht mehr stoppen lassen. Würde mich also sehr über eine weitere Erklärung bezüglich togglen freuen. Oder noch besser wäre ein Code Beispiel. Vielen Dank!

Dank dir, du meinst also ich soll über void setup so eine globale status variable einfügen?

int status = 6;

und deinen Code-Abschnitt unter 5. setzten. Dann würde doch das Umschalten funktionieren. Oder?

Hallo Zusammen,

leider bekomme ich es nicht hin. Das Lauflicht läuft nicht in der Dauerschleife. Wenn von meiner App die 5 erscheint läuft das Lauflicht genau ein Pixel weiter. Für jede Pixelbewegung muss ich also den Knopf drücken. Das ist leider nicht der Sinn! Hab jetzt auch mal den Vorschlag von Noiasca probiert. Funktioniert leider auch nicht. Habe mal den Code modifiziert nach Noiasca angehängt. Außerdem die Oberfläche meiner App und den seriellen Monitor nachdem ich in der App folgende Buttons gedrück habe: Licht rot, Licht blau, Licht weiss, Licht aus und 2x start Lauflicht.

Würde mich freuen, wenn mir jemand helfen könnte.


[code#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>

#define PIN        15
#define NUMPIXELS  36

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);


//Lauflicht_________________________________________________________________________
#ifdef __AVR__
#include <avr/power.h>
#endif

int i = 0;
int a = 2;
int b = 4;
int c = 6;
int d = 8;
int e = 10;

int pause = 10; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED.
int status;   //Statusvariable für Lauflicht________________________________________??????????????????????
//_________________________________________________________________________________


//ROUTER VERBINDUNG_____________________________________
/* define port */
WiFiClient client;
WiFiServer server(80);

// INTERNET Einstellungen
const char* ssid = "XXX";
const char* password = "XXXX";
IPAddress ip(192, 1X, X, X); //set IP
IPAddress gateway(192, X, X, X); //set getteway
IPAddress subnet(255, XX, XX, 0);


// Empfangene Daten von App
String  data = "";
//________________________________________________________


void setup() {

  pixels.begin();


  //ROUTER VERBINDUNG_________________________________________
  Serial.begin(115200);
  delay(10);

  // Verbindung zum Netzwerk
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  server.begin();
  Serial.println("Server started");

  Serial.print("Type this address in URL to connect: ");
  Serial.print("http://");
  Serial.println(ip);
  Serial.println("/");
}

void loop()
{

  // If the server available, run the "checkClient" function */
  client = server.available();
  if (!client) return;
  data = checkClient ();


  // Eingehende Daten von App 
  if (data == "1") {
    Serial.println("Aus");
    pixels.setPixelColor(0, pixels.Color(0, 0, 0));
    pixels.setPixelColor(1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(2, pixels.Color(0, 0, 0));
    pixels.setPixelColor(3, pixels.Color(0, 0, 0));
    pixels.setPixelColor(4, pixels.Color(0, 0, 0));
    pixels.setPixelColor(5, pixels.Color(0, 0, 0));
    pixels.setPixelColor(6, pixels.Color(0, 0, 0));
    pixels.setPixelColor(7, pixels.Color(0, 0, 0));
    pixels.setPixelColor(8, pixels.Color(0, 0, 0));
//usw

    pixels.show();

  }

  else if (data == "2") {
    Serial.println("Rot");
    pixels.setPixelColor(10, pixels.Color(255, 0, 0));
    pixels.setPixelColor(11, pixels.Color(255, 0, 0));
    pixels.setPixelColor(12, pixels.Color(255, 0, 0));
    pixels.setPixelColor(13, pixels.Color(255, 0, 0));
    pixels.setPixelColor(14, pixels.Color(255, 0, 0));
    pixels.setPixelColor(15, pixels.Color(255, 0, 0));
    pixels.setPixelColor(16, pixels.Color(255, 0, 0));
    pixels.setPixelColor(17, pixels.Color(255, 0, 0));
    pixels.setPixelColor(18, pixels.Color(255, 0, 0));
    pixels.setPixelColor(19, pixels.Color(255, 0, 0));
    pixels.setPixelColor(20, pixels.Color(255, 0, 0));

    pixels.show();
  }

  else if (data == "3") {
    Serial.println("Blau");
    pixels.setPixelColor(10, pixels.Color(0, 0, 255));
    pixels.setPixelColor(11, pixels.Color(0, 0, 255));
    pixels.setPixelColor(12, pixels.Color(0, 0, 255));
    pixels.setPixelColor(13, pixels.Color(0, 0, 255));
    pixels.setPixelColor(14, pixels.Color(0, 0, 255));
    pixels.setPixelColor(15, pixels.Color(0, 0, 255));
    pixels.setPixelColor(16, pixels.Color(0, 0, 255));
    pixels.setPixelColor(17, pixels.Color(0, 0, 255));
    pixels.setPixelColor(18, pixels.Color(0, 0, 255));
    pixels.setPixelColor(19, pixels.Color(0, 0, 255));
    pixels.setPixelColor(20, pixels.Color(0, 0, 255));

    pixels.show();
  }

  // If the incoming data is "4", weiss
  else if (data == "4") {
    Serial.println("Weiss");
    pixels.setPixelColor(10, pixels.Color(255, 255, 255));
    pixels.setPixelColor(11, pixels.Color(255, 255, 255));
    pixels.setPixelColor(12, pixels.Color(255, 255, 255));
    pixels.setPixelColor(13, pixels.Color(255, 255, 255));
    pixels.setPixelColor(14, pixels.Color(255, 255, 255));
    pixels.setPixelColor(15, pixels.Color(255, 255, 255));
    pixels.setPixelColor(16, pixels.Color(255, 255, 255));
    pixels.setPixelColor(17, pixels.Color(255, 255, 255));
    pixels.setPixelColor(18, pixels.Color(255, 255, 255));
    pixels.setPixelColor(19, pixels.Color(255, 255, 255));
    pixels.setPixelColor(20, pixels.Color(255, 255, 255));

    pixels.show();
  }


else if (data == "5")  //Lauflicht läuft leider nicht im Loop___________????????????????????????????
  {
    status =! status;
    Serial.print(F("Status=")); 
    Serial.println(status);
  }

  if (status)
  {
    Serial.println("Lauflicht");
    pixels.setPixelColor(i, pixels.Color(0, 150, 0)); // Grün
    pixels.setPixelColor(a, pixels.Color(155, 0, 0)); // Rot
    pixels.setPixelColor(b, pixels.Color(0, 0, 150)); // blau
    pixels.setPixelColor(c, pixels.Color(150, 150, 0)); // gelb
    pixels.setPixelColor(d, pixels.Color(0, 150, 150)); // türkis
    pixels.setPixelColor(e, pixels.Color(150, 150, 150)); // weiss

    pixels.setPixelColor(i - 1, pixels.Color(0, 0, 0)); // Der vorherige Pixel wird abgeschaltet
    pixels.setPixelColor(a - 1, pixels.Color(0, 0, 0)); // Der vorherige Pixel wird abgeschaltet
    pixels.setPixelColor(b - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(c - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(d - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(e - 1, pixels.Color(0, 0, 0));



    pixels.show(); // Durchführen der Pixel-Ansteuerung

    if (i == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0)); // Im Fall von Pixel "0" muss die vorherige (39) ausgeschaltet werden.
    if (a == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (b == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (c == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (d == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (e == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));

    pixels.show(); // Durchführen der Pixel-Ansteuerung
    delay (pause);

    i = i + 1; // Die Variable "i" wird um eine Zahl vergrößert. Die neue Zahl "i" ist dann die nächste LED im Led-Ring
    a = a + 1;
    b = b + 1;
    c = c + 1;
    d = d + 1;
    e = e + 1;


    if (i == 150) i = 0; // Wenn die Variable den Wert 40 erreicht hat, wird die Variable auf den Wert "0" zurück gesetzt, da die Nummerierung der LEDs nur von 0 bis 39 geht.
    if (a == 150) a = 0;
    if (b == 150) b = 0;
    if (c == 150) c = 0;
    if (d == 150) d = 0;
    if (e == 150) e = 0;

  }

}

//Daten von der App
String checkClient (void)
{
  while (!client.available()) delay(1);
  String request = client.readStringUntil('\r');
  request.remove(0, 5);
  request.remove(request.length() - 9, 9);
  return request;
}]

serial_monitor.JPG

Sorry, mein Text sollte natürlich nicht im Code sein!

Hier nochmal:

Hallo Zusammen,

leider bekomme ich es nicht hin. Das Lauflicht läuft nicht in der Dauerschleife. Wenn von meiner App die 5 erscheint läuft das Lauflicht genau ein Pixel weiter. Für jede Pixelbewegung muss ich also den Knopf drücken. Das ist leider nicht der Sinn! Hab jetzt auch mal den Vorschlag von Noiasca probiert. Funktioniert leider auch nicht. Habe mal den Code modifiziert nach Noiasca angehängt. Außerdem die Oberfläche meiner App und den seriellen Monitor nachdem ich in der App folgende Buttons gedrück habe: Licht rot, Licht blau, Licht weiss, Licht aus und 2x start Lauflicht.

Würde mich freuen, wenn mir jemand helfen könnte.

deine Funktion checkClient blockiert für immer, wenn nichts neues kommt.

  while (!client.available()) delay(1);  // STOP, bis neue daten da sind
  client.readStringUntil('\r');    // WARTEN, bis Zeile komplett gelesen ist

damit läuft loop natürlich auch nur einmal je empfangene Zeile

Aber ohne diese Zeilen kann ich nichts steuern, oder?

Hi

Sind diese Zeilen Deine Steuerung? Eher nicht - Das ist vll. eine Art Datenerfassung.

Das brauchst Du nur, wenn neue Daten da sind - also Dein .available sollte kein while sein, eher ein if. Und sollte dann auch nur den Teil umklammern, wo Du die Daten empfängst - EINZELN (also wieder ohne while) - und prüfst, ob der Datensatz komplett ist. Wenn JA, reagierst Du darauf, indem Du die Daten verarbeitest - z.B. Deine Dauerschleife wieder anhalten, langsamer oder schneller machen - State-Maschine möchte von Dir erkundet werden (Beispiel Blink_without_delay in der IDE ist ein guter Anfang).

Und MALE Dir auf, Was Du Wann machen willst/musst - z.B. könnte es Dir auffallen, daß es blöd ist, auf eine Eingabe zu warten, Die nicht kommt, wo Du doch gerade ein Lauflicht steuern sollst - also NICHT warten, sondern nur drauf reagieren.

loop() muß möglichst schnell durchlaufen werden, so kannst Du nahezu zeitgleich Alles Mögliche machen, und den Rest lässt Du 'in dieser Runde' halt einfach links liegen.

MfG

Danke für die Ratschläge,

ich habe jetzt in folgenden Zeilen while durch if ersetzt. Der Code läuft jetzt gleich gut bzw. schlecht. Unter 5. läuft der Code nur ein Mal. Mir muss man wohl noch mehr auf die Sprünge helfen.

while (WiFi.status() != WL_CONNECTED) {

und

while (!client.available()) delay(1); String request = client.readStringUntil('\r');

Hi

Ohne Deinen aktuellen Sketch können wir hier weiter im Nebel stochern. Sofern Du NUR das while durch if ersetzt hast, sollte die loop() zumindest durchgehend durchlaufen werden - wenn nicht, müsste man Mal nachsehen, warum nicht. ... dafür, Du ahnst Es, ist Dein Sketch die erste Anlaufstelle.

Wie bei Code so üblich, fühlt sich Dieser in Code-Tags am wohlsten - und ein 8) wird nicht zu einem Smilie, sondern zu Acht Klammer-zu.

MfG

#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>

#define PIN        15
#define NUMPIXELS  36

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);


//Lauflicht_________________________________________________________________________
#ifdef __AVR__
#include <avr/power.h>
#endif

int i = 0;
int a = 2;
int b = 4;
int c = 6;
int d = 8;
int e = 10;

int pause = 10; // 100 Millisekunden Pause bis zur Ansteuerung der nächsten LED.
int status;   //Statusvariable für Lauflicht________________________________________??????????????????????
//_________________________________________________________________________________


//ROUTER VERBINDUNG_____________________________________
/* define port */
WiFiClient client;
WiFiServer server(80);

// INTERNET Einstellungen
const char* ssid = "XXX";
const char* password = "XXXX";
IPAddress ip(192, 1X, X, X); //set IP
IPAddress gateway(192, X, X, X); //set getteway
IPAddress subnet(255, XX, XX, 0);


// Empfangene Daten von App
String  data = "";
//________________________________________________________


void setup() {

  pixels.begin();


  //ROUTER VERBINDUNG_________________________________________
  Serial.begin(115200);
  delay(10);

  // Verbindung zum Netzwerk
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, password);

  if (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  server.begin();
  Serial.println("Server started");

  Serial.print("Type this address in URL to connect: ");
  Serial.print("http://");
  Serial.println(ip);
  Serial.println("/");
}

void loop()
{

  // If the server available, run the "checkClient" function */
  client = server.available();
  if (!client) return;
  data = checkClient ();


  // Eingehende Daten von App 
  if (data == "1") {
    Serial.println("Aus");
    pixels.setPixelColor(0, pixels.Color(0, 0, 0));
    pixels.setPixelColor(1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(2, pixels.Color(0, 0, 0));
    pixels.setPixelColor(3, pixels.Color(0, 0, 0));
    pixels.setPixelColor(4, pixels.Color(0, 0, 0));
    pixels.setPixelColor(5, pixels.Color(0, 0, 0));
    pixels.setPixelColor(6, pixels.Color(0, 0, 0));
    pixels.setPixelColor(7, pixels.Color(0, 0, 0));
    pixels.setPixelColor(8, pixels.Color(0, 0, 0));
//usw

    pixels.show();

  }

  else if (data == "2") {
    Serial.println("Rot");
    pixels.setPixelColor(10, pixels.Color(255, 0, 0));
    pixels.setPixelColor(11, pixels.Color(255, 0, 0));
    pixels.setPixelColor(12, pixels.Color(255, 0, 0));
    pixels.setPixelColor(13, pixels.Color(255, 0, 0));
    pixels.setPixelColor(14, pixels.Color(255, 0, 0));
    pixels.setPixelColor(15, pixels.Color(255, 0, 0));
    pixels.setPixelColor(16, pixels.Color(255, 0, 0));
    pixels.setPixelColor(17, pixels.Color(255, 0, 0));
    pixels.setPixelColor(18, pixels.Color(255, 0, 0));
    pixels.setPixelColor(19, pixels.Color(255, 0, 0));
    pixels.setPixelColor(20, pixels.Color(255, 0, 0));

    pixels.show();
  }

  else if (data == "3") {
    Serial.println("Blau");
    pixels.setPixelColor(10, pixels.Color(0, 0, 255));
    pixels.setPixelColor(11, pixels.Color(0, 0, 255));
    pixels.setPixelColor(12, pixels.Color(0, 0, 255));
    pixels.setPixelColor(13, pixels.Color(0, 0, 255));
    pixels.setPixelColor(14, pixels.Color(0, 0, 255));
    pixels.setPixelColor(15, pixels.Color(0, 0, 255));
    pixels.setPixelColor(16, pixels.Color(0, 0, 255));
    pixels.setPixelColor(17, pixels.Color(0, 0, 255));
    pixels.setPixelColor(18, pixels.Color(0, 0, 255));
    pixels.setPixelColor(19, pixels.Color(0, 0, 255));
    pixels.setPixelColor(20, pixels.Color(0, 0, 255));

    pixels.show();
  }

  // If the incoming data is "4", weiss
  else if (data == "4") {
    Serial.println("Weiss");
    pixels.setPixelColor(10, pixels.Color(255, 255, 255));
    pixels.setPixelColor(11, pixels.Color(255, 255, 255));
    pixels.setPixelColor(12, pixels.Color(255, 255, 255));
    pixels.setPixelColor(13, pixels.Color(255, 255, 255));
    pixels.setPixelColor(14, pixels.Color(255, 255, 255));
    pixels.setPixelColor(15, pixels.Color(255, 255, 255));
    pixels.setPixelColor(16, pixels.Color(255, 255, 255));
    pixels.setPixelColor(17, pixels.Color(255, 255, 255));
    pixels.setPixelColor(18, pixels.Color(255, 255, 255));
    pixels.setPixelColor(19, pixels.Color(255, 255, 255));
    pixels.setPixelColor(20, pixels.Color(255, 255, 255));

    pixels.show();
  }


else if (data == "5")  //Lauflicht läuft leider nicht im Loop___________????????????????????????????
  {
    status =! status;
    Serial.print(F("Status=")); 
    Serial.println(status);
  }

  if (status)
  {
    Serial.println("Lauflicht");
    pixels.setPixelColor(i, pixels.Color(0, 150, 0)); // Grün
    pixels.setPixelColor(a, pixels.Color(155, 0, 0)); // Rot
    pixels.setPixelColor(b, pixels.Color(0, 0, 150)); // blau
    pixels.setPixelColor(c, pixels.Color(150, 150, 0)); // gelb
    pixels.setPixelColor(d, pixels.Color(0, 150, 150)); // türkis
    pixels.setPixelColor(e, pixels.Color(150, 150, 150)); // weiss

    pixels.setPixelColor(i - 1, pixels.Color(0, 0, 0)); // Der vorherige Pixel wird abgeschaltet
    pixels.setPixelColor(a - 1, pixels.Color(0, 0, 0)); // Der vorherige Pixel wird abgeschaltet
    pixels.setPixelColor(b - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(c - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(d - 1, pixels.Color(0, 0, 0));
    pixels.setPixelColor(e - 1, pixels.Color(0, 0, 0));



    pixels.show(); // Durchführen der Pixel-Ansteuerung

    if (i == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0)); // Im Fall von Pixel "0" muss die vorherige (39) ausgeschaltet werden.
    if (a == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (b == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (c == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (d == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));
    if (e == 0) pixels.setPixelColor(149, pixels.Color(0, 0, 0));

    pixels.show(); // Durchführen der Pixel-Ansteuerung
    delay (pause);

    i = i + 1; // Die Variable "i" wird um eine Zahl vergrößert. Die neue Zahl "i" ist dann die nächste LED im Led-Ring
    a = a + 1;
    b = b + 1;
    c = c + 1;
    d = d + 1;
    e = e + 1;


    if (i == 150) i = 0; // Wenn die Variable den Wert 40 erreicht hat, wird die Variable auf den Wert "0" zurück gesetzt, da die Nummerierung der LEDs nur von 0 bis 39 geht.
    if (a == 150) a = 0;
    if (b == 150) b = 0;
    if (c == 150) c = 0;
    if (d == 150) d = 0;
    if (e == 150) e = 0;

  }

}

//Daten von der App
String checkClient (void)
{
  if (!client.available()) delay(1);
  String request = client.readStringUntil('\r');
  request.remove(0, 5);
  request.remove(request.length() - 9, 9);
  return request;
}

Vielen Dank!

Hi

int pause=10; Kommentar passt wohl nicht zum dort stehendem Wert - warum den Kommentar nicht sinnvoll nutzen und 'Pause in ms zwischen Einzel-LEDs' - also den Wert nicht erneut nennen, sondern sagen, was dieser Wert Da macht.

int status; - Wie viele Status hast Du? Können Die auch negativ werden? Byte bietet den Bereich 0...255, reicht z.Bl. auch für Pin-Definitionen.

DAS wird Dir loop() so lange neu starten, bis der Server endlich auch Mal läuft - sollte Er abschmieren, ist Dein loop() auch direkt wieder Müll, da NICHTS mehr ausgeführt wird, da loop() direkt beendet wird (return). client = server.available(); if (!client) return;

Wenn Du alle Pixel auf die gleiche Farbe setzen möchtest, würde ich eine FOR-Schleife benutzen, ggf. eine eigene Funktion, wo ich die Farbe mit angeben kann - so hast Du bei den festen Farben NUR einen Funktionsaufruf und die Funktion (und den Platzverbrauch) nur 1x.

delay(pause) ist blöd, wenn Du mehrer Dinge quasi gleichzeitig machen willst - z.B. Serverdaten empfangen und LEDs ansteuern. If (i==150) würde ich in NUMPIXELS (sollte man auch als const byte, statt #define angeben) ändern - so klappt der Code auch bei kürzeren/längeren Stripes Da ALLE Deine Variablen genau das Gleiche machen - verpacke die Funktionalität in eine Funktion und rufe dann Diese mit den entsprechenden Parametern auf - eben dem Pixel, Der gerade gesetzt werden soll o.Ä..

Zu Deinem 'läuft nur 1x durch' - Du fragst Daten vom Server ab - ist Das gerade eine '5', wird das Lauflicht gestartet(?). Blöd, daß im nächsten Durchlauf der Server keine erneute 5 sendet - Du musst Dir also MERKEN, daß das Lauflicht laufen soll und mit den Serverdaten diesen Merker setzen/löschen.

Alles in Allem: Viel Speicherplatz für nahezu identische Funktionalität - klar, unbenutzten Platz bekommt man auch nicht vergütet, aber SO muß ein Sketch nun auch wieder nicht aussehen - alleine die ganze Tipperei sollte Einen zur Funktionsnutzung bringen.

MfG

PS: Vll. nicht, was Du lesen wolltest - sorry dafür. PPS: Habe ich was verpasst? Kommentarloser Sketch und dann ein Vielen Dank-Post ohne sonst was drum herum?

Dank dir Postmaster für die ganzen Anmerkungen. Ich versuche sie umzusetzen. Allerdings bin ich kein Fachmann und mir fehlt da noch das Know-how. Aber folgender Teil ist genau mein Problem.

"Du musst Dir also MERKEN, daß das Lauflicht laufen soll und mit den Serverdaten diesen Merker setzen/löschen."

Wie mache ich das?

Hi

...
byte merker_lauflicht=0;  //=0 oberhalb setup(); unnötig, globale Variablen werden mit 0 initialisiert
...
if (data == '5'){
   //hier kommen wir NUR hin, wenn das Lauflicht gestartet werden soll
  merker_lauflicht=1;
}
//Im Gegenzug musst Du bei den anderen 'Befehlen' den Merker aber auch wieder zurück setzen
if (merker_lauflicht){  //wenn der Merker ungleich Null ist, kommen wir hier rein
  switch (merker_lauflicht){
    case 1: i=0;
               clear_stripe(); //löscht den Stripe - eigene Funktion, wirst Du schreiben müssen)
               lasttime=millis();
               merker_lauflicht=2; //nächste Status, Den wir abarbeiten wollen
               break;
    case 2:if (millis()-lasttime>=wartezeit){
                 set_pixel(i,0,0,0);  //lösche zuletzt gesetzten Pixel
                 i++;
                 lasttime+=wartezeit;  //=millis() ginge auch
                 if (i>=PixelCount){ //sind wir am Ende?){
                    merker_lauflicht=3;
                 }else{
                    set_pixel(i,r,g,b); //Pixel in Wunschfarbe setzen
                 }
                 break;
    case 3:if (millis()-lasttime>=wartezeit){
                 set_pixel(i,0,0,0);  //lösche zuletzt gesetzten Pixel
                 i--;
                 lasttime+=wartezeit;  //=millis() ginge auch
                 if (i==0){ //sind wir am Ende?){
                    merker_lauflicht=2;
                 }else{
                    set_pixel(i,r,g,b); //Pixel in Wunschfarbe setzen
                 }
                 break;
    default: Serial.print("Error");
   }
}

Das natürlich in loop() eingelassen - sollte dann die Pixel einzeln alle 'wartezeit' ms nach einander aufleuchten lassen. Durch eine erneute '5' wird das Lauflicht neu gestartet. Die ganzen globalen Variablen wie lasttime wirst Du erstellen müssen - entweder global, oder local mit static (damit Die erhalten bleiben - normale lokale Variablen gehen am Ende der Funktion verloren - und loop() ist auch nur eine Funktion. Gerne Das in eine eigene Funktion ausgelagert, daß Du in loop() nur noch lauflicht(); aufrufen musst und diese Funktion sich darum kümmert, ob das Lauflicht laufen soll und wenn ja, was dabei gemacht werden soll.

MfG

PS: Mit dem Merker 'merkst' Du Dir nur irgend was, nicht mehr, nicht weniger. Manchmal ist die Welt wirklich so einfach :)

Dank dir, ich werde es Morgen ausprobieren.

Vielen Dank noiasca,

es funktioniert alles perfekt!