Anfänger benötigt Hilfe beim Lauflicht

Hallo zusammen,
bin absoluter Neuling auf dem gebiet :see_no_evil:

Habe aber mit viel testen, lesen und Videos schon viel hinbekommen.

ich steuere über MQTT einen LED Streifen an, klappt fast alles, beim Lauflicht geht die letzte einfach nicht aus :frowning:

habe schon einiges getestet aber evtl. sieht von euch jemand den fehler.
nicht erschrecken habe einige serielle ausgaben reingepackt..

if (blink) {
  strip.setPixelColor(i1, strip.Color(0,150,0)); // 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);
  delay (1000);
  if (i1==0){  // wenn i1 0 Letzte (NUMP) ausschalten 
  strip.setPixelColor(NUMP, strip.Color(0,0,0)); 
  strip.setPixelColor(NUMP-5, strip.Color(255,0,0)); // Testweise NUMP -5 auf rot
  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");
  } 
}

Die rote LED im Code geht sogar an, also scheint der Code "soweit" zu laufen

Hoffe jemand hat noch eine idee :slight_smile:

Frank

Ja.
NUMP hat einen falschen Inhalt.
Den verschweigst Du leider.
Auch eine Kopie der seriellen Ausgaben könnte vielleicht helfen...?

NUMP ist die Anzahl der LED sind 10
die seriellen Ausgaben kommen sofort

hier noch die ausgabe habe mal einen Zyklus genommen...

i1 auf null0010 aus1234567890i1 auf null 

Sehe es aber glaube ich schon selber da steht keine 10 :see_no_evil: abder warum ?

Sag ich ja.
Dein Array fängt bei 0 an und hat 10 Einträge.
Zeig mal Deine Initialisierung der Variablen.
Also alles was als globale Variablen vor dem Setup deklariert und initialisiert ist.

#include "Arduino.h"
#include <ESP8266WiFi.h>   // Board
#include <PubSubClient.h>  //MQTT
#include <Adafruit_NeoPixel.h>   //WS8212
//
WiFiClient espClient;
PubSubClient client(espClient);

// Variablen
char msg[50];
const char* ssid = "***";
const char* password = "***";
const char* mqtt_server = "192.168.50.200";
const int mqtt_port = 1883;
const char* clientId = "TestMcu";
const char* mqtt_user = "***";
const char* mqtt_pwd = "***";
bool blink ;


#define PIN    (D2)
#define NUMP 10

Sollte alles sein

Ne, da fehlt was.
Dann mal das setup und die initialisierung der Neopixel.

void setup() {

  Serial.begin(9600);   // Serielle baudrate
  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)

  pinMode(D4, OUTPUT);
  delay(500);
  wifi_setup() ;         // WLAN verbinden
  client.setServer(mqtt_server, mqtt_port);
  reconnect();
  client.setCallback(MQTTCallback);


}
int pause=2000;
int i1=0;

die zei waren mir gerade durch gegangen ... da isser :see_no_evil: :see_no_evil:

Das INIT der Pixel sieht so aus: (?)

Adafruit_NeoPixel strip(NUMP, D4, NEO_GRB + NEO_KHZ800);

nicht ganz

Adafruit_NeoPixel strip(NUMP, PIN, NEO_GRB + NEO_KHZ800);

Ok. Das ist dann Deine Obergrenze.
Die wird abgebildet von 0-9. Das sind 10 Werte.
Damit dürfte deine LED

nicht an Stelle 5 aufleuchten?

Jetzt wo du es sagst ist die 6.

Ich weiss. :wink:
Las mir nen Moment - ich hab sowas nicht, weiss aber wie es gehen kann....

Zeit ist um.
Möchtest Du das mal ersetzen. Wo es reingehört sollte klar sein:

  if (i1 == 0) // wenn i1 0 Letzte (NUMP) ausschalten
  {
    Serial.print(F("NumPixel: "));
    Serial.print(strip.numPixels());
    Serial.println(NUMP);
    strip.setPixelColor(strip.numPixels(), strip.Color(0, 0, 0));
    strip.setPixelColor(strip.numPixels() - 5, strip.Color(255, 0, 0)); // Testweise NUMP -5 auf rot

die 10 bleibt immer noch an :frowning:
und die 6 rot

die ausgabe ...

010 aus1234567890i1 auf null0NumPixel: 10
010 aus

Ja klar! Der zählt ja auch durch. Also alle ersetzen:

strip.numPixels()-1

Super das wars :+1: :+1: :+1:
jetzt noch mal drüber sehen und verstehen :slight_smile:
Vielen vielen Dank

Möchtest Du insgesamt ersetzen?

if (blink)
{
  strip.setPixelColor(i1, strip.Color(0, 150, 0)); // 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);
  delay (1000);
  if (i1 == 0) // wenn i1 0 Letzte (NUMP) ausschalten
  {
    Serial.println();
    Serial.print(F("NumPixel: "));
    Serial.print(lastPixel());
    Serial.print("\t");
    Serial.println(NUMP);
    strip.setPixelColor(lastPixel(), strip.Color(0, 0, 0));
    strip.setPixelColor(lastPixel() - 5, strip.Color(255, 0, 0)); // Testweise NUMP -5 auf rot
    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");
  }
}

uint16_t lastPixel()
{
  strip.numPixels() - 1;
}

Dann erklär ich.

Ja mach ich

er motzt aber

'lastPixel' was not declared in this scope

oder muss das uint16_t lastPixel() nach oben

uint8_t lastPixel()
{
return strip.numPixels() - 1;
}

// Edit: uint8_t reicht auch - mehr geht ja mit 10 nicht.

ich lass mal die 16 (wozu ist die) drin wenn's läuft ist nur ein Reststück, deshalb bau ich ja mit Variablen, weis noch nicht wieviele es werden ...

er motzt aber immer noch rum :frowning:

src\main.cpp: In function 'void loop()':
src\main.cpp:184:18: error: 'lastPixel' was not declared in this scope
  184 |     Serial.print(lastPixel());
      |                  ^~~~~~~~~
src\main.cpp: At global scope:
src\main.cpp:214:1: error: expected declaration before '}' token
  214 | }
      | ^
*** [.pio\build\d1_mini\src\main.cpp.o] Error 1