Einschlaffunktion: Lautstärke ausfaden

Ich habe eben die KidzAudio Badoo Box entdeckt:

Im Grunde handelt es sich um einen Audioplayer für Kinder ohne Cloudbindung, soweit gut. Aber an den TonUINO kommt die nicht ran, da eine RFID-Funktion fehlt und man somit einzelne Hörspiele nicht direkt anwählen kann. Aber die Box hat eine interessante Funktion, die auch für den TonUINO Sinn macht:

Mit aktivierter Einschlaffunktion wird die Lautstärke über einen Zeitraum von 30 Minuten langsam auf Null runtergeregelt. Das wäre doch eine Idee für einen Modifier.

1 Like

Coole Idee…

Noch besser wäre es, wenn die Hörspiele nicht direkt innerhalb 30 Minuten ausfaden, sondern die letzten 30 Minuten… Dann läuft das Hörspiel wenigstens zu Ende…

1 Like

Das hat schon mal jemand umgesetzt. Ich finde es aber gerade auf die Schnelle leider nicht wieder. :sweat_smile:

@Blackmore: Dazu müsste aber bekannt sein, wie lange das Hörspiel dauert. Das geht mit der Kombination Arduino+DFPlayer aber nicht.
Würde man aber z.B. den BY8001 statt des DFPlayers benutzen, könnte man die Länge der Tracks abfragen und damit die längenabhängige Ausfade-Funktion realisieren…

Das kann mam doch in den Sleepteimer integrieren, so dass in den letzten 30% der eingstellten zeit, die aktuelle Lautstärke gleichmäßig reduziert wird, bis man nach Ablauf des timers, bei Lautstärke 0 ist und die Box aus geht.

1 Like

@marco-117
Ich habe dafür ebenfalls den SleepTimer erweitert, jedoch nicht prozentual von der eingestellten Zeit sonder fix über die letzten 20s. Wenn man bei den kleinen Inkrementen über 30 Minuten ausblendet, müsste dieses logarithmisch erfolgen, da sonst eine ggf. ziemlich lange Zeit sehr, sehr wenig zu hören ist.

Ich habe das ganze einfach linear über die letzten 20s gemacht, zusätzlich habe ich das manuelle Lautstärke erhöhen während des Ausblenden deaktiviert (Kinder sind schlau :wink: ).

Wie folgt der auf die aktuelle DEV zurück portierte Code:

class SleepTimer : public Modifier {
    private:
        unsigned long sleepAtMillis = 0;
        unsigned long lastVolCheck = 0;
        uint16_t lastVolume = 0;
    public:

    void loop() {
        if (this->sleepAtMillis > 0 && millis() > this->sleepAtMillis) {
            Serial.println(F("=== SleepTimer::loop() -> SLEEP!"));
            mp3.pause();

            setStandbyTimer();
            activeModifier = NULL;
            delete this;
        }
        else {
            if (isPlaying() && this->sleepAtMillis > 0 && millis() > this->sleepAtMillis - 20000 && millis() > this->lastVolCheck + 1000) {
                if (this->lastVolume <= 0) {
                    this->lastVolume = volume;
                }
                this->lastVolCheck = millis();
                uint16_t val = this->lastVolume - map(this->lastVolCheck, this->sleepAtMillis - 20000, this->sleepAtMillis, 0, this->lastVolume);
                mp3.setVolume(val);
            }
        }
    }

    SleepTimer(uint8_t minutes) {
        Serial.println(F("=== SleepTimer()"));
        Serial.println(minutes);
        this->sleepAtMillis = millis() + minutes * 60000;
        this->lastVolCheck = millis();
    }

    uint8_t getActive() {
        Serial.println(F("== SleepTimer::getActive()"));
        return 1;
    }
};
1 Like

So ganz verstehe ich den Sinn davon nicht. :thinking:Entweder ich will das Hörspiel zu Ende hören, dann ist es doof die letzten 30 Minuten zu verpassen. Oder ich möchte einschlafen, dann kann auch einfach nach x Minuten ausfaden…

Gut das du es erwähnst, das hätte ich vergessen zu beachten.