Wie Wifi in Neopixel mit WS2821b und D1 Mini integrieren?

Hey Leute :slight_smile:

Ich versuche gerade mit Wemos D1 Minis ein paar LED-Streifen (WS2812b) per WLAN zu steuern.

Mein Problem:

  • Wie überprüfe ich bei jeder Loop den Status von Wifi und SQL-Datenbank, ohne dass es ewig dauert?

Mein Versuch 1

void setup() {
[...]
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    MYSQL_DISPLAY0(".");
  }

  while (conn.connect(server, server_port, user, password) != RESULT_FAIL) {
    delay(500);
    MYSQL_DISPLAY0(".");
  }
[...]
}

void loop() {
   // der Code für die LEDs
}

--> Problem: Sobald die Wifi-Verbindung aus irgendeinem Grund kurz weg ist, stürzt der D1 Mini ab.

Daher brauche ich eine andere Lösung, aber meine einzige Idee ist so etwas. Damit bin ich auch nicht sonderlich glücklich, da glaube (!), dass diese Lösung durch die if-Schleife Probleme machen könnte.

Mein Versuch 2

void loop() {
  while ((WiFi.status() == WL_CONNECTED) && (conn.connect(server, server_port, user, password))) {
  {
      // der Code für die LEDs
  }

  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    MYSQL_DISPLAY0(".");
  }

  while (conn.connect(server, server_port, user, password) != RESULT_FAIL) {
    delay(500);
    MYSQL_DISPLAY0(".");
  }

}

---> Problem: Jede Loop dauert jetzt ca. 500ms, so dass die Rainbow-Effekte nicht mehr laufen.

Über einen Lösungsvorschlag wäre ich dankbar :slight_smile:

LG LG Lvpvs

Ok... möglicherweise habe ich doch eine Variante 3 gefunden, die evtl. funktioniert.

Testlauf läuft, aber:

void setup () {
[...]
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    MYSQL_DISPLAY0(".");
  }
  while (conn.connect(server, server_port, user, password) != RESULT_FAIL) {
    delay(500);
    MYSQL_DISPLAY0(".");
  }

[...]
}

void loop () {
  if (conn.connected()) {
    red = runQuery(queryRed);
    green = runQuery(queryGreen);
    blue = runQuery(queryBlue);
    duration = runQuery(queryDuration);
    brightness = runQuery(queryBrightness);
    patternCurrent = runQuery(queryPattern);
  }
  else {
    WiFi.begin(ssid, pass);

    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      MYSQL_DISPLAY0(".");
    }

    while (conn.connect(server, server_port, user, password) != RESULT_FAIL) {
      delay(500);
      MYSQL_DISPLAY0(".");
    }
  }

  // der Code für die LEDs
}

--> eine Loop dauert ca. 50-70ms und eine Server-Restart/Verbindungsabbruch hält es jetzt aus.

--> Vielleicht habe ich bereits die Lösung, d.h. vielleicht kann der Thread geschlossen werden :see_no_evil: Testlauf läuft.

Datenbankabfragen dauern ihre Zeit. Warum holst Du nicht alle Werte in einer Abfrage? Wie sehen Deine Abfragen aus?

Gruß Tommy

Danke für deine Antwort =)

Weil ich es leider nicht hinbekomme einen Array bei einer Funktion als return zurückzugeben. Ansonsten hätte ich das sehr gerne gemacht ^^

Aktuell sieht das Query-Geschehen so aus:

String queryBrightness = String("SELECT brightness FROM ") + default_database + "." + default_table
                         + " WHERE device_id = '" + default_value + "'";
String queryPattern = String("SELECT pattern FROM ") + default_database + "." + default_table
                      + " WHERE device_id = '" + default_value + "'";
String queryRed = String("SELECT red FROM ") + default_database + "." + default_table
                  + " WHERE device_id = '" + default_value + "'";
String queryGreen = String("SELECT green FROM ") + default_database + "." + default_table
                    + " WHERE device_id = '" + default_value + "'";
String queryBlue = String("SELECT blue FROM ") + default_database + "." + default_table
                   + " WHERE device_id = '" + default_value + "'";
String queryDuration = String("SELECT duration FROM ") + default_database + "." + default_table
                       + " WHERE device_id = '" + default_value + "'";

int runQuery(String query)
{
  row_values *row = NULL;
  long result = 0;
  
  // Execute the query
  sql_query.execute(query.c_str());
  
  // Fetch the columns (required) but we don't use them.
  sql_query.get_columns();
  
  // Read the row (we are only expecting the one)
  do 
  {
    row = sql_query.get_next_row();
    if (row != NULL) 
    {
      result = atol(row->values[0]);
    }
  } while (row != NULL);
  
  // Now we close the cursor to free any memory
  sql_query.close();

  return result;
}

Lieber wäre mir allerdings:

sqlQuery = String("SELECT red, green, blue, duration, brightness, pattern FROM ") + default_database + "." + default_table
                         + " WHERE device_id = '" + default_value + "'";

Und dann mit einem

red = result[0]
green = result[1]
...

Aber wie gesagt habe ich einen Array als return nicht hinbekommen. Hast du da eine Idee?

Des weiteren hat mein aktueller Code (Version 3) leider gerade folgenden Fehler geliefert:

12:34:49.945 ->  ets Jan  8 2013,rst cause:4, boot mode:(3,6)
12:34:49.945 -> 
12:34:49.945 -> wdt reset
12:34:49.945 -> load 0x4010f000, len 3460, room 16 
12:34:49.992 -> tail 4
12:34:49.992 -> chksum 0xcc
12:34:49.992 -> load 0x3fff20b8, len 40, room 4 
12:34:49.992 -> tail 4
12:34:49.992 -> chksum 0xc9
12:34:49.992 -> csum 0xc9
12:34:49.992 -> v00046e90
12:34:49.992 -> ~ld

d.h. Version 3 ist auch nicht stabil ^^

ist das klug?
Wie oft in der Sekunde kann sich der Wert in der DB ändern dass das sinn machen kann?

Was willst du genau erreichen?

Vermutlich werde ich es nie realisieren, aber ich habe stets live-Lichttechnik (Ersatz für DMX) im Hinterkopf, d.h. einen schnellen Lichtwechsel zur Musik.

dann macht ein DMX "Empfang" via Artnet oder RS485 wohl mehr Sinn als DMX in eine DB zu schreiben und von der DB wieder auslesen zu wollen.

Für eine Kabel-Variante auf jeden Fall, ja.

Aber das ist bei diesem Projekt gerade nicht mein Problem :thinking: sondern als primäres Problem der Absturz und als sekundäres das zurückgeben von Arrays bei einer Funktion.

dann mach mal einen kompilierbaren sketch der dein Problem zeigt und lass alles weg was nicht ein primäres Problem ist.

weil "wie prüfst du den Wifi Status" ist

if (WiFi.status() == .... was auch immer dich interessiert)

und nein ... im loop brauchst nicht immer ein wifi.begin() ... das brauchst nur wennst kein Wifi hast.

Über die if-Schleife wird wifi.begin() ja nur aufgerufen, falls keine sql-Verbindung vorhanden ist, d.h. in dem Fall verbindet er sich mit dem WiFi erst mal neu und stellt dann eine db-Verbindung her, aber nicht standardmäßig in jeder Loop.

Ist das nicht gut?

Ich kann verstehen, dass das gerade sehr sinnvoll wäre, aber ich wüsste gerade nicht wie. Ich kann es nicht wirklich auf einen Code-Abschnitt einschränken :thinking: und leider tritt es auch erst (bislang) nach mindestens 45 Minuten Laufzeit auf ^^ ich kann es nicht reproduzieren :-/

Hallo,
das halte ich für eine Ausrede, erstens ist das Internet voll mit Beispielen, zweitens könntest Du ein globales Array nehmen das umschiffst Du Dein "Problem".
Heinz

Da Du uns immer nur mit Häppchen abspeist, ist sinnvolle Hilfe unmöglich.
Welche Lib verwendest Du zum Zugriff auf MySQL (Link bitte).
Wie @noiasca bereits schrieb, ohne einen kompilierbaren Sketch wird das nur stochern im Nebel und das macht keiner gern.

Gruß Tommy

Ausrede würde ich jetzt nicht sagen. Ich habe es nicht innerhalb von 15 Minuten verstanden und da es nicht mein Problem war, habe ich mich halt nicht weiter damit beschäftigt :sweat_smile: @Tommy56 hatte mit seinem Hinweis da jedoch natürlich vollständig recht und wenn ich dazu zufällig auch Tipps bekomme, dann nehme ich die gerne, aber mein ursprüngliches Problem war halt einfach ein anderes :man_shrugging:

Da hast du wohl recht.

Tut mir voll Leid ^^ ich versuche es mal so nachvollziehbar wie möglich zu machen :roll_eyes:

Folgender Fehler tritt im Abstand von 75 Minuten auf (und ich habe keine Ahnung welcher Teil des Programms ihn verursacht):

Fehlercode
12:34:49.945 ->  ets Jan  8 2013,rst cause:4, boot mode:(3,6)
12:34:49.945 -> 
12:34:49.945 -> wdt reset
12:34:49.945 -> load 0x4010f000, len 3460, room 16 
12:34:49.992 -> tail 4
12:34:49.992 -> chksum 0xcc
12:34:49.992 -> load 0x3fff20b8, len 40, room 4 
12:34:49.992 -> tail 4
12:34:49.992 -> chksum 0xc9
12:34:49.992 -> csum 0xc9
12:34:49.992 -> v00046e90
12:34:49.992 -> ~ld

13:49:15.788 ->  ets Jan  8 2013,rst cause:4, boot mode:(3,6)
13:49:15.788 -> 
13:49:15.788 -> wdt reset
13:49:15.788 -> load 0x4010f000, len 3460, room 16 
13:49:15.788 -> tail 4
13:49:15.788 -> chksum 0xcc
13:49:15.788 -> load 0x3fff20b8, len 40, room 4 
13:49:15.788 -> tail 4
13:49:15.788 -> chksum 0xc9
13:49:15.788 -> csum 0xc9
13:49:15.788 -> v00046e90
13:49:15.788 -> ~ld
13:49:15.884 -> 

Hier die komplette Datei:

Hauptprogramm
// #################################################################################################################
// #################################################################################################################
// ################################## DEFINES MARIADB ##############################################################
// #################################################################################################################
// #################################################################################################################

#include "defines.h"
#include "Credentials.h"
#include <MySQL_Generic.h>

#define USING_HOST_NAME     false

#if USING_HOST_NAME
// Optional using hostname, and Ethernet built-in DNS lookup
char server[] = "server.local"; // change to your server's hostname/URL
#else
IPAddress server(192, 168, 100, 2);
#endif

uint16_t server_port = 3306;    //3306;

char default_database[] = "home";              //"test_arduino";
char default_table[]    = "lights";        //"test_arduino";

String default_column   = "brightness";
String default_value    = "41";

String queryBrightness = String("SELECT brightness FROM ") + default_database + "." + default_table
                         + " WHERE device_id = '" + default_value + "'";
String queryPattern = String("SELECT pattern FROM ") + default_database + "." + default_table
                      + " WHERE device_id = '" + default_value + "'";
String queryRed = String("SELECT red FROM ") + default_database + "." + default_table
                  + " WHERE device_id = '" + default_value + "'";
String queryGreen = String("SELECT green FROM ") + default_database + "." + default_table
                    + " WHERE device_id = '" + default_value + "'";
String queryBlue = String("SELECT blue FROM ") + default_database + "." + default_table
                   + " WHERE device_id = '" + default_value + "'";
String queryDuration = String("SELECT duration FROM ") + default_database + "." + default_table
                       + " WHERE device_id = '" + default_value + "'";

MySQL_Connection conn((Client *)&client);

// Create an instance of the cursor passing in the connection
MySQL_Query sql_query = MySQL_Query(&conn);

// #################################################################################################################
// #################################################################################################################
// ################################## DEFINES NEOPIXEL #############################################################
// #################################################################################################################
// #################################################################################################################


// A non-blocking everyday NeoPixel strip test program.

// NEOPIXEL BEST PRACTICES for most reliable operation:
// - Add 1000 uF CAPACITOR between NeoPixel strip's + and - connections.
// - MINIMIZE WIRING LENGTH between microcontroller board and first pixel.
// - NeoPixel strip's DATA-IN should pass through a 300-500 OHM RESISTOR.
// - AVOID connecting NeoPixels on a LIVE CIRCUIT. If you must, ALWAYS
//   connect GROUND (-) first, then +, then data.
// - When using a 3.3V microcontroller with a 5V-powered NeoPixel strip,
//   a LOGIC-LEVEL CONVERTER on the data line is STRONGLY RECOMMENDED.
// (Skipping these may work OK on your workbench but can fail in the field)

#include <Adafruit_NeoPixel.h>

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#ifdef ESP32
// Cannot use 6 as output for ESP. Pins 6-11 are connected to SPI flash. Use 16 instead.
#define LED_PIN    2
#else
#define LED_PIN    2
#endif

// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 300

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 3 = Pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)

unsigned long pixelPrevious = 0;        // Previous Pixel Millis
unsigned long patternPrevious = 0;      // Previous Pattern Millis
int           patternCurrent = 0;       // Current Pattern Number
int           patternInterval = 5000;   // Pattern Interval (ms)
int           pixelInterval = 50;       // Pixel Interval (ms)
int           pixelQueue = 0;           // Pattern Pixel Queue
int           pixelCycle = 0;           // Pattern Pixel Cycle
uint16_t      pixelCurrent = 0;         // Pattern Current Pixel Number
uint16_t      pixelNumber = LED_COUNT;  // Total Number of Pixels

// #################################################################################################################
// #################################################################################################################
// ################################## VOID SETUP ###################################################################
// #################################################################################################################
// #################################################################################################################

#include "Database.h"
#include "Neopixel.h"
int brightness;
int brightness_old;
int brightness_change;
int pattern_old;
int pattern_change;
int red_old;
int blue_old;
int green_old;
int brightness_start = 20;

int red;
int green;
int blue;
int duration;

void setup()
{
  Serial.begin(115200);
  while (!Serial && millis() < 5000); // wait for serial port to connect

  MYSQL_DISPLAY1("\nStarting Basic_Select_WiFi on", BOARD_NAME);
  MYSQL_DISPLAY(MYSQL_MARIADB_GENERIC_VERSION);

  // Begin WiFi section
  MYSQL_DISPLAY1("Connecting to", ssid);

  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    MYSQL_DISPLAY0(".");
  }
  Serial.println("");
  // print out info about the connection:
  MYSQL_DISPLAY1("Connected to network. My IP address is:", WiFi.localIP());

  MYSQL_DISPLAY3("Connecting to SQL Server @", server, ", Port =", server_port);
  //  MYSQL_DISPLAY5("User =", user, ", PW =", password, ", DB =", default_database);

  // ######################## NEOPIXEL ##################################

  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(brightness_start); // Set BRIGHTNESS to about 1/5 (max = 255)

  MYSQL_DISPLAY0("Connecting to Database");

  while (conn.connect(server, server_port, user, password) != RESULT_FAIL) {
    delay(500);
    MYSQL_DISPLAY0(".");
  }

  Serial.println("");
  Serial.println("Setup completed.");
}

// #################################################################################################################
// #################################################################################################################
// ################################## VOID LOOP ####################################################################
// #################################################################################################################
// #################################################################################################################

void loop()
{
  unsigned long anfang = millis();
  int counter; // Loop counter for brightness changes
  int n = 2; // Brightness +-1 every n'th Loop

  if (conn.connected()) {
    red = runQuery(queryRed);
    green = runQuery(queryGreen);
    blue = runQuery(queryBlue);
    duration = runQuery(queryDuration);
    brightness = runQuery(queryBrightness);
    patternCurrent = runQuery(queryPattern);
  }
  else {
    WiFi.begin(ssid, pass);

    while (WiFi.status() != WL_CONNECTED)
    {
      delay(500);
      MYSQL_DISPLAY0(".");
    }

    while (conn.connect(server, server_port, user, password) != RESULT_FAIL) {
      delay(500);
      MYSQL_DISPLAY0(".");
    }
  }



  // ######################## BRIGHTNESS ##########################

  if (brightness_change != brightness) {
    Serial.println("[CHANGE] Brightness set to " + String(brightness));
    brightness_change = brightness;
  }

  if (brightness_old != brightness and brightness_old < 256) {

    if (counter % n == 0) {

      int differenz = abs(brightness - brightness_old);
      if (brightness_old > brightness ) {
        brightness_old--;
        brightness_old--;
        strip.setBrightness(brightness_old);
        strip.show();
      }
      if (brightness_old < brightness and brightness_old <= 253) {
        brightness_old++;
        brightness_old++;
        strip.setBrightness(brightness_old);
        strip.show();
      }
    }
    counter++;
  } else {
    counter = 0;
  }


  // ######################## PATTERN ##########################

  if (pattern_change != patternCurrent) {
    Serial.println("[CHANGE] Pattern set to " + String(patternCurrent));
    pattern_change = patternCurrent;
  }
  unsigned long currentMillis = millis();                     //  Update current time
  if ((currentMillis - patternPrevious) >= patternInterval) { //  Check for expired time
    patternPrevious = currentMillis;
    //  patternCurrent++;                                        //  Advance to next pattern

    if (patternCurrent >= 10)
      patternCurrent = 0;
  }

  int timer = millis() - anfang;


  // ######################## SWITCH-CASE ##########################
  //  if (currentMillis - pixelPrevious >= pixelInterval) {       //  Check for expired time
  pixelPrevious = currentMillis;                            //  Run current frame
  switch (patternCurrent) {
    case 9:
      for (int i = 0; i < LED_COUNT; i++) {
        strip.setPixelColor(i, strip.Color(red, green, blue)); //  Set pixel's color (in RAM)
      }
      strip.show();
      //  colorWipe(strip.Color(red, green, blue), 50 - timer); // Individual Color
      break;
    case 8:
      theaterChaseRainbow(50 - timer); // Rainbow-enhanced theaterChase variant
      break;
    case 7:
      rainbow(duration - timer); // Flowing rainbow cycle along the whole strip
      break;
    case 6:
      theaterChase(strip.Color(0, 0, 127), 50 - timer); // Blue
      break;
    case 5:
      theaterChase(strip.Color(127, 0, 0), 50 - timer); // Red
      break;
    case 4:
      theaterChase(strip.Color(127, 127, 127), 50 - timer); // White
      break;
    case 3:
      colorWipe(strip.Color(0, 0, 255), 50); // Blue
      break;
    case 2:
      colorWipe(strip.Color(0, 255, 0), 50 - timer); // Green
      break;
    case 1:
      colorWipe(strip.Color(84, 0, 24), 50 - timer); // Red
      break;
    default:
      colorWipe(strip.Color(255, 200, 25), 50 - timer); // Warmwhite
      break;
  }
  //  }
}
Credentials.h
#ifndef Credentials_h
#define Credentials_h

char ssid[] = "XXXXX";        // your network SSID (name)
char pass[] = "XXXXX";        // your network password

char user[]         = "XXXXX";              // MySQL user login username
char password[]     = "XXXXX";          // MySQL user login password

#endif    //Credentials_h
Database.h


int runQuery(String query)
{
  row_values *row = NULL;
  long result = 0;
  
  // Execute the query
  sql_query.execute(query.c_str());
  
  // Fetch the columns (required) but we don't use them.
  sql_query.get_columns();
  
  // Read the row (we are only expecting the one)
  do 
  {
    row = sql_query.get_next_row();
    if (row != NULL) 
    {
      result = atol(row->values[0]);
    }
  } while (row != NULL);
  
  // Now we close the cursor to free any memory
  sql_query.close();

  return result;
}
Neopixel.h
void pulse() {
  // fade in
  for (int x = 80; x < 160; x++) {
    strip.setBrightness(x);
  }
  // fade out
  for (int x = 80; x >= 160; x--) {
    strip.setBrightness(x);
  }
}

// Some functions of our own for creating animated effects -----------------

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
  if(pixelInterval != wait)
    pixelInterval = wait;                   //  Update delay time
  strip.setPixelColor(pixelCurrent, color); //  Set pixel's color (in RAM)
  strip.show();                             //  Update strip to match
  pixelCurrent++;                           //  Advance current pixel
  if(pixelCurrent >= pixelNumber)           //  Loop the pattern from the first LED
    pixelCurrent = 0;
}

// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
// between frames.
void theaterChase(uint32_t color, int wait) {
  if(pixelInterval != wait)
    pixelInterval = wait;                   //  Update delay time
  for(int i = 0; i < pixelNumber; i++) {
    strip.setPixelColor(i + pixelQueue, color); //  Set pixel's color (in RAM)
  }
  strip.show();                             //  Update strip to match
  for(int i=0; i < pixelNumber; i+=3) {
    strip.setPixelColor(i + pixelQueue, strip.Color(0, 0, 0)); //  Set pixel's color (in RAM)
  }
  pixelQueue++;                             //  Advance current pixel
  if(pixelQueue >= 3)
    pixelQueue = 0;                         //  Loop the pattern from the first LED
}

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(uint8_t wait) {
  if(pixelInterval != wait)
    pixelInterval = wait;                   
  for(uint16_t i=0; i < pixelNumber; i++) {
    strip.setPixelColor(i, Wheel((i + pixelCycle) & 255)); //  Update delay time  
  }
  strip.show();                             //  Update strip to match
  pixelCycle++;                             //  Advance current cycle
  if(pixelCycle >= 256)
    pixelCycle = 0;                         //  Loop the cycle back to the begining
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  if(pixelInterval != wait)
    pixelInterval = wait;                   //  Update delay time  
  for(int i=0; i < pixelNumber; i+=3) {
    strip.setPixelColor(i + pixelQueue, Wheel((i + pixelCycle) % 255)); //  Update delay time  
  }
  strip.show();
  for(int i=0; i < pixelNumber; i+=3) {
    strip.setPixelColor(i + pixelQueue, strip.Color(0, 0, 0)); //  Update delay time  
  }      
  pixelQueue++;                           //  Advance current queue  
  pixelCycle++;                           //  Advance current cycle
  if(pixelQueue >= 3)
    pixelQueue = 0;                       //  Loop
  if(pixelCycle >= 256)
    pixelCycle = 0;                       //  Loop
}
defines.h
/****************************************************************************************************************************
  defines.h
  Library for communicating with a MySQL or MariaDB Server
  
  Based on and modified from Dr. Charles A. Bell's MySQL_Connector_Arduino Library https://github.com/ChuckBell/MySQL_Connector_Arduino
  to support nRF52, SAMD21/SAMD51, SAM DUE, STM32F/L/H/G/WB/MP1, ESP8266, ESP32, etc. boards using W5x00, ENC28J60, LAM8742A Ethernet,
  WiFiNINA, ESP-AT, built-in ESP8266/ESP32 WiFi.

  The library provides simple and easy Client interface to MySQL or MariaDB Server.
  
  Built by Khoi Hoang https://github.com/khoih-prog/MySQL_MariaDB_Generic
  Licensed under MIT license
 **********************************************************************************************************************************/

#ifndef defines_h
#define defines_h

#define DEBUG_ESP8266_AT_WEBSERVER_PORT Serial

// Debug Level from 0 to 4
#define _ESP_AT_LOGLEVEL_       1

#define MYSQL_DEBUG_PORT      Serial

// Debug Level from 0 to 4
#define _MYSQL_LOGLEVEL_      1

#if ! (ESP8266 || ESP32 )
  // Select only one of these libraries, only for boards other than ESP8266/ESP32
  #define USING_WIFI_ESP8266_AT           false
  #define USING_WIFININA_GENERIC          false
  #define USING_WIFININA                  false
  #define USING_WIFIESPAT_LIB             true
  #define USING_WIFI_CUSTOM               false
#endif

#if defined(ARDUINO_SAMD_MKR1000)
  #if defined(USE_WIFI_NINA)
    #undef USE_WIFI_NINA
  #endif
  #define USE_WIFI_NINA         false
  #define USE_WIFI101           true
#endif

#if ( defined(NRF52840_FEATHER) || defined(NRF52832_FEATHER) || defined(NRF52_SERIES) || defined(ARDUINO_NRF52_ADAFRUIT) || \
        defined(NRF52840_FEATHER_SENSE) || defined(NRF52840_ITSYBITSY) || defined(NRF52840_CIRCUITPLAY) || defined(NRF52840_CLUE) || \
        defined(NRF52840_METRO) || defined(NRF52840_PCA10056) || defined(PARTICLE_XENON) || defined(NINA_B302_ublox) || defined(NINA_B112_ublox) )
  #if defined(WIFI_USE_NRF528XX)
    #undef WIFI_USE_NRF528XX
  #endif
  #define WIFI_USE_NRF528XX          true
#endif

#if    ( defined(ARDUINO_SAMD_ZERO) || defined(ARDUINO_SAMD_MKR1000) || defined(ARDUINO_SAMD_MKRWIFI1010) \
      || defined(ARDUINO_SAMD_NANO_33_IOT) || defined(ARDUINO_SAMD_MKRFox1200) || defined(ARDUINO_SAMD_MKRWAN1300) || defined(ARDUINO_SAMD_MKRWAN1310) \
      || defined(ARDUINO_SAMD_MKRGSM1400) || defined(ARDUINO_SAMD_MKRNB1500) || defined(ARDUINO_SAMD_MKRVIDOR4000) || defined(__SAMD21G18A__) \
      || defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS) || defined(__SAMD21E18A__) || defined(__SAMD51__) || defined(__SAMD51J20A__) || defined(__SAMD51J19A__) \
      || defined(__SAMD51G19A__) || defined(__SAMD51P19A__) || defined(__SAMD21G18A__) )
  #if defined(WIFI_USE_SAMD)
    #undef WIFI_USE_SAMD
  #endif
  #define WIFI_USE_SAMD      true
#endif

#if ( defined(ARDUINO_SAM_DUE) || defined(__SAM3X8E__) )
  #if defined(WIFI_USE_SAM_DUE)
    #undef WIFI_USE_SAM_DUE
  #endif
  #define WIFI_USE_SAM_DUE      true
  #warning Use SAM_DUE architecture
#endif

#if ( defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3)  ||defined(STM32F4) || defined(STM32F7) || \
       defined(STM32L0) || defined(STM32L1) || defined(STM32L4) || defined(STM32H7)  ||defined(STM32G0) || defined(STM32G4) || \
       defined(STM32WB) || defined(STM32MP1) )
  #if defined(WIFI_USE_STM32)
    #undef WIFI_USE_STM32
  #endif
  #define WIFI_USE_STM32      true
#endif

#if ( defined(ARDUINO_NANO_RP2040_CONNECT) || defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_RASPBERRY_PI_PICO) || \
      defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) )
  #if defined(WIFI_USE_RP2040)
    #undef WIFI_USE_RP2040
  #endif
  #define WIFI_USE_RP2040          true
#endif

#ifdef CORE_TEENSY
  #if ( USING_WIFI_ESP8266_AT  || USING_WIFIESPAT_LIB )
    // For Teensy 4.1/4.0
    #define EspSerial Serial2   //Serial2, Pin RX2 : 7, TX2 : 8
  #endif
  
  #if defined(__IMXRT1062__)
    // For Teensy 4.1/4.0
    #define BOARD_TYPE      "TEENSY 4.1/4.0"
  #elif defined(__MK66FX1M0__)
    #define BOARD_TYPE "Teensy 3.6"
  #elif defined(__MK64FX512__)
    #define BOARD_TYPE "Teensy 3.5"
  #elif defined(__MKL26Z64__)
    #define BOARD_TYPE "Teensy LC"
  #elif defined(__MK20DX256__)
    #define BOARD_TYPE "Teensy 3.2" // and Teensy 3.1 (obsolete)
  #elif defined(__MK20DX128__)
    #define BOARD_TYPE "Teensy 3.0"
  #elif defined(__AVR_AT90USB1286__)
    #error Teensy 2.0++ not supported yet
  #elif defined(__AVR_ATmega32U4__)
    #error Teensy 2.0 not supported yet
  #else
    // For Other Boards
    #define BOARD_TYPE      "Unknown Teensy Board"
#endif

#elif defined(WIFI_USE_NRF528XX)
  #if ( USING_WIFI_ESP8266_AT  || USING_WIFIESPAT_LIB )
    #define EspSerial Serial1
  #endif
  
  #if defined(NRF52840_FEATHER)
    #define BOARD_TYPE      "NRF52840_FEATHER_EXPRESS"
  #elif defined(NRF52832_FEATHER)
    #define BOARD_TYPE      "NRF52832_FEATHER"
  #elif defined(NRF52840_FEATHER_SENSE)
    #define BOARD_TYPE      "NRF52840_FEATHER_SENSE"
  #elif defined(NRF52840_ITSYBITSY)
    #define BOARD_TYPE      "NRF52840_ITSYBITSY_EXPRESS"
  #elif defined(NRF52840_CIRCUITPLAY)
    #define BOARD_TYPE      "NRF52840_CIRCUIT_PLAYGROUND"
  #elif defined(NRF52840_CLUE)
    #define BOARD_TYPE      "NRF52840_CLUE"
  #elif defined(NRF52840_METRO)
    #define BOARD_TYPE      "NRF52840_METRO_EXPRESS"
  #elif defined(NRF52840_PCA10056)
    #define BOARD_TYPE      "NORDIC_NRF52840DK"
  #elif defined(NINA_B302_ublox)
    #define BOARD_TYPE      "NINA_B302_ublox"
  #elif defined(NINA_B112_ublox)
    #define BOARD_TYPE      "NINA_B112_ublox"
  #elif defined(PARTICLE_XENON)
    #define BOARD_TYPE      "PARTICLE_XENON"
  #elif defined(MDBT50Q_RX)
    #define BOARD_TYPE      "RAYTAC_MDBT50Q_RX"
  #elif defined(ARDUINO_NRF52_ADAFRUIT)
    #define BOARD_TYPE      "ARDUINO_NRF52_ADAFRUIT"
  #else
    #define BOARD_TYPE      "nRF52 Unknown"
  #endif

#elif defined(WIFI_USE_SAMD)
  #if ( USING_WIFI_ESP8266_AT  || USING_WIFIESPAT_LIB )
    // For SAMD
    #define EspSerial Serial1
  #endif
  
  #if defined(ARDUINO_SAMD_ZERO)
    #define BOARD_TYPE      "SAMD Zero"
  #elif defined(ARDUINO_SAMD_MKR1000)
    #define BOARD_TYPE      "SAMD MKR1000"
  #elif defined(ARDUINO_SAMD_MKRWIFI1010)
    #define BOARD_TYPE      "SAMD MKRWIFI1010"
  #elif defined(ARDUINO_SAMD_NANO_33_IOT)
    #define BOARD_TYPE      "SAMD NANO_33_IOT"
  #elif defined(ARDUINO_SAMD_MKRFox1200)
    #define BOARD_TYPE      "SAMD MKRFox1200"
  #elif ( defined(ARDUINO_SAMD_MKRWAN1300) || defined(ARDUINO_SAMD_MKRWAN1310) )
    #define BOARD_TYPE      "SAMD MKRWAN13X0"
  #elif defined(ARDUINO_SAMD_MKRGSM1400)
    #define BOARD_TYPE      "SAMD MKRGSM1400"
  #elif defined(ARDUINO_SAMD_MKRNB1500)
    #define BOARD_TYPE      "SAMD MKRNB1500"
  #elif defined(ARDUINO_SAMD_MKRVIDOR4000)
    #define BOARD_TYPE      "SAMD MKRVIDOR4000"
  #elif defined(ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS)
    #define BOARD_TYPE      "SAMD ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS"
  #elif defined(ADAFRUIT_FEATHER_M0_EXPRESS)
    #define BOARD_TYPE      "SAMD21 ADAFRUIT_FEATHER_M0_EXPRESS"
  #elif defined(ADAFRUIT_METRO_M0_EXPRESS)
    #define BOARD_TYPE      "SAMD21 ADAFRUIT_METRO_M0_EXPRESS"
  #elif defined(ADAFRUIT_CIRCUITPLAYGROUND_M0)
    #define BOARD_TYPE      "SAMD21 ADAFRUIT_CIRCUITPLAYGROUND_M0"
  #elif defined(ADAFRUIT_GEMMA_M0)
    #define BOARD_TYPE      "SAMD21 ADAFRUIT_GEMMA_M0"
  #elif defined(ADAFRUIT_TRINKET_M0)
    #define BOARD_TYPE      "SAMD21 ADAFRUIT_TRINKET_M0"
  #elif defined(ADAFRUIT_ITSYBITSY_M0)
    #define BOARD_TYPE      "SAMD21 ADAFRUIT_ITSYBITSY_M0"
  #elif defined(ARDUINO_SAMD_HALLOWING_M0)
    #define BOARD_TYPE      "SAMD21 ARDUINO_SAMD_HALLOWING_M0"
  #elif defined(ADAFRUIT_METRO_M4_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_METRO_M4_EXPRESS"
  #elif defined(ADAFRUIT_GRAND_CENTRAL_M4)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_GRAND_CENTRAL_M4"
  #elif defined(ADAFRUIT_FEATHER_M4_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_FEATHER_M4_EXPRESS"
  #elif defined(ADAFRUIT_ITSYBITSY_M4_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_ITSYBITSY_M4_EXPRESS"
  #elif defined(ADAFRUIT_TRELLIS_M4_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_TRELLIS_M4_EXPRESS"
  #elif defined(ADAFRUIT_PYPORTAL)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_PYPORTAL"
  #elif defined(ADAFRUIT_PYPORTAL_M4_TITANO)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_PYPORTAL_M4_TITANO"
  #elif defined(ADAFRUIT_PYBADGE_M4_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_PYBADGE_M4_EXPRESS"
  #elif defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_METRO_M4_AIRLIFT_LITE"
  #elif defined(ADAFRUIT_PYGAMER_M4_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_PYGAMER_M4_EXPRESS"
  #elif defined(ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_PYGAMER_ADVANCE_M4_EXPRESS"
  #elif defined(ADAFRUIT_PYBADGE_AIRLIFT_M4)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_PYBADGE_AIRLIFT_M4"
  #elif defined(ADAFRUIT_MONSTER_M4SK_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_MONSTER_M4SK_EXPRESS"
  #elif defined(ADAFRUIT_HALLOWING_M4_EXPRESS)
    #define BOARD_TYPE      "SAMD51 ADAFRUIT_HALLOWING_M4_EXPRESS"
  #elif defined(SEEED_WIO_TERMINAL)
    #define BOARD_TYPE      "SAMD SEEED_WIO_TERMINAL"
  #elif defined(SEEED_FEMTO_M0)
    #define BOARD_TYPE      "SAMD SEEED_FEMTO_M0"
  #elif defined(SEEED_XIAO_M0)
    #define BOARD_TYPE      "SAMD SEEED_XIAO_M0"
  #elif defined(Wio_Lite_MG126)
    #define BOARD_TYPE      "SAMD SEEED Wio_Lite_MG126"
  #elif defined(WIO_GPS_BOARD)
    #define BOARD_TYPE      "SAMD SEEED WIO_GPS_BOARD"
  #elif defined(SEEEDUINO_ZERO)
    #define BOARD_TYPE      "SAMD SEEEDUINO_ZERO"
  #elif defined(SEEEDUINO_LORAWAN)
    #define BOARD_TYPE      "SAMD SEEEDUINO_LORAWAN"
  #elif defined(SEEED_GROVE_UI_WIRELESS)
    #define BOARD_TYPE      "SAMD SEEED_GROVE_UI_WIRELESS"
  #elif defined(__SAMD21E18A__)
    #define BOARD_TYPE      "SAMD21E18A"
  #elif defined(__SAMD21G18A__)
    #define BOARD_TYPE      "SAMD21G18A"
  #elif defined(__SAMD51G19A__)
    #define BOARD_TYPE      "SAMD51G19A"
  #elif defined(__SAMD51J19A__)
    #define BOARD_TYPE      "SAMD51J19A"
  #elif defined(__SAMD51P19A__)
    #define BOARD_TYPE      "__SAMD51P19A__"
  #elif defined(__SAMD51J20A__)
    #define BOARD_TYPE      "SAMD51J20A"
  #elif defined(__SAM3X8E__)
    #define BOARD_TYPE      "SAM3X8E"
  #elif defined(__CPU_ARC__)
    #define BOARD_TYPE      "CPU_ARC"
  #elif defined(__SAMD51__)
    #define BOARD_TYPE      "SAMD51"
  #else
    #define BOARD_TYPE      "SAMD Unknown"
  #endif

#elif defined(WIFI_USE_STM32)
  #if ( USING_WIFI_ESP8266_AT  || USING_WIFIESPAT_LIB )
    // For STM32
    #if defined(ARDUINO_NUCLEO_F767ZI)
      #warning Nucleo-144 NUCLEO_F767ZI board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX
      // RX TX
      HardwareSerial Serial1(D0, D1);
    #elif defined(ARDUINO_NUCLEO_L053R8)
      #warning Nucleo-64 NUCLEO_L053R8 board selected, using HardwareSerial Serial1 @ pin D0/RX and D1/TX
      // RX TX
      HardwareSerial Serial1(D0, D1);   // (PA3, PA2);
    #endif  
   
    #warning EspSerial using SERIAL_PORT_HARDWARE, can be Serial or Serial1. See your board variant.h
    #define EspSerial     SERIAL_PORT_HARDWARE    //Serial1
  #endif

  #if defined(STM32F0)
    #warning STM32F0 board selected
    #define BOARD_TYPE  "STM32F0"
  #elif defined(STM32F1)
    #warning STM32F1 board selected
    #define BOARD_TYPE  "STM32F1"
  #elif defined(STM32F2)
    #warning STM32F2 board selected
    #define BOARD_TYPE  "STM32F2"
  #elif defined(STM32F3)
    #warning STM32F3 board selected
    #define BOARD_TYPE  "STM32F3"
  #elif defined(STM32F4)
    #warning STM32F4 board selected
    #define BOARD_TYPE  "STM32F4"
  #elif defined(STM32F7)   
    #warning STM32F7 board selected
    #define BOARD_TYPE  "STM32F7"    
  #elif defined(STM32L0)
    #warning STM32L0 board selected
    #define BOARD_TYPE  "STM32L0"   
  #elif defined(STM32L1)
    #warning STM32L1 board selected
    #define BOARD_TYPE  "STM32L1"
  #elif defined(STM32L4)
    #warning STM32L4 board selected
    #define BOARD_TYPE  "STM32L4"
  #elif defined(STM32H7)
    #warning STM32H7 board selected
    #define BOARD_TYPE  "STM32H7"
  #elif defined(STM32G0)
    #warning STM32G0 board selected
    #define BOARD_TYPE  "STM32G0"
  #elif defined(STM32G4)
    #warning STM32G4 board selected
    #define BOARD_TYPE  "STM32G4"
  #elif defined(STM32WB)
    #warning STM32WB board selected
    #define BOARD_TYPE  "STM32WB"
  #elif defined(STM32MP1)
    #warning STM32MP1 board selected
    #define BOARD_TYPE  "STM32MP1"
  #else
    #warning STM32 unknown board selected
    #define BOARD_TYPE  "STM32 Unknown"
  #endif
  
#elif (ESP8266)
  #warning ESP8266 board selected
  #define BOARD_TYPE    ARDUINO_BOARD

#elif (ESP32)
  #warning ESP32 board selected
  #define BOARD_TYPE    ARDUINO_BOARD

#elif defined(WIFI_USE_RP2040) && !defined(ARDUINO_ARCH_MBED)  

  // For RP2040
  #if ( USING_WIFI_ESP8266_AT  || USING_WIFIESPAT_LIB )
    #define EspSerial Serial1
  #endif
  
#elif defined(WIFI_USE_RP2040) && defined(ARDUINO_ARCH_MBED)

  #warning Using ARDUINO_ARCH_MBED

    // For MBED RP2040
  #if ( USING_WIFI_ESP8266_AT  || USING_WIFIESPAT_LIB )
    #define EspSerial Serial1
  #endif
  
  #if ( defined(ARDUINO_NANO_RP2040_CONNECT)    || defined(ARDUINO_RASPBERRY_PI_PICO) || \
        defined(ARDUINO_GENERIC_RP2040) || defined(ARDUINO_ADAFRUIT_FEATHER_RP2040) )
    // Only undef known BOARD_NAME to use better one
    #undef BOARD_NAME
  #endif
  
  #if defined(ARDUINO_RASPBERRY_PI_PICO)
    #define BOARD_NAME      "MBED RASPBERRY_PI_PICO"
  #elif defined(ARDUINO_ADAFRUIT_FEATHER_RP2040)
    #define BOARD_NAME      "MBED ADAFRUIT_FEATHER_RP2040"
  #elif defined(ARDUINO_GENERIC_RP2040)
    #define BOARD_NAME      "MBED GENERIC_RP2040"
  #elif defined(ARDUINO_NANO_RP2040_CONNECT) 
    #define BOARD_NAME      "MBED NANO_RP2040_CONNECT"
  #else
    // Use default BOARD_NAME if exists
    #if !defined(BOARD_NAME)
      #define BOARD_NAME      "MBED Unknown RP2040"
    #endif
  #endif
 
#else
  // For Mega
  #if ( USING_WIFI_ESP8266_AT  || USING_WIFIESPAT_LIB )
    #define EspSerial Serial1
  #endif
  
  #define BOARD_TYPE      "AVR Mega"
#endif

#ifndef BOARD_NAME
  #define BOARD_NAME    BOARD_TYPE
#endif

#endif    //defines_h

Die dazugehörige SQL-Tabelle sieht so aus:

Zusammenfassung
-- Exportiere Datenbank Struktur für home
CREATE DATABASE IF NOT EXISTS `home` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
USE `home`;

-- Exportiere Struktur von Tabelle home.light_open
CREATE TABLE IF NOT EXISTS `lights` (
  `task_id` int(11) DEFAULT NULL,
  `device_id` int(11) DEFAULT NULL,
  `duration` int(11) DEFAULT NULL,
  `red` int(11) DEFAULT NULL,
  `green` int(11) DEFAULT NULL,
  `blue` int(11) DEFAULT NULL,
  `speed` int(11) DEFAULT NULL,
  `brightness` int(11) DEFAULT NULL,
  `pattern` int(11) DEFAULT NULL,
  `timestamp` timestamp NULL DEFAULT current_timestamp()
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;

-- Exportiere Daten aus Tabelle home.lights: ~2 rows (ungefähr)
INSERT INTO `light_open` (`task_id`, `device_id`, `duration`, `red`, `green`, `blue`, `speed`, `brightness`, `pattern`, `timestamp`) VALUES
	(1, 41, 300, 255, 60, 20, 500, 32, 7, '2022-10-18 18:48:36'),
	(2, 42, 200, 255, 60, 20, 500, 32, 7, '2022-12-11 08:49:16');

Dann orientiere Dich doch einfach an diesem Beispiel Deiner Lib. In Zeile 180 ist der Zugriff auf die einzelnen Felder einer Query mit mehreren Feldern gezeigt.

Gruß Tommy

Irgendwie hängst Du vermutlich in einer Schleife fest wdt ist der "Wachund" ich weiß nicht genau worauf der beim ESP eingestellt ist. Jedenfalls wenn der lopp zu lange dauert kann das System nicht schnell genug mit dem WIFI werkeln. Wenn Du rausbekommst wo er festhängt könntest Du ein delay(0) da einbauen , aber der richtige Weg ist das nicht. Also bau noch ein paar Seriellprint("ich bin gerade hier" ) damit Du debuggen kannst.
Heinz

Danke :blush: für das Array-Nebenproblem könnte das ein gutes Beispiel sein :upside_down_face:

Suuuper! Danke @Rentner , das ist ein Ansatz :slight_smile: Ich baue mal ein paar Println's ein und lasse es noch mal paar Stunden laufen :upside_down_face:

Artnet functioniert aber auch mit WiFi Das ist das einfach zu machen mit LED software.

void loop() {
   // der Code für die LEDs
}

Das ist aber relevant. welchen library genutz wird. Die meisten haben zwierigkeiten wenn sie mit WiFi combiniert werden.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.