Forum: PC-Programmierung Arduino ESP32 Blynk Neopixel while Schleife mit virtuellem Schalter


von David R. (david_r378)


Lesenswert?

Hallo, ich möchte mit Hilfe eines ESP32 und der Blynk App einen Neopixel 
Streifen ansteuern. Wenn ich auf den virtuellen Schalter V6 drücke, 
möchte ich, dass ein Neopixel so lange blinkt, bis ich erneut den 
Schalter betätige. Also bei Zustand 1 so lange blinken, bis sich der 
Zustand auf 0 ändert. Wenn ich jedoch auf den Schalter drücke, dann 
läuft die while Schleife endlos ab und im seriellen Monitor wird nach 
jedem Ablauf der Schleife "1" angezeigt, obwohl ich den Schalter nochmal 
drücke. Ich weiß, dass ich in der while Schleife selbst, den Zustand vom 
Taster abfragen muss, aber anscheinend bekomme ich es nicht hin, da es 
unendlich blinkt. Ich sitze schon seit mehreren Tagen an diesem Problem 
und habe in einem anderen Forum nur frustrierende, nicht helfende 
Antworten bekommen. Ich würde mich sehr freuen, wenn mir jemand bei der 
while Schleife helfen kann oder vielleicht ist das ein falscher Ansatz.

#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 d = 1000;
int wert;
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(V6)
{
    wert = param.asInt();
    Serial.println(wert);
   while (wert==1)  {
    leds1[1] = CRGB(250,0,0);
    FastLED.show();
    delay(d);
    leds1[1] = CRGB(0,0,0);
    FastLED.show();
    delay(d);
    Serial.print(wert);

    }
}

von PittyJ (Gast)


Lesenswert?

Ich habe ja schon viel C-Code gesehen, aber hier steige ich nicht durch.

Warum heissen alle Funktonen BLYNK_WRITE ?
Und was ist V4, V5 und V6?
Wo wird denn überhaupt ein Pin abgefragt?

Oder ist das kein C/C++?

So normal Programmieren auf einem PC kannst du? Oder ist das bislang 
alles nur Copy/Paste?

von David R. (david_r378)


Lesenswert?

BLYNK_WRITE führt einen Befehl aus, wenn ein Schalter in der Blynk App 
betätigt wird. Beispiel: BLYNK_WRITE(V6) { Befehl }, wenn V6 betätigt 
wird, dann wird ein dementsprechender Befehl ausgeführt. In der App kann 
man einen Schalter auf eine graphische Oberfläche ziehen und einstellen 
welchen virtuellen Pin er schalten soll, in dem Fall V6.

Wie man oben unschwer erkennen kann, besitzt Blynk eine eigene Library 
in der Arduino IDE. Daher kommen auch Funktionen, wie "BLYNK_WRITE()", 
"Blynk.run()".

Und ja, ich gebe zu, dass ich den Code von V4 und V5 aus dem Internet 
kopiert habe, da ich keine richtige Anleitung gefunden habe wie man mit 
dem "ZeRGBa" umgeht und wie ich finde, muss man nicht alles neu erfinden 
;)

von Foo B. (foobar02)


Lesenswert?

Nabend,

ist jetzt schon ne ganze Weile her, dass ich das letzte Mal mit Blynk 
hantiert habe (und ich meine mich zu erinnern, dass es mir nie wirklich 
gefallen hat..), aber das Problem liegt für mich klar in der 
while-Schleife.

Du hast schon richtig erkannt, dass du deine Endbedingung in der 
Schleife abfragen musst. Deine Variable "wert" muss also in der Schleife 
auf != 1 gesetzt werden, wenn du den Schalter das zweite Mal betätigst.
1
while (wert==1)  
2
{
3
    leds1[1] = CRGB(250,0,0);
4
    FastLED.show();
5
    delay(d);
6
7
    leds1[1] = CRGB(0,0,0);
8
    FastLED.show();
9
    delay(d);
10
11
    Serial.print(wert);
12
    //hier fehlt die Abfrage
13
}

Insgesamt ist mir aber noch nicht ganz klar, wo der Wert von "wert" 
eigentlich herkommt, bzw. wie Blynk die Zustände der Schalter in der App 
an den ESP übergibt.

Also konkret:

1) Code aufräumen ;)

2) Herausfinden, wie der Zustand von V6 in der while-Schleife abgefragt 
werden kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.