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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von David R. (david_r378)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.