ESP32 Blynk while Schleife

Hallo, ich möchte einen Neopixel Streifen mit Hilfe eines ESP32 und der Blynk App steuern. Ich möchte ein Neopixel per Knopfdruck auf einen virtuellen Schalter (V2) in einer Farbe blinken lassen und zwar so lange, bis ich erneut auf diesen Schalter drücke. Die Schleife startet zwar ganz normal, aber sie sollte ja so lange laufen, bis der Schalterstatus als “0” eingelesen wird (while Schleife), jedoch beendet sich die Schleife schon nach dem ersten Durchgang, obwohl im seriellen Monitor der Status “1” angezeigt wird. Ich würde mich sehr freuen, wenn mir jemand dabei helfen kann, denn ich sitze schon seit einigen Stunden an dieser Kleinigkeit :slight_smile:

#include <FastLED.h>
#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT
#define FASTLED_ESP32_RAW_PIN_ORDER
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#define NUM_LEDS1 5
#define LED_TYPE    WS2812
#define COLOR_ORDER GRB
CRGB leds1[NUM_LEDS1];
char auth[] = "AIiH_ZA1WUZu89MhA6QaxdtMe-E-0eDB";
#define PIN1 14
int data=255;
int r,g,b;
int val;
int val2;
void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth);
  FastLED.addLeds<LED_TYPE, PIN1, COLOR_ORDER>(leds1, NUM_LEDS1).setCorrection( TypicalLEDStrip );
}
 
BLYNK_WRITE(V4)
{
  r = param[0].asInt();
  g = param[1].asInt();
  b = param[2].asInt();
  static1(r, g, b,data);
}
 
void loop()
{
  Blynk.run();
}
BLYNK_WRITE(V5)
{
data = param.asInt(); 
static1(r, g, b,data);
}
void static1(int r, int g, int b,int brightness)
{
  FastLED.setBrightness(brightness);
  for (int i = 0; i < NUM_LEDS1; i++ )
  {
    leds1[i] = CRGB(r, g, b);
  }
  FastLED.show();
}
BLYNK_WRITE(V2)
{
  val = param.asInt();
  Serial.println(val);
   while (val==1)  {
    leds1[1] = CRGB(250,0,0);
    FastLED.show();
    delay(1000);
    leds1[1] = CRGB(0,0,0);
    FastLED.show();
    delay(1000);
    Serial.println(val);
    val = Serial.read(); 
if (val==0) {
  break;
}
   }
}

Ich würde raten, dass dein val = Serial.read(); in den meisten Fällen null oder gar -1 liefert

Es ist sehr eigenartig wenn ich das ganze Programm neu starte, dann drücke ich auf den Schalter V2. Der Neopixel blinkt (serieller Monitor gibt "1" aus), sobald er geblinkt hat, wird im seriellen Monitor nochmal "1" ausgegeben und die Schleife stoppt nach einem Durchgang. Wenn ich aber den Schalter wieder ausschalte, dann wird "0" angezeigt, aber die Schleife stoppt eindeutig nicht dadurch.

Auch im seriellen Monitor steht nur Text, den man als Text hier in Codetags posten kann.

Gruß Tommy

[3499257] BLE connect
[3500247] Ready
1
1
0
1
1
0

Leider kann ich dir nicht helfen...
Blynk ist mir völlig unbekannt.
Da hilft es auch nichts, wenn du mich mit PMs bedrängst....

 while (val==1)  {
    leds1[1] = CRGB(250,0,0);
    FastLED.show();
    delay(1000);
    leds1[1] = CRGB(0,0,0);
    FastLED.show();
    delay(1000);
    Serial.println(val);
    val = Serial.read();
if (val==0) {
  break;
}

Das IF und break() am Ende braucht es nicht; das macht schon das while().

delay ist nicht gut. benutze millis() schau Dir das blink without delay Beispiel ind der IDE an und suche nach der NAchtwächtererklährung hier im Forum.

Wenn Du den Wert von val serial ausgeben willst dann ist es besser das nach dem Serial.read() zu machen. Vorher ist er sicher 1 da ansonsten die while Schleife nicht ausgeführt würde.

Die Programmlogik ist falsch.
Du mußt das Blinken im loop machen ohne delay (siehe millis() und in Statusvariablen abspeichern ob gerade ein blinken eingeschaltet wurde, die LED gerade ein oder aus sein muß und welche Farbe blinken muß.
Blynk nimmt nur die Komandos von der APP entgegen und darf nur die Statusvariablen setzen.

Grüße Uwe

Vielen Dank für die Antwort, ich glaube, dass ich das Blink without delay einigermaßen verstanden habe, aber an meiner Umsetzung scheitert es noch:

BLYNK_WRITE(V6)
{
  wert = param.asInt();
  wert=Serial.read();
  Serial.println(wert);
   while (wert==1)  {
   
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    leds1[1] = CRGB(250,0,0);
    FastLED.show();
    //delay(1000);}
    
    if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    leds1[1] = CRGB(0,0,0);
    FastLED.show();
    //delay(1000);
    wert = Serial.read(); 
    Serial.println(wert);
   }

}
}
}

was soll denn das Serial.read() da drin?

Mir wurde gesagt, dass ich den Wert in der while Schleife auslesen muss, ansonsten würde sie unendlich gehen.

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