Stepper und ArtNet auf einem ESP8266

Moin zusammen,

da meine Google Latein am ende sind, wende ich an Euch und hoffe Hilfe zu erhalten.
Was C++ Programmierung angeht bin ich ein ziemlicher Neuling, und habe dies diverse Verständnis Probleme.
Ich versuche ein Projekt umzusetzen mit ArtNet, Stepper und WS2812 Led, zu den einzelnen Themen gibt es
viele Projekte aber keins was die o.g. Punkte zusammen abdeckt.
Als Board verwende ich ein ESP8266 ( https://www.amazon.de/gp/product/B0754HWZSQ/ref=ppx_yo_dt_b_asin_image_o04_s00?ie=UTF8&psc=1 )
als Stepper einen A4988. Das ganze ist im Moment als STEP und DIR angeschlossen.
Artnet und Stepper laufen bereits einzeln, aber wenn ich vom Artnet den DMX wer an Stepper übergebe läufts irgendwie nicht sauber.
Es füllt sich so an, als würde die Stepper lib auf genug daten warten und erst dann sich bewegen.
Als Artnet Sender verwende ich QLC+ ( https://www.qlcplus.org/ )
Ich hoffe habt eine Idee wo mein Denkfehler ist.

MfG

Andreas

; PlatformIO Project Configuration File
[env:esp12e]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
lib_deps = 
	rstephan/ArtnetWifi@^1.4.0
	fastled/FastLED @ ^3.4.0
	waspinator/AccelStepper@^1.61
upload_speed = 921600
board_build.filesystem = littlefs
build_flags =
#include <ESP8266WiFi.h>
#include <ArtnetWifi.h>
#include <Arduino.h>
#include <FastLED.h>
#include <AccelStepper.h>

//Stepper 
#define STEPPER1_DIR_PIN D4
#define STEPPER1_STEP_PIN D3
AccelStepper stepper(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);

// WiFi stuff
const char* ssid = "FRITZ!Box 7490";
const char* password = "12345678";
// LED settings
const int numLeds = 1; // CHANGE FOR YOUR SETUP
const int numberOfChannels = numLeds * 3; // Total number of channels you want to receive (1 led = 3 channels)
const byte dataPin = 2;
CRGB leds[numLeds];

// Art-Net settings
ArtnetWifi artnet;
WiFiUDP UdpSend;
const int startUniverse = 0; // CHANGE FOR YOUR SETUP most software this is 1, some software send out artnet first universe as 0.

// Check if we got all universes
const int maxUniverses = numberOfChannels / 512 + ((numberOfChannels % 512) ? 1 : 0);
bool universesReceived[maxUniverses];
bool sendFrame = 1;
int previousDataLength = 0;





// connect to wifi – returns true if successful or false if not
boolean ConnectWifi(void)
{
  boolean state = true;
  int i = 0;

  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20){
      state = false;
      break;
    }
    i++;
  }
  if (state){
    Serial.println("");
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("");
    Serial.println("Connection failed.");
  }

  return state;
}


void initTest()
{
  for (int i = 0 ; i < numLeds ; i++) {
    leds[i] = CRGB(127, 0, 0);
  }
  FastLED.show();
  delay(500);
  for (int i = 0 ; i < numLeds ; i++) {
    leds[i] = CRGB(0, 127, 0);
  }
  FastLED.show();
  delay(500);
  for (int i = 0 ; i < numLeds ; i++) {
    leds[i] = CRGB(0, 0, 127);
  }
  FastLED.show();
  delay(500);
  for (int i = 0 ; i < numLeds ; i++) {
    leds[i] = CRGB(0, 0, 0);
  }
  FastLED.show();
}

void onDmxFrame(uint16_t universe, uint16_t length, uint8_t sequence, uint8_t* data)
{
  sendFrame = 1;
  // set brightness of the whole strip
  if (universe == 15)
  {
    FastLED.setBrightness(data[0]);
    FastLED.show();
  }

  // Store which universe has got in
  if ((universe - startUniverse) < maxUniverses) {
    universesReceived[universe - startUniverse] = 1;
  }

  for (int i = 0 ; i < maxUniverses ; i++)
  {
    if (universesReceived[i] == 0)
    {
      //Serial.println("Broke");
      sendFrame = 0;
      break;
    }
  }

  // read universe and put into the right part of the display buffer
  for (int i = 0; i < length / 3; i++)
  {
    int led = i + (universe - startUniverse) * (previousDataLength / 3);
    if (led < numLeds)
      leds[led] = CRGB(data[i * 3], data[i * 3 + 1], data[i * 3 + 2]);
  }
  previousDataLength = length;

  if (sendFrame)
  {
    FastLED.show();
    // Reset universeReceived to 0
    memset(universesReceived, 0, maxUniverses);
  }
}

void setup()
{
  
  Serial.begin(115200);
  ConnectWifi();
  artnet.begin();
  FastLED.addLeds<WS2812, dataPin, GRB>(leds, numLeds);
  initTest();

  // this will be called for each packet received
  artnet.setArtDmxCallback(onDmxFrame);

  digitalWrite(D3, LOW); // Currently no stepper motor movement
  digitalWrite(D4, LOW);
  stepper.setMaxSpeed(2500);
  stepper.setAcceleration(1200.0);
  //stepper.setMinPulseWidth(20);

} //End Setup

void loop(){
  // we call the read function inside the loop
  artnet.read();

  uint16_t r = artnet.read();
  if(r == ART_POLL)
  {
    Serial.println("POLL");
  }
  if (r == ART_DMX)
  {
   // print out our data
   Serial.print("universe number = ");
   Serial.print(artnet.getUniverse());
   Serial.print("\tdata length = ");
   Serial.print(artnet.getLength());
   Serial.print("\tsequence n0. = ");  
   Serial.println(artnet.getSequence());
   Serial.print("DMX data: ");
    
    for (int i = 0 ; i < 1 ; i++)
    {
      Serial.print(artnet.getDmxFrame()[i]);
      int analog_in = analogRead(artnet.getDmxFrame()[i]);
      stepper.runToNewPosition(analog_in); //send to stepper  
      //stepper.moveTo(analog_in);
      //stepper.setSpeed(100);
      //stepper.runSpeedToPosition();
      //stepper.run();
      Serial.print("  "); 
    }
    Serial.println();
    Serial.println();
  }


  delay(50);
}

Ich fürchte, dein Denkfehler ist, dass dir jemand helfen könnte aufgrund der Beschreibung
"... läufts irgendwie nicht sauber"

Auch fürchte ich, keiner wird dein komplettes Projekt incl. Hardware nachbauen. Nur um zu sehen, was du unter "nicht sauber" verstehst.

Und mit platformIO, artnet und esp8266 ist es zwar nett, dass du hier fragst, erinnert aber an die Strategie, nach einem verlorenen Schlüssel unter der Laterne zu suchen weil es da am hellsten ist, und so die Erfolgs-Chance erhöht.

Hallo michael_x,

danke fürs feedback.
Ja du hast recht ich hätte es anders formulieren sollen.
Der C++ Syntax ist für mich als Anfänger an gewissen stellen noch nicht ganz klar, wie z.B.:
for (int i = 0 ; i < 1 ; i++)
Warum wird "i++ "benutzt, es erhöht die zahl nach jedem durchlauf der "for" Schleife. Aber wofür ?
Wenn ich die AccelStepper lib ohne Artnet laufen lasse, und ein Poti verwende, funktioniert es wie erwartet.
Aber wenn ich dann den gewünschten "Wert" von Artnet übergebe, wartet das ganze immer einen moment und lässt
ein teil der Sequenz die vom Artnet kommt laufen und stoppt wieder.
Mein vermuten als Laie ist dass entweder AccelStepper lib ein problem damit hat das es sich ständig um einen
neuen "Wert" kümmern soll oder irgendwo läuft der Speicher voll und wenn dieser geleert wurde kann AccelStepper
was machen.

Any Ideas ?

Grus
Andreas

for (int i = 0 ; i < 1 ; i++)

Warum wird "i++ "benutzt

Warum-Fragen gleiten generell gern ins generelle, philosophische ab.

Wie in C/C++ eine for-Schleife im Prinzip aussieht, sollte dir schon klar sein.

Wenn du danach fragen würdest, warum hier überhaupt eine for Schleife verwendet wird, insbesondere wegen der i<1 Bedingung, wäre die Antwort wohl nur, "ja, da hast du Recht, warum eigentlich..."

In deinem Fall ist die Antwort, dass

const int numLeds = 1; // CHANGE FOR YOUR SETUP

ein Sonderfall ist, und üblicherweise die ganze FastLED Geschichte nicht für eine einzelne LED gedacht ist.

ArtNet und ESP8266 sind mir weitgehend unbekannt.

Was ich sehe:

  • runToNewPosition ist blockierend.
  • delay(50); in loop ist piep piep piep

Beide Punkte sind zusammen mit anderen Aktionen ungeeignet.