Krippenprojekt mit LED und Schieberegler flackert

zwischen intervall und 100 fehlt ein =
(trage ich noch nach)

Um es ganz deutlich zu sagen.
Die Nummerierung vom ESP8266-Minimodul unterscheidet sich von der GPIO-Nummerierung

Die Nummerierung vom der ESP8266-Wemos-Platine unterscheidet sich von der GPIO-Nummerierung
Das einzige was ich mir vorwerfen lassen kann ist das ich umgenau geschrieben habe
Pin 2 ist GPIO2. Die kurze dürre Zeichenfolge "Pin 2" enthält keine Hinweise darauf welchen "Pin" bzw. welche Pin-Nummerierung ich jetzt meine.
Es bleibt unklar ob ich
die Nummerierung der

  • ESP8266-Modul (die kleine aufgelötete Platine mit der Platinen-Antenne)
  • die SMD-Chip-Lötkontakte des eigentlichen ESP8266-chips im inneren des ESP8266-Moduls
  • die Anschlüsse auf der Wemos D1-Mini-Platine im 2,54 mm Raster

meine.

Damit ich das jetzt so verstehe:
lastHelligKeit wird auf 0 gesetzt in einem uint8_t (Wertebereich 0-255)
Wenn lastHelligKeit gleich ist wie HELLIGKEIT_STALL gehe aus der Funktion
Wenn ungleich dann fülle lastHelligKeit mit dem aktuellen Wert von HELLIGKEIT_STALL aus dem Schieberegler
der Rest ist bekannt.

Der einzige Unterschied, den ich jetzt sehe ist der, dass er aus der Funktion wieder herausgeht, wenn die Werte sich nicht verändert haben?

Nein.
Die Pin-Benamsung entspricht nicht der GPIO-Benamsung
Das ist schon immer so gewesen und ich kann mich auch daran erinnern, dass es früher immer hieß, dass in der PIN-Definition die GPIO oder die Dx Schreibweise benutzt werden sollte um Missverständnisse zu vermeiden.

Es ist und bleibt damit aber trotzdem nicht unklar, was 2 ist.
Im Code ist es die Dx in der Platinenbeschreibung bleibt es bei der Zuordnung wie oben auf den Bildern.

und genau so soll es sein. Es wird nur was an den Stripe gesandt wenn sich die Helligkeit durch den Slider geändert hat.

Richtig.
Und damit schreibt er auch nicht neu auf die Pins.
Beim Feuer verbrauchst Du Rechenzeit mit dem delay().
In den 100ms passiert nix.
Eigentlich gar nix. Ausser das der Controller um sich selbst kümmert.
Jede Änderung die Du mit dem Webserver machen würdest, würde erst nach 100ms erfasst und ausgeführt.

Bei den Stripes sorge ich dafür, dass die Stripes nur beschrieben werden, wenn die Werte sich ändern.
Du blockierst mit jedem schreiben die Interrupts, da sie für die Zeit abgeschaltet sind.

Willst Du mal wissen, wieviel Zeit Du verbratest? :sweat_smile:

Argh, das hätt ich auch sehen müssen (können)...

Ein Schönheitsfehler besteht noch: die erste LED leuchtet nur grün, egal, wie viel gedimmt wird... Ich glaube ich schneide sie einfach raus... :wink:

Da ich eigentlich nur die Helligkeit während der Laufzeit abändern möchte, hätte ich gedacht, ich setze den stall(); ins Setup und den h_Stall(); ins Loop.

Wenn ich das mache kann ich auch dimmen, ich darf jedoch nicht ganz aus dimmen, dann habe ich wieder farbkino... Komisch, da wird doch in den Farben nichts verändert?

Ich mach jetzt mal nen Interrupt und gönn mir nen Kaffee..

Herzlichen Dank!

Abschließend der vollständige Code:

#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

const char* ssid = "DeineSSID";
const char* password = "DeinPASSWD";
 
int ledPin = D4;
int HELLIGKEIT_STALL = 100;
ESP8266WebServer server(80);

#define FEUER_1  15
#define FEUER_2  13

// Which pin on the Arduino is connected to the NeoPixels?
#define PINSTALL        2 // STALL
#define NUMPIXELS_STALL 10 //5
#define ROT_STALL        250 
#define GRUEN_STALL      160
#define BLAU_STALL       0
//#define HELLIGKEIT_STALL 

Adafruit_NeoPixel pixelsSTALL(NUMPIXELS_STALL, PINSTALL, NEO_GRB + NEO_KHZ800);

void setup() {
  // put your setup code here, to run once:
  pixelsSTALL.begin();
  stall();
  pinMode(FEUER_1, OUTPUT);
  pinMode(FEUER_2, OUTPUT);

  #if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

Serial.begin(115200);
  delay(10);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
 
  // Mit Wifi verbinden
  Serial.print("Verbinden mit: "); 
  Serial.println(ssid);
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi verbunden");

  server.on("/", []() {
    if (server.args()) {
      uint16_t input;
      digitalWrite(ledPin, input = server.arg(0).toInt());
      HELLIGKEIT_STALL = input;
      //Serial.printf("HELLIGKEIT_STALL: %d\n", HELLIGKEIT_STALL);
      server.send(204);
    }
    else {
      server.send(200, "text/html", "Stall: <input type='range' min='0' max='255' oninput='fetch(`? =` + value)'>");
    }
  });
  server.begin();

  Serial.println("Server gestartet");
 
  // Print the IP address
  Serial.print("Diese URL zum Verbinden aufrufen: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");

  //stall();

}

void loop() {
  // put your main code here, to run repeatedly:

server.handleClient();

stall();
  
feuer();

}


void feuer()
{
  static uint32_t lastMillis = 0;
  const uint32_t intervall = 100;
  if (millis() - lastMillis > intervall)
  {
    lastMillis += intervall;
    analogWrite(FEUER_1, random(150));
    analogWrite(FEUER_2, random(150));
  }
}


void h_stall()
{
  static uint8_t lastHelligKeit = 0;
  if (lastHelligKeit == HELLIGKEIT_STALL)
  { return; }
  lastHelligKeit = HELLIGKEIT_STALL;
  pixelsSTALL.setBrightness(HELLIGKEIT_STALL);
  pixelsSTALL.show();
  Serial.printf("HELLIGKEIT_STALL: %d\n", HELLIGKEIT_STALL);
}


void stall()
{
  static uint8_t lastHelligKeit = 0;
  if (lastHelligKeit == HELLIGKEIT_STALL)
  { return; }
  lastHelligKeit = HELLIGKEIT_STALL;
  Serial.printf("HELLIGKEIT_STALL: %d\n", HELLIGKEIT_STALL);
  pixelsSTALL.setBrightness(HELLIGKEIT_STALL);
  // The first NeoPixel in a strand is #0, second is 1, all the way up
  // to the count of pixels minus one.
  for (int i = 0; i < NUMPIXELS_STALL; i++) // For each pixel...
  {
    // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255
    // Here we're using a moderately bright green color:
    pixelsSTALL.setPixelColor(i, pixelsSTALL.Color(ROT_STALL, GRUEN_STALL, BLAU_STALL));
    // Send the updated pixel colors to the hardware.
    //delay(DELAYVAL); // Pause before next pass through loop
  }
  pixelsSTALL.show();
}

Dein erster Pixel ist kaputt.
Dir fehlt ein Widerstand zwischen abgehendem IO-Pin des ESP und dem Stipe-Input in Reihe als Strombegrenzer.
Durch die fehlende Begrenzung schiesst Du den Pixel ab, wenn die Versorgungspannung des ESP und des Stripes nicht gleichzeitig aus geht.

Sei froh, dass Du überhaupt noch was siehst.
Auf manchen Stripes geht der erste Pixel kaputt und der Rest bleibt auch dunkel ...

Wenn Du einen R in der leitung hast, kannst Du den ersten Pixel rausschneiden und dann sollte das Phantomflackern auch aufhören.

Mach nen Erledigthaken ran, dann kann sich der Rest über Pinnummern und TTL-Pegel austauschen - für mich wäre es dann erledigt.

Bei einer Wordclock hätte ich eher etwas statisches erwartet :sweat_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.