Anfänger benötigt Hilfe beim Lauflicht

Du hast irgendwo einen Klammerfehler!
Das uint8_t (das wären weit über 250 Leds) reicht.
Du musst das aber NACH dem Ende von loop()
{
}
als neue Funktion ablegen.
Nicht innerhalb von loop!

Drück mal STRG-T. Wenn Du nicht weiter kommst bring mal den kompletten Code - das wird sonst Rätselraten.

Wenn Du 10 Pixel hast muß der Index von 0 bis 9 gezählt werden.
i = i+1;
if (i==10) i=0;
Wenn Du ein Pixel einschalten willst und das vorherige ausschalten willst dann gibt es den Spezialfall i = 0, In diesem Fall muß das letzte Pixel 9 ausgeschaltet werden.

also

NumerPixel = 10;
i1 = i1+1;
if (i1==NumerPixel) i1=0;

strip.setPixelColor(i1, strip.Color(0,150,0)); 
if (i1 == 0)
  strip.setPixelColor(NumerPixel-1, strip.Color(0,0,0));
else
  strip.setPixelColor(i1-1, strip.Color(0,0,0));

Grüße Uwe

Das macht er ja!Sogar richtig, weil er die Variable verwendet.

  if (i1 == NUMP) // wenn Ende dann i1 auf 0
  {
    i1 = 0;

Ich habe das oben ja schon bestätigt und am laufen gehabt.
Er hat nur die Funktion lastPixel() im loop verankert. Vorher war es ja schick...

Kürzere Variante:

    strip.setPixelColor(i1, strip.Color(0, 0, 0)); // Der vorherige Pixel wird abgeschaltet
    strip.show(); // LED's Ansteuern
    i1 = i1 + 1; // "i1" hochzählen
    if (i1 == NUMP) { // wenn Ende dann i1 auf 0
      i1 = 0;
    }
    strip.setPixelColor(i1, strip.Color(0, 150, 0)); // Pixel leuchtet in der Farbe Grün

Hi, sorry das ich jetzt erst Antworte, durfte am Samstag nicht mehr schreiben (Begrenzung Neuling :frowning: , und gestern den ganzen Tag unterwegs
Habe es jetzt so gelassen wie wir es am laufen hatte und noch weiter daran gebastelt, läuft jetzt super. Nochmals vielen dank für die Hilfe :+1:

Dann könntest Du dieses Thema als gelöst markieren.

Ich würde gerne sehen, was da zum Ende raus kam ...

Habe jetzt den Beitrag mit der Lösung markiert, reicht das so ? :slight_smile:

Ja.

Allerdings lebt ein öffentliches Forum vom Nehmen und Geben, weshalb Du noch Dein fertiges, lauffähiges Programm zeigen könntest. Möglicherweise kann jemand davon lernen.

Klar gerne, ist noch nicht ganz fertig aber es wird :slight_smile:

#include <Arduino.h>
#include <ESP8266WiFi.h>             // ESP 8266
#include <PubSubClient.h>            //MQTT 
#include "Servo.h"                   //Sevosteuerung
#include <Adafruit_NeoPixel.h>       //WS8212 LED'S


#define PIN (D2)
#define NUMP 10


// Funktionen
WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_NeoPixel strip(NUMP, PIN, NEO_GRB + NEO_KHZ800);

// Variablen
String newHostname = "GarageRobbi_1OG";
const char* ssid = "****";
const char* password = "*****";
const char* mqtt_server = "192.168.50.10";
const int mqtt_port = 1884;
const char* clientId = "Garage Robbi 1.OG";
const char* mqtt_user = "*****";
const char* mqtt_pwd = "****";
char msg[50];
Servo Klappe;
bool blink1, dauer1 ;
int pause=100;
int i1=0;
int mode, rt, gn, bl, bri;





// Verbindung mit WLan herstellen
void wifi_setup() {
 WiFi.hostname(newHostname.c_str());
 Serial.println();
 WiFi.begin(ssid, password);
 Serial.print("Verbinde mit WLan");
 while (WiFi.status() != WL_CONNECTED)
 {
   delay(500);
   Serial.print(".");
 }
 Serial.println();
 Serial.print("Connected, IP address: ");
 Serial.print(WiFi.localIP());
}

/// MQTT Client
void MQTTCallback(char* topic, byte* payload, unsigned int length) {
String Command = "";
      Serial.print("Received message [");
      Serial.print(topic);
      Serial.print("] ");
      char msg[length+1];
  for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
        msg[i] = (char)payload[i];
        Command = Command + (char)payload[i];}
        int angle = Command.toInt();
        Serial.println();

if(strcmp(topic, "Garage Robbi 1OG/Klappe") == 0){  // Eingehend Motor
  Klappe.write(angle);
}

if(strcmp(topic, "Garage Robbi 1OG/LED") == 0){ // Eingehend LED
  i1=0;
  sscanf(msg, "%d:%d:%d:%d:%d:%d", &mode, &rt, &gn, &bl, &bri);
    if (mode==0){  //Aus
  blink1 = false ;
  dauer1 = false ;
  strip.clear();
  strip.show();
  }
    else if (mode==1) { //Lauflicht Strip 1
    blink1 = true ;
    dauer1 = false ;
  }
    else if (mode==2) { //Dauer Strip 1
    dauer1 = true ;
    blink1 = false ;
  }
    else   {            // Alles Andere --> Aus
  blink1 = false ;
  dauer1 = false ;
  strip.clear();
  strip.show();
  }
}
if(strcmp(topic, "Garage Robbi 1OG/string") == 0){
  
  /*
  
  Serial.print(F("n="));
  Serial.println(n);
  Serial.print(F("mode="));
  Serial.print(mode);
  Serial.print(F(", rt="));
  Serial.println(rt);
  Serial.print(F("bl="));
  Serial.print(bl);
  Serial.print(F(", gn="));
  Serial.println(gn);
  Serial.print(F("bri="));
  Serial.print(bri);
  */
}

}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");

    if (client.connect(clientId, mqtt_user, mqtt_pwd)) {
      Serial.println("connected");
      client.subscribe("Garage Robbi 1OG/Klappe");
      client.subscribe("Garage Robbi 1OG/LED");
      client.subscribe("Garage Robbi 1OG/string");

    }
    else
    {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

void LED(){   // LEDS ansteuern
if (blink1) {
  strip.setBrightness(bri);
  strip.setPixelColor(i1, strip.Color(rt,gn,bl)); // Pixel leuchtet in der Farbe Grün
  strip.setPixelColor(i1-1, strip.Color(0,0,0)); // Der vorherige Pixel wird abgeschaltet
  strip.show(); // LED's Ansteuern
  Serial.print(i1);
  if (i1 == 0) {// wenn i1 0 Letzte (NUMP) ausschalten
    Serial.print(F("NumPixel: "));
    Serial.println(NUMP);
    strip.setPixelColor(strip.numPixels()-1, strip.Color(0, 0, 0));
  strip.show(); // LED's Ansteuern
  Serial.print(i1);
  Serial.print("10 aus");}
  delay (pause);
  i1=i1+1; // "i1" hochzählen
  if (i1==NUMP){ // wenn Ende dann i1 auf 0
  i1=0; 
  Serial.print(i1);
  Serial.print("i1 auf null");
  }  
}
if (dauer1){
   for(int i=0; i<NUMP; i++) { // For each pixel...
    strip.setBrightness(bri);
    strip.setPixelColor(i, strip.Color(rt, gn, bl));
    strip.show();   // Send the updated pixel colors to the hardware.
    }
  }
}

void setup() {          // Initialisierung beim start
  Serial.begin(9600);   // Serielle baudrate
  Klappe.attach(D1);
  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
  delay(500);
  wifi_setup() ;         // WLAN verbinden
  client.setServer(mqtt_server, mqtt_port);
  reconnect();
  client.setCallback(MQTTCallback);
}

// put your main code here, to run repeatedly:
void loop() {
//WLan überwachen / neu verbinden
   client.loop();
   LED();
if (WiFi.status() != WL_CONNECTED) {
    delay(3000);
    wifi_setup();
  }
if (!client.connected() && WiFi.status() == WL_CONNECTED){
  delay(3000);
  reconnect();
}
  
}

Habe dir mal alle rein gepackt was ich bis jetzt habe, hoffe du schlägst als Profi jetzt nicht die Hände über dem Kopf zusammen :rofl: :rofl: Die ganzen Prints waren nur zum testen, kommen am schluss noch raus...

1 Like

Natürlich :slight_smile: warst zu schnell :slight_smile:

Ja, da ist noch Luft.

Aber,
In Zeile 139 fängt bei Dir blink1 an es hört in Zeile 159 auf.
Versuche aus #17 das blink da rein zu bringen.

Void LED() hört in Zeile 167 auf.
Ab Zeile 168 setze aus #17 das mit lastPixel() ein.

So und wenn Du damit funktionsfähig bist, biete ich Dir an, das böse delay() zu ersetzen.

Bisher gut gemacht.
:+1:

Habe ich gemacht, musste aber die LastPixel vor die LED Funktion setzen sonst hat er rum gemotzt
.... , so läuft es :+1: Welchen Vorteil hat das jetzt zu meinen Code ? will ja was lernen :slight_smile: und warum ist delay böse :see_no_evil:

Mit fertig meinte ich eigentlich das noch was dazu kommt :rofl:

Weil Dein ESP kommunizieren möchte und während delay das nicht kann.

Ich habe gelesen, WS2812 und ESP8266 passen nicht optimal zusammen, weil WS2812 blockierend angesteuert werden müssen. Ich verwende daher ESP32 und FastLED, weil da die Ansteuerung per DMA, also vom Programmablauf unabhängiger Hardware, erfolgen soll.