UDP Eingangspaket als Interrupt?

Hi,

Ich hab eine LED Steuerung programmiert, die ich per UDP An/Aus schalte

Problem: da ich die Leds mit einer for schleife dimme, blockiert der Code für 2,55 Sekunden pro Farbe.

Dadurch werden, wenn ich den Befehl zum Ausschalten geben, schaltet der LED-Streifen erst ab wenn er einmal alle Farben durchgelaufen hat.

Ich wollte erst mit millis arbeiten aber ich wollte mich, da die Grundlagen so langsam durch sind, mich mit Interrupt beschäftigen. Auch wenn das vielleicht nicht die beste Lösung ist...

Meine Idee war, die UDP() Funktion als Interrupt Arbeiten zu lassen.

Hab Google bemüht und finde aber nur Interrupts mit dem attachInterrupt() Befehl, der ja nur durch einen Pin ausgelöst wird, wenn ich das richtig verstanden habe.

und so bin ich hier gelandet.

würde das mit einem Interrupt funktionieren oder bin ich komplett auf dem Holzweg?

Mfg

#include <ESP8266WiFi.h>
#define Netzwerkname "xxx"
#define Passwort "xxx"

#include <WiFiUdp.h>
WiFiUDP Udp;

char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1];

#define localPort 4210  // Port an dem der UDP Verkehr ist

//== LED Pins ==
#define pin_rot D2
#define pin_blau D6
#define pin_gruen D5

//== Farbwert ==
byte Gruen;   // Startet mit Weiß
byte Blau;
byte Rot;

byte status = 0;  // Led status

void update() // Aktualiesiert die LED Streifen
{
  analogWrite(pin_gruen, Gruen);
  analogWrite(pin_blau, Blau);
  analogWrite(pin_rot, Rot);
}

void morph(byte* value, bool es_werde_licht) // Sktualisiert eine der Farbvariablen. Entweder heller oder dunkler
{
  for (byte i = 0; i < 255; i++)
  {
    if (es_werde_licht)
      (*value)++;

    else
      (*value)--;

    update();
    delay(10);
  }
}

void fade(bool aktiv)
{
  if (aktiv)
  {
    morph(&Rot,   false); //=== Übergang von Weiß zu Cyan ===
    morph(&Gruen, false); //=== Übergang von Cyan zu Blau ===
    morph(&Rot,   true);  //=== Übergang von Blau zu Magenta ===
    morph(&Blau,  false); //=== Übergang von Magenta zu Rot ===
    morph(&Rot,   false); //=== Übergang von Rot zu Schwarz ===
    morph(&Gruen, true);  //=== Übergang von Schwarz zu Grün ===
    morph(&Rot,   true);  //=== Übergang von Grün zu Gelb ===
    morph(&Blau,  true);  //=== Übergang von Gelb zu Weiß (alle aus) ===
  }
  if (!aktiv)
  {
    Gruen = 0;   // Leds aus
    Blau = 0;
    Rot = 0;

    update();
  }
}

void UDP()
{
  int packetSize = Udp.parsePacket();

  if (packetSize)
  {
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;

    if (strncmp(packetBuffer, "A1", 2) == 0)  // == Leds anschalten ==
    {
      status = 1;

      Gruen = 255;   // Startet mit Weiß
      Blau = 255;
      Rot = 255;
      update();
    }

    else if (strncmp(packetBuffer, "A0", 2) == 0) // == Leds ausschalten ==
      status = 2;

  }
}
void setup()
{
  // Serial.begin(115200);

  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);

  WiFi.begin(Netzwerkname, Passwort);

  while (WiFi.status() != WL_CONNECTED)
    yield(); // tu nichts
  
  Udp.begin(localPort);
}

void loop()
{

  UDP();

  if (status == 1) // Schalte Leds an
    fade(true);

  if (status == 2) // Schalte Leds nach beendeter durchgang aus
    fade(false);

}

Kann denn dein Controller (welcher ?) UDP-Pakete empfangen, wenn die for-Schleife läuft ?

ja Holzweg.
löse die for schleife auf!

HotSystems:
Kann denn dein Controller (welcher ?) UDP-Pakete empfangen, wenn die for-Schleife läuft ?

oh dachte das hätte ich noch geschrieben. WEMOS D1 MINI

und ja kann er. Wenn er die Farben durchläuft und ich mittendrin den Befehl gebe, wird der Streifen wenn die Funktionen fertig gelaufen sind, ausgeschaltet.

noiasca:
ja Holzweg.

Weil das mit dem Interrupt nicht geht oder weil das nicht sinnvoll wäre ?

Mfg

sippy23_08:
und ja kann er. Wenn er die Farben durchläuft und ich mittendrin den Befehl gebe, wird der Streifen wenn die Funktionen fertig gelaufen sind, ausgeschaltet.

Dann kannst du die gewünschte Steuerung an geeigneter Stelle durchführen, wenn du die for-Schleife aufgelöst hast.

sippy23_08:
Weil das mit dem Interrupt nicht geht oder weil das nicht sinnvoll wäre ?

warum blockierst du deinen Code und willst mit anderen Mitteln diese Blockade umgehen?
Schreibe nicht blockierenden Code.
Problem gelöst.

noiasca:
warum blockierst du deinen Code und willst mit anderen Mitteln diese Blockade umgehen?
Schreibe nicht blockierenden Code.
Problem gelöst.

weil ich wie gesagt lernen will wie Interrupt funktionieren

... dafür braucht's aber keine Blockade - die Interrupts 'tun' auch so.

Hallo,

Dein Lösungsansatz ist falsch. Wahrscheinlich gibt es auch keine einfache Möglichkeit das der ESP dir einen Interupt auslöst an den du so einfach drann kommst. Es wurde sicher einfach nicht vorgesehen weil es der falsche Weg ist. Der ESP kann im Hintergrund Daten empfangen soweit ok. Du fragst sie irgendwann ab, wann du das tust ist Deine Sache.

Vor einiger Zeit hab ich mal was geschrieben was sich anhand eines Beispiels genau mit deinem Thema beschäftigt. Lesen und verstehen.

Tutorial für Anfänger

Heinz

Der Esp kann das vielleicht in den Tiefen seiner Core Programmierung, oder wie man dazu sagen mag.

  1. Holzweg
  2. mit loop hast du schon eine Schleife
  3. das delay macht eine for Schleife erst richtig böse.
  4. wenn du es unbedingt so lassen willst, ruf doch die udp Routine in der for Schleife auf

sippy23_08:
weil ich wie gesagt lernen will wie Interrupt funktionieren

Wir versuchen "verzweifelt" dir zu erklären, das dies mit dem ESP und UDP nicht funktioniert.
Jedenfalls ist mir kein Weg bekannt.

Also mach es in der Loop.
Den Umgang mit einem IRQ kannst du dann immer noch mit einem Uno lernen.

Hi,

Es gibt eine Bibliothek die Ticker heißt die ruft eine Funktion in einem Festgelegten Intervall. Hat mit dem blockierenden Code auch gut funktioniert. Weiß nicht ob man das mit einem Interrupt vergleichen kann.

Hab die aber nicht benutzt und es so gemacht. Das einzige was jetzt noch blockiert ist der delay von 10ms der mich aber nicht stört.

//== LED Pins ==
#define pin_rot D2
#define pin_blau D6
#define pin_gruen D5

//== Farbwert ==
byte Gruen = 255;   // Startet mit Weiß
byte Blau = 255;
byte Rot = 255;

char farben [] =
{
  'W', // Weiss
  'C', // Cyan
  'B', // Blau
  'M', // Magenta
  'R', // Rot
  'S', // Scjwarz
  'G', // Grün
  'Y', // Gelb
};

byte farbstatus = 0;

void update() // Aktualiesiert die LED Streifen
{
  analogWrite(pin_gruen, Gruen);
  analogWrite(pin_blau, Blau);
  analogWrite(pin_rot, Rot);
}

void morph(byte* value, bool es_werde_licht) // Sktualisiert eine der Farbvariablen. Entweder heller oder dunkler
{
  static byte i = 0;

  if  (i < 255)
  {
    if (status == 0)
    {
      if (es_werde_licht)
        (*value)++;

      else
        (*value)--;

      update();
      delay(10);

      i++;
    }
  }
  else if (i >= 255)
  {
    i = 0;
    farbstatus++;
  }
  if (farbstatus >= 8)  farbstatus = 0; // von vorne beginnen
}

void fade(bool aktiv)
{
  if (aktiv)
  {
    char aktueller_farbstatus = farben[farbstatus];

    if (aktueller_farbstatus == 'W') morph(&Rot,   false); //== Übergang von Weiß zu Cyan ==
    if (aktueller_farbstatus == 'C') morph(&Gruen, false); //== Übergang von Cyan zu Blau ==
    if (aktueller_farbstatus == 'B') morph(&Rot,   true);  //== Übergang von Blau zu Magenta ==
    if (aktueller_farbstatus == 'M') morph(&Blau,  false); //== Übergang von Magenta zu Rot ==
    if (aktueller_farbstatus == 'R') morph(&Rot,   false); //== Übergang von Rot zu Schwarz ==
    if (aktueller_farbstatus == 'S') morph(&Gruen, true);  //== Übergang von Schwarz zu Grün ==
    if (aktueller_farbstatus == 'G') morph(&Rot,   true);  //== Übergang von Grün zu Gelb ==
    if (aktueller_farbstatus == 'Y') morph(&Blau,  true);  //== Übergang von Gelb zu Weiß ==
  }
  if (!aktiv)
  {
    farbstatus = 0;

    Gruen = 0;   // Leds aus
    Blau = 0;
    Rot = 0;

    update();
  }
}

Na, das ist doch prima.
Wenn es dann auch funktioniert ist dein Problem gelöst.
Super.

HotSystems:
Na, das ist doch prima.
Wenn es dann auch funktioniert ist dein Problem gelöst.
Super.

Jap funzt. Danke für die Mühe

Frohe Ostern