ESPuino-miniD32(pro): Lolin D32/D32 pro mit SD_MMC und Port-Expander (SMD)

also… nun habe ich den zweiten D32 pro und auch eine nagelneue SD Karte wieder bei beiden Mainboards verwendet. Leider genau das identische Verhalten, wie oben beschrieben:

  • ist PN5180 konfiguriert ruckelt es ohne Ende ganz egal, ob dieser real in Hardware angesteckt ist oder nicht
  • konfiguriere ich den RC522 ruckelt es kurz am Anfang jedes Liedes und danach läuft es fließend
  • wenn ich alle RFID Reader auskommentiere und die MP3 direkt über das Web UI starte ist das Verhalten identisch zum RC522

Ich bin nun wirklich mit meinem Latein am Ende?!?

Poste mal deine Configs und zeige Bilder, damit man die Lötpunkte sieht.

Hi, ich hätte Interesse an diesem Board zusammen mit dem „D32 pro FePo“ und zwar gleich 3x das ganze. Hatte mich bereits im FePo Thread für diesen gemeldet würde das aber auch gerne zusammen nehmen sofern machbar. Danke schon mal im voraus und beste Grüße.

Wo kann ich so ein Teil kaufen ?

Habe eine PN geschrieben.

Ab der neuen rev2.2 ist es nun auch möglich, mittels der Lötbrücke JP6 zu konfigurieren, ob der 3.3 V-Pin auf dem externen I2C-Konnektor auch im Deepsleep mit 3.3 V versorgt wird oder ob er abgeschaltet wird. Bislang wurde es immer abgeschaltet.

Hintergrund für diese Anpassung ist: Der Port-Expander hängt an I2C und wird dauerhaft mit 3.3 V versorgt. Hat man nun ein externes I2C-Device am I2C-Bus und schaltet dieses ab, so „zieht es den I2C-Bus runter“ und das führt dazu, dass der Port-Expander nicht richtig arbeitet. Dementsprechend kann der ESP32 nicht aus dem Deepsleep aufgeweckt werden. Dem könnte man (getestet habe ich es nicht) wohl auch mit Koppelwiderständen auf dem I2C-Bus begegnen, aber ich habe mich jetzt erstmal für die einfachere Variante entschieden.

1 „Gefällt mir“

Guten Morgen! Ich würd mich auch für so einen PCB interessieren.
Im Forum hab ich schon einige Male gelesen, dass du (@biologist) auch immer wieder einige fertige auf Lager hast, könnte ich da eins erweben?

Schreibe dir eine PN.

Für diejenigen, die es interessiert: Oben im ersten Post habe ich jetzt endlich auch mal den Schaltplan verlinkt.

1 „Gefällt mir“

kleine Idee von mir: Wie wäre es die „Default“ Brücken und WiderstandsKonfig in kursiv auf die LP zu drucken (plus Text kursiv = Default) dann ist das löten noch einfacher :smiley:

Ich weiß gar nicht so genau, ob man in KiCad auck kursiv einstellen kann. Aber gut, man könnte es auch mit einem (*) lösen.
Wobei das mit den Default-Einstellungen gar nicht so einfach ist. Also mit JP5 zB stellt man ja ein, ob der Mosfet per GPIO32 oder per Port-Expander angesteuert wird. Per Default steht im Configfile 32, aber mein persönlicher Default ist 115 (Port-Expander). Weil kann halt das Gleiche und dann hat man noch einen GPIO frei.
Defacto ist es aber eh so, dass 70 bis 80% der Leute, die die Platine bei mir ordern, alles komplett gelötet haben möchten. Das war so von mir eigentlich nicht gedacht, aber so läuft es halt :rofl:.

Aber ja: Die Idee ist nicht schlecht. Kann ich mal berücksichtigen.

Mich hat ein Benutzer vorhin darauf aufmerksam gemacht, dass mit einem FePo-Develboard und der ESPuino-mini (alles inkl. rev2.3) der Reset-Taster nicht funktioniert, wenn der Akku angeschlossen ist. Und leider muss ich zugeben, dass mir hier ein Design-Bug unterlaufen ist, der zuvor offenbar niemand aufgefallen ist :woman_shrugging:.

Hintergrund:

Auf den Develboards, die sich für diese Platine eignen (Lolin D32, Lolin D32 pro, E32 Lipo und D32 pro FePo), gibt es einen Anschluss „EN“ und weiteren für „Reset“.

EN: Wirkt auf den Festspannungsregler (LDO). Zieht man EN auf GND, dann wird der LDO ausgeschaltet und damit auch der ESP32.
RESET: Wirkt direkt auf den ESP32 - ebenfalls mittels GND.

Bestandsaufnahme:

  • Der auf dem ESPuino-mini aufgelötete Taster und auch der JST-Anschluss für Reset wirken auf EN.
  • Der auf dem Develboard selbst aufgelötete mini-Taster wirkt auf RESET. Dieser funktioniert auch immer ohne Probleme.

Problem:

Das FePo-Develboard besitzt zwar auch einen LDO, jedoch wird dieser von der Akkuspannung umgangen. Das habe ich extra so gemacht, damit die eh schon passende Akkuspannung durch den LDO nicht „unsinnigerweise“ kleiner wird. Normalerweise eine feine Sache, jedoch fällt mir das hier auf die Füße, weil damit hat das Reset-Auslösen keine Wirkung mehr, wenn es über EN erfolgt und zudem ein Akku angeschlossen ist. Denn: Der LDO liefert dann zwar keine Spannung mehr, jedoch kommt sie dann eben ersatzweise vom Akku. Grrr.
Bei sämtlichen Develboards, die mit LiPo-Akkus arbeiten, gibt es hier kein Problem, da beide Spannungen (USB und Akku) immer durch den LDO gehen.

Was jetzt?

Tja, sau blöd :frowning:. Großes Sorry an dieser Stelle!
Ich werde ein Update der Platine machen und bei JLC bestellen. Alle diejenigen, die mini+FePo verwenden und zudem den Reset-Taster nutzen möchten, können sich bei mir zwecks Austausch melden. Ihr müsst mir dann eure mini-Platinen zurückschicken, ich löte die Teile auf die neue Platine um und schicke euch die Sachen zurück. Das wird aber erst Anfang November (frühestens) klappen.

Kann man das auch anders fixen?

a) Es müsste gehen, wenn man die Leiterbahn zwischen dem Reset-Taster und EN unterbricht und zudem vom Reset-Taster eine Drahtbrücke zu RESET lötet. Ein einfaches Brücken von EN und RESET geht NICHT, da EN mit bis zu 5 V arbeitet und RESET nur mit 3.3 V. Und auf RESET will man keine 5 V haben, weil das den ESP32 „himmelt“.

b) Einfacher geht es, wenn man nur nur einen externen Resetknopf nutzen möchte - also NICHT den, der auf der ESPuino-mini aufgelötet ist. Also eben so einen, wie man ihn per JST-Konnektor extern anschließen kann. Da kann man die Drähte einfach hinten auf der ESPuino-mini an RESET und GND anlöten und alles läuft wie gewünscht.

Update 14.11.2022:
Die neue Revision ist inzwischen eingetroffen und arbeitet auch bei FePo wie geplant.

Ich habe ein Problem mit LPCD und dem PN5180 (sorry Torsten :innocent: )
Gemacht habe ich:

  • Firmware 4.1 wurde geflashed
  • RFID_IRQ auf 106
  • PN5180_ENABLE_LPCD gesetzt und JP1 2+3, JP4 gesetzt

Wenn der ESP jetzt in den DeepSleep wechseln will (oder beim shutdown über die WebUI) kommt folgende Ausgabe:

Gehe in Deep Sleep wegen Inaktivität...
Gehe jetzt in Deep Sleep!
Lautsprecher ausgeschaltet
Firmware version=63.252
prepare low power card detection...
PN5180 IRQ PIN: 1
switchToLPCD failed
deep-sleep, good night.......
Maximale Inaktivitätszeit wurde aus NVS geladen: 2
Firmware version=4.1
RFID-Tags koennen jetzt gescannt werden...
RFID-Tags koennen jetzt gescannt werden...
Port-expander gefunden
Interrupt für Port-Expander aktiviert

Ich vermute ja das Problem liegt bei switchToLPCD failed. Dazu habe ich aber leider noch nichts weiter gefunden. Jemand eine Idee, was ich testen könnte um den Fehler zu finden? @tueddy vllt? :slightly_smiling_face:

EDIT
Ich hab gerade das Thema hier gefunden und das nfc.reset(); hat bei mir geholfen.

2 „Gefällt mir“

Kleines Update: Seit kurzem wird auf die mini-Platine kein Breadboard mehr für SD gelötet (Müllvermeidung, weniger Arbeit und weniger Kosten), sondern stattdessen ist der SD-Slot integriert. Vom Funktionsumfang her ändert sich jedoch nichts.

Und in Sachen Verbindung zur Kopfhörerplatine setze ich nun JST PH 6fach ein (weniger Kosten, weniger Arbeit und scheinbar verlässlicher). Das kürzlich berichtete Problem mit dem Reset-Button bei FePo ist auch gefixt. Das ist jetzt die Revision 2.3.

4 „Gefällt mir“

Hallo,

erstmal vielen Dank, für das tolle Projekt. Ich hab mich schon eine Weile hier im Forum umgesehen und würde nun gerne starten.

Hierfür würde ich am liebsten mit einem deiner PCBs beginnen. Gerne mit so wenig Lötaufwand wie möglich :wink:
Normale Lötverbindungen bekomme ich hin, bei SMD halte ich mich aber lieber raus.

Über eine PN würde ich mich freuen

Grüße

So, nachdem ich meine PCB vor ein paar Tagen ja schon bekommen hatte, kam heute auch endlich mein lolin 32 pro.

Habe alle Einstellungen entsprechend der Beschreibung vorgenommen, dennoch kommt leider bei mir

[E][SD_MMC.cpp:85] begin(): Failed to initialize the card (264). Make sure SD card lines have pull-up resistors in place.
E (7673) sdmmc_io: sdmmc_io_reset: unexpected return: 0x108

Und er rebootet in einer Endlosschleife.

Hier meine Einstellungen:

settings.h:

#ifndef __ESPUINO_SETTINGS_H__
    #define __ESPUINO_SETTINGS_H__
        #include "Arduino.h"
        #include "values.h"
#if __has_include("settings-override.h")
    #include "settings-override.h"
#else
    //######################### INFOS ####################################
    // This is the general configfile for ESPuino-configuration.

    //################## HARDWARE-PLATFORM ###############################
    /* Make sure to also edit the configfile, that is specific for your platform.
    If in doubts (your develboard is not listed) use HAL 1
    1: Wemos Lolin32                        => settings-lolin32.h
    2: ESP32-A1S Audiokit                   => settings-espa1s.h
    3: Wemos Lolin D32                      => settings-lolin_D32.h
    4: Wemos Lolin D32 pro                  => settings-lolin_D32_pro.h
    5: Lilygo T8 (V1.7)                     => settings-ttgo_t8.h
    6: ESPuino complete                     => settings-complete.h
    7: Lolin D32 pro SDMMC Port-Expander    => settings-lolin_d32_pro_sdmmc_pe.h
    8: AZDelivery ESP32 NodeMCU             => settings-azdelivery_sdmmc.h
    99: custom                              => settings-custom.h
    more to come...
    */
    #ifndef HAL             // Will be set by platformio.ini. If using Arduini-IDE you have to set HAL according your needs!
        #define HAL 7       // HAL 1 = LoLin32, 2 = ESP32-A1S-AudioKit, 3 = Lolin D32, 4 = Lolin D32 pro; ... 99 = custom
    #endif


    //########################## MODULES #################################
    #define PORT_EXPANDER_ENABLE          // When enabled, buttons can be connected via port-expander PCA9555 (https://forum.espuino.de/t/einsatz-des-port-expanders-pca9555/306)
    //#define I2S_COMM_FMT_LSB_ENABLE       // Enables FMT instead of MSB for I2S-communication-format. Used e.g. by PT2811. Don't enable for MAX98357a, AC101 or PCM5102A)
    #define MDNS_ENABLE                     // When enabled, you don't have to handle with ESPuino's IP-address. If hostname is set to "ESPuino", you can reach it via ESPuino.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 DE                     // DE = deutsch; EN = english
    //#define STATIC_IP_ENABLE              // Enables static IP-configuration (change static ip-section accordingly)
    #define HEADPHONE_ADJUST_ENABLE       // Used to adjust (lower) volume for optional headphone-pcb (refer maxVolumeSpeaker / maxVolumeHeadphone) and to enable stereo (if PLAY_MONO_SPEAKER is set)
    #define PLAY_MONO_SPEAKER               // If only one speaker is used enabling mono should make sense. Please note: headphones is always stereo (if HEADPHONE_ADJUST_ENABLE is active)
    #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_MAX17055      // Enables battery-measurement via external fuel gauge (MAX17055)
    //#define SHUTDOWN_ON_BAT_CRITICAL      // Whether to turn off on critical battery-level (only used if MEASURE_BATTERY_XXX is active)
    //#define PLAY_LAST_RFID_AFTER_REBOOT   // When restarting ESPuino, the last RFID that was active before, is recalled and played
    //#define USE_LAST_VOLUME_AFTER_REBOOT  // Remembers the volume used at last shutdown after reboot
    #define USEROTARY_ENABLE                // If rotary-encoder is used (don't forget to review WAKEUP_BUTTON if you disable this feature!)
    #define BLUETOOTH_ENABLE                // If enabled and bluetooth-mode is active, you can stream to your ESPuino via bluetooth (a2dp-sink).
    //#define IR_CONTROL_ENABLE             // Enables remote control (https://forum.espuino.de/t/neues-feature-fernsteuerung-per-infrarot-fernbedienung/265)
    #define CACHED_PLAYLIST_ENABLE          // Enables playlist-caching (infos: https://forum.espuino.de/t/neues-feature-cached-playlist/515)
    #define PAUSE_WHEN_RFID_REMOVED       // Playback starts when card is applied and pauses automatically, when card is removed (https://forum.espuino.de/t/neues-feature-pausieren-wenn-rfid-karte-entfernt-wurde/541)
    //#define DONT_ACCEPT_SAME_RFID_TWICE   // RFID-reader doesn't accept the same RFID-tag twice in a row (unless it's a modification-card or RFID-tag is unknown in NVS). Flag will be ignored silently if PAUSE_WHEN_RFID_REMOVED is active. (https://forum.espuino.de/t/neues-feature-dont-accept-same-rfid-twice/1247)
    #define SAVE_PLAYPOS_BEFORE_SHUTDOWN  // When playback is active and mode audiobook was selected, last play-position is saved automatically when shutdown is initiated
    #define SAVE_PLAYPOS_WHEN_RFID_CHANGE // When playback is active and mode audiobook was selected, last play-position is saved automatically for old playlist when new RFID-tag is applied


    //################## select SD card mode #############################
    #define SD_MMC_1BIT_MODE              // run SD card in SD-MMC 1Bit mode (using GPIOs 15 + 14 + 2 is mandatory!)
    //#define SINGLE_SPI_ENABLE             // If only one SPI-instance should be used instead of two (not yet working!)


    //################## select RFID reader ##############################
    //#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       // use PN5180 via SPI

    #ifdef RFID_READER_TYPE_MFRC522_I2C
        #define MFRC522_ADDR 0x28           // default I2C-address of MFRC522
    #endif

    #ifdef RFID_READER_TYPE_PN5180
        //#define PN5180_ENABLE_LPCD        // Wakes up ESPuino if RFID-tag was applied while deepsleep is active. Only ISO-14443-tags are supported for wakeup!
    #endif

    #if defined(RFID_READER_TYPE_MFRC522_I2C) || defined(RFID_READER_TYPE_MFRC522_SPI)
        constexpr uint8_t rfidGain = 0x07 << 4;      // Sensitivity of RC522. For possible values see reference: https://forum.espuino.de/uploads/default/original/1X/9de5f8d35cbc123c1378cad1beceb3f51035cec0.png
    #endif


    //############# Port-expander-configuration ######################
    #ifdef PORT_EXPANDER_ENABLE
        constexpr uint8_t expanderI2cAddress = 0x20;  // I2C-address of PCA9555 (0x20 is true if PCA's pins A0+A1+A2 are pulled to GND)
    #endif

    //################## BUTTON-Layout ##################################
    /* German documentation: https://forum.espuino.de/t/das-dynamische-button-layout/224
    Please note the following numbers as you need to know them in order to define actions for buttons.
    Even if you don't use all of them, their numbers won't change
        0: NEXT_BUTTON
        1: PREVIOUS_BUTTON
        2: PAUSEPLAY_BUTTON
        3: ROTARYENCODER_BUTTON
        4: BUTTON_4
        5: BUTTON_5

    Don't forget to enable/configure those buttons you want to use in your develboard-specific config (e.g. settings-custom.h)

    Single-buttons [can be long or short] (examples):
        BUTTON_0_SHORT => Button 0 (NEXT_BUTTON) pressed shortly
        BUTTON_3_SHORT => Button 3 (ROTARYENCODER_BUTTON) pressed shortly
        BUTTON_4_LONG => Button 4 (BUTTON_4) pressed long

    Multi-buttons [short only] (examples):
        BUTTON_MULTI_01 => Buttons 0+1 (NEXT_BUTTON + PREVIOUS_BUTTON) pressed in parallel
        BUTTON_MULTI_12 => Buttons 1+2 (PREV_BUTTON + PAUSEPLAY_BUTTON) pressed in parallel

    Actions:
        To all of those buttons, an action can be assigned freely.
        Please have a look at values.h to look up actions available (>=100 can be used)
        If you don't want to assign an action or you don't use a given button: CMD_NOTHING has to be set
    */
    // *****BUTTON*****        *****ACTION*****
    #define BUTTON_0_SHORT    CMD_NEXTTRACK
    #define BUTTON_1_SHORT    CMD_PREVTRACK
    #define BUTTON_2_SHORT    CMD_PLAYPAUSE
    #define BUTTON_3_SHORT    CMD_MEASUREBATTERY
    #define BUTTON_4_SHORT    CMD_SEEK_BACKWARDS
    #define BUTTON_5_SHORT    CMD_SEEK_FORWARDS

    #define BUTTON_0_LONG     CMD_LASTTRACK
    #define BUTTON_1_LONG     CMD_FIRSTTRACK
    #define BUTTON_2_LONG     CMD_PLAYPAUSE
    #define BUTTON_3_LONG     CMD_SLEEPMODE
    #define BUTTON_4_LONG     CMD_VOLUMEUP
    #define BUTTON_5_LONG     CMD_VOLUMEDOWN

    #define BUTTON_MULTI_01   CMD_NOTHING   //CMD_TOGGLE_WIFI_STATUS (disabled now to prevent children from unwanted WiFi-disable)
    #define BUTTON_MULTI_02   CMD_ENABLE_FTP_SERVER
    #define BUTTON_MULTI_03   CMD_NOTHING
    #define BUTTON_MULTI_04   CMD_NOTHING
    #define BUTTON_MULTI_05   CMD_NOTHING
    #define BUTTON_MULTI_12   CMD_TELL_IP_ADDRESS
    #define BUTTON_MULTI_13   CMD_NOTHING
    #define BUTTON_MULTI_14   CMD_NOTHING
    #define BUTTON_MULTI_15   CMD_NOTHING
    #define BUTTON_MULTI_23   CMD_NOTHING
    #define BUTTON_MULTI_24   CMD_NOTHING
    #define BUTTON_MULTI_25   CMD_NOTHING
    #define BUTTON_MULTI_34   CMD_NOTHING
    #define BUTTON_MULTI_35   CMD_NOTHING
    #define BUTTON_MULTI_45   CMD_NOTHING

    //#################### Various settings ##############################

    // Serial-logging-configuration
    #define SERIAL_LOGLEVEL LOGLEVEL_DEBUG              // Current loglevel for serial console

    // Static ip-configuration
    #ifdef STATIC_IP_ENABLE
        #define LOCAL_IP   192,168,2,100                // ESPuino's IP
        #define GATEWAY_IP 192,168,2,1                  // IP of the gateway/router
        #define SUBNET_IP  255,255,255,0                // Netmask of your network (/24 => 255.255.255.0)
        #define DNS_IP     192,168,2,1                  // DNS-server of your network; in private networks it's usually the gatewy's IP
    #endif

    // Buttons (better leave unchanged if in doubts :-))
    constexpr uint8_t buttonDebounceInterval = 50;                // Interval in ms to software-debounce buttons
    constexpr uint16_t intervalToLongPress = 700;                 // Interval in ms to distinguish between short and long press of buttons

    // RFID-RC522
    #define RFID_SCAN_INTERVAL 100                      // Interval-time in ms (how often is RFID read?)

    // Automatic restart
    #ifdef SHUTDOWN_IF_SD_BOOT_FAILS
        constexpr uint32_t deepsleepTimeAfterBootFails = 20;      // Automatic restart takes place if boot was not successful after this period (in seconds)
    #endif

    // FTP
    // Nothing to be configured here...
    // Default user/password is esp32/esp32 but can be changed via webgui

    // ESPuino will create a WiFi if joing existing WiFi was not possible. Name can be configured here.
    constexpr const char accessPointNetworkSSID[] PROGMEM = "ESPuino";     // Access-point's SSID
    
	// Bluetooth
	constexpr const char nameBluetoothSinkDevice[] PROGMEM = "ESPuino";        // Name of your ESPuino as Bluetooth-device
    constexpr const char nameBluetoothSourceDevice[] PROGMEM = "My POGS Wireless Headphone"; // Name of Bluetooth-device to connect to (BT-Headset name) (https://forum.espuino.de/t/neues-feature-bluetooth-kopfhoerer/1293/)

    // Where to store the backup-file for NVS-records
    constexpr const char backupFile[] PROGMEM = "/backup.txt"; // File is written every time a (new) RFID-assignment via GUI is done
    constexpr const char playlistCacheFile[] PROGMEM = "playlistcache.csv"; // Filename that is used for caching playlists

    //#################### Settings for optional Modules##############################
    // (optinal) Neopixel
    #ifdef NEOPIXEL_ENABLE
        #define NUM_LEDS                    24          // number of LEDs
        #define CHIPSET                     WS2812B     // type of Neopixel
        #define COLOR_ORDER                 GRB
    #endif

    #if defined(MEASURE_BATTERY_VOLTAGE) || defined(MEASURE_BATTERY_MAX17055)
        #define BATTERY_MEASURE_ENABLE                 // Don't change. Set automatically if any method of battery monitoring is selected.
        constexpr uint8_t s_batteryCheckInterval = 10; // How often battery is measured (in minutes) (can be changed via GUI!)
    #endif

    #ifdef MEASURE_BATTERY_VOLTAGE
        // (optional) Default-voltages for battery-monitoring via Neopixel; can be changed later via WebGUI
        constexpr float s_warningLowVoltage = 3.4;                      // If battery-voltage is <= this value, a cyclic warning will be indicated by Neopixel (can be changed via GUI!)
        constexpr float s_warningCriticalVoltage = 3.1;                 // If battery-voltage is <= this value, assume battery near-empty. Set to 0V to disable.
        constexpr float s_voltageIndicatorLow = 3.0;                    // Lower range for Neopixel-voltage-indication (0 leds) (can be changed via GUI!)
        constexpr float s_voltageIndicatorHigh = 4.2;                   // Upper range for Neopixel-voltage-indication (all leds) (can be changed via GUI!)
    #endif

    #ifdef MEASURE_BATTERY_MAX17055
        constexpr float s_batteryLow = 15.0;            // low percentage
        constexpr float s_batteryCritical = 5.0;        // critical percentage

        constexpr uint16_t s_batteryCapacity = 6000;    // design cap of battery (mAh)
        constexpr uint16_t s_emptyVoltage = 300;        // empty voltage in 10mV
        constexpr uint16_t s_recoveryVoltage = 360;     // recovery voltage in 10mV
        constexpr uint8_t  s_batteryChemistry = 0x60;   // 0 = Li-Ion, 0x20 = NCR, 0x60 = LiFePO4
        constexpr float s_resistSensor = 0.01;          // current sense resistor, currently non-default values might lead to problems
        constexpr bool s_vCharge = false;                   // true if charge voltage is greater than 4.275V
    #endif

    // enable I2C if necessary
    #if defined(RFID_READER_TYPE_MFRC522_I2C) || defined(PORT_EXPANDER_ENABLE) || defined(MEASURE_BATTERY_MAX17055)
        #define I2C_2_ENABLE
    #endif

    // (optinal) Headphone-detection (leave unchanged if in doubts...)
    #ifdef HEADPHONE_ADJUST_ENABLE
        constexpr uint16_t headphoneLastDetectionDebounce = 1000; // Debounce-interval in ms when plugging in headphone
    #endif

    // Seekmode-configuration
    constexpr uint8_t jumpOffset = 30;                            // Offset in seconds to jump for commands CMD_SEEK_FORWARDS / CMD_SEEK_BACKWARDS

    // (optional) Topics for MQTT
    #ifdef MQTT_ENABLE
        constexpr uint16_t mqttRetryInterval = 60;                // Try to reconnect to MQTT-server every (n) seconds if connection is broken
        constexpr uint8_t mqttMaxRetriesPerInterval = 1;          // Number of retries per time-interval (mqttRetryInterval). mqttRetryInterval 60 / mqttMaxRetriesPerInterval 1 => once every 60s
        #define DEVICE_HOSTNAME "ESP32-ESPuino"         // Name that is used for MQTT
        constexpr const char topicSleepCmnd[] PROGMEM = "Cmnd/ESPuino/Sleep";
        constexpr const char topicSleepState[] PROGMEM = "State/ESPuino/Sleep";
        constexpr const char topicRfidCmnd[] PROGMEM = "Cmnd/ESPuino/Rfid";
        constexpr const char topicRfidState[] PROGMEM = "State/ESPuino/Rfid";
        constexpr const char topicTrackState[] PROGMEM = "State/ESPuino/Track";
        constexpr const char topicTrackControlCmnd[] PROGMEM = "Cmnd/ESPuino/TrackControl";
        constexpr const char topicCoverChangedState[] PROGMEM = "State/ESPuino/CoverChanged";
        constexpr const char topicLoudnessCmnd[] PROGMEM = "Cmnd/ESPuino/Loudness";
        constexpr const char topicLoudnessState[] PROGMEM = "State/ESPuino/Loudness";
        constexpr const char topicSleepTimerCmnd[] PROGMEM = "Cmnd/ESPuino/SleepTimer";
        constexpr const char topicSleepTimerState[] PROGMEM = "State/ESPuino/SleepTimer";
        constexpr const char topicState[] PROGMEM = "State/ESPuino/State";
        constexpr const char topicCurrentIPv4IP[] PROGMEM = "State/ESPuino/IPv4";
        constexpr const char topicLockControlsCmnd[] PROGMEM ="Cmnd/ESPuino/LockControls";
        constexpr const char topicLockControlsState[] PROGMEM ="State/ESPuino/LockControls";
        constexpr const char topicPlaymodeState[] PROGMEM = "State/ESPuino/Playmode";
        constexpr const char topicRepeatModeCmnd[] PROGMEM = "Cmnd/ESPuino/RepeatMode";
        constexpr const char topicRepeatModeState[] PROGMEM = "State/ESPuino/RepeatMode";
        constexpr const char topicLedBrightnessCmnd[] PROGMEM = "Cmnd/ESPuino/LedBrightness";
        constexpr const char topicLedBrightnessState[] PROGMEM = "State/ESPuino/LedBrightness";
        constexpr const char topicWiFiRssiState[] PROGMEM = "State/ESPuino/WifiRssi";
        constexpr const char topicSRevisionState[] PROGMEM = "State/ESPuino/SoftwareRevision";
        #ifdef BATTERY_MEASURE_ENABLE
            constexpr const char topicBatteryVoltage[] PROGMEM = "State/ESPuino/Voltage";
            constexpr const char topicBatterySOC[] PROGMEM     = "State/ESPuino/Battery";
        #endif
    #endif

    // !!! MAKE SURE TO EDIT PLATFORM SPECIFIC settings-****.h !!!
    #if (HAL == 1)
        #include "settings-lolin32.h"                       // Contains all user-relevant settings for Wemos Lolin32
    #elif (HAL == 2)
        #include "settings-espa1s.h"                        // Contains all user-relevant settings for ESP32-A1S Audiokit
    #elif (HAL == 3)
        #include "settings-lolin_d32.h"                     // Contains all user-relevant settings for Wemos Lolin D32
    #elif (HAL == 4)
        #include "settings-lolin_d32_pro.h"                 // Contains all user-relevant settings for Wemos Lolin D32 pro
    #elif (HAL == 5)
        #include "settings-ttgo_t8.h"                       // Contains all user-relevant settings for Lilygo TTGO T8 1.7
    #elif (HAL == 6)
        #include "settings-complete.h"                      // Contains all user-relevant settings for ESPuino complete
    #elif (HAL == 7)
        #include "settings-lolin_d32_pro_sdmmc_pe.h"        // Pre-configured settings for ESPuino Lolin D32 pro with SDMMC + port-expander (https://forum.espuino.de/t/espuino-minid32pro-lolin-d32-pro-mit-sd-mmc-und-port-expander-smd/866)
    #elif (HAL == 8)
        #include "settings-azdelivery_sdmmc.h"              // Pre-configured settings for AZ Delivery ESP32 NodeMCU / Devkit C (https://forum.espuino.de/t/az-delivery-esp32-nodemcu-devkit-c-mit-sd-mmc-und-pn5180-als-rfid-leser/634)
    #elif (HAL == 9)
        #include "settings-lolin_d32_sdmmc_pe.h"            // Pre-configured settings for ESPuino Lolin D32 pro with SDMMC + port-expander (https://forum.espuino.de/t/espuino-minid32-pro-lolin-d32-pro-mit-sd-mmc-und-port-expander-smd/866)
    #elif (HAL == 99)
        #include "settings-custom.h"                        // Contains all user-relevant settings custom-board
    #endif

    //#define ENABLE_ESPUINO_DEBUG                            // Needs modification of platformio.ini (https://forum.espuino.de/t/rfid-mit-oder-ohne-task/353/21); better don't enable unless you know what you're doing :-)
    #endif //settings_override
#endif

settings-lolin_d32_pro_sdmmc_pe.h;

#ifndef __ESPUINO_SETTINGS_LOLIN_D32_PRO_H__
#define __ESPUINO_SETTINGS_LOLIN_D32_PRO_H__
    #include "Arduino.h"

    //######################### INFOS ####################################
    /* This is a PCB-specific config-file for *Wemos Lolin32 D32 pro with port-expander PCA9555PW and SD_MMC*.
    PCB: t.b.a.
    Forum: https://forum.espuino.de/t/espuino-minid32-pro-lolin-d32-pro-mit-sd-mmc-und-port-expander-smd/866
    Infos: https://www.wemos.cc/en/latest/d32/d32_pro.html
    Schematics Lolin D32 pro: https://www.wemos.cc/en/latest/_static/files/sch_d32_pro_v2.0.0.pdf
    Schematics PCB: t.b.a.
    Caveats: GPIO35 (battery monitoring) + don't use internal SD-slot as it's to capable of SD_MMC because of its pin-layout!
    Status:
        tested with PN5180 + SD_MMC (by biologist79)
    */

    //################## GPIO-configuration ##############################
    // Please note: GPIOs 34, 35, 36, 39 are input-only and don't have internal pullup-resistors.
    // So if connecting a button to these, make sure to add a 10k-pullup-resistor for each button.
    // Further infos: https://randomnerdtutorials.com/esp32-pinout-reference-gpios/
    // GPIOs 16+17 are not available for D32 pro as they're used to internal purposes (PSRAM).
    // All GPIOs >=100 and <= 115 are connected to a port-expander
    #ifdef SD_MMC_1BIT_MODE
        //  (MOSI)    15  CMD
        //  (SCK)     14  SCK
        //  (MISO)     2  D0
    #else
        // SPI-SD IS NOT SUPPORTED BY THIS PCB - DON'T USE INTERNAL SD-READER!
        #define SPISD_CS                    99          // GPIO for chip select (SD)
        #ifndef SINGLE_SPI_ENABLE
            #define SPISD_MOSI              99          // GPIO for master out slave in (SD) => not necessary for single-SPI
            #define SPISD_MISO              99          // GPIO for master in slave ou (SD) => not necessary for single-SPI
            #define SPISD_SCK               99          // GPIO for clock-signal (SD) => not necessary for single-SPI
        #endif
    #endif

    // RFID (via SPI)
    #define RST_PIN                         99          // Used as dummy for RC522
    #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                   33          // PN5180 BUSY PIN
        #define RFID_RST                    22          // PN5180 RESET PIN
        #define RFID_IRQ                    99          // Needs to be adjusted to 106 if LPCD-mode is desired!
    #endif

    // I2S (DAC)
    #define I2S_DOUT                        25          // Digital out (I2S)
    #define I2S_BCLK                        27          // BCLK (I2S)
    #define I2S_LRC                         26          // LRC (I2S)

    // Rotary encoder
    #ifdef USEROTARY_ENABLE
        //#define REVERSE_ROTARY                        // To reverse encoder's direction; switching CLK / DT in hardware does the same
        #define ROTARYENCODER_CLK           34          // rotary encoder's CLK
        #define ROTARYENCODER_DT            39          // 39 = 'VN'; rotary encoder's DT
    #endif

    // Amp enable (optional)
    #define GPIO_PA_EN                      108         // To enable/disable amp for loudspeaker; connected to port-expander

    // Control-buttons
    #define NEXT_BUTTON                     102         // Next-Button: connected to port-expander
    #define PREVIOUS_BUTTON                 100         // Prev-Button: connected to port-expander
    #define PAUSEPLAY_BUTTON                101         // Pplay-Button: connected to port-expander
    #define ROTARYENCODER_BUTTON            103         // Set to 99 to disable the button; connected to port-expander
    #define BUTTON_4                        104         // Button 4: connected to port-expander
    #define BUTTON_5                        105         // Button 5: connected to port-expander

    // Channels of port-expander can be read cyclic or interrupt-driven. It's strongly recommended to use the interrupt-way!
    // Infos: https://forum.espuino.de/t/einsatz-des-port-expanders-pca9555/306
    #ifdef PORT_EXPANDER_ENABLE
        #define PE_INTERRUPT_PIN            36          // GPIO that is used to receive interrupts from port-expander + to wake up ESP32
    #endif

    // I2C-configuration (necessary for PCA9555)
    #ifdef I2C_2_ENABLE
        #define ext_IIC_CLK                 4           // i2c-SCL (clock)
        #define ext_IIC_DATA                13          // i2c-SDA (data)
    #endif

    // Wake-up button => this also is the interrupt-pin if port-expander is enabled!
    // Please note: only RTC-GPIOs (0, 4, 12, 13, 14, 15, 25, 26, 27, 32, 33, 34, 35, 36, 39, 99) can be used! Set to 99 to DISABLE.
    // Please note #2: this button can be used as interrupt-pin for port-expander. If so, all pins connected to port-expander can wake up ESPuino.
    #define WAKEUP_BUTTON                   36          // Defines the button that is used to wake up ESPuino from deepsleep; set to 99 to disable

    // Power-control
    #define POWER                           115          // GPIO used to drive transistor-circuit, that switches off peripheral devices while ESP32-deepsleep
    #ifdef POWER
        #define INVERT_POWER                          // If enabled, use inverted logic for POWER circuit, that means peripherals are turned off by writing HIGH
    #endif

    // (optional) Neopixel
    #define LED_PIN                         12          // GPIO for Neopixel-signaling

    // (optinal) Headphone-detection
    #ifdef HEADPHONE_ADJUST_ENABLE
        //#define DETECT_HP_ON_HIGH                      // Per default headphones are supposed to be connected if HT_DETECT is LOW. DETECT_HP_ON_HIGH will change this behaviour to HIGH.
        #define HP_DETECT                   107          // GPIO that detects, if there's a plug in the headphone jack or not; connected to port-expander
    #endif

    // (optional) Monitoring of battery-voltage via ADC
    #ifdef MEASURE_BATTERY_VOLTAGE
        #define VOLTAGE_READ_PIN            35          // GPIO used to monitor battery-voltage. Don't change, it's built in
        constexpr float referenceVoltage = 3.30;        // Voltage between 3.3V and GND-pin at the develboard in battery-mode (disconnect USB!)
        constexpr float offsetVoltage = 0.1;            // If voltage measured by ESP isn't 100% accurate, you can add an correction-value here
    #endif

    // (optional) For measuring battery-voltage a voltage-divider is already onboard. Connect a LiPo and use it!
    #ifdef MEASURE_BATTERY_VOLTAGE
        constexpr uint16_t rdiv1 = 100;                 // Don't change, it's built in
        constexpr uint16_t rdiv2 = 100;                 // Don't change, it's built in
    #endif

    #ifdef IR_CONTROL_ENABLE
        #define IRLED_PIN                   5               // GPIO where IR-receiver is connected (only tested with VS1838B)
        #define IR_DEBOUNCE                 200             // Interval in ms to wait at least for next signal (not used for actions volume up/down)

        // Actions available. Use your own remote control and have a look at the console for "Command=0x??". E.g. "Protocol=NEC Address=0x17F Command=0x68 Repeat gap=39750us"
        // Make sure to define a hex-code not more than once as this will lead to a compile-error
        // https://forum.espuino.de/t/neues-feature-fernsteuerung-per-infrarot-fernbedienung/265
        #define RC_PLAY                     0x68            // command for play
        #define RC_PAUSE                    0x67            // command for pause
        #define RC_NEXT                     0x6b            // command for next track of playlist
        #define RC_PREVIOUS                 0x6a            // command for previous track of playlist
        #define RC_FIRST                    0x6c            // command for first track of playlist
        #define RC_LAST                     0x6d            // command for last track of playlist
        #define RC_VOL_UP                   0x1a            // Command for volume up (one step)
        #define RC_VOL_DOWN                 0x1b            // Command for volume down (one step)
        #define RC_MUTE                     0x1c            // Command to mute ESPuino
        #define RC_SHUTDOWN                 0x2a            // Command for deepsleep
        #define RC_BLUETOOTH                0x72            // Command to enable/disable bluetooth
        #define RC_FTP                      0x65            // Command to enable FTP-server
    #endif
#endif

Bei env ist auch der richtige lolin ausgewählt.

Bist du dir da 100% sicher? Weil da verliest man sich leicht.
Die Settings von oben sehen ok aus.

Ich war gestern Abend wohl so müde, dass ich nur eine Seite des lolin angelötet hatte… :rofl:

Also, es funktioniert alles. Ich hab nur jetzt ein anderes (mechanisches) Problem: Ich habe die Batterie angesteckt, und jetzt bekomme ich sie nicht mehr raus. Der Stecker war so hart verkantet, dass beim Rausziehen die Buchse auseinandergebrochen ist.

Funktioniert aber noch :wink:

Ui. Aber so lange es noch funktioniert - umso besser :slight_smile:
Ja aber schön, dass es geklappt hat :+1:

Hey, ich habe vor 3 Jahren einen Tonuino gebaut und würde das ganze gerne mit mehr Features versehen. Ich hätte gerne dafür eine der (SMD)gelöteten Platinen, was genau muss ich tun?