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);
}