From 04bc34472ead75a854ab19371e5c90163a1f96d7 Mon Sep 17 00:00:00 2001 From: Torsten Stauder Date: Mon, 25 Jan 2021 20:19:39 +0100 Subject: [PATCH] User-wish: added optional directive USE_LAST_VOLUME_AFTER_REBOOT --- README.md | 3 ++- src/logmessages.h | 3 ++- src/logmessages_EN.h | 3 ++- src/main.cpp | 34 ++++++++++++++++++++++++---------- src/settings.h | 23 ++++++++++++----------- 5 files changed, 42 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 5ed272d..70bad73 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ Finally, the long announced Tonuino-PCB for Wemos' Lolin32 is [there](https://gi * 13.01.2020: Added fileexlorer to webgui (thanks @grch87 for contribution!). Now files and directories can be renamed, uploaded and deleted via webgui. * 17.01.2020: Added directive `STATIC_IP_ENABLE`: (optional) static IPv4-configuration * 18.01.2020: Added directive `PN5180_ENABLE_LPCD`: awake from deepsleep with PN5180 is now possible (but needs another GPIO) +* 25.01.2020: Added directive `USE_LAST_VOLUME_AFTER_REBOOT`: Remembers volume used at last shutdown after reboot. This overwrites initial volume from GUI. ## Known bugs * Some webstreams don't run. Guess it's a combination of saturated connection-pool and lack of heap-memory. Works probably better if ESP32-WROVER (e.g. Lolin D32 pro) is used, as this chip has PSRAM. Advice: Don't enable modules (e.g. MQTT) if you don't need them as this could save memory (and trouble). * English translation for webgui is currently outdated. This will be fixed soon when i18n-support will be integrated. @@ -87,7 +88,7 @@ The heart of my project is an ESP32 on a [Wemos Lolin32 development-board](https * If Neopixel enabled: set NUM_LEDS to the LED-number of your Neopixel-ring and define the Neopixel-type using `#define CHIPSET` * If you're using Arduino-IDE please make sure to change ESP32's partition-layout to `No OTA (2MB APP/2MB Spiffs)` as otherwise the sketch won't fit into the flash-memory. * Open board-specific config-file and edit according your needs. -* If you want to monitor battery's voltage, make sure to enable `MEASURE_BATTERY_VOLTAGE`. Use a voltage-divider as voltage of a LiPo is way too high for ESP32 (only 3.3V supported!). For my tests I connected VBat with a serial connection of 130k + 390k resistors (VBat(+)--130k--X--390k--VBat(-)). X is the measure-point where to connect the GPIO to. If using Lolin D32 or Lolin D32 pro, make sure to leave both resistor-values unchanged at 100k. Same for GPIO: unchanged at 35. +* If you want to monitor battery's voltage, make sure to enable `MEASURE_BATTERY_VOLTAGE`. Use a voltage-divider as voltage of a LiPo is way too high for ESP32 (only 3.3V supported!). For my tests I connected VBat with a serial connection of 130k + 130k resistors (VBat(+)--130k--X--130k--VBat(-)). X is the measure-point where to connect the GPIO to. If using Lolin D32 or Lolin D32 pro, make sure to leave both resistor-values unchanged at 100k. Same for GPIO: unchanged at 35. Please note: via GUI upper and lower voltage cut-offs for visualisation of battery-voltage (Neopixel) is available. Additional GUI-configurable values are interval (in minutes) for checking battery voltage and the cut off-voltage below whose a warning is shown via Neopixel. * If you're using a headphone-pcb with a [headphone jack](https://www.conrad.de/de/p/cliff-fcr1295-klinken-steckverbinder-3-5-mm-buchse-einbau-horizontal-polzahl-3-stereo-schwarz-1-st-705830.html) that has a pin to indicate if there's a plug, you can use this signal along with the feature `HEADPHONE_ADJUST_ENABLE` to limit the maximum headphone-voltage automatically. As per default you have to invert this signal (with a P-channel MOSFET) and connect it to GPIO22. * Enabling `SHUTDOWN_IF_SD_BOOT_FAILS` is really recommended if you run your Tonuino in battery-mode without having a restart-button exposed to the outside of Tonuino's enclosure. Because otherwise there's no way to restart your Tonuino and the error-state will remain until battery is empty (or you open the enclosure, hehe). diff --git a/src/logmessages.h b/src/logmessages.h index f11357f..60d6c73 100644 --- a/src/logmessages.h +++ b/src/logmessages.h @@ -172,4 +172,5 @@ static const char freeHeapAfterSetup[] PROGMEM = "Freier Heap-Speicher nach Setu static const char tryStaticIpConfig[] PROGMEM = "Statische IP-Konfiguration wird durchgeführt..."; static const char staticIPConfigFailed[] PROGMEM = "Statische IP-Konfiguration fehlgeschlagen"; static const char wakeUpRfidNoIso14443[] PROGMEM = "ESP32 wurde vom Kartenleser aus dem Deepsleep aufgeweckt. Allerdings wurde keine ISO-14443-Karte gefunden. Gehe zurück in den Deepsleep..."; -static const char lowPowerCardSuccess[] PROGMEM = "Kartenerkennung via 'low power' erfolgreich durchgeführt"; \ No newline at end of file +static const char lowPowerCardSuccess[] PROGMEM = "Kartenerkennung via 'low power' erfolgreich durchgeführt"; +static const char rememberLastVolume[] PROGMEM = "Lautstärke vor dem letzten Shutdown wird wiederhergestellt. Dies überschreibt die Einstellung der initialen Lautstärke aus der GUI."; \ No newline at end of file diff --git a/src/logmessages_EN.h b/src/logmessages_EN.h index 691481b..d6375e3 100644 --- a/src/logmessages_EN.h +++ b/src/logmessages_EN.h @@ -172,4 +172,5 @@ static const char freeHeapAfterSetup[] PROGMEM = "Free heap after setup"; static const char tryStaticIpConfig[] PROGMEM = "Performing static IP-configuration..."; static const char staticIPConfigFailed[] PROGMEM = "Static IP-configuration failed"; static const char wakeUpRfidNoIso14443[] PROGMEM = "Wakeup caused by low power card-detection. RF-field changed but no ISO-14443 card on reader was found. So I'll return back to sleep now..."; -static const char lowPowerCardSuccess[] PROGMEM = "Switch to low power card-detection: success"; \ No newline at end of file +static const char lowPowerCardSuccess[] PROGMEM = "Switch to low power card-detection: success"; +static const char rememberLastVolume[] PROGMEM = "Restored volume used before last shutdown. This overwrites the initial volume configured via webgui."; \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index ee188d3..55db775 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2433,6 +2433,9 @@ void deepSleepManager(void) { FastLED.clear(); FastLED.show(); #endif + #ifdef USE_LAST_VOLUME_AFTER_REBOOT + prefsSettings.putUInt("previousVolume", currentVolume); + #endif // SD card goto idle mode #ifdef SD_MMC_1BIT_MODE SD_MMC.end(); @@ -4408,16 +4411,27 @@ void setup() { loggerNl(serialDebug, (char *) FPSTR(wroteMaxInactivityToNvs), LOGLEVEL_ERROR); } - // Get initial volume from NVS - uint32_t nvsInitialVolume = prefsSettings.getUInt("initVolume", 0); - if (nvsInitialVolume) { - initVolume = nvsInitialVolume; - snprintf(logBuf, serialLoglength, "%s: %u", (char *) FPSTR(restoredInitialLoudnessFromNvs), nvsInitialVolume); - loggerNl(serialDebug, logBuf, LOGLEVEL_INFO); - } else { - prefsSettings.putUInt("initVolume", initVolume); - loggerNl(serialDebug, (char *) FPSTR(wroteInitialLoudnessToNvs), LOGLEVEL_ERROR); - } + #ifndef USE_LAST_VOLUME_AFTER_REBOOT + // Get initial volume from NVS + uint32_t nvsInitialVolume = prefsSettings.getUInt("initVolume", 0); + #else + // Get volume used at last shutdown + uint32_t nvsInitialVolume = prefsSettings.getUInt("previousVolume", 999); + if (nvsInitialVolume == 999) { + prefsSettings.putUInt("previousVolume", initVolume); + nvsInitialVolume = initVolume; + } else { + loggerNl(serialDebug, (char *) FPSTR(rememberLastVolume), LOGLEVEL_ERROR); + } + #endif + if (nvsInitialVolume) { + initVolume = nvsInitialVolume; + snprintf(logBuf, serialLoglength, "%s: %u", (char *) FPSTR(restoredInitialLoudnessFromNvs), nvsInitialVolume); + loggerNl(serialDebug, logBuf, LOGLEVEL_INFO); + } else { + prefsSettings.putUInt("initVolume", initVolume); + loggerNl(serialDebug, (char *) FPSTR(wroteInitialLoudnessToNvs), LOGLEVEL_ERROR); + } // Get maximum volume for speaker from NVS uint32_t nvsMaxVolumeSpeaker = prefsSettings.getUInt("maxVolumeSp", 0); diff --git a/src/settings.h b/src/settings.h index 1c7e957..7306d32 100644 --- a/src/settings.h +++ b/src/settings.h @@ -16,17 +16,18 @@ //########################## 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 NEOPIXEL_REVERSE_ROTATION // Some Neopixels are adressed/soldered counter-clockwise. This can be configured here. -#define LANGUAGE 1 // 1 = deutsch; 2 = 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) -#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 PLAY_LAST_RFID_AFTER_REBOOT // When restarting Tonuino, the last RFID that was active before, is recalled and played +#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 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) +#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 PLAY_LAST_RFID_AFTER_REBOOT // When restarting Tonuino, 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 BLUETOOTH_ENABLE // Doesn't work currently (so don't enable) as there's not enough DRAM available