ESP32 Port inkl. Webinterface

#148

Hello,
A big thank you for this evolution on ESP32 which I am making a version with the code in English and a French voice. However, I have a translation problem. I did not find the mp3 file number 600, which is read on line 1147, nor the corresponding text in soundfiles.txt files :

#149

Hi, these files are only for this tonuino version and an Add-On for the color menue. A guy from that forum crated that for me. The number 600 ask “please chose a color”

#150

Thanks for the text! I will be able to generate the corresponding mp3

Another question about the code, about the admin mode.

What does it do, because it does not seem to be used in the code?

Knowing that it is not proposed when creating a new map, how to define a map in admin mode? Is it a specific card that we define in the hard code?

#151

The Admin mode is not used, this was part of the Master version wich i have adapted and expand to work with the esp.

#152

Ok, thanks for the precision.

#153

Wenn die Tasks korrekt gestartet werden und konfiguriert sind sollte das RTOS automatisch dafür sorgen dass jeder Task entsprechend Zeit auf dem Prozessor bekommt. Anders als bei anderen Betriebssystemen ist es ja gerade beim RTOS so dass die Tasks NICHT kooperieren müssen (also “die Kontrolle abgeben”) sondern das RTOS die Zeit in “Scheiben” aufteilt und die unter den Tasks verteilt. Aber auch wenn das Warten auf das Freiwerden des Buffers richtig gemacht ist (was ich bei einer Library jetzt mal hoffen würde) sollte das funktionieren. Man muss aber natürlich die parallel laufenden Aufgaben schon jeweils in einen separaten Task packen, sonst gehts natürlich nicht.

#154

Leider ist die Library nicht richtig gemacht. Die Library verbraucht so viel Zeit wie sie bekommt in einer while Schleife.
Wenn der Thread jetzt auch noch eine hohe Porträt hat (damit die Widergabe nicht stockt) wird eine Menge Zeit sinnlos gebraten.

#155

Welche Library benutzt ihr denn genau?

#156

Die Library bummelt im loop und wartet auf das Freiwerden des Puffers. Ich hab das bei mir etwas optimiert (zusätzlich delay) und es klappt so ganz gut. Generell glaube ich inzwischen, dass man nicht zu viel vom rtos erwarten sollte :wink: bzw. auch die Tasks gut steuern muss.

#157

Also das Problem ist ja diese Funktion hier:

inline void await_data_request() const
{
  while ( !digitalRead ( dreq_pin ) )
  {
    NOP() ; // Very short delay
  }
}

Eine einfache Möglichkeit wäre sicher an Stelle des NOP() ein delay() einzusetzen, dass gerade so lange ist dass man auf jeden Fall den Puffer noch füllen kann bevor die Wiedergabe unterbricht.

Eleganter wäre es aber

  • den dreq_pin auf einen Interrupt zu legen
  • Funktion die den Puffer füllt in einem hoch priorisierten Task an einer Semaphore warten zu lassen
  • Im Interrupthandler diese Semaphore freizugeben

Im Ablauf wäre das dann so:

  • Auch während der Wiedergabe kümmert sich der Prozessor die meiste Zeit um die weniger wichtigen Sachen (in einem oder mehreren niedrig priorisierten Tasks, z.B. Tastendrücke, Webinterface).
  • Sobald am dreq_pin die Flanke erkannt wird, startet der Interrupthandler, gibt die Semaphore frei, und beendet sich gleich wieder.
  • Da der am höchsten priorisierte Task (der den Puffer füllt, und nur das) jetzt an der Semaphore weitermachen kann, wird dieser nach dem Interrupthandler als erster ausgeführt und füllt sofort den Puffer.
  • Danach sperrt er die Semaphore wieder und die niedrig priorisierten Tasks bekommen wieder Ausführungszeit.

Und dann funktioniert dass auch mit dem RTOS :wink:

So wie das aktuell implementiert ist bekommst Du quasi jeden Prozessor oder Betriebssystem ausgelastet. Es scheint mir so dass die Library eher auf den Betrieb auf deutlich schwächeren Prozessoren ausgelegt ist, bei denen man ohnehin nicht davon ausgeht dass man parallel etwas anderes macht.

Das kann an auch irgendwo nachlesen, (ich dachte eigentlich in der Adafruit Doku), aber finde grade nur den Link für die Arduinoversion (die genau diesen “Fehler” macht).

#158

Genau das (mit dem Semaphore) habe ich auch noch geplant, aber irgendwie fehlt mir gerade die Zeit dazu. Wenn dann würde ich die Library komplett überarbeiten und auch solche Dinge wie die MP3 Streams rausschmeißen (Single Responsibility Prinzip). Das muss eine eigene Klasse übernehmen.

Außerdem habe ich vor ein paar Tagen entdeckt, das es eine Lib von Adafruit gibt, evtl. ist die besser aufgebaut.

Das Problem bei der “schnellen” Lösung ist ja auch, das der Buffer sich (je nach BitRate) unterschiedlich schnell leert.

#159

Das mit dem Interrupt ist in jedem Fall die eleganteste und zuverlässigste Lösung.

In der Lib von Adafruit ist es soweit ich das gesehen hab ähnlich schlecht gelöst…

#160

So ist es aktuell bei mir.

Mir fehlt aktuell leider auch die Zeit, aber hört sich nicht zu aufwändig an.
Wie wartet der Buffer-Task denn? Ist das nicht auch wieder ein loop?
Hast Du ein Beispiel, Links ?

Grundsätzlich würde ich die Library ruhig erweitern. Am Ende ist es ein MP3 Player und keine Flugzeugsteuerung :wink:

#161

Hallo zusammen,

das Thema interessiert mich auch brennend.
Was mich bisher aber davon abgehalten war, ist das “umständliche” aktualisieren der SD Karte.

Nun mit dem ESP32 scheint das ja ganz gut anders geregelt zu werden?
Auch wenn das noch alles im Aufbau ist:
Gibt es irgendwo einen Schaltplan, wie ich mir das Ganze anhand von dem ESP32 zusammenbauen kann?

Danke
_david

#162

Was meinst du genau? Die Karte entnehmen und am Rechner neu befüllen ist Dir zu aufwendig?

#163

Hey,

auch wenn es sich, wie von dir dargestellt nicht viel Arbeit ist, ist es schon aufwendiger die Sammlung (auf einer NAS vorhanden), dann immer manuell synchron zu halten.

Also ja: ein Fernzugriff, in welcher Weise auch immer, wäre mir am liebsten.

MfG

_david

#164

Sehr spannendes Vorhaben, für das ich mich hier dann auch gleich angemeldet habe, um etwas Unterstützung für den Einstieg zu bekommen…

Kurzvorstellung: Ich wollte ursprünglich eine Art WakeUpLight mit dem ESP32 für die Kiddies bauen und mich damit einfriemeln, dann aber Euer Projekt gesehen. Da ich die TonieBox selbst toll finde, sich aber das geschlossene, Cloud-basierte System für mich verbietet, möchte ich nun das mit einem etwas modifizierten WakeUpLight. Grundlegende Übung in strukturierter Programmierung ist vorhanden, aber ich habe keine Übung mit C, RTOS, Webserver usw., so dass ich eher auf leichte Anpassungen statt auf Selbstentwicklung setzen muss.

Projektdaten: ESP32 Dev Kit C (von AZ) + VS1003/1053 Codec MP3 Modul + RFID-Leser (von AZ) mit Karte und Tag sind schon da, ein EASYmaxx Colorcube wird das Gehäuse, internen Lautsprecher würde ich gern weiterverwenden und wenn möglich auch gleich den Akku (sonst halt tauschen) .

Nach 163 Post zu mind. 3 parallelen Projekten schwirrt mir aber der Kopf:

  1. Gibt es irgendwo einen aktuellen Verdrahtungsplan für die Shields (Anfängerfehler-Frust vermeiden)?

  2. Gibt es eine einfache, sichere Lösung für die Stromversorgung (ohne Eigenentwicklung einer Ladeschutzplatine, notfalls auch erstmal Akku/Powerbank zum Laden rausnehmen)?

  3. An welchen der 3 Builds kann man sich denn als Einsteiger am Einfachsten dranhängen? Ich würde gern v.A. Routinen für die RGB-LED nutzen und etwas abwandeln (für einstellbare Weckabläufe, z.B. Nacht, bald aufstehen, aufstehen, oder Ist noch Zeit, bald los, jetzt wirklich los).

Falls das Alles schon beantwortet wäre, war es für mich leider nicht ohne Weiteres erkennbar und ich bitte um Welpenschutz :wink:

Besten Dank schon einmal

#165

gibt es das nicht schon im Nuclear Football

und Tolipwen entwickelt in seiner Fork auch den Code weiter

#166

Weiß nicht so recht, was genau Du meinst (Gibt es was schon im Football? Antwort auf Schaltpläne? WakeUpLight als Elternbett-Ampel? Oder Ladeschutz-Lösung?)

Deiner Antwort würde ich entnehmen, dass weder die Lösungen von Christopher, TheSealion noch von Christian genutzt werden sollten, sondern Henriks Football bzw. der Fork von Tolipwen im gleichen Thread(?) jetzt der Stand der Dinge sind? Soll ich die Fragen besser dort nochmal stellen?

#167
  1. Schau mal hier: EnRav - Box (TonUINO Remix)
    Welchen Shield hast Du genau? Die PINS für die Steuerung des VS1053 / SDCard sind “beliebig” und könnten im Code entsprechend angepasst werden.

  2. Da gibt es aus meiner Sicht keinen Unterschied zum “echten” Tonuino. Dazu findest du reichlich Informationen im Forum.

  3. Jetzt wird schwierig :wink: Wir konnten uns leider nie auf eine gemeinsame Basis einigen. Es gibt evtl. zwei grobe Richtungen. Der Code von @TheSealion ist sehr modular und nutzt freertos Funktionen für multithreading (um beide CPUs zu nutzen). Mein Code basiert auf dieser Vorarbeit. Wir driften dann bei so Themen wie Datenübertragung / Filehandling usw. auseinander. Hier könnte ich unterstützen / Mikes GitHub sollte Dein Startpunkt sein. @Henrik 's Code ist etwas einfacher zu lesen, weil er bisher kein multithreading benutzt (oder?) Für Einsteiger sicher etwas besser geeignet. Außerdem hat er schon ein Webinterface implementiert. Der oben verlinkte Fork verbindet nun diese beiden “Welten” :wink: