Nachdem der Blog-Beitrag Internet-Radio mit dem ESP32 ein großes Echo hervorrief, stellen wir hier jetzt eine zweite Variante vor, die zahlreiche Verbesserungen und Erweiterungen erhielt. Wesentlichste Änderung ist die Verwendung des I2S Digital Verstärkers MAX98357A an Stelle des Analogverstärkers. Das Display wurde auf 4 Zeilen mit 20 Zeichen vergrößert. Neben dem gerade gespielten Sender werden Datum und Uhrzeit, sowie die aktuelle Lautstärke angezeigt. In den beiden unteren Zeilen werden Informationen zum laufenden Programm angezeigt, die mit dem Audiostream mitgeschickt werden. Die Lautstärkeregelung erfolgt ebenso, wie die Senderwahl über einen Rotary-Encoder. Die Konfiguration kann, wie bei der verbesserten Version von Herrn Schröder (siehe Update im alten Beitrag), über einen Browser erfolgen. Über diesen Weg kann auch die Senderliste verändert und erweitert werden. Da manche URLs nicht abspielbar sind, kann eine URL über die Browserkonfiguration jetzt getestet werden, ehe sie gespeichert wird. Die Versorgung über Akku wurde weggelassen, da der Stromverbrauch zu hoch war. Zusätzlich kann ein Firmwareupdate über WLAN (Over The Air = OTA) erfolgen.
Benötigte Hardware
Anzahl | Bauteil | Anmerkung |
---|---|---|
1 |
|
|
2 |
|
|
1 |
|
|
1 |
|
|
1 |
|
|
1 |
|
|
1 |
|
|
2 |
|
|
1 |
|
|
2 |
|
|
2 |
|
|
1 |
|
|
1 |
|
|
2 |
|
|
2 |
Drehknöpfe für 6mm Achse |
|
Mehrere |
|
|
1 |
|
|
1 |
|
Schaltung
Die folgende Tabelle zeigt die Verwendung der Pins des ESP32
Gerät |
Bezeichnung |
ESP32 |
Verstärker links |
LRC |
25 |
BCLK |
26 |
|
DIN |
27 |
|
|
GAIN |
GND |
|
SD |
+5V |
|
GND |
GND |
VIN |
+5V |
|
Verstärker rechts |
LRC |
25 |
BCLK |
26 |
|
|
DIN |
27 |
|
GAIN |
GND |
|
SD |
+5V über 470kΩ |
|
GND |
GND |
|
VIN |
+5V |
LCD-Display |
GND |
GND |
|
VCC |
+5V |
|
SDA |
21 |
|
SCL |
22 |
Encoder Lautstärke |
CLK |
14 |
|
DT |
13 |
|
SW |
|
|
+ |
+3.3V |
|
GND |
GND |
Encoder Senderwahl |
CLK |
33 |
|
DT |
32 |
|
SW |
35 3.3V über10kΩ |
|
+ |
+3.3V |
|
GND |
GND |
Versorgung |
+5V |
VIN |
|
GND |
GND |
Der ESP32 wird mit den Widerständen und Stiftleisten für die Peripherie auf einer 50x70 mm großen Lochrasterplatte aufgebaut. Für die beiden Verstärker-Module werden 7-polige Federleisten verwendet.
Die Abbildung zeigt die Bestückung und die Verdrahtung auf der Unterseite
Die Abbildung zeigt die Realisierung auf einer Lochrasterplatine 50 x 70 mm
Die Verdrahtung könnte auch über eine einseitig gedruckte Schaltung erfolgen. Lediglich die rot eingezeichnete Verbindung muss über eine freie Verbindung realisiert werden. Für den I2S Bus werden drei Drahtbrücken verwendet.
In die beiden 7-poligen Federleisten werden die zwei Verstärkermodule eingesteckt. Die beiden Rotary-Encoder und das Display werden mit Jumper Wire Kabel F2F mit den entsprechenden Stiftleisten auf der Lochrasterplatte verbunden. Die Lautsprecher werden an den Schraubklemmen der Verstärkermodule angeschlossen.
Software
Der Sketch wurde aus Gründen der Übersichtlichkeit in mehrere Teile zerlegt. Dazu wird eine Funktion genutzt, die die Arduino IDE zur Verfügung stellt. Gibt es neben dem Hauptsketch, der denselben Namen wie der Ordner hat, noch weitere „.ino“ oder „.h“ Dateien im selben Ordner, so werden diese vom Compiler in alphabetischer Reihenfolge an den Hauptsketch angehängt.
Da der gesamte Code sehr umfangreich geworden ist, gibt es diesen nur zum Herunterladen.
Sketch zum Herunterladen
Die ZIP-Datei enthält den Ordner mit allen zugehörigen Dateien. Sie muss in das Arbeitsverzeichnis der Arduino IDE (meist Dokumente\Arduino\) entpackt werden. Im Folgenden werden die einzelnen Teile kurz beschrieben. Eine detaillierte Beschreibung finden Sie als Kommentare im Code.
-
Webradio_MAX.ino: Das ist der Hauptsketch. Es werden globale Variablen und Datenstrukturen definiert.
- setup() nach dem Initialisieren der seriellen Schnittstelle werden die Konfigurationsdaten aus den Präferenzen gelesen. Dann werden die Setupfunktionen der einzelnen Programmteile, mit Ausnahme von Webservers und OTA aufgerufen. Es folgt der Verbindungsaufbau zum lokalen WLAN. War die Verbindung nicht erfolgreich, werden auf dem Display Informationen zur Konfiguration angezeigt. Bei erfolgreicher Verbindung wird die Echtzeituhr initialisiert und die Wiedergabe der zuletzt gehörten Station gestartet. Nun kann auch das Setup für Webserver und OTA aufgerufen werden.
- loop() prüft zuerst, ob OTA-Anfragen vorliegen und dann, ob es Anfragen für den Webserver gibt. Es wird überprüft, ob die Verbindung zum WLAN noch besteht. Wenn die Verbindung besteht, werden der Audiostream und die beiden Encoder auf Ereignisse geprüft. Einmal pro Minute wird die Anzeige der Uhrzeit aktualisiert. War die Verbindung mehr als 5 Minuten unterbrochen, wird der ESP32 neu gestartet.
-
audio.ino: In diesem Teil werden alle Funktionen im Zusammenhang mit den Audiostreams implementiert.
- setup_audio() bereitet das System vor. Buffer und Stream-Ausgang werden initialisiert.
- audio_loop() überprüft den Status des Audio-Streams.
-
MDCallback(void *cbData, const char *type, bool isUnicode, const char *string)
wird immer dann aufgerufen, wenn im empfangenen Stream neue Metadaten verfügbar sind. Metadaten vom Typ „Title“ werden auf dem Display angezeigt. - stopPlaying() beendet das Abspielen des Streams und gibt die zugehörigen Ressourcen frei.
- bool startUrl(String url) Startet das Abspielen eines Streams von einer gegebenen URL. Ist der Start nicht erfolgreich, wird false zurückgegeben.
- setGain() setzt die Lautstärke auf den Wert der globalen Variablen currentGain.
-
display.ino: Enthält Funktionen zum Ansteuern des Displays und die Definition von Sonderzeichen wie Lautsprecher und deutsche Umlaute.
- setup_display() initialisiert das Display und erzeugt die Sonderzeichen im Display-RAM.
- String extraChar(String text) ersetzt im übergebenen UTF8-Text die deutschen Umlaute durch den entsprechenden Sonderzeichen-Code.
- showStation() zeigt den Namen der aktuellen Radiostation in der zweiten Zeile des Displays an. Die Anzeige beginnt an der Position 2 und wird auf 18 Zeichen beschnitten. Ist die aktuelle Station auch die aktive Station so wird auf Position 0 das Lautsprechersymbol angezeigt.
- displayMessage2(uint8_t line, String msg) der übergebene String wird ab der angegebenen Zeile in zwei Zeilen angezeigt. Beide Zeilen werden vorher gelöscht. Hat der String mehr als 20 Zeichen, erfolgt ein Zeilenumbruch. Die zweite Zeile wird nach 20 Zeichen abgeschnitten.
- displayDateTime() In der ersten Zeile wird Datum und Uhrzeit angezeigt. In der äußerst rechten Position wird die aktuelle Lautstärke in Prozent angezeigt.
- displayMessage(uint8_t line, String msg) der übergebene String wird in der angegebenen Zeile angezeigt. Die Zeile wird vorher gelöscht. Der String wird auf maximal 20 Zeichen beschnitten.
- displayClear() löscht alle vier Zeilen.
- clearLine(uint8_t line) löscht die angegebene Zeile
-
gain.ino: Steuert die Lautstärkeregelung mit einem Rotary-Encoder
- gain_loop() prüft ob sich der Wert des Rotary-Encoders geändert hat. Ist das der Fall, wird der neue Lautstärkewert gespeichert und eingestellt.
- IRAM_ATTR readGainISR() Interrupt-Behandlung für den Encoder
- setup_gain() startet den Encoder, registriert die Interrupt-Routine, setzt die Grenzwerte und den aktuellen Wert als Voreinstellung.
-
index.h: Enthält die HTML-Seiten für den Webserver. Mit der Befehlsfolge
const char MAIN_page[] PROGMEM = R"=====(
beliebiger Text………
)=====";
kann ein beliebiger Text direkt als Konstante in den Programmspeicher eingebaut werden. Das ist für HTML-Seiten sehr praktisch, da diese dann außerhalb der IDE entworfen und getestet werden können. Die vorliegenden Seiten nutzen jQuery, Ajax und JavaScript. Der Vorteil von Ajax für interaktive Seiten liegt darin, dass bei Änderungen nur der veränderte Teil der Seite aktualisiert wird. Es werden drei HTML-Konstanten definiert.- OPTION_entry ein Template für Einträge in der Auswahlliste für die Radiostationen
- MAIN_page die Hauptseite mit Konfiguration und Wartung der Senderliste
- CONFIG_page Seite zur Eingabe der Zugangsdaten, wenn der ESP32 zur Erstkonfiguration im Accesspoint Modus ist.
-
ota.ino: Hier sind die Funktionen zum Update der Firmware über WLAN zu finden.
- setup_ota() es wird der Hostname und das Passwort festgelegt. Anschließend werden Callback-Funktionen registriert.
- ota_onStart() wird beim Start eines OTA-Uploads aufgerufen. Das Display wird gelöscht und in der ersten Zeile eine entsprechende Meldung angezeigt
- ota_onEnd() wird nach dem Beenden des Uploads aufgerufen. Eine entsprechende Meldung wird in der dritten Zeile angezeigt.
- ota_onProgress(unsigned int progress, unsigned int total) wird während des Uploads in regelmäßigen Abständen aufgerufen und liefert Informationen über den Fortgang. In der zweiten Zeile des Displays wird der Fortgang in Prozent angezeigt.
- ota_onError(ota_error_t error) wird aufgerufen wenn ein Fehler auftritt. Die Fehlermeldung wird dann in der vierten Zeile angezeigt.
-
rotary.ino steuert die Senderwahl mit einem Rotary-Encoder
- rotary_loop() prüft, ob sich der Wert des Rotary-Encoders geändert hat. Ist das der Fall, wird die nächste Station aus der Senderliste angezeigt. Wird innerhalb von 10 Sekunden der Knopf am Encoder gedrückt, so wird auf die neue Station umgeschaltet. Wird der Knopf nicht gedrückt, erfolgt kein Wechsel und die aktuelle Station wird wieder angezeigt.
- IRAM_ATTR readRotaryISR() Interrupt-Behandlung für den Encoder
- setup_rotary() startet den Encoder, registriert die Interrupt-Routine, setzt die Grenzwerte und den aktuellen Wert als Voreinstellung.
-
stations.ino: definiert eine Programmspeicherkonstante mit der Default-Senderliste.
- setup_senderliste() füllt die Senderliste im RAM mit der Senderliste aus den Preferences. Gibt es dort keine Senderliste, so wird die Default-Senderliste verwendet.
-
webserver.ino: Enthält das Setup und die Funktionen, um auf http-Anfragen zu reagieren.
- setup_webserver(): Es werden die einzelnen Funktionen zum Behandeln der http-Anfragen registriert und der Server auf Port 80 gestartet.
- webserver_loop() es wird geprüft, ob neue Anfragen vorliegen.
- handleRoot() bearbeitet eine Anfrage für die Hauptseite. Liegt eine Verbindung ins lokale WLAN vor, wird die Hauptseite an den Client gesendet. Ist der ESP32 für die Grundkonfiguration im Accesspoint Modus, wird die Konfigurationsseite übertragen. Zusätzlich müssen in diesem Fall noch eventuell vorhandene Parameter verarbeitet werden, um die Zugangsdaten zu speichern, oder einen Neustart auszulösen.
- sendStations() reagiert auf das Ajax-Kommando mit der URL /cmd/stations. Sendet die Liste der Stationen als HTML-Optionlist. Diese Liste wird dann über Javascript im Client in das Dropdownelement eingebaut.
- setAccessData() reagiert auf das Ajax-Kommando mit der URL /cmd/setaccess. Die Konfigurationsdaten SSID, PKEY und NTP-Server werden in den Präferenzen gespeichert.
- getAccessData() reagiert auf das Ajax-Kommando mit der URL /cmd/getaccess. Die Konfigurationsdaten SSID, PKEY und NTP-Server werden als Antwort gesendet. Als Trennzeichen wird das Zeilenende verwendet.
- getStationData() reagiert auf das Ajax-Kommando mit der URL /cmd/getstation. Die ID der gewünschten Station wird als Argument erwartet. Es wird der Name, die URL und das Enable-Flag der angegebenen Station als Antwort gesendet. Als Trennzeichen wird das Zeilenende verwendet.
- setStationData() reagiert auf das Ajax-Kommando mit der URL /cmd/setstation. Die ID der gewünschten Station wird als Argument erwartet. Ist die ID gültig, werden die als Argument übergebenen Daten für den Namen, die URL und das Enable-Flag in der Senderliste gespeichert.
- testStation() reagiert auf das Ajax-Kommando mit der URL /cmd/teststation. Die URL, die getestet werden soll, wird als Argument erwartet. Es wird versucht, die Wiedergabe der angegebenen URL zu starten. Ist der Versuch nicht erfolgreich, so wird wieder auf die aktuelle Station zurückgeschaltet und mit „ERROR“ geantwortet.
- endTest() reagiert auf das Ajax-Kommando mit der URL /cmd/endtest. Der Test wird beendet, indem die Wiedergabe der aktuellen Station gestartet wird.
- restart() reagiert auf das Ajax-Kommando mit der URL /cmd/restart. Der ESP32 wird neu gestartet.
-
wlan.ino: Enthält die Funktion zum Herstellen einer Verbindung mit dem lokalen WLAN oder zur Bereitstellung eines Accesspoints, wenn eine Verbindung nicht möglich ist.
- boolean initWiFi(String ssid, String pkey) versucht mit den angegebenen Zugangsdaten eine Verbindung zum lokalen WLAN herzustellen. Wenn keine SSID angegeben wurde, oder der Verbindungsversuch nicht gelingt, wird ein Accesspoint gestartet. Über diesen Accesspunkt kann dann von einem Browser unter der Adresse 192.168.4.1 die Konfigurationsseite aufgerufen werden.
Damit der Sketch kompiliert werden kann, muss die Arduino IDE entsprechend vorbereitet werden. Die Arduino IDE unterstützt standardmäßig eine große Anzahl von Boards mit unterschiedlichen Mikrocontrollern, nicht aber den ESP32. Damit man Programme für diese Controller erstellen und hochladen kann, muss daher ein Softwarepaket für die Unterstützung installiert werden.
Zuerst müssen Sie der Arduino IDE mitteilen, wo sie die zusätzlich benötigten Daten findet. Dazu öffnen Sie im Menü Datei den Punkt Voreinstellungen. Im Voreinstellungs-Fenster gibt es das Eingabefeld mit der Bezeichnung „Zusätzliche Boardverwalter URLs“. Wenn Sie auf das Icon rechts neben dem Eingabefeld klicken, öffnet sich ein Fenster, in dem Sie die URL https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json eingeben können.
Nun wählen Sie in der Arduino IDE unter Werkzeug → Board die Boardverwaltung.
Es öffnet sich ein Fenster, in dem alle zur Verfügung stehenden Pakete aufgelistet werden. Um die Liste einzugrenzen, gibt man im Suchfeld „esp32“ ein. Dann erhält man nur noch einen Eintrag in der Liste. Installieren Sie das Paket „esp32“. Falls das Paket schon installiert war, prüfen Sie bitte, ob Sie die neueste Version haben.
Für das Display benötigen Sie eine Bibliothek, die über die Arduino Bibliotheksverwaltung installiert werden kann. Das ist die Bibliothek „LiquidCrystal I2C“ von Marco Schwartz in der Version 1.1.2.
Eine weitere Bibliothek wird für den Rotary-Encoder benötigt. Ihr Name ist „AiEsp32RotaryEncoder“ von Igor Antolic in der Version 1.4.0.
Kernstück dieses Projekts ist aber die Bibliothek „ESP8266Audio“ von Earle F. Philhower in der Version 1.9.7.
Diese Bibliothek ermöglicht es, verschiedene digitale Audiostreams zu lesen, zu dekodieren und über verschiedene Ausgangskanäle wiederzugeben. Als Eingang, kann der Programmspeicher, der interne RAM´, ein Filesystem, eine SD-Karte, ein HTTP-Stream, oder ein ICY-Stream genutzt werden. Der ICY-Stream wird typisch von Internet-Radios genutzt.
Dekodiert werden können WAV, MOD, MIDI, FLAC, AAC und MP3 Dateien. Für das Webradio wird MP3 benötigt. Die Ausgabe kann schließlich in Speicher, Files oder I2S erfolgen.
Wenn alle Bibliotheken installiert sind, kann der Sketch kompiliert und auf die Hardware hochgeladen werden.
Achtung! Da sich der Sketch aus zahlreichen Teilen zusammensetzt, kann das Kompilieren, insbesondere beim ersten Mal, lange dauern. In den Voreinstellungen sollte „Compiler Warnungen“ auf „keine“ gestellt werden, da die LCD-Bibliothek fälschlicherweise eine Warnung ausgibt
Inbetriebnahme
Bei der ersten Inbetriebnahme sind noch keine Präferenzen vorhanden. Es kann daher keine Verbindung zum lokalen WLAN hergestellt werden. Ein Accesspunkt mit der SSID „webradioconf“ ohne Passwort wird gestartet. Mit z.B. einem Smartphone kann nun eine Verbindung zu diesem Accesspoint hergestellt werden. Danach kann in einem Browser über die Adresse 192.168.4.1 die Konfigurationsseite aufgerufen werden.
Nach dem Neustart sollte die Verbindung zum lokalen WLAN erfolgreich hergestellt werden können. Die Wiedergabe der Station 0 aus der Default Liste (NDR2) sollte mit einer Lautstärke von 50% starten. Mit dem Encoder für die Lautstärke kann die Verstärkung eingestellt werden. Änderungen werden in den Präferenzen gespeichert, sodass beim nächsten Einschalten dieselbe Lautstärke eingestellt wird. Mit dem anderen Encoder kann ein Sender aus der Liste gewählt werden. Beim Drehen des Encoders wird in der zweiten Zeile des Displays der Name der Station angezeigt. Durch Drücken des Kopfes am Encoder wird die gerade angezeigte Station zur aktuellen Station und die Wiedergabe wird gestartet. Auch dieser Wert wird in den Präferenzen gespeichert. Beim nächsten Start wird automatisch die zuletzt gewählte Station wiedergegeben. Wird der Knopf am Encoder innerhalb von 10 Sekunden nicht gedrückt, springt die Anzeige auf die aktuelle Station zurück.
Konfiguration und Bearbeitung der Senderliste
Über die URL http://webradio/ sollte die Konfigurationsseite abrufbar sein. Im oberen Teil können die Zugangsdaten und der NTP-Server geändert werden. Die Änderungen werden erst dann wirksam, wenn der Knopf „Speichern“ geklickt wurde.
Mit dem Knopf „Neustart“ kann ein Neustart ausgelöst werden.
Die Dropdown-Liste enthält alle Sender der Senderliste. Auswählbare Sender haben vor dem Namen einen schwarzen Punkt. Im Formular darunter werden die Daten zur ausgewählten Station angezeigt und können geändert werden. Ist das Häkchen bei „Verwenden“ nicht gesetzt, kann die Station im Gerät nicht ausgewählt werden. Da manche URLs nicht funktionieren, sollte eine neue URL mit dem Knopf „Testen“ getestet werden. Ein Klicken auf diesen Knopf startet die Wiedergabe der URL am Gerät. Sollte die Wiedergabe nicht funktionieren, wird sofort wieder auf den aktuellen Sender zurückgeschaltet und eine Meldung angezeigt. Ist die Wiedergabe möglich, wird eine Box mit einem Knopf angezeigt. Klicken auf diesen Knopf schließt die Box und beendet den Test. Es wird wieder die aktuelle Station wiedergegeben. Mit dem Knopf „Ändern“ können die Änderungen für die ausgewählte Station dauerhaft geändert werden.
Firmware Update über OTA
Um das Programm zu aktualisieren ist es nicht notwendig, das Gerät zu öffnen und eine USB-Verbindung herzustellen. In der Arduino IDE sollten Sie bei den Ports den folgenden Eintrag sehen.
Über diesen Port können Sie nun einen Sketch hochladen. Zum Schutz muss nach Aufforderung das Passwort „radioupdate“ eingegeben werden. Da die Serielle Schnittstelle nicht genutzt werden kann, werden Meldungen am Display angezeigt.
Hinweise
Der ESP32 hat eine CPU mit zwei Kernen. Beim Internet Radio muss der Web-Datenstrom vom Internet über das http-Protokoll gelesen werden. Das geschieht im System-Thread, der auf dem Kern 0 läuft. Die Anwendung muss den empfangenen Stream dekodieren und in den Buffer schreiben, aus dem dann die Daten über DMA ohne Zutun der CPU ausgegeben werden. Das Dekodieren erfolgt im Anwendungs-Thread, der auf Kern 1 läuft. Wenn nun zusätzlich CPU-Zeit für Display und Encoder verwendet werden, kommt es zu kurzen Unterbrechungen, die beim Drehen der Encoder akustisch zu hören sind.
Eine Stromversorgung über den USB-Bus des ESP32 Moduls ist möglich. Die Versorgung über den externen Eingang ist nur eine Empfehlung.
Das 3D-Objekt zum Pultgehäuse ist so angeordnet, dass ein 3D-Druck ohne Stützstrukturen möglich ist. Den Link zu den Druckdateien finden Sie in der Bauteileliste am Anfang des Beitrages.
Viel Spaß mit dem Radio!
UPDATE
Herr Andreas Kühn hat das vierzeilige Display durch ein farbiges TFT-Display ersetzt. Er hat uns dankenswerter Weise erlaubt, seine Version hier zu veröffentlichen.
Die Funktionen für das Display mussten natürlich ersetzt werden. Auch zwei zusätzliche Bibliotheken sind erforderlich.
"U8g2" von Oliver in der Version 2.27.6 und
"GFX Library for Arduino" von Moon On Our Nation in Version 1.3.1
Die folgende Tabelle zeigt die Verdrahtung zwischen dem Display und dem ESP32
DISPLAY | ESP32 |
VCC | +5V |
GND | GND |
CS | GPIO 05 |
RESET | EN |
A0 | GPIO 17 |
SDA | GPIO 23 |
SCK | GPIO 18 |
LED | 3.3V |
137 commentaires
Markus Bösel
Hallo an alle, erstmal…
danke an alle die diese Bauanleitung erarbeitet und veröffentlich haben. Beide Anleitungen haben funktioniert und ich hatte keinerlei Probleme.
Ich habe das Radio erst nach der Anleitung von AZ-Delivery gebaut und dann mit der Änderung von Herrn Kühn.
Jetzt habe ich das 1.8" SPI TFT ersetzt durch ein 1.69" TFT mit ST7789V2 Treiber.
Da das gesamt Erscheinungsbild des Display besser ist (abgerundete Ecken und flachere Bauweise) auch finde ich die Farben des Display besser.
Dazu sind keine großen bauliche Änderungen erforderlich alle PINs bleiben gleich nur die Stromversorgung des Display habe ich auf 3.3v umgestellt, auch 5v sind möglich.
In der Display.ino müssen dazu die:
– Zeile “#define LS” muss von 23 auf 32 geändert werden,
– alle Schriftarten mit der Bezeichnung “gfx→setFont” habe ich auf “u8g2_font_VCR_OSD_tf” geändert das ist der Schriftgröße und der Lesbarkeit geschuldet.
– die Zeile “Arduino_GFX *gfx” muss von “new Arduino_ST7735” auf “new Arduino_ST7789” >>> (bus, -1 /* RST /, 3 / rotation /, true / IPS /, 240 / width /, 280 / height /, 0 / col offset 1 /, 20 / row offset 1 /, 0 / col offset 2 /, 20 / row offset 2 */); geändert werden.
Damit läuft dann das Radio auch mit dem 1.69" Display und bietet neben den schon vorhandene angezeigten Infos auch noch Platz für ein Fußzeile mit der Info zur gegenwärtig verwendeten IP-Adresse. die geschieht durch das einfügen des folgenden
Code-Zeilen am ende der Display.ino
void netIP()
{
gfx→setTextColor(YELLOW);
gfx→setCursor(50,230);
gfx→print(WiFi.localIP());
}
das ganze brauch dann nur noch in der LOOP-Schleife mit " netIP(); " aufgerufen werden.
Fertig!
Nun zu meinem Problem! Ich habe es öfters mal das die rechte Seite des Tons aus geht, wenn ich die Lautstärke des Radios auf über 75% hoch regele (das Radio ist in meiner Werkstatt am laufen und wenn des beim Arbeiten zu laut wird drehe ich das Radio auch schon mal hoch um wenigsten noch etwas zu hören). Kennt einer das Problem mit dem Aussetzer einer Seite (ps. muss das Radio dann erst vom Strom trennen und neu starten, sonst kommt die rechte Seite nicht wieder, auch ein Reset des ESP hilft dabei nicht).
das Austauchen der Amplifier Module und des ESPs, gegen neue hat auch nichts gebracht. Der Fehler war schon vor dem Austausch des TFTs.
Leider bin ich kein Elektroniker und auch kein Programmieren und weis daher nicht mehr weiter. Für Lösungsansätze oder sogar eine komplett Lösung des Problems wäre ich dankbar.
MfG Markus B.
Wolfgang
… und im Nachgang noch der Fehlerbericht:
WARNUNG: Bibliothek LiquidCrystal_I2C behauptet auf avr Architektur(en) ausgeführt werden zu können und ist möglicherweise inkompatibel mit Ihrer derzeitigen Platine, welche auf esp32 Architektur(en) ausgeführt wird.
In file included from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src/AudioFileSourceICYStream.h:31,
from D:\Mikroprozessor\#projects\# projects_ready_ok\InternetRadio\ESPWEBRADIO_NEU_15.07.2024\ESPwebRadio\audio.ino:2:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src/AudioFileSourceHTTPStream.h:56:5: error: ‘WiFiClient’ does not name a type
56 | WiFiClient client;
| ^~~~~~~~~~
exit status 1
Compilation error: exit status 1
Wolfgang
Wolfgang
… habe nun meinen Hauptfehler entdeckt: Ich hatte falsche Versionen von Bibliotheken installiert (hatte mit neuesten Versionen gearbeitet). Nun ist meine Error-Liste überschaubarer geworden, für mich aber noch immer nicht so, dass ich die richtigen Schlüsse daraus ziehen könnte und den Fehler, den ich offenbar gemacht habe zu eliminieren.- Kann mir jemand helfen?
Vielen Dank im Voraus, Wolfgang
Wolfgang
… kann mir noch geholfen werden? – Hatte das Internet Radio mit ESP32 und MAX 98357A
erfolgreich aufgebaut und es funktionierte – Musste es nach MAX 98357-Tausch auf einem neuen ESP32-S erneut aufspielen mit katastrophalem Ergebnis: Der Compiler bringt eine ganze Menge an Fehlermeldungen und steigt am Schluss dann ganz aus:
In file included from c:\Users\Wolfgang\Documents\Arduino\libraries\SD\src/utility/Sd2Card.h:26,
from c:\Users\Wolfgang\Documents\Arduino\libraries\SD\src/utility/SdFat.h:29,
from c:\Users\Wolfgang\Documents\Arduino\libraries\SD\src/SD.h:20,
from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceSD.h:25,
from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceSD.cpp:21:
c:\Users\Wolfgang\Documents\Arduino\libraries\SD\src/utility/Sd2PinMap.h:527:2: error: #error Architecture or board not supported.
527 | #error Architecture or board not supported.
| ^~~~~
In file included from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioGeneratorMIDI.cpp:69:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\libtinysoundfont/tsf.h: In function ‘void tsf_channel_midi_control(tsf*, int, int, int)’:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\libtinysoundfont/tsf.h:2101:1: error: insn does not satisfy its constraints:
2101 | }
| ^
(insn 883 353 354 51 (set (reg:SF 19 f0 371)
(mem/u/c:SF (symbol_ref/u:SI (“*.LC223”) [flags 0×2]) [0 S4 A32])) c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\libtinysoundfont/tsf.h 49 {movsf_internal}
(nil))
during RTL pass: postreload
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\libtinysoundfont/tsf.h:2101:1: internal compiler error: in extract_constrain_insn, at recog.cc:2692
libbacktrace could not find executable to open
Please submit a full bug report, with preprocessed source (by using -freport-bug).
See <https://gcc.gnu.org/bugs/> for instructions.
In file included from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.cpp:23:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.h:56:5: error: ‘WiFiClient’ does not name a type
56 | WiFiClient client;
| ^~~~~~~~~~
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.cpp: In member function ‘virtual bool AudioFileSourceHTTPStream::open(const char*)’:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.cpp:42:14: error: ‘client’ was not declared in this scope; did you mean ‘Client’?
42 | http.begin(client, url);
| ^~~~~~
| Client
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.cpp: In member function ‘virtual uint32_t AudioFileSourceHTTPStream::readInternal(void*, uint32_t, bool)’:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.cpp:105:3: error: ‘WiFiClient’ was not declared in this scope
105 | WiFiClient stream = http.getStreamPtr();
| ^~~~~~~~~~
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.cpp:105:15: error: ‘stream’ was not declared in this scope; did you mean ‘std::io_errc::stream’?
105 | WiFiClient *stream = http.getStreamPtr();
| ^~~~~~
| std::io_errc::stream
In file included from c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\ios:42,
from c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\ostream:38,
from c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\bits\unique_ptr.h:41,
from c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\memory:76,
from C:\Users\Wolfgang\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.2\libraries\HTTPClient\src/HTTPClient.h:34,
from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.h:26:
c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\bits\ios_base.h:204:24: note: ‘std::io_errc::stream’ declared here
204 | enum class io_errc { stream = 1 };
| ^~~~~~
In file included from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceICYStream.h:31,
from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceICYStream.cpp:28:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceHTTPStream.h:56:5: error: ‘WiFiClient’ does not name a type
56 | WiFiClient client;
| ^~~~~~~~~~
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceICYStream.cpp: In member function ’virtual bool AudioFileSourceICYStream::open(const char)‘:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceICYStream.cpp:49:14: error: ’client’ was not declared in this scope; did you mean ‘Client’?
49 | http.begin(client, url);
| ^~~~~~
| Client
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceICYStream.cpp: In member function ‘virtual uint32_t AudioFileSourceICYStream::readInternal(void*, uint32_t, bool)’:
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceICYStream.cpp:118:3: error: ‘WiFiClient’ was not declared in this scope
118 | WiFiClient *stream = http.getStreamPtr();
| ^~~~~~~~~~
c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceICYStream.cpp:118:15: error: ‘stream’ was not declared in this scope; did you mean ‘std::io_errc::stream’?
118 | WiFiClient *stream = http.getStreamPtr();
| ^~~~~~
| std::io_errc::stream
In file included from c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\ios:42,
from c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\ostream:38,
from c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\bits\unique_ptr.h:41,
from c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\memory:76,
from C:\Users\Wolfgang\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.0.2\libraries\HTTPClient\src/HTTPClient.h:34,
from c:\Users\Wolfgang\Documents\Arduino\libraries\ESP8266Audio\src\AudioFileSourceICYStream.h:26:
c:\users\wolfgang\appdata\local\arduino15\packages\esp32\tools\esp-x32\2302\xtensa-esp32-elf\include\c++\12.2.0\bits\ios_base.h:204:24: note: ‘std::io_errc::stream’ declared here
204 | enum class io_errc { stream = 1 };
| ^~~~~~
exit status 1
Compilation error: exit status 1
Bin dankbar für jeden Hinweis.
Horst Günther
Hallo zusammen,
Es zeigen sich bei mir kleine Audio-Aussetzer bei der Nutzung eines TFT, wenn die Metadaten und die Uhrzeit neu geschrieben werden. Hat hier schon jemand einen Ansatz zur Lösung gefunden?
Die TFT Wecker Version enthält eigentlich fast den gleichen Quelltext, abgesehen von der Textbox Ausgabe, die ich nicht benutze, da die TFT_eSPI Library diese Option nicht kennt.
Das wird aber wohl nicht die Ursache sein, oder?
Gruß
Horst Günther
Glenn,
this is the key.
In the “Webradio.ino” search for this line…
configTzTime(……)
(“CET-1CEST,M3.5.0/02:00:00,M10.5.0/03:00:00” , ntp.c_strg())
modify this to your reqirements for UK.
Google here for www.hs-help.net/hshelp/gira/v4_7/de/proj_tz.html for more Details.
Good success for this.
Horst
Glenn Foyster
Ich habe dieses Radio zum Laufen gebracht, bis auf ein Problem: Die Zeit zeigt immer noch eine Stunde vor der britischen Zeit an, d. h. der deutschen Zeit und der britischen Sommerzeit. Weiß jemand, wie man das ändern kann?
Ich dachte, es könnte sich ändern, wenn ich einen britischen Sender einschalte, aber das ist nicht passiert.
Ich habe den String NPT auf der Seite webradio_MAX.ino von de.pool.ntp.org in uk.pool.ntp.org geändert, aber keine Änderung.
Hat die Zeit überhaupt etwas mit dieser Einstellung zu tun?
Würde mich über jede Hilfe freuen. Sonst wäre es perfekt. Abgesehen davon, dass die Lautstärke etwas zwielichtig ist und es keine Möglichkeit gibt, das Radio auszuschalten, kann ich die Lautstärke einfach auf Null herunterdrehen!
Glenn Foyster
I have got this radio working except one problem – the time still shows 1 hour ahead of UK time i.e German time and British Summer Time. Does anyone know how to change this?
I thought it might change when I tuned into a UK station but that didn’t happen.
I have changed the String NPT on the webradio_MAX.ino page from de.pool.ntp.org to uk.pool.ntp.org but no change.
Is the time even anything to do with this setting?
Would appreciate any help. Otherwise it would be perfect. Apart from the volume being a bit dodgy and no way of turning the radio off but I can just turn down the volume to zero!
Glenn Foyster
Ich habe dieses Radio erfolgreich aufgebaut und kann die in der Software aufgeführten deutschen Programme einstellen, die gut klingen und auf dem LCD-Bildschirm angezeigt werden. Ich versuche jetzt, die URLs für englische Programme zu finden. Die meisten deutschen Sender scheinen eine MP3-Dateierweiterung zu haben. Für englische Sender kann ich keine MP3-Erweiterungen finden, sondern nur .m4s oder m3u8 oder m3u oder pls.
Ich habe noch keine URLs mit diesen Erweiterungen zum Abspielen. Ist eine Konvertierung in eine MP3-Datei möglich oder weiß jemand, wo MP3-URL-Dateierweiterungen erhältlich sind?
Glenn Foyster
I have successfully constructed this radio and can tune in to the German programmes listed in the software, which sounds good and shows on the LCD screen. I am now trying to find the URL’s for English programmes. Most of the German stations seem to have an mp3 file extension. For English stations I cannot find mp3 extensions but only .m4s or m3u8 or m3u or pls.
I have not got URL’s with these extensions to play yet. Is it possible to convert to an mp3 or does anyone know where mp3 URL file extensions are obtainable
Horst Günther
Das ESP32 Webradio läuft soweit sehr gut, mit LCD2004 als auch mit einem TFT-ILI9488. Nur die eingebettete OTA Funktion ist sehr problematisch und eigentlich nicht zu gebrauchen.
Der Hostname ist in der IDE 1.8. 19 nicht zu sehen, wohl aber in der IDE 2.3.2.
In der 2.3.2 läßt sich der Vorgang auch starten und nach Compilierung beginnt OTA auch zu arbeiten, bricht dann aber ab mit allen 5 OTA Fehlermeldungen.
Ein SW Update mit dem OTAWebUpdater läuft dagegen sicher und wäre vorzuziehen.
Die Frage ist nun, wie kann man die “OTAWebUpdater” Programmzeilen so in die “Index.h” einarbeiten, dass alle Teile (Accespoint-Konfiguration sowie die Webseite für die Radio Konfiguration / Senderlisten und der OTAWebUpdater) laufen können?
Markus
Hallo,
ich habe zunächst die Version aus dem Artikel Internet Radiowecker mit dem AZDelivery Bausatz probiert. TFT funktioniert, Lautsprecher geben nur Brummen ab.
Bei dem obigen Sketch ist mein TFT Display komplett dunkel, Lautsprecher brummen. Serieller Monitor zeigt Verbindung an (“Show Time”).
Gibt es einen Sketch + Schaltplan wo die beiden Encoder angeschlossen sind und die TFT-Platine aus dem Bausatz Internetradio verbaut ist?
Grüße
Markus
Gundbert
Hallo,
ich habe das Radio mit einen ILI9341 Display nachgebaut. Mich stören die Aussetzer während der Display Aktualisierungen. Die Maßnahmen dagegen wurden nur für das LCD gepflegt. Hat jemand hier eine Lösung für das TFT?
Und ich finde es schade, den Bluetooth Empfänger nicht zu nutzen. Die Umschaltung könnte über den nicht genutzten Button des Lautstärkereglers oder als eine Station in der Senderlste erfolgen. Leider reichen meine Kenntnisse nicht um den Code vollständig zu verstehen.
Kamil
Hallo,
just to save time for hobbiest starting project now.
Actual board version esp32 by Espressif System in Arduino IDE is 3.0.0 alfa.
This version produce compiler error and could not be used for this project!
Any previus version is OK.
Dieter
@ Uwe Schmidt vom 13.02.23: Bist du inzwischen mit dem Problem der nur einkanaligen Musikwiedergabe weitergekommen ? Bei mir ist es exakt das Gleiche und das Encoder/Verstärkermodul ist nicht dran schuld. Habe verschiedene erprobt. Es funktioniert immer nur mit einem Modul. Kommt das zweite dazu fängt es an zu krächzen oder/und Audio bricht völlig zusammen. @ Gerald Lechner: Hast du eine Idee???
Gerald Lechner
@Raimund: Es gibt eine Platine, die für alle Varianten verwendet werden kann.
https://aisler.net/p/YSYPXUHW
@Michael Herrmann: Ich nehme an, dass es am Aufbau des Streams liegt. Neben den MP3 Daten werden ja auch Metadaten übertragen.
@Stefan Winkler: Das sollte kein Problem sein. Es sollten noch genug ungenutzte IO-Ports am ESP32 zu finden sein.
Stefan Winkler
Hallo zusammen.
Vielen Dank erstmal für das tolle Projekt.
Die Teile für die Update Version mit dem kleinen TFT sind im Zulauf daher kann ich noch nicht sagen ob oder wie gut das Radio funktionieren wird. Ich habe vor, es fix im Auto einzubauen und es über einen Mobilrouter zu verbinden. Den Lautstärkeregler werde ich nicht nach außen führen sondern innen lassen.
Jetzt die Frage, kann man an das Radio theoretisch 5 Taster anschließen um damit eine Art Memory Funktion zu realisieren? Die Schalter könnten ja sicherlich auf den Programmspeicher zu greifen.
Grüße Stefan
Michael Herrmann
Hallo,
mein erstes ESP32 Projekt ist auf Anhieb gelungen. Ich habe den Code aus dem Projekt “2.Advent aus 2022” minimal geändert (für Audio-Verstärker ohne I2C).
Die Software ließ sich ohne Probleme compilieren.
Hatte zuerst die Version von Herrn Lechner und dann das Update von Herrn Andreas Schröder ausprobiert, was bei der letzteren Version ständig Fehler bzgl. ESPAsyncWebServer brachte.
Nun hätte ich eine Frage:
woran kann es liegen, dass einige URLs mit mp3-Streams nicht abspielbar sind und sofort einen ERROR erzeugen?
Reimund
Hat schon jemand die Platine dafür hergestellt.
Ist bestimmt viel einfacher als alles per Hand zu verdrahten
David S.
@Dirk,
die gleiche Idee hatte ich auch.
Durch drücken des Tasters soll der ESP32 in den Deep sleep, wodurch dann auch ein noch freier pin, der bei ON high ist, auf low geht und damit ein NPN Transistor wegschaltet, der wiederum einen PNP Transistor wegschaltet um die 5V vom Display zu trennen. Dafür bastel ich mir gerade noch eine Schaltung.
Oder hast du einen besseren weg?
Grüße
David
svensche
Hallo Gerald, ich habe mein Problem mit dem 2004 LCD-Display in den Griff bekommen. @AZDelivery Warum schreibt ihr in Eurem eBook zu dem 2004 I2C-LCD, dass man einen Level-Shifter benötigt, wenn man für SDA/SCL 3V3 nutzt?
@Gerald: Ich habe deinen Code in eine Struktur portiert, so dass eine Entwicklung mit VSCode/PlatformIO möglich ist – https://github.com/chess-levin/esp32webradio
@All: Freue mich über Ergänzungen, Verbesserungen etc.
Svensche
Hallo Herr Lechner,
großartiges Projekt – dankeschön!!!!
Ich habe mir die letzte Nacht um die Ohren geschlagen, weil ich das HD44780 2004 LCD Display Bundle 4×20 Zeichen mit I2C Schnittstelle Blau am ESP32 nicht zum Laufen bekomme. Ich habe es als einziges Device an Pin 21,22, +5V, GND am ESP32 angeschlossen. Hatte zuerst die SDA/SCL direkt an den die Ports 21/22 angeschlossen, dann habe ich das AZ-eBook gelesen und einen Levelshifter dazwischen geklemmt. Hatte aber nicht den im eBook genannten TXS0108E sondern einen “mmtrade | 3x 4-Kanal Pegelwandler Logic Level Converter Shifter 4 Kanal Pegelwandler I2C IIC BiDirektional 5V~3.3V für Arduino Raspberry Pi Mikrocontroller” (https://www.amazon.de/Converter-Pegelwandler-BiDirektional-Raspberry-Mikrocontroller/dp/B07DKT9JXT/ref=asc_df_B07DKT9JXT)
Der Demosketch von https://github.com/iakop/LiquidCrystal_I2C_ESP32/blob/master/examples/HelloWorld/HelloWorld_ESP32.ino compiliert (habe die I2C Pins auf 21/22 geändert). Die Hintergrundbeleuchtung des Displays leuchtet, aber es werden keine Zeichen angezeigt.
Ich habe auch diverse andere LCD Libs probiert, aber die Anzeige von Zeichen funktioniert nie. Hat jemand einen Tipp für mich…?
dirk
Ich hätte da noch einen Verbesserungsvorschlag:
der Taster am Lautstärkeregler ist ja noch ungenutzt, wie wäre es, diesen zu benutzen um das Gerät (sowohl den ESP32 als auch das Display) durch Drücken dieses Tasters in den Standby zu schicken und ihn durch nochmaliges Drücken wieder aus dem Standby aufzuwecken. Das sollte eigentlich kein großes Problem darstellen, erfordert aber eine kleinere Modifikation der Schaltung und auch der Software…
Das würde dann auch wieder den Akkubetrieb ermöglichen.
Zum anderen wäre es dann auch möglich über das Webinterface einen Timer zu Programmieren um seine Lieblingssendung nicht zu verpassen…
LG, dirk
David
Hallo,
Ich würde mir auch gerne ein Radio aufbauen, gibt es auch für die Version mit Farbdisplay auch eine 3D Datei?
Grüße
David
Mirko Jacke
kann mir jemand einen tipp geben, warum mein esp nicht in der fritzbox erkannt wird, bis auf das verbinden mit dem ap lief alles super
Bernhard Rekemeier
Berechnung: ?
5 / (4,7+10) x 4,7 = 3,4 # nö
5V / (4,7k+10k) x 4,7k – 5V = 3,4V # ja
Jeder ESP- Dev. hat einen Spannungsregler von 5V auf 3,3 V. Also sollten die GPIOs auch auf 3,3V laufen. Wo 5V draufsteht, sollte auch 5 V vorhanden sein, z.B. BME280 Sensor, den es in 5V und 3,3V gibt. Ich arbeite ausschließlich mit 3,3 V auf den ESPs, bisher ohne Probleme. Auch an die 10k Widerstände (3,3V an SDA) denken, wenn der I2C-Bus mit mehr Devices verwendet wird(Display und Sensor).
Pit
@Gerald Lechner
Falsch, ich habe nicht “im Prinzip” recht sonder meine Aussage ist eindeutig richtig,
weder der ESP8266 noch der ESP32 ist 5V telerant. Das etwas gerade geht OBWOHL es technisch falsch ist macht es nicht besser. Ihre vorgeschlagene Loesung
<
Die Pullup Widerstände sind 4,7kOhm. wenn man beide Leitungen über 10kOhm mit Masse
verbindet ändert sich die Leerlaufspannung von 5V auf 3.4 V. Spannungsteiler 5 / (4.7 + 10) * 4.7 = 3.4
>
Ginge natuerlich auch.
Ich bin halt der Meinung man sollte in Schaltungsvorschlaegen technisch sauber arbeiten damit Menschen die etwas nachbauen sich nicht falsches merken, denn in einer anderen Kombination von Modulen mit dem ESP koennte derartiges ihn zerstoeren.
Gerald Lechner
@Pit: Sie haben im Prinzip recht. Da beide Signalleitungen vom ESP32 als Ausgang betrieben werden ist es aber nicht ganz so kritisch. Ich hatte noch keine Probleme damit.
Die Pullup Widerstände sind 4,7kOhm. wenn man beide Leitungen über 10kOhm mit Masse
verbindet ändert sich die Leerlaufspannung von 5V auf 3.4 V. Spannungsteiler 5 / (4.7 + 10) * 4.7 = 3.4
Pit
Hi
Hier das gleiche Problem wie bei der urspruenglichen Variante:
ich finde die Anschaltung des Display es etwas “gefaehrlich” fuer den ESP32,
denn so wie dargestellt wird der I2C ueber die PullUps auf der Display-Interfaceplatine
auf 5V gezogen, der ESP32 mag aber , soweit mir bekannt , keine 5V am GPIO.
Deswegen wuerde ich vorschlagen entweder das Display auf 3V3 oder die PullUps
von der Interfaceplatine entfernen und 2 neue gegen 3V3 in die Schaltung zu integrieren.
Michel
@Hans-Jürgen
https://github.com/adafruit/Fritzing-Library/blob/master/parts/Adafruit%20MAX98357A.fzpz
Hans-Jürgen
Moin,
kann mir jemand einen Tip geben, wo ich das Fritzing-File für den Verstärker MAX98357A finde?
Ich möchte versuchen, eine Platine für das Wlan-Radio mit dem TFT-Display zu erstellen.
Danke schon mal
Hans-Jürgen
Rainer
Hat schon jemand die Platine dafür hergestellt. Wenn ja würde ich gerne gegen Unkosten erstatten, diese erstehen.
Mfg Rainer
Rainer
Läuft prima. Etwas friemelig war der Zusammenbau mit dem 4x 20 Zeilen Display. Wenig Platz um die Lautsprecher fest zu schrauben. Aber nun funktioniert alles.
Wumba
Nochmal ein Repost, weil ich mal weider drüber gestolpert bin: Stottern kommtn, wenn der 10 k Widerstand am GPIO 35 zum 3,3 V Anschluss fehlt.
Warum ist das so?
#Stottern#Abbruch#Aussetzer
Konrad
Hallo beisammen,
Kleine Frage an Alle: Hat jemand das mit der SD-Card mal ausprobiert und die jeweiligen mp3 Musikdateien “angespielt”? Habe noch nicht das TFT Display ausprobiert und würde mich einfach mal interessieren, wie man die Karte musiktechnisch über die Knöpfe ansteuert.
Auch war irgendwo mal die Idee zu einem Radiowecker. Gibt es dazu schon Ansätze?
Danke
Konrad
Kamil
Thank you Mr. Lechner for precise answer. Now it is OK.
Just the last question concerning special characters. In the software subpart “display”, there is code on the first about 50 lines for german characters.
(How to display them on dot 8×8 and than if such character is detected which display pattern should be used).
I have tried to use those functions to display some my language characters. For example: é. (e with acute), Dec. code is 195 169. If I put all data inside functions, I was not succesfull. The result was e without any sign over it. I have tried to see original Titel for song through Serial monitor, Titel in my language was without acute?
I suppose: some special characters are not even transfered by internet? I could not compare with German
station, because few choosen German stations displayed names of English songs only without special german characters.
Can you advice how to display special not german characters?
Gerald Lechner
@Kamil: This problem occurs if you missed the 10k resistor from 3.3V to GPIO35. This resistor is always required even if the rotary switch for station selection is not supplied.
Konrad
@Tommy: Großes Dankeschön. Tolle Arbeit.
Thommy
Hallo zusammen,
ich habe das Gehäuse eben bei Thingiverse veröffentlicht. Es sind STL Dateien, sowie auch die SCAD Dateien zum Download verfügbar. (Damit ihr das Modell ggf. anpassen könnt. Die Einschmelzmuttern M3 findet ihr bei Amazon oder bei Ebay. Dort gibt es Sets die aus Einschmelzmutter und Schraube besteht. Alles hält damit noch besser und es wird auch nix lose mit der Zeit, als wenn man nur Schrauben in den Kunststoff schraubt. Ich nutze diese für all meine Projekte und habe damit sehr gute Erfahrungen gemacht. Vielleicht noch einen Tip beim Drucken der Beschriftungen – ich habe hierfür bei Cura einen Filamentwechsel eingestellt, damit er ab einer bestimmten Höhe nicht mehr blau sondern weiß druckt. Wem das zu umständlich ist, der druckt einfarbig und malt die Konturen mit einem weißen Edding(oder besser weißen Acrylfarbstift) nach. Und wer sicht fragt warum das Radio “No. 7” heißt; das ist mein 7. Radio was ich gebaut habe.(nicht immer das gleiche, sondern eigene Projekte)
So genug gesabbelt – Viel Spaß beim nachdrucken. ;-)
Hier gehts zum Gehäuse: https://www.thingiverse.com/thing:5954124
Kamil
To make more clear what is " pulsating sound": Sound is ON for about 0.5s, than OFF for 0.5s, than ON, than OFF and so on, like modulated by rectangular pulses 1Hz (not 0.5Hz). Does not matter which web station is selected.
Kamil
Hallo,
very nice project and clear software.
But I have a problem with sound:
Compilation and upload is O.K.
Display is 4×20 original AZ Delivery. Esp32 is 30 pins.
Display is working, but after WiFi is connected, there is sound pulsating in frequency about 0.5 Hz, Volume is O,K.
If there is not pulsation, sound looks good.
I simplified hardware for just ESP32 and one Max amplifier. Sound was pulsating again.
Than I loaded other very simple software. Sound was OK. It means, that problem could be in software?
I have check project with external power 5V, but results are the same.
I have tried to adjust SD pin by resistor to different modes, no influence.
Multimeter show me some pulsation on pin 27 of ESP32.
Can you advice,
best regards
Kamil
Günter
Kanal-/Lautstärke-Fehler gefunden, es war die Zeile 40 in der audio.ino (out = new AudioOutputI2S(0,1);). Obwohl ich die Zeile im sketch gemäß Hinweisen geändert hatte, hat die IDE immer die falsche Version geladen (mein Fehler: das Archiv existierte zuerst noch ausgepackt in /Downloads,) Es ist nicht das erste Mal, dass ich an der 2.0-IDE verzweifle). Auch wenn der Compiler nichts beanstandet, lohnt es sich also, den Output durchzulesen. Das Löschen des entpackten Archivs in /Downloads war die Abhilfe. Nun ein schönes begeisterndes Gerät geworden, vielen Dank.
Günter R..
Siegfried
@ Günter R : ich habe die Audio Bibliothek auf Version 1.9.5 und damit läuft es stabil und gut. ESP32 Version ist dabei 2.0.6
Gruß
Günter R.
Herzlichen Dank an Herrn Lechner zuerst, für einen wirklich vollständigen Projekt-Umfang. Auch hier läuft fast alles auf Anhieb, denn leider bekomme ich nur auf einem Kanl und dort stark verzerrtes pumpendes Audiosignal (auf allen Sendern übrigens). Die Audio-Biblithek ist Version 1.9.7. Gibt es Erkenntnisse, dass eine ältere Version diesen Fehler vielleicht noch nicht haben könnte? Vielen Dank im Voraus…
Konrad
@Thommy: Hier, hier, hier!! Sieht echt toll aus. Bitte gerne die slt Dateien, bzw. CAD. Großes Dankeschön
Kleine Frage an Alle: Hat jemand das mit der SD-Card mal ausprobiert und die jeweiligen mp3 Musikdateien “angespielt”? Habe noch nicht das TFT Display ausprobiert und würde mich einfach mal interessieren, wie man die Karte musiktechnisch über die Knöpfe ansteuert.
Danke
Konrad
Dank
Rainer Hoffmann
@Thommy
Ein sehr schönes Gehäuse hast du da entworfen. Ich bin interessiert!
Thommy
@Sven
Doch es könnte tatsächlich am Code liegen. Schau mal bitte in der webradio_MAX_TFT.ino Datei nach. Dort findest du folgende Zeile:
“bool newTitle = false;”
Diese Zeile ist muss aber auf true gesetzt werden, da sonst keine Titel angezeigt werden.
Also die Zeile wie folgt abändern:
“bool newTitle = true;”
Danach bloß noch auf deinen ESP32 flashen und es sollte funktionieren.
Bitte auch noch in der audio.ino Datei nachsehen. Dort gibt es die selbe Zeile. Die sollte auch auf “true” stehen.
Thommy
Ich habe die Version mit dem 1.8er Display und der Platine von Herrn Lechner nachgebaut. Das Gehäuse hat mir nicht ganz so gefallen, deswegen habe ich ein eigenes konstruiert. Die beiden Knöpfe und die Schriftzüge natürlich auch. Für die Befestigung der Platine, der Lautsprecher und dem Deckel habe ich Einschmelzgewinde M3 genommen.
https://photos.app.goo.gl/EvanbvWFKMPprEx79
Wenn Interesse am Gehäuse besteht kann ich es gern kostenlos zur Verfügung stellen. Ich habe es mit openscad konstruiert, sodass man es leicht anpassen kann.
Sven Laur
@Siegfried: Danke für Deine Antwort. Bei mir zeigen auch die von Dir erwähnten Sender keine Titelinformationen an. Hat jemand eine Idee wie man hier am besten nach dem Fehler suchen kann? Am Code wird es sicher nicht liegen, wenn andere die Infos angezeigt bekommen. Am Display liegt es auch nicht da ich die Variable „Titel“ über den seriellenMonitor ausgegeben habe und dort auch kein Inhalt vorhanden war. Kann man die Titelinfos auch mit einem anderen Programm auslesen um das mal zu testen? Bin für jeden Hinweis dankbar denn irgendwie wurmt mich das, dass mein halbes Display leer bleibt. :-)
Siegfried
@ Sven Laur: bei mir zeigen auch nicht alle Sender diese Titel an, aber z.B. MDR oder NDR oder Antenne Bayern liefern diese Info und dann sehe ich diese auch auf dem Display ( habe das 2.8“Display )
Gruß