Probleme mit Webserver für Ws2812b

Hallo Leute,

das hier ist mein erster Post und ich bin noch blutiger Anfänger. Also bitte hatet mich nicht für die Frage.

Ich habe folgendes Problem ich habe einen Webserver für meinen Ws2812b "programmiert". Hat soweit geklappt, es gibt zwei Farbmodie einmal/rainbow und /warmwhite. Das hier ist mein Code:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "FRITZ!Box 7490 ";
const char* password = "";

ESP8266WebServer server(80);
#include <Adafruit_NeoPixel.h>
#define PIN D4
Adafruit_NeoPixel strip = Adafruit_NeoPixel(97, D4, NEO_GRB + NEO_KHZ800);
 
  
const int led = 13;

void handleRoot() {
  server.send(200, "text/plain", "usage:\n/rainbow");
 
}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void warmwhite(uint8_t wait){
  uint16_t i;
 for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, 255,255,120);}
  strip.show();
  delay(wait);
}
void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("instead")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);
  
   server.on("/rainbow", []() {
    server.send(500, "text/plain", "rainbow");
    
    uint16_t y;
  for (y=0; y<5000; y++){
  rainbow(100000);}
  } 
);server.on("/warmwhite",[](){
      server.send(700,"text/plain","warmwhite");

      warmwhite(1000000);
    }
);

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop(void) {
  server.handleClient();
  
}

Meine Frage ist jetzt wie ich einen Neustart implementieren kann z.B hatte ich schon die Idee das ganze über Threads zu lösen aber nachdem ich es Programmiert hatte sagte mir ein Freund dass das nicht ginge. Dann probierte ich es mit einer if- Abfrage auf Handle Client hier wieder mein Code

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "FRITZ!Box 7490 RS15";
const char* password = "";

ESP8266WebServer server(80);
#include <Adafruit_NeoPixel.h>
#define PIN D4
Adafruit_NeoPixel strip = Adafruit_NeoPixel(97, D4, NEO_GRB + NEO_KHZ800);


const int led = 13;

void handleRoot() {
  server.send(200, "text/plain", "usage:\n/rainbow");

}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void warmwhite(uint8_t wait) {
  uint16_t i;
  for (i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, 255, 255, 120);
  }
  strip.show();
  delay(wait);
}
void rainbow(uint8_t wait) {
  uint16_t i, j;

  for (j = 0; j < 256; j++) {
    for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("instead")) {
    Serial.println("MDNS responder started");
  }




  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop(void) {
  int y;
  y == 0;
  if (server.handleClient()) {
     y++;
  }
  else {
    break;
  }
  server.on("/", handleRoot);
  int x;
  x == 0;
  do {
    if (y = 0) {
      server.on("/rainbow", []() {
        server.send(500, "text/plain", "rainbow");

        rainbow(100000);
      }
    }
    else {
      server.on("/warmwhite", []() {
        server.send(700, "text/plain", "warmwhite");

        warmwhite(1000000);
      }
    }

  } while (x = 0)

    ;
}

Und jetzt meine Frage hat jemand eine Idee wie ich das lösen kann?

Hi

Wenn Du fragen würdest, was Du wissen willst, vielleicht.
Was hast Du, was willst Du, was bekommst Du?

MfG

Wofür brauchst Du den Neustart? Was soll ihn auslösen?

Gruß Tommy

Hallo,

ich denke Du willst die funktionen für wanweis und rainbow vorzeitig beenden bzw neu starten.

so wird das nix.

ist schon klar , alle Beispiele aus der fastLED benutzen delay(). Aber die delay müssen raus da macht der prozessor eine pause also nix ausser warten damit kannst Du die funktion nicht beenden bzw vorzeitig verlassen. Der Webserver sollte ja aber eigendlich auch nicht laufen wärend des delay().

schau dir blink without delay an und ersetze delay durch millis.

postmaster-ino:
Hi

Wenn Du fragen würdest, was Du wissen willst, vielleicht.
Was hast Du, was willst Du, was bekommst Du?

MfG

Danke für die schnelle Antwort. :slight_smile:

Mein Ziel ist es das der Led Streifen vom Mikrocontroller angesteuert wird und es einen Modus gibt der z.B. /aus heißt mit dem der Controller neu startet oder den aktuellen Modus abschaltet und einen neuen Aufruft. Das ganze soll erstmal per Server im Wifi laufen oder vielleicht später dann generell per Server den man auch außerhalb des Netzwerks aufrufen kann. Und mein Problem ist eben dieser Abschalt- modus.

Meeriefreak:
Danke für die schnelle Antwort. :slight_smile:

Mein Ziel ist es das der Led Streifen vom Mikrocontroller angesteuert wird und es einen Modus gibt der z.B. /aus heißt mit dem der Controller neu startet oder den aktuellen Modus abschaltet und einen neuen Aufruft. Das ganze soll erstmal per Server im Wifi laufen oder vielleicht später dann generell per Server den man auch außerhalb des Netzwerks aufrufen kann. Und mein Problem ist eben dieser Abschalt- modus.

Oder ist eine ganz schlechte Basis für eine Programmierung.

Werde Dir erst mal selbst klar, was Du erreichen willst.
/aus sollte auch nur das machen, was es heißt: die LED ausschalten. Warum willst Du da einen Neustart mit verwursten?

Ein neuer Aufruf wäre dann z.B. /rainbow oder /blink

Baue das Ganze doch erst mal ohne LED-Streifen und gib nur auf dem seriellen Monitor aus. Damit lernst Du erst mal die Funktionsweise des Webservers kennen.

Wenn Das funktioniert, dann baust Du Deine Effekte auf - ohne delay und ohne blockierende Schleifen, damit Dein Webserver immer auf Eingaben reagieren kann.

Wie man sowas machen kann habe ich mal für einen Weihnachtsstern gebaut. Du kannst Dir da gern Anregungen holen.

Gruß Tommy

Rentner:
Hallo,

ich denke Du willst die funktionen für wanweis und rainbow vorzeitig beenden bzw neu starten.

so wird das nix.

ist schon klar , alle Beispiele aus der fastLED benutzen delay(). Aber die delay müssen raus da macht der prozessor eine pause also nix ausser warten damit kannst Du die funktion nicht beenden bzw vorzeitig verlassen. Der Webserver sollte ja aber eigendlich auch nicht laufen wärend des delay().

schau dir blink without delay an und ersetze delay durch millis.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

const char* ssid = "FRITZ!Box 7490";
const char* password = "";

ESP8266WebServer server(80);
#include <Adafruit_NeoPixel.h>
#define PIN D4
Adafruit_NeoPixel strip = Adafruit_NeoPixel(97, D4, NEO_GRB + NEO_KHZ800);
 
  
const int led = 13;

void handleRoot() {
  server.send(200, "text/plain", "usage:\n/rainbow");
 
}
unsigned long previousMillis = 0;
const long interval = 1000;


void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void warmwhite(uint8_t){
  uint16_t i;
 for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, 255,255,120);}
  strip.show();
   unsigned long currentMillis = millis();  
}
void rainbow(uint8_t ) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
     unsigned long currentMillis = millis();
  }
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("instead")) {
    Serial.println("MDNS responder started");
  }

  server.on("/", handleRoot);
  
   server.on("/rainbow", []() {
    server.send(500, "text/plain", "rainbow");
    
    uint16_t y;
  for (y=0; y<5000; y++){
  rainbow(100000);}
  } 
);server.on("/warmwhite",[](){
      server.send(700,"text/plain","warmwhite");

      warmwhite(1000000);
    }
);

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop(void) {
  server.handleClient();
  
}

Hi danke für die schnelle Antwort hat mir in jedem Fall geholfen. Aber ich habe ja schon geschrieben das ich blutiger Anfänger bin. Deswegen habe ich jetzt die Frage ob das so richtig ist? Ich habe jetzt das wait aus dem Header der Methode entfrernt weil es meine ich nicht nötig ist. Zudem habe ich das delay() halt durch unsigned long currentMillis=Millis ersetzt. Außerdem habe ich die Frage was das denn genau bringt? Klar habe ich im Internet gelesen und raus gefunden dass das die Wartezeit damit genauer macht deswegen frage ich mich ob das noch was anderes bringt?

Tommy56:
Oder ist eine ganz schlechte Basis für eine Programmierung.

Werde Dir erst mal selbst klar, was Du erreichen willst.
/aus sollte auch nur das machen, was es heißt: die LED ausschalten. Warum willst Du da einen Neustart mit verwursten?

Ein neuer Aufruf wäre dann z.B. /rainbow oder /blink

Baue das Ganze doch erst mal ohne LED-Streifen und gib nur auf dem seriellen Monitor aus. Damit lernst Du erst mal die Funktionsweise des Webservers kennen.

Wenn Das funktioniert, dann baust Du Deine Effekte auf - ohne delay und ohne blockierende Schleifen, damit Dein Webserver immer auf Eingaben reagieren kann.

Wie man sowas machen kann habe ich mal für einen Weihnachtsstern gebaut. Du kannst Dir da gern Anregungen holen.

Gruß Tommy

Danke für den Link und die Antwort werde ich mir auf jeden Fall ansehen.

Habe mich entschieden das nur netzwerk basiert zu machen. Und mit dem /aus wollte ich halt bezwecken das ich den Led Streifen ausschalten kann und einen neuen Befehl aufrufen kann weil das halt noch nicht geht weil im Moment der eine Befehl der Aktiv ist noch den Kanal für die anderen blockiert.

Ja, das geht nur, wenn Du nicht blockierend programmierst. Der Loop muss immer schnell durch laufen und auf nichts warten.

Gruß Tommy