Dev-Branch

Habe den neuen FTP-Server getestet und für (sehr) gut befunden:

  • Im FTP-Manager z.B. Filezilla muss man nur IP, Benutzername & Kennwort eintragen. Keine Codepage oder max. Anzahl von Verbindungen.
  • Bessere Uploadgeschwindiigkeit. Ich erreiche ungefähr 450KB/s, ein wenig langsamer als Webupload.
  • Beim Upload mehrerer Dateien oder eines Ordners scheinen zwei Verbindungen gleichzeitig möglich
  • Absolut stabil, ganze Ordner waren kein Problem
  • Die Bibliothek ist auch in PlatformIO registriert und aktiv. Bugs können dort gemeldet werden und der Autor kümmert sich drum.

Das ist jetzt im DEV-Branch verfügbar.
@Joe91 Vielen Dank für Deine Arbeit!

5 „Gefällt mir“

Ich hab mal die .gitignore angepast, vscode zeigt mir da dauernd Änderungen (in seinem eigenem Ordner) an… Könnt ja mal gucken ob das für euch so okay ist.

Bei mir wird immer die VS-Code Datei „extension.json“ als geändert angezeigt obwohl da nix geändert ist.
Verschwindet die damit aus der Änderungsansicht?

genau das passiert bei mir auch… daher der PR

Eine kleine Sommerloch-Meldung aus dem DEV-Branch:

ESPuino zeigt jetzt beim Start die empfangene NTP Uhrzeit im Log an:

[ 2142 ]  Synchronisiere Uhrzeit via NTP...
[ 4335 ]  Datum/Uhrzeit empfangen von NTP-Server: 20.07.2023, 15:30:40

Datum/Uhrzeit wird z.B. für hochgeladene Dateien auf SD-Karte als Zeitstempel benötigt (FTP oder Web-Upload). CMD_TELL_TIME wäre auch denkbar.

Außerdem kann die Zeitzone in settings.h hier eingestellt werden, @compactflash z.B. für Toronto/Kanada

2 „Gefällt mir“

Aus dem DEV-Branch:

  • Die Neustart-Methode ist überarbeitet und beendet die einzelnen Module genauso wie beim Deep-Sleep. Damit werden z.B. die LED’s sauber ausgeschaltet und Einstellungen gespeichert wie z.B. SAVE_PLAYPOS_BEFORE_SHUTDOWN Vorher gab es einfach einen Hard-Reset Vorschlag stammt aus dieser Diskussion
  • Für den Neustart gibt es ein neues Kommando CMD_RESTARTSYSTEM, evt. mag das jemand auch für MQTT veröffentlichen, gern mit einem Pull-Request?
  • Die Gesamtspieldauer & Spielzeit seit letztem Start wird gespeichert und in der Weboberfläche angezeigt. Also wie lange läuft der ESPuino schon & spielt Musik ab…
  • In der Webobefläche wird die ESP32-Hardware (Modell, Revision & CPU Takt) angezeigt. Das könnte evt. noch wichtig werden falls „Arduino als Komponente“ nur für neuere Chiprevisionen (Revision 3) verfügbar wird
  • Neues Kommando CMD_TELL_CURRENT_TIME sagt die aktuelle Uhrzeit an. Die Tell-Commands können in der Zukunft leicht erweitert werden, z.B. Ansage des aktuellen Titels/Webstreams oder andere dynamische Ansagen

Feedback, Vorschläge, Bugreports wie immer gern hier!

4 „Gefällt mir“

Bei mir schaltet der ESPuino bei Neustart aus???

Die einzelnen Module werden jetzt vor dem Neustart sauber beendet. Dazu gehört auch Power-Off. Hast Du damit Probleme festgestellt? Oder startet der gar nicht neu? Am Besten nochmal genauer beschreiben

Hi, wahrscheinlich liegt es an meinen Boards mit ON/OFF-Controller. Da gibt es schon länger ein Problem welches ich hier beschrieben habe.

Und zwar so:
Pin Power, bei mir GPIO21, ist über eine Diode mit Pin ROTARYENCODER_BUTTON, bei mir GPIO39, verbunden. In der System.cpp habe ich den delay von 200 auf z.Zt.1800 geändert.

// switch off power
Power_PeripheralOff();
delay(1800);
#if defined (RFID_READER_TYPE_MFRC522_SPI) || defined (RFID_READER_TYPE_MFRC522_I2C) || defined(RFID_READER_TYPE_PN5180)
Rfid_Exit();
#endif

Damit bilde ich einen langen Tastendruck des ROTARYENCODER_BUTTON nach um das

zu erreichen . Ich habe momentan die Zeit auf 1,8 Sek. verringert weil solange der PIN „gedrückt“ ist kein erneutes Einschalten möglich ist. Die 1,8 Sek sind ganz praktikabel. Die Zeit muss größer sein als die mit dem Kondensator C_PDT ( Wert aktuell auch verkleinert) hardwaremäßig eingestellte Zeit.

Ich kann den neuen Code noch nicht komplett nachvollziehen , aber definitiv geht der Reboot wenn ich den GPIO21 (POWER) nicht verbunden habe. Dann kann ich natürlich auch nicht mehr ausschalten. Da dauert etwas zu lange, ein Verlängern des delay bringt aber nichts.
Kann da im Moment nicht weitermachen, da ich heute noch verreise.
VG

Nachtrag: Ich denke ich weiß woran es liegt. Bisher wurden der Restart in Web.cpp auslöst , ohne Power_PeriphelOff. Das ist jetzt anders. Für den Restart ist der delay(200) ok , beim Ausschalten brauche ich einen delay von ca. 2000. Ich werde es wenn ich zurück bin testen und entsprechend ändern. Leider weiß ich nicht ob es auch andere trifft die meine PCB verwenden. Dann müßte ein Flag gesetzt werden für Restart oder Shutdown und jeweils einer anderen Zeit. Zusätzlich ein
#define on_off_controller // e.g. LTC2954-1 , required because of trouble with Arduino >1.0.6

Hi all,

ich bin gerade wieder dabei den aktuellen devbranch zu testen.
Bericht folgt.

Aber vorher noch ein Frage. Ich habe irgendwo etwas gelesen, dass es möglich sein soll, die Lautstärkenstufen im unteren Bereich zu verfeinern. Mir sind die Unterschiede zw. 1,2 und 3 zu groß.
Hier softwaremäßig eingreifen zu können, wäre für mich ideal.

Kann mir bitte jemand sagen, wo ich da gesehen habe. Kann es leider nicht mehr finden. :frowning:

VD

1 „Gefällt mir“

Also die Audiolib unterstützt mehr als die von uns verwendeten 21 Stufen. Aber ich denke da müsste einiges angepasst werden, wenn man davon abweichen will.
Davon ab haben die MAX98357a ja diesen GAIN. Ich persönlich stelle alle Boards, die hier rausgehen, auf 3 dB ein, da mir das im unteren Bereich bei 4 Ohm-Lautsprechern auch zu grob gestuft ist. Bzw. es geht einfach nicht leise genug für den Anwendungsfall, dass die Kinder auch dabei einpennen sollen. Wobei es so kritisch irgendwie doch nicht ist, weil ich staune immer wieder, bei welchen Lautstärken meine Kinder einpennen können :slight_smile:

Insofern: Hast du Gain schon auf 3 dB oder kannst du da noch was machen? Alternativ, wenn man die gesamte Lautstärke nicht braucht, kann man auch einen 4 Ohm-Widerstand (oder besser 2x 8 Ohm parallel) in Reihe schalten. Dann geht’s insgesamt nicht mehr so laut, aber vielleicht ist das ja auch ein gangbarer Weg.

1 „Gefällt mir“

Hast du wahrscheinlich hier gelesen.

1 „Gefällt mir“

genau - vielen Dank!

Danke für die Tips!

Ich denke da an eine nichtlineare (logarithmische) Weitergabe unserer 21 Stufen an die Lib.
Ich versuch da mal was anzupassen.

2 „Gefällt mir“

@compactflash Hätte jetzt nicht erwartet das jemand in Schwierigkeiten wg. Restart-Refactoring gerät. Aber die Hardware ist wohl schon recht divers hier. Man könnte bei einem Neustart die Module herunterfahren aber auf das eigentliche Power-Off hier verzichten. Allerdings wird erst nach dem Power-Off der RFID-Leser beendet, dies wohl auch wg. LPCD. Gibt es dazu einen Idee?

Wg. Lautstärkeschritte: Die Audio-Bibliothek hat die Methode setVolumeSteps() , damit wäre es lösbar. Allerdings meine das an vielen Stellen im ESPuino Code die Max-Lautstärke auf 21 festgeegt ist…

@tueddy
Das brauche ich zwingend zum Ausschalten . Ich habe schon eine Idee , aber wie schon erwähnt kann ich es erst nächste Woche angehen.

Ggf ist das doch gar nicht so viel. Ich habe eben mal Noob-mäßig nach 21 gesucht und finde nur:
Bluetooth.cpp: #define BLUETOOTHPLAYER_VOLUME_MAX 21u
AudioPlayer.cpp: #define AUDIOPLAYER_VOLUME_MAX 21u
Dazu noch ein paar Stellen in management.html.

Also muss man testen, aber ist vermutlich gar nicht so fürchterlich viel. Ne Idee wäre vielleicht auch, das an die Anzahl der LEDs des Neopixel-Rings zu koppeln. Wobei das aber vermutlich erst Sinn macht, wenn man davon 24 hat.

Ich habe die Lösung, wie angekündigt, versucht an der Wurzel zu packen.
Die Audiolib von Wolle hat intern ja 64 Stufen. Die Lautstärke wird dabei dem menschlichem Gehörempfinden logarithmisch angehoben und zwar quadratisch.
Das geht ab stufe 4 schon ganz gut aber eben weiter darunter nicht mehr so fein.
@Wolle: Gibt es noch eine andere Möglichkeit, als die Audo.cpp Datei der Library in den ESPUINO Source zu kopieren und dort zu ändern? Ansonsten ein Vorschlag weiter unten von mir.
Das war meine erste schnelle Lösung, die funktioniert, aber keineswegs ideal ist.

Ich habe die setVolume function mit einer Wertereihe belgt und dabei die Kurve ensprechend wertemäßig gewählt, dass diese am Beginn ganz flach ist.

//----------------------------------------------------------------------------
void Audio::setVolume(uint8_t vol) {
    uint16_t vols[21] = {0,1,2,3,5,7,11,16,22,30,40,52,66,83,103,127,156,193,240,301,400};
    if (vol > m_vol_steps) vol = m_vol_steps;
    if (vol<21)
      m_vol = vols[vol];
    else
      m_vol = vol * vol;
    return;
}

@Wolle: Vorschlag
Ein Volume Array in der Lib public zugänglich machen (z.B. mit SetVolumeStepValues([…])) und die Werte mit den bisherigen (vol x vol) default vorbelegen. Damit wäre die function im Verhalten unverändert, man könnte die Kurve aber auch individuell nach Bedarf selber anpassen wie ich es z.B. gemacht habe.
Man könnte das auch ganz einfach so in den dev branch aufnehmen, dass die Wertetabelle in den settings.ini default wie bisher mit (vol x vol) vorbelegt vorgegeben ist und alternativ eine 2. Reihe mit meiner oder von wem auch immer individuell angepassten Lautstärkekurve zur Verfügung (Auswahl) gestellt wird. Letztere kann so durch auskommentieren gewählt werden und bei Bedarf auch noch beliebig angepasst werden.
Aufwand:

AudioLib:
Kleine Anpassung der Function setVolume wie oben vorgeschlagen
Neue function SetVolumeStepValues([…])

ESPuino:
Settings 2 Zeilen mit Wertetabelle
Eine Zeile zur Initialisierung der Wertetabelle in der AudioLib (z.B: SetVolumeStepValues([…]))

Ich bin jetzt jedenfalls happy mit dem Ergebnis. Wenn sich hier eine Lösung finden ließe, dass ich nicht bei jedem Update die Audio.cpp neu anpassen muss, wäre das toll.
Ich denke das ist auch allgemein von Interesse.

Versucht es einfach einmal mi der geänderten Audio::setVolume(uint8_t vol)

VG Niko

1 „Gefällt mir“

Was mir noch beim Test des aktuellen deb branches aufgefallen ist und ich für mich verbessern wollte:

  1. Problem TrackBack bei M3U-Liste:

Ich höre oft WebRadio über eine M3U Liste und zappe dann auch mal vor und zurück.
Vorwärts kein Problem, alles wie erwartet: Am Ende der rote Ring als Anzeige, dass es nicht weiter geht. Zurück sieht das aber anders aus. Am Anfang angelangt wechselt die Wiedergabe zw. 1. und 2 Station. Ich hab es für mich wie folgt gelöst:
Den case PREVIOUSTRACK hab ich wie folgt abgeändert:

                case PREVIOUSTRACK:
                    trackCommand = NO_ACTION;
                    if (gPlayProperties.pausePlay) {
                        audio->pauseResume();
                        gPlayProperties.pausePlay = false;
                    }
                    if (gPlayProperties.repeatCurrentTrack) { // End loop if button was pressed
                        gPlayProperties.repeatCurrentTrack = false;
                        #ifdef MQTT_ENABLE
                            publishMqtt(topicRepeatModeState, AudioPlayer_GetRepeatMode(), false);
                        #endif
                    }
                    if (gPlayProperties.playMode == WEBSTREAM) {
                        Log_Println(trackChangeWebstream, LOGLEVEL_INFO);
                        System_IndicateError();
                        continue;
                    } else if (gPlayProperties.playMode == LOCAL_M3U) {
                        Log_Println(cmndPrevTrack, LOGLEVEL_INFO);
                        if (gPlayProperties.currentTrackNumber > 0) {
                            gPlayProperties.currentTrackNumber--;
                        } else {
                            System_IndicateError();
                            continue;
                        }
                    } else {        
                        if (gPlayProperties.currentTrackNumber > 0 || gPlayProperties.repeatPlaylist) {
                            if (audio->getAudioCurrentTime() < 5) { // play previous track when current track time is small, else play current track again
                                if (gPlayProperties.currentTrackNumber == 0 && gPlayProperties.repeatPlaylist) {
                                    gPlayProperties.currentTrackNumber = gPlayProperties.numberOfTracks - 1;    // Go back to last track in loop-mode when first track is played
                                } else {
                                    gPlayProperties.currentTrackNumber--;
                                }
                            }

                            if (gPlayProperties.saveLastPlayPosition) {
                                AudioPlayer_NvsRfidWriteWrapper(gPlayProperties.playRfidTag, *(gPlayProperties.playlist + gPlayProperties.currentTrackNumber), 0, gPlayProperties.playMode, gPlayProperties.currentTrackNumber, gPlayProperties.numberOfTracks);
                                Log_Println(trackStartAudiobook, LOGLEVEL_INFO);
                            }

                            Log_Println(cmndPrevTrack, LOGLEVEL_INFO);
                            if (!gPlayProperties.playlistFinished) {
                                audio->stopSong();
                            }
                        } else {
                            if (gPlayProperties.saveLastPlayPosition) {
                                AudioPlayer_NvsRfidWriteWrapper(gPlayProperties.playRfidTag, *(gPlayProperties.playlist + gPlayProperties.currentTrackNumber), 0, gPlayProperties.playMode, gPlayProperties.currentTrackNumber, gPlayProperties.numberOfTracks);
                            }
                            audio->stopSong();
                            Led_Indicate(LedIndicatorType::Rewind);
                            audioReturnCode = audio->connecttoFS(gFSystem, *(gPlayProperties.playlist + gPlayProperties.currentTrackNumber));
                            // consider track as finished, when audio lib call was not successful
                            if (!audioReturnCode) {
                                System_IndicateError();
                                gPlayProperties.trackFinished = true;
                                continue;
                            }
                            Log_Println(trackStart, LOGLEVEL_INFO);
                            continue;
                        }
                    }
                    break;

Damit funktioniert es bei mir nun. Hab es mit List M3U, mit Webstream (eine Station) und mit Hörspiel von der SD-Karte getestet.
Vielleicht ein möglicher BugFix für den devbranch.

  1. Ledring mit 24 LEDs und Lautstärkeanzeige

Hier ist mir aufgefallen, dass bei Stufe 2 bereits 3 Leds leuchten. Also 1,3,4,….
Bei mir war in den Settings bei Neopixel folgender Eintrag mit einem Update dazugekommen:

#define DIMMABLE_STATES 50

Ich habe den auf 1 gestellt, dann war die Anzahl der leuchtenden LEDs bis Stufe 6 entsprechend, dann wird erst die erste Korrektur für (21 auf 24 verteilen) ausgeführt.
Frage: Sollte der Defaultwert in den settings.h dann nicht besser 1 statt 50 sein?
Habe noch nicht herausgefunden, was es sonst noch für Auswirkungen hat.

VG Niko

Hallo @Niko,
die 22 Standardwerte (0…21) sind für Tasten oder Tochpads gedacht. Für Drehenkoder ist ein größerer Wertebereich besser geeignet (max 255). Ihr könnt mit audio.setVolumeSteps() den 21er Wert überschreiben. Dann ist die Lautstärke viel feinstufiger regelbar.