Browse Source

Merge pull request #40 from kkloesener/master

Merge kkloesner ESP32-A1S-integration
master
biologist79 5 years ago
committed by GitHub
parent
commit
29adb2fd3e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. BIN
      Hardware-Plaforms/MRFC522-RC522-RFID.jpg
  2. BIN
      Hardware-Plaforms/drill.jpg
  3. 63
      platformio.ini
  4. 105
      src/main.cpp
  5. 55
      src/settings-espa1s.h
  6. 61
      src/settings-lolin32.h
  7. 79
      src/settings.h

BIN
Hardware-Plaforms/MRFC522-RC522-RFID.jpg

After

Width: 1569  |  Height: 2976  |  Size: 622 KiB

BIN
Hardware-Plaforms/drill.jpg

After

Width: 1024  |  Height: 932  |  Size: 172 KiB

63
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
[env:]

105
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 <ESP32Encoder.h>
#include "Arduino.h"
#include <WiFi.h>
@ -22,8 +30,12 @@
#include "SD.h"
#endif
#include "esp_task_wdt.h"
#ifdef RFID_READER_TYPE_MFRC522
#include <MFRC522.h>
#ifdef RFID_READER_TYPE_MFRC522_SPI
#include <MFRC522.h>
#endif
#ifdef RFID_READER_TYPE_MFRC522_I2C
#include "Wire.h"
#include <MFRC522_I2C.h>
#endif
#ifdef RFID_READER_TYPE_PN5180
#include <PN5180.h>
@ -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

55
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

61
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

79
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

Loading…
Cancel
Save