diff --git a/Hardware-Plaforms/MRFC522-RC522-RFID.jpg b/Hardware-Plaforms/MRFC522-RC522-RFID.jpg new file mode 100644 index 0000000..cb9704c Binary files /dev/null and b/Hardware-Plaforms/MRFC522-RC522-RFID.jpg differ diff --git a/Hardware-Plaforms/drill.jpg b/Hardware-Plaforms/drill.jpg new file mode 100644 index 0000000..f439d29 Binary files /dev/null and b/Hardware-Plaforms/drill.jpg differ diff --git a/platformio.ini b/platformio.ini index 0f117ae..5fabdb6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,4 +1,4 @@ -;PlatformIO Project Configuration File +; PlatformIO Project Configuration File ; ; Build options: build flags, source filter ; Upload options: custom upload port, speed and extra flags @@ -8,14 +8,52 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html +[common] +lib_deps_builtin = + SPI + Wire +lib_deps_external = + https://github.com/schreibfaul1/ESP32-audioI2S.git + https://github.com/madhephaestus/ESP32Encoder.git + https://github.com/knolleary/pubsubclient.git + https://github.com/biologist79/ESP32FTPServer + https://github.com/FastLED/FastLED.git#3.3.3 + ESP Async WebServer + https://github.com/me-no-dev/AsyncTCP + https://github.com/bblanchon/ArduinoJson.git +; https://github.com/pschatzmann/ESP32-A2DP.git + +[env:common] +build_flags = -DHAL=1 +; Don't forget to run this script if you changed the html-files provided in any way +extra_scripts = + pre:processHtml.py + + +[env:esp32-a12] +platform = espressif32 +board = esp-wrover-kit +framework = arduino +monitor_speed = 115200 +board_build.partitions = no_ota.csv +build_flags = -DHAL=2 +lib_deps = + https://github.com/kkloesener/MFRC522_I2C_Library.git + https://github.com/kkloesener/AC101.git + ${common.lib_deps_builtin} + ${common.lib_deps_external} + [env:lolin32] platform = espressif32 board = lolin32 framework = arduino monitor_speed = 115200 board_build.partitions = no_ota.csv -lib_deps = ${env:common.lib_deps} -extra_scripts = ${env:common.extra_scripts} +lib_deps = + ${common.lib_deps_builtin} + ${common.lib_deps_external} + https://github.com/biologist79/rfid.git + https://github.com/tueddy/PN5180-Library.git upload_port = /dev/cu.SLAB_USBtoUART monitor_port = /dev/cu.SLAB_USBtoUART @@ -69,21 +107,4 @@ monitor_port = /dev/cu.SLAB_USBtoUART ;WINDOWS: COM3 ;LINUX: /dev/ttyUSB0 (if it's the first USB-device attached, otherwise increase number) -[env:common] -lib_deps = - https://github.com/schreibfaul1/ESP32-audioI2S.git - https://github.com/madhephaestus/ESP32Encoder.git - https://github.com/knolleary/pubsubclient.git - https://github.com/biologist79/ESP32FTPServer.git - https://github.com/FastLED/FastLED.git#3.3.3 - https://github.com/biologist79/rfid.git - https://github.com/tueddy/PN5180-Library.git - ESP Async WebServer - https://github.com/me-no-dev/AsyncTCP - https://github.com/bblanchon/ArduinoJson.git -; https://github.com/Yveaux/AC101.git -; https://github.com/pschatzmann/ESP32-A2DP.git - -; Don't forget to run this script if you changed the html-files provided in any way -extra_scripts = - pre:processHtml.py \ No newline at end of file +[env:] \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 3911f2e..4fefd5a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,14 @@ // !!! MAKE SURE TO EDIT settings.h !!! #include "settings.h" // Contains all user-relevant settings + +// !!! MAKE SURE TO EDIT PLATFORM SPECIFIC settings-****.h !!! +#if (HAL == 1) +#include "settings-lolin32.h" // Contains all user-relevant settings +#elif (HAL == 2) +#include "settings-espa1s.h" // Contains all user-relevant settings +#endif + #include #include "Arduino.h" #include @@ -22,8 +30,12 @@ #include "SD.h" #endif #include "esp_task_wdt.h" -#ifdef RFID_READER_TYPE_MFRC522 - #include +#ifdef RFID_READER_TYPE_MFRC522_SPI + #include +#endif +#ifdef RFID_READER_TYPE_MFRC522_I2C + #include "Wire.h" + #include #endif #ifdef RFID_READER_TYPE_PN5180 #include @@ -260,12 +272,27 @@ fs::FS FSystem = (fs::FS)SD; #else fs::FS FSystem = (fs::FS)SD_MMC; #endif + TaskHandle_t mp3Play; TaskHandle_t rfid; + #ifdef NEOPIXEL_ENABLE TaskHandle_t LED; #endif +#if (HAL == 2) +#include "AC101.h" + static TwoWire i2cBusOne = TwoWire(0); + static AC101 ac(i2cBusOne); +#endif +#ifdef RFID_READER_TYPE_MFRC522_SPI + static MFRC522 mfrc522(RFID_CS, RST_PIN); +#endif +#ifdef RFID_READER_TYPE_MFRC522_I2C + static TwoWire i2cBusTwo = TwoWire(1); + static MFRC522 mfrc522(MFRC522_ADDR, MFRC522_RST_PIN, i2cBusTwo); +#endif + // FTP #ifdef FTP_ENABLE FtpServer *ftpSrv; // Heap-alloction takes place later (when needed) @@ -364,7 +391,6 @@ void volumeToQueueSender(const int32_t _newVolume); wl_status_t wifiManager(void); bool writeWifiStatusToNVS(bool wifiStatus); - /* Wrapper-Funktion for Serial-logging (with newline) */ void loggerNl(const char *str, const uint8_t logLevel) { if (serialDebug >= logLevel) { @@ -393,7 +419,6 @@ int countChars(const char* string, char ch) { return count; } - void IRAM_ATTR onTimer() { xSemaphoreGiveFromISR(timerSemaphore, NULL); } @@ -1380,6 +1405,7 @@ void playAudio(void *parameter) { audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT); audio.setVolume(initVolume); + uint8_t currentVolume; static BaseType_t trackQStatus; static uint8_t trackCommand = 0; @@ -1754,17 +1780,9 @@ void playAudio(void *parameter) { } -#ifdef RFID_READER_TYPE_MFRC522 +#if defined RFID_READER_TYPE_MFRC522_SPI || defined RFID_READER_TYPE_MFRC522_I2C // Instructs RFID-scanner to scan for new RFID-tags void rfidScanner(void *parameter) { - static MFRC522 mfrc522(RFID_CS, RST_PIN); - #ifndef SINGLE_SPI_ENABLE - SPI.begin(); - #endif - mfrc522.PCD_Init(); - mfrc522.PCD_DumpVersionToSerial(); // Show details of PCD - MFRC522 Card Reader detail - delay(4); - loggerNl((char *) FPSTR(rfidScannerReady), LOGLEVEL_DEBUG); byte cardId[cardIdSize]; char *cardIdString; @@ -1813,6 +1831,7 @@ void rfidScanner(void *parameter) { } } xQueueSend(rfidCardQueue, &cardIdString, 0); +// free(cardIdString); } } vTaskDelete(NULL); @@ -3066,7 +3085,6 @@ void accessPointStart(const char *SSID, IPAddress ip, IPAddress netmask) { accessPointStarted = true; } - // Reads stored WiFi-status from NVS bool getWifiEnableStatusFromNVS(void) { uint32_t wifiStatus = prefsSettings.getUInt("enableWifi", 99); @@ -3103,6 +3121,7 @@ bool writeWifiStatusToNVS(bool wifiStatus) { return true; } } + return true; } @@ -3452,7 +3471,7 @@ void onWebsocketEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsE client->ping(); } else if (type == WS_EVT_DISCONNECT) { //client disconnected - Serial.printf("ws[%s][%u] disconnect: %u\n", server->url(), uint(client->id())); + Serial.printf("ws[%s][%u] disconnect: %u\n", server->url(), uint8_t(client->id())); } else if (type == WS_EVT_ERROR) { //error was received from the other end Serial.printf("ws[%s][%u] error(%u): %s\n", server->url(), client->id(), *((uint16_t*)arg), (char*)data); @@ -3541,7 +3560,6 @@ bool isNumber(const char *str) { } - void webserverStart(void) { if (wifiManager() == WL_CONNECTED && !webserverStarted) { // attach AsyncWebSocket for Mgmt-Interface @@ -3578,7 +3596,6 @@ void webserverStart(void) { } } - // Dumps all RFID-entries from NVS into a file on SD-card bool dumpNvsToSd(char *_namespace, char *_destFile) { #ifdef NEOPIXEL_ENABLE @@ -3739,9 +3756,25 @@ void setup() { ); #endif +#if (HAL == 2) + i2cBusOne.begin(IIC_DATA, IIC_CLK, 40000); + + while (not ac.begin()) { + Serial.printf("AC101 Failed!\n"); + delay(1000); + } + Serial.printf("AC101 via I2C - OK!\n"); + + pinMode(22, OUTPUT); + digitalWrite(22, HIGH); + + pinMode(GPIO_PA_EN, OUTPUT); + digitalWrite(GPIO_PA_EN, HIGH); + Serial.printf("Built-In Amplifier enabled\n"); +#endif #ifndef SINGLE_SPI_ENABLE - #ifdef SD_MMC_1BIT_MODE + #ifdef SD_MMC_1BIT_MODE pinMode(2, INPUT_PULLUP); #else // Init uSD-SPI @@ -3751,9 +3784,11 @@ void setup() { spiSD.setFrequency(1000000); #endif #else - //SPI.begin(RFID_SCK, RFID_MISO, RFID_MOSI); - SPI.begin(); - SPI.setFrequency(1000000); + #ifdef RFID_READER_TYPE_MFRC522_SPI + //SPI.begin(RFID_SCK, RFID_MISO, RFID_MOSI); + SPI.begin(); + SPI.setFrequency(1000000); + #endif #endif #ifndef SINGLE_SPI_ENABLE @@ -3776,6 +3811,14 @@ void setup() { } + #ifdef RFID_READER_TYPE_MFRC522_I2C + i2cBusTwo.begin(ext_IIC_DATA, ext_IIC_CLK, 40000); + #endif + + mfrc522.PCD_Init(); + delay(50); + loggerNl((char *) FPSTR(rfidScannerReady), LOGLEVEL_DEBUG); + // welcome message Serial.println(F("")); Serial.println(F("_____ _____ _____ _____ _____ ")); @@ -3820,6 +3863,20 @@ void setup() { a2dp_sink.start("Tonuino"); #endif + #ifdef DISPLAY_I2C + // OLED Display - https://github.com/olikraus/u8g2/wiki/u8g2setupcpp#sh1106-128x64_noname-1 + U8G2_SH1106_128X64_NONAME_1_2ND_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); + u8g2.begin(); + u8g2.firstPage(); + do { + u8g2.setFont(u8g2_font_ncenB08_tr); + u8g2.drawStr(0,8,"Tonuino gestartet"); + u8g2.drawStr(0,16,"Papas Projekt"); + u8g2.drawStr(0,24,"Dritte Statuszeile passt"); + u8g2.drawStr(0,16,"und noch eine vierte Zeile"); + } while ( u8g2.nextPage() ); + #endif + // Create queues volumeQueue = xQueueCreate(1, sizeof(int)); if (volumeQueue == NULL) { @@ -4064,7 +4121,7 @@ void setup() { pinMode(PAUSEPLAY_BUTTON, INPUT_PULLUP); pinMode(NEXT_BUTTON, INPUT_PULLUP); pinMode(PREVIOUS_BUTTON, INPUT_PULLUP); - + // Init rotary encoder encoder.attachHalfQuad(DREHENCODER_CLK, DREHENCODER_DT); encoder.clearCount(); @@ -4097,7 +4154,9 @@ void setup() { void loop() { webserverStart(); - ftpManager(); + #ifdef FTP_ENABLE + ftpManager(); + #endif #ifdef HEADPHONE_ADJUST_ENABLE headphoneVolumeManager(); #endif diff --git a/src/settings-espa1s.h b/src/settings-espa1s.h new file mode 100644 index 0000000..ae257fd --- /dev/null +++ b/src/settings-espa1s.h @@ -0,0 +1,55 @@ +#include "Arduino.h" + +//################## GPIO-configuration ############################## +// uSD-card-reader (via SPI) +#define SPISD_CS 13 // GPIO for chip select (SD) +#ifndef SINGLE_SPI_ENABLE + #define SPISD_MOSI 15 // GPIO for master out slave in (SD) => not necessary for single-SPI + #define SPISD_MISO 2 // GPIO for master in slave ou (SD) => not necessary for single-SPI + #define SPISD_SCK 14 // GPIO for clock-signal (SD) => not necessary for single-SPI +#endif + +#define MFRC522_RST_PIN 12 // needed for i2c-comm MTDI on JTAG +#define MFRC522_ADDR 0x28 // default Address of MFRC522 +#define ext_IIC_CLK 23 // 14-pin-header +#define ext_IIC_DATA 18 // 14-pin-header + +// I2S (DAC) +#define I2S_DOUT 25 // Digital out (I2S) +#define I2S_BCLK 27 // BCLK (I2S) +#define I2S_LRC 26 // LRC (I2S) + +// I2C (AC101) +#define IIC_CLK 32 // internal +#define IIC_DATA 33 // internal + +// Amp enable +#define GPIO_PA_EN GPIO_NUM_21 // internal +#define GPIO_SEL_PA_EN GPIO_SEL_21 + +// Rotary encoder +#define DREHENCODER_CLK 5 // If you want to reverse encoder's direction, just switch GPIOs of CLK with DT (in software or hardware) +#define DREHENCODER_DT 18 // Info: Lolin D32 / Lolin D32 pro 35 are using 35 for battery-voltage-monitoring! +#define DREHENCODER_BUTTON 4 // Button is used to switch Tonuino on and off + +// Control-buttons +#define PAUSEPLAY_BUTTON 36 // GPIO to detect pause/play +#define NEXT_BUTTON 199 // GPIO to detect next +#define PREVIOUS_BUTTON 198 // GPIO to detect previous (Important: as of 19.11.2020 changed from 33 to 2) + +// Power-control +#define POWER 19 // GPIO used to drive transistor-circuit, that switches off peripheral devices while ESP32-deepsleep + +// (optional) Neopixel +#define LED_PIN 23 // GPIO for Neopixel-signaling + +// (optinal) Headphone-detection +#ifdef HEADPHONE_ADJUST_ENABLE + #define HP_DETECT 39 // GPIO that detects, if there's a plug in the headphone jack or not +#endif + +// (optional) Monitoring of battery-voltage via ADC +#ifdef MEASURE_BATTERY_VOLTAGE + #define VOLTAGE_READ_PIN 33 // GPIO used to monitor battery-voltage. Change to 35 if you're using Lolin D32 or Lolin D32 pro as it's hard-wired there! +#endif + diff --git a/src/settings-lolin32.h b/src/settings-lolin32.h new file mode 100644 index 0000000..18883a1 --- /dev/null +++ b/src/settings-lolin32.h @@ -0,0 +1,61 @@ +#include "Arduino.h" + +//################## GPIO-configuration ############################## +#ifdef SD_MMC_1BIT_MODE + // uSD-card-reader (via SD-MMC 1Bit) + // + // SD_MMC uses fixed pins + // MOSI 15 + // SCKK 14 + // MISO 2 // hardware pullup may required +#else + // uSD-card-reader (via SPI) + #define SPISD_CS 15 // GPIO for chip select (SD) + #ifndef SINGLE_SPI_ENABLE + #define SPISD_MOSI 13 // GPIO for master out slave in (SD) => not necessary for single-SPI + #define SPISD_MISO 16 // GPIO for master in slave ou (SD) => not necessary for single-SPI + #define SPISD_SCK 14 // GPIO for clock-signal (SD) => not necessary for single-SPI + #endif +#endif + +// RFID (via SPI) +#define RST_PIN 99 // Not necessary but has to be set anyway; so let's use a dummy-number +#define RFID_CS 21 // GPIO for chip select (RFID) +#define RFID_MOSI 23 // GPIO for master out slave in (RFID) +#define RFID_MISO 19 // GPIO for master in slave out (RFID) +#define RFID_SCK 18 // GPIO for clock-signal (RFID) + +#ifdef RFID_READER_TYPE_PN5180 + #define RFID_BUSY 16 // PN5180 BUSY PIN + #define RFID_RST 22 // PN5180 RESET PIN +#endif +// I2S (DAC) +#define I2S_DOUT 25 // Digital out (I2S) +#define I2S_BCLK 27 // BCLK (I2S) +#define I2S_LRC 26 // LRC (I2S) + +// Rotary encoder +#define DREHENCODER_CLK 34 // If you want to reverse encoder's direction, just switch GPIOs of CLK with DT (in software or hardware) +#define DREHENCODER_DT 35 // Info: Lolin D32 / Lolin D32 pro 35 are using 35 for battery-voltage-monitoring! +#define DREHENCODER_BUTTON 32 // Button is used to switch Tonuino on and off + +// Control-buttons +#define PAUSEPLAY_BUTTON 5 // GPIO to detect pause/play +#define NEXT_BUTTON 4 // GPIO to detect next +#define PREVIOUS_BUTTON 2 // GPIO to detect previous (Important: as of 19.11.2020 changed from 33 to 2) + +// (optional) Power-control +#define POWER 17 // GPIO used to drive transistor-circuit, that switches off peripheral devices while ESP32-deepsleep + +// (optional) Neopixel +#define LED_PIN 12 // GPIO for Neopixel-signaling + +// (optinal) Headphone-detection +#ifdef HEADPHONE_ADJUST_ENABLE + #define HP_DETECT 22 // GPIO that detects, if there's a plug in the headphone jack or not +#endif + +// (optional) Monitoring of battery-voltage via ADC +#ifdef MEASURE_BATTERY_VOLTAGE + #define VOLTAGE_READ_PIN 33 // GPIO used to monitor battery-voltage. Change to 35 if you're using Lolin D32 or Lolin D32 pro as it's hard-wired there! +#endif diff --git a/src/settings.h b/src/settings.h index f0ea49f..9ef88f8 100644 --- a/src/settings.h +++ b/src/settings.h @@ -1,88 +1,30 @@ #include "Arduino.h" //########################## MODULES ################################# -#define MDNS_ENABLE // When enabled, you don't have to handle with Tonuino's IP-address. If hostname is set to "tonuino", you can reach it via tonuino.local -#define MQTT_ENABLE // Make sure to configure mqtt-server and (optionally) username+pwd -#define FTP_ENABLE // Enables FTP-server; DON'T FORGET TO ACTIVATE AFTER BOOT BY PRESSING PAUSE + NEXT-BUTTONS (IN PARALLEL)! -#define NEOPIXEL_ENABLE // Don't forget configuration of NUM_LEDS if enabled +//#define MDNS_ENABLE // When enabled, you don't have to handle with Tonuino's IP-address. If hostname is set to "tonuino", you can reach it via tonuino.local +//#define MQTT_ENABLE // Make sure to configure mqtt-server and (optionally) username+pwd +//#define FTP_ENABLE // Enables FTP-server; DON'T FORGET TO ACTIVATE AFTER BOOT BY PRESSING PAUSE + NEXT-BUTTONS (IN PARALLEL)! +//#define NEOPIXEL_ENABLE // Don't forget configuration of NUM_LEDS if enabled #define NEOPIXEL_REVERSE_ROTATION // Some Neopixels are adressed/soldered counter-clockwise. This can be configured here. #define LANGUAGE 1 // 1 = deutsch; 2 = english //#define HEADPHONE_ADJUST_ENABLE // Used to adjust (lower) volume for optional headphone-pcb (refer maxVolumeSpeaker / maxVolumeHeadphone) #define SHUTDOWN_IF_SD_BOOT_FAILS // Will put ESP to deepsleep if boot fails due to SD. Really recommend this if there's in battery-mode no other way to restart ESP! Interval adjustable via deepsleepTimeAfterBootFails. -#define MEASURE_BATTERY_VOLTAGE // Enables battery-measurement via GPIO (ADC) and voltage-divider +//#define MEASURE_BATTERY_VOLTAGE // Enables battery-measurement via GPIO (ADC) and voltage-divider //#define PLAY_LAST_RFID_AFTER_REBOOT // When restarting Tonuino, the last RFID that was active before, is recalled and played //#define BLUETOOTH_ENABLE // Doesn't work currently (so don't enable) as there's not enough DRAM available //################## select SD card mode ############################# //#define SD_MMC_1BIT_MODE // run SD card in SD-MMC 1Bit mode -//#define SINGLE_SPI_ENABLE // If only one SPI-instance should be used instead of two (not yet working!) +//#define SINGLE_SPI_ENABLE // If only one SPI-instance should be used instead of two (not yet working!) (Works on ESP32-A1S with RFID via I2C) //################## select RFID reader ############################## -#define RFID_READER_TYPE_MFRC522 // use MFRC522 +//#define RFID_READER_TYPE_MFRC522_SPI // use MFRC522 via SPI +#define RFID_READER_TYPE_MFRC522_I2C // use MFRC522 via I2C //#define RFID_READER_TYPE_PN5180 - -//################## GPIO-configuration ############################## -#ifdef SD_MMC_1BIT_MODE - // uSD-card-reader (via SD-MMC 1Bit) - // - // SD_MMC uses fixed pins - // MOSI 15 - // SCKK 14 - // MISO 2 // hardware pullup may required -#else - // uSD-card-reader (via SPI) - #define SPISD_CS 15 // GPIO for chip select (SD) - #ifndef SINGLE_SPI_ENABLE - #define SPISD_MOSI 13 // GPIO for master out slave in (SD) => not necessary for single-SPI - #define SPISD_MISO 16 // GPIO for master in slave ou (SD) => not necessary for single-SPI - #define SPISD_SCK 14 // GPIO for clock-signal (SD) => not necessary for single-SPI - #endif -#endif - -// RFID (via SPI) -#define RST_PIN 99 // Not necessary but has to be set anyway; so let's use a dummy-number -#define RFID_CS 21 // GPIO for chip select (RFID) -#define RFID_MOSI 23 // GPIO for master out slave in (RFID) -#define RFID_MISO 19 // GPIO for master in slave out (RFID) -#define RFID_SCK 18 // GPIO for clock-signal (RFID) - -#ifdef RFID_READER_TYPE_PN5180 - #define RFID_BUSY 16 // PN5180 BUSY PIN - #define RFID_RST 22 // PN5180 RESET PIN -#endif -// I2S (DAC) -#define I2S_DOUT 25 // Digital out (I2S) -#define I2S_BCLK 27 // BCLK (I2S) -#define I2S_LRC 26 // LRC (I2S) - -// Rotary encoder -#define DREHENCODER_CLK 34 // If you want to reverse encoder's direction, just switch GPIOs of CLK with DT (in software or hardware) -#define DREHENCODER_DT 35 // Info: Lolin D32 / Lolin D32 pro 35 are using 35 for battery-voltage-monitoring! -#define DREHENCODER_BUTTON 32 // Button is used to switch Tonuino on and off - -// Control-buttons -#define PAUSEPLAY_BUTTON 5 // GPIO to detect pause/play -#define NEXT_BUTTON 4 // GPIO to detect next -#define PREVIOUS_BUTTON 2 // GPIO to detect previous (Important: as of 19.11.2020 changed from 33 to 2) - -// (optional) Power-control -#define POWER 17 // GPIO used to drive transistor-circuit, that switches off peripheral devices while ESP32-deepsleep - -// (optional) Neopixel -#define LED_PIN 12 // GPIO for Neopixel-signaling - -// (optinal) Headphone-detection -#ifdef HEADPHONE_ADJUST_ENABLE - #define HP_DETECT 22 // GPIO that detects, if there's a plug in the headphone jack or not -#endif - -// (optional) Monitoring of battery-voltage via ADC -#ifdef MEASURE_BATTERY_VOLTAGE - #define VOLTAGE_READ_PIN 33 // GPIO used to monitor battery-voltage. Change to 35 if you're using Lolin D32 or Lolin D32 pro as it's hard-wired there! -#endif - +//################## select Hardware Platform ############################## +// #define HAL 2 // HAL 1 = LoLin32, 2 = AI AudioKit - no need to define when using platformIO BuildProcess //#################### Various settings ############################## @@ -121,6 +63,7 @@ static const char backupFile[] PROGMEM = "/backup.txt"; // File is written every uint8_t FS_DEPTH = 5; // Max. recursion-depth of file tree const char *DIRECTORY_INDEX_FILE = "/files.json"; // Filename of files.json index file +//#################### Settings for optional Modules############################## // (optinal) Neopixel #ifdef NEOPIXEL_ENABLE #define NUM_LEDS 24 // number of LEDs