Internet Radiowecker mit Touchscreen - AZ-Delivery


Basierend auf den erfolgreichen Blog-Beiträgen zum Internetradio (Teil 1, Teil 2) stelle ich heute einen Radiowecker vor. Das Besondere, es wird ein AZ-Touch mit 2,4 Zoll oder 2,8 Zoll Touchscreen verwendet. Die Bedienung erfolgt ausschließlich über den Touchscreen. Es gibt zwei Weckzeiten, welche beliebigen Wochentagen zugeordnet werden können. Natürlich ist auch ein Einschlaf-Timer vorhanden. Damit das Display in der Nacht nicht stört, kann die Helligkeit eingestellt werden. Mit einem optionalen LDR kann die Display-Helligkeit automatisch an die Raumhelligkeit angepasst werden. Lautstärke, Einschlafzeit, Display-Helligkeit und Senderwahl können über den Touchscreen eingestellt werden. Weckzeiten und die Stream-URLs der Radiostationen werden über ein Web-Interface konfiguriert.

Zum Blog bieten wir kurzzeitig ein Radiowecker Produktset an, mit dem Sie die Produkte im Vergleich zu den Einzelpreisen deutlich günstiger erhalten.

Benötigte Hardware

Anzahl Bauteil Anmerkung

1

AZ-Touch mit 2,4 Zoll Display oder 2,8 Zoll Display

 

1

ESP32 Dev-Kit C V4

 

2

I2S Digitalverstärker mit MAX98357A

 

1

Lautsprecher 2er Set

 

1

Widerstand 470 kOhm

 

1

DC-Einbaubuchse

 

1

LDR Modul

Optional

 

Schaltung

ACHTUNG!

Bis zum 17. Oktober war hier ein fehlerhafter Schaltplan abgebildet. Das gilt auch für das PDF zum Beitrag. Wenn Sie das PDF vorher heruntergeladen haben, sollten Sie es erneut herunterladen!

Der Schaltplan zeigt nur jene Teile, die im AZ-Touch nicht vorhanden sind.  Die folgenden Abbildungen zeigen, wie man die Platine des AZ-Touch entsprechend erweitert. Für die Audioverstärker werden zwei 7-polige Federleisten zum Aufstecken der Audioverstärker auf dem Lochrasterfeld des AZ-Touch angebracht. Ebenso ein 470 kΩ Widerstand. Wer den optionalen Lichtsensor verwenden will, sollte eine zweipolige Stiftleiste bei 3,3 V und GND, sowie eine einpolige bei A0 einlöten.

ACHTUNG: Der LDR R2 muss zwischen GPIO36 und 3.3V, der Widerstand R3 zwischen GPIO36 und GND angeschlossen werden. In einer älteren Variante des Schaltplans war dies andersherum dargestellt. Bei fdalschem Anschluss wird die Hintergrundbeleuchtung bei Dunkelheit heller.


Die zweite Abbildung zeigt, wie die Verdrahtung auf der Rückseite erfolgen sollte. In Gelb sind die Konturen der Federleisten und des Widerstands dargestellt. Der Anschluss des LDR Moduls ist wie dargestellt richtig. Der Pin mit dem Aufdruck "-" gehört an 3.3V !

 Zusammenbau

Zur Unterbringung der Lautsprecher gibt es für den AZ-Touch eine Rückwand, die ihn in ein Pultgehäuse verwandelt. Die Rückwand kann mit einem 3D-Drucker hergestellt werden. Sie hat auch eine Öffnung für Die DC-Einbaubuchse. Datei zum Drucken der Rückwand.

Pultgehäuse

 

Zusammenbau

Zum Einbau des optionalen LDR gibt es eine Befestigungsplatte, auf die das LDR-Modul geschraubt werden kann. Oben im Gehäuse wird ein 5mm Loch gebohrt und dann die Befestigungsplatte mit doppelseitigem Klebeband so an die Rückwand geklebt, dass der LDR in die Bohrung zu liegen kommt.

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 den Ordner der Projektdateien (oft Dokumente\Arduino\) entpackt werden. Im Folgenden werden die einzelnen Teile kurz beschrieben. Eine detaillierte Beschreibung finden Sie als Kommentare im Code.

  • radiowecker.ino: Das ist der Hauptsketch. Es werden globale Variablen und Datenstrukturen definiert.
    • findNextAlarm() sucht Zeit und Wochentag an dem der Wecker aktiviert werden soll. Das Ergebnis wird in den globalen Variablen alarmday für den Wochentag und alarmtime für die Zeit in Minuten gespeichert. Wurde kein nächster Termin gefunden, wird alarmday auf 8 gesetzt.
    • setup() nach dem Initialisieren der seriellen Schnittstelle werden die Konfigurationsdaten aus den Präferenzen gelesen. Dann werden die Setupfunktionen der einzelnen Programmteile, mit Ausnahme des 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. 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 und überprüft, ob der Wecker aktiviert werden muss. Stimmen Weckzeit und Wochentag überein, wird der Radio-Stream gestartet und mit der eingestellten Lautstärke wiedergegeben. War die Verbindung mehr als 5 Minuten unterbrochen, wird der ESP32 neu gestartet.
  • 01_ziffern.ino: Definiert 11 Bitmaps mit 50 x 70 Pixeln. Es sind dies die Ziffern 0 bis 9 und der Doppelpunkt zur Darstellung der Uhrzeit.
  • 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
  • fonts.h: Hier werden zwei Fonts für die Textanzeige definiert. Einer hat eine Höhe von 9 Pixel, der andere 12 Pixel. Neben den 7-Bit ASCII Zeichen (Code 32 bis 126) gibt es auch die deutschen Umlaute Ä, Ö, Ü, ä, ö, ü, ß und das Grad Zeichen (Codes 127 bis 134). Zur Umwandlung gibt es im Modul tft_display.ino die Funktion encodeUnicode(const char* src, char* dst), die einen Text im UTF8 Format so umwandelt, dass er im Display richtig dargestellt wird. Zur einfacheren Handhabung werden zwei Makros definiert: FNT9 für den 9-Pixel Font und FNT12 für den 12-Pixel Font.
  • 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.
  • knoepfe.h: Hier wird eine Bitmap mit 320 x 64 Pixel definiert, die die Köpfe auf der Konfigurationsseite darstellt. Jeder der fünf Knöpfe hat eine Größe von 64 x 64 Pixel.
  • 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 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. Auf dem Display wird der Fortgang in Prozent und als Balken angezeigt.
    • ota_onError(ota_error_t error) wird aufgerufen wenn ein Fehler auftritt. Die Fehlermeldung wird am Display angezeigt.
  • stations.ino: definiert eine Programmspeicherkonstante mit der Default-Senderliste.
    • setup_senderliste() füllt die Senderliste im RAM mit der Senderliste aus den Präferenzen. Gibt es dort keine Senderliste, so wird die Default-Senderliste verwendet.
    • restore(): Füllt die Senderliste aus der Default-Senderliste und speichert sie in den Präferenzen ab. Die Funktion ist hilfreich, wenn die Senderliste durcheinandergeraten ist.
    • saveList(): Speicher die Senderliste aus dem RAM in den Präferenzen ab.
    • reorder(uint8_t oldpos, uint8_t newpos): Verschiebt den Sendereintrag an der Position oldpos an die Position newpos. Dazwischen liegende Einträge werden entsprechend verschoben.
  • tft_display.ino: enthält alle Funktionen zum Ansteuern des Displays und des Touchscreens.
    • onTouchClick(TS_Point p): Callback-Funktion, die immer dann aufgerufen wird, wenn man kurz auf den Touchscreen tippt. Der Parameter p gibt den Punkt am Display an, auf den getippt wurde. Die Koordinaten sind x und p.y. Der Nullpunkt ist im linken oberen Eck.
    • setGainValue(uint16_t value): Der Schieberegler für die Lautstärke wird aktualisiert, sodass er auf dem übergebenen Wert steht.
    • setBrightness(uint16_t value): Der Schieberegler für die Helligkeit wird aktualisiert, sodass er auf dem übergebenen Wert steht.
    • setSnoozeTime(uint16_t value): Der Schieberegler für die Einschlafzeit wird aktualisiert, sodass er auf dem übergebenen Wert steht.
    • setBGLight(uint8_t prct): Die Helligkeit der Hintergrundbeleuchtung des Displays wird auf den übergebenen Wert in Prozent eingestellt. Ist der Wert 0, wird die Helligkeit abhängig vom Lichtsensor eingestellt.
    • selectStation(uint16_t x): Je nach x-Position wird auf der Konfigurationsseite der nächste oder der vorhergehende Eintrag in der Senderliste angezeigt. Nicht aktivierte Einträge werden übersprungen. Ist x < 50 wird der vorhergehende Eintrag angezeigt. Ist x > 270 wird der nächste Eintrag angezeigt. Für alle anderen Werte von x passiert nichts.
    • toggleRadio(boolean off) : Je nach Wert des Parameters off wird die Wiedergabe des MP3 Streams gestartet oder gestoppt. Danach wird auf die Anzeige der Uhr umgeschaltet.
    • toggleAlarm(): Die Wecker-Funktion wird umgeschaltet. Von aus auf ein und umgekehrt. Danach wird auf die Anzeige der Uhr umgeschaltet.
    • startSnooze(): Die Einschlaf-Zeit wird mit dem konfigurierten Wert gestartet. Danach wird auf die Anzeige der Uhr umgeschaltet. Falls notwendig, wird das Radio eingeschaltet.
    • changeStation(): Die mit selectStation ausgewählte Station wird als aktive Station gesetzt. Danach wird auf die Anzeige der Uhr umgeschaltet.
    • touch_loop(): Muss von der Hauptschleife aufgerufen werden und dient dazu den Status des Touchscreens abzufragen, um Berührungen zu erkennen.
    • setup_display(): Das Display und er Touchscreen werden initialisiert.
    • textInBox(uint16_t x, uint16_t y, uint16_t w, uint16_t h, const char* text, uint8_t align = ALIGNLEFT, boolean big = false, uint16_t fc = ILI9341_WHITE , uint16_t bg = ILI9341_BLACK, uint8_t lines = 1 ): Der übergebene Text wird in einem Rechteck mit der Breite w und der Höhe h an der Position x, y (linke obere Ecke) ausgegeben. Ist der Text zu lang, wird er beim letzten Wortzwischenraum abgeschnitten. Die Ausrichtung kann links, rechts oder zentriert erfolgen. Default ist links. Mit dem Parameter big kann die Schriftgröße mit 12 Pixel gewählt werden. Default ist 9 Pixel. Schriftfarbe und Hintergrundfarbe können gewählt werden. Default ist weiß auf schwarz. Eine mehrzeilige Anzeige ist möglich. In diesem Fall erfolgt der Zeilenumbruch immer an einem Wortzwischenraum. Default ist einzeilig.
    • updateTime(boolean redraw): Die Anzeige von Datum und Uhrzeit wird aktualisiert. Ist redraw true, wird der gesamte Inhalt neu ausgegeben, sonst werden nur die Änderungen aktualisiert.
    • displayDateTime(): Ruft updateTime(false)
    • showProgress(uint32_t prc): Zeigt einen Fortschrittsbalken und den Wert in Prozent an. Wird im Zusammenhang mit dem Softwareupdate aufgerufen.
    • encodeUnicode(const char* src, char* dst): Wandelt im Text src die UTF8 Zeichen ÄÖÜäöüß° so um, dass sie im Display richtig dargestellt werden. Das Ergebnis wird in dst Der Zielstring muss in ausreichender Größe existieren.
    • showSlider(uint16_t y,float value, uint16_t vmax): Ein Schieberegler wird an der vertikalen Position y Der Schieber wird entsprechend dem übergebenen Wert value positioniert. Der Parameter vmax gibt den maximalen Wert an.
    • showGain(): Der Balken für die Lautstärkeeinstellung im Konfigurations-Display wird angezeigt.
    • showBrigthness(): Der Balken für die Helligkeitseinstellung im Konfigurations-Display wird angezeigt.
    • showSnoozeTime(): Der Balken für die Einstellung der Einschlafzeit im Konfigurations-Display wird angezeigt.
    • updateStation(): Der Name des Senders im Balken für die Senderauswahl wird aktualisiert.
    • showStationList(): Der Balken für die Senderauswahl im Konfigurations-Display wird angezeigt.
    • showCommand(): Das Konfigurations-Display wird mit voller Helligkeit angezeigt.
    • showStation(): Der Name des aktiven Senders wird im Radioblock angezeigt.
    • showTitle(): Die Metadaten zum gerade wiedergegebenen Streams werden im Radioblock angezeigt.
    • showRadio(): Der Radioblock wird angezeigt.
    • showNextAlarm(): Datum und Uhrzeit für das nächste Wecker-Ereignis werden in der untersten Zeile angezeigt.
    • showDebugInfo(int16_t v1, int16_t v2, int16_t v3): Diese Funktion wird nicht verwendet. Sie kann aber dazu benutzt werden, den Wert von drei Integer-Zahlen am Display in der untersten Zeile anzuzeigen.
    • showClock(): Die Uhrzeit wird angezeigt. Das Display wird vorher komplett gelöscht. Ist das Radio eingeschaltet, wird der Radioblock angezeigt. Ist die Wecker-Funktion aktiv, wird die nächste Weckzeit angezeigt.
  • 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.
    • getAlarms() reagiert auf das Ajax-Kommando mit der URL /cmd/getalarms. Die beiden Alarmzeiten sowie die jeweiligen Alarmtage werden als String gesendet. Als Trennzeichen wird das Zeilenende verwendet.
    • uint16_t stringToMinutes(String val): Wandelt einen String im Format hh:mm in die Anzahl der Minuten um.
    • setAlarms() reagiert auf das Ajax-Kommando mit der URL /cmd/setalarms. Die Alarmzeiten werden als Argument al0 und al8 im Format hh:mm erwartet. Die Alarmtage werden in den Argumenten al1 bis al7 und al9 bis al15 erwartet. Sie werden in eine 8-Bit Binärzahl umgewandelt.
    • 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.
    • restoreStations(): Die Senderliste wird mit den Default Sendern gefüllt und in den Präferenzen abgespeichert.
    • 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 Accesspoint 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 Version 2.0.9 haben.

 ESP32 Package

Für das Display benötigen Sie zwei Bibliothek, die über die Arduino Bibliotheksverwaltung installiert werden können. Das ist die Bibliothek „Adafruit_ILI9341“ in der Version 1.5.10

ILI-9341

und die Bibliothek „Adafruit_GFX“ in der Version 1.10.14.

GFX-Bibliothek

Zwei weitere Bibliotheken werden für den Touchscreen benötigt. Das ist „XPT2046_Touchscreen“ in der Version 1.4.0

XPT-2046

und  „Touchevent“ in der Version 1.3.0

Touch Event

Kernstück dieses Projekts ist aber die Bibliothek „ESP8266Audio“ von Earle F. Philhower in der Version 1.9.7.

ESP8266 Audio

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. Für das ESP32 Package und die ESP8266audio Bibliothek ist es wichtig, die angegebenen Versionen zu benutzen, da die Audio-Bibliothek sehr hardwarenahe programmiert wurde.

Wer sich das Kompilieren ersparen will, kann hier die fertig kompilierte Firmware herunterladen und direkt auf den ESP32 hochladen.

Binärfile zum Herunterladen

Zum Hochladen des Binärfiles benötigt man ein Hilfsprogramm, das bei Espressif kostenlos heruntergeladen werden kann.  Flash Download Tools


Sie müssen die ZIP-Datei herunterladen und entpacken. Dann können Sie das enthaltene Programm flash_download_tool_3.9.5.exe starten. Es erscheint ein Fenster zur Auswahl des Controllers.

Controller Auswahl
Hier wählen Sie als Chip-Type ESP32 und als Work-Mode Develop. Mit OK wird das Programm fortgesetzt. Es erscheint das Arbeitsfenster des Tools.

Flash Tool
Verbinden Sie den ESP32 über ein USB-Kabel mit dem Computer und wählen Sie unten rechts die verwendete serielle Schnittstelle aus. In der obersten Zeile setzen Sie den Pfad zur heruntergeladenen BIN-Datei für den Radiowecker. Als Zieladresse muss 0x10000 eingegeben werden. Alle anderen Einstellungen wählen Sie wie auf der Abbildung gezeigt. Nun können Sie auf „START“ klicken. Der Upload beginnt. Wenn alles fertig ist, wechselt die grüne Fläche „IDLE“ auf Blau mit dem Text „FINISH“.  Der ESP32 hat nun die Firmware für den Radiowecker und die Inbetriebnahme kann erfolgen. Die fertig kompilierte BIN-Datei funktioniert nur mit der aktuellen Version des AZ-Touch.

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 „radioweckerconf“ ohne Passwort wird gestartet. Auf dem Display erscheint eine entsprechende Meldung.

Not Connected
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.

Konfigurationsseite

Nach dem Neustart sollte die Verbindung zum lokalen WLAN erfolgreich hergestellt werden können. Am Display sollte die aktuelle Uhrzeit und das Datum angezeigt werden.

Zeitanzeige 

Tippt man irgendwo auf das Display, erscheint die Bedienungsseite.

Bedienungsseite

Es gibt drei Schieberegler für Lautstärke, Helligkeit und Einschlafzeit. Verändert werden die Einstellungen, indem man auf die gewünschte Position tippt. Eine Besonderheit gilt für die Helligkeit. Wird die auf 0 eingestellt, wird, falls der optionale LDR vorhanden ist, die Helligkeit an die Umgebungshelligkeit angepasst.

In der vierten Zeile sieht man die aktuelle Radiostation. Mit den zwei Knöpfen links und rechts können Sender aus der Senderliste ausgewählt werden.

Ganz unten ist eine Reihe von Knöpfen.

Knopf1 Das Radio wird ein- oder ausgeschaltet. Die Anzeige kehrt zur Zeitanzeige zurück. Wurde das Radio eingeschaltet, erscheint unter der Zeitanzeige der Radioblock mit dem Sendernamen und den Metadaten (z.B. Name des geraden gespielten Liedes).
Knopf2 Die Einschlafzeit wird gestartet. Falls das Radio nicht eingeschaltet ist, wird es eingeschaltet. Die Anzeige kehrt zur Zeitanzeige zurück. Wenn die eingestellte Einschlafzeit vorüber ist, wird das Radio automatisch ausgeschaltet.

Knopf3 Die Wecker-Funktion wird ein- oder ausgeschaltet. Die Anzeige kehrt zur Zeitanzeige zurück. Wurde der Wecker eingeschaltet, erscheint ganz unten im Display der Wochentag und die Uhrzeit, wann der Wecker das nächste Mal ausgelöst wird. Wenn der angezeigte Wochentag und die Uhrzeit zutreffen, wird das Radio automatisch eingeschaltet.

Knopf4 Der ausgewählte Sender wird als aktiver Sender übernommen. Ist das Radio gerade eingeschaltet, so wechselt der Stream automatisch auf den neuen Sender. Die Anzeige kehrt zur Zeitanzeige zurück.

Knopf5 Die Anzeige kehrt zur Zeitanzeige zurück.

 Erfolgt 10 Sekunden keine Aktivität, so kehrt die Anzeige automatisch zur Zeitanzeige zurück. Alle Einstellungsänderungen werden in den Präferenzen gespeichert. Die Bedienungsseite wird immer mit voller Helligkeit dargestellt.

Konfiguration und Bearbeitung der Weckzeiten und der Senderliste

Über die URL http://radiowecker/ sollte die Konfigurationsseite abrufbar sein.

Konfiguration

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.
Als Nächstes folgen die Weckzeiten. Es können zwei Weckzeiten eingestellt werden. Für jede der Weckzeiten können die Wochentage gewählt werden, an denen die Weckzeiten anzuwenden sind.
Die Dropdown-Liste darunter 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. Achtung! Am Gerät muss das Radio zum Testen eingeschaltet sein. 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. Im Eingabefeld „Position“ wird die Position der ausgewählten Station innerhalb der Senderliste angezeigt. Durch eine Änderung dieses Wertes, kann die Station auf die angegebene Position verschoben werden. 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.

OTA Port

Über diesen Port können Sie nun einen Sketch hochladen. Zum Schutz muss nach Aufforderung das Passwort „weckerupdate“ eingegeben werden. Da die Serielle Schnittstelle nicht genutzt werden kann, werden Meldungen am Display angezeigt.

OTA Progress

Hier gibt es den Beitrag als PDF

Viel Spaß beim Nachbauen.

Nachtrag:

Ziffern in rot, gelb, grün und blau

Dieser Download enthält eine neue Variante von 01_ziffern.ino. Wenn die original Datei 01_ziffern.ino durch diese ersetzt wird, kann in der Datei tft_display.ino in Zeile 335, im Befehl drawRGBBitmap ziffern_rot durch ziffern_gelb, ziffern_gruen oder ziffern_blau ersetzt werden.

Monochrom-Bitmap:

Ich habe noch eine andere Variante, angeregt durch den Kommentar von kunigunde, die Farbe der Ziffern beliebig zu ändern. Dabei wird statt des RGB-Bitmaps ein monochromes Bitmap benutzt, das dann beliebig eingefärbt werden kann. Sie müssen dazu die Dateien 01_ziffern.ino und tft_display.ino durch die entsprechenden aus dem folgenden Link ersetzen.

Variante

In der Datei tft_display.ino in der Funktion updateTime() kann man die Hintergrundfarbe und die Schriftfarbe einstellen.

      if ((z<11) && (redraw || (tim[i] != lasttime[i]))) {
        tft.fillRect(30+i*55,30,50,70,ILI9341_BLACK); //Hintergrund
        tft.drawBitmap(30+i*55,30,ziffern[z],50,70,ILI9341_GREEN);  //Schrift
      }

Hier als Beispiel grün auf schwarzem Hintergrund.

WICHTIGER HINWEIS:

In der Hauptdatei radiowecker.ino liegt ein Fehler vor, der es verhindert, dass nach einem Verbindungsverlust das Gerät neu gestartet wird.

Die Bedingung in den Zeilen 232 bis 238 muss inklusive "else" Teil entfallen. Sie muss wie folgt aussehen:

    getLocalTime(&ti);
    minutes = ti.tm_hour * 60 + ti.tm_min;
    weekday = ti.tm_wday;

DisplaysEsp-32Projekte für fortgeschrittene

141 comentarios

Karl J. Ziller

Karl J. Ziller

Schöner Radiowecker. Leider schaffe ich es nicht andere Sender einzustellen.
z.B.
HPR1: Traditional Classic Country
https://us2.maindigitalstream.com/ssl/7713

Dieter Borgelt

Dieter Borgelt

Es läuft auch auf einen AZTouch esp (alte Version) mit zwei Änderungen im tft_display:
tft.setRotation(3) TFT und Touch sind sonst 180 versetzt
#define TOUCH_IRQ 2 geänderte PIN-Nutzung alt IRQ2 neu IRQ27

kunigunde

kunigunde

V3.0.0 ist auf GitHub.
Ab sofort mit Alarm Einstellungen auf dem Touchscreen möglich.

Andreas K.

Andreas K.

Zum Glück werden die Beiträge hier nicht zeitnah erneuert :-)
Dadurch hat sich meine Frage erledigt, ich habe es durch Forscherdrang selbst gelöst. Jetzt wird mit die Adresse angezeigt und ich muss nicht mehr die Fritzbox fragen, was z.B. im Urlaub mit einem fremden Netz eh nicht möglich wäre.

kunigunde

kunigunde

@Andreas K.
Dein Wunsch mit der IP auf dem Screen ist in Version 2.1.3 mit integriert.
@René Herzmann
Deine Version “antiflickering” ist seit Version 2.1.2 integriert. (Danke)

Github URL:
https://github.com/beabel/radiowecker

Online Flasher von Version 2.1.3:
https://ne-xt.de/esp_flasher/

Andreas K.

Andreas K.

@Joachim Hofmann:
Der Sitz des Widerstandes ist uninteressant passt sowohl auf Reihe 4 oder 5. Die Lötpins sind alle unverbunden, nur ein Raster!
Der Wiederstand R3, übrigens 10kOhm, ist auf dem LDR-Modul schon verbaut, nimmst du eigenes Bauteile, dann musst du den natürlich einlöten.
@Jimbo
You need a Power Supply with 9-35V, DC.

Andreas K.

Andreas K.

Hallo Radiobastler!
Ich habe nun endlich auch das Radio zusammengeklöppelt, nachdem ich schon die erste Variante mit dem 2-zeiligenbDisplay gebaut hatte. Ich habe die Software von Kunigunde genommen und bin sehr zufrieden. Eine Bitte hätte ich aber noch, kann man irgendwie die Anzeige der aktuellen IP-Adresse realisieren? Das wäre bequemer, wenn man das Radio über den PC oder das Smartphone bedienen will. ( Das geht übrigens absolut einfach und super, danke für das Feature!)

Jimbo

Jimbo

I have just received this internet radio kit.
Please can you tell me what DC power supply it needs – 5V or 3.3V?
Also, where can I buy a suitable power supply?

Joachim Hofmann

Joachim Hofmann

Ich bin gerade dabei den Radio zusammen zu bauen. Dabei sind mir zwei Sachen in der Dokumentation aufgefallen:
Auf Seite 2 im PDF ist die Vorder- und Rückseite der Platine abgebildet. Im ersten Bild ist der Widerstand in der 4. Spalte der Platine abgebildet, im zweiten Bild in der 5. Spalte.
Im Schaltplan gibt es noch einen R3 mit 20kOhm. In den beiden Bildern ist er nicht eingezeichnet und wird auch im Text nicht erwähnt. Entsprechend dem E-Book zum LDR wird kein Widerstand benötigt.
Gegebenenfalls sollte die Dokumentation entsprechend korrigiert werden.

Dylan Harris

Dylan Harris

I’ve bought this kit from AZ Delivery but they are unable to lend assistance. I have done the wiring for the amplifiers and all elements are assembled and processor now runs and runs sketch. However, when try to use the radio side of things it crashes and reboots. Have you any suggestions as to how I can diagnose this and have you any other wiring and assembly instructions as I could do with more information to check all components and wiring is correct. I have used the funny claw type connections for the processor but at a loss as to what the other two are used for. Hope you can help please?

YSC

YSC

Hallo Technik-Enthusiasten,
ich habe Fragen zum Touch-Radio: Welches Netzteil benötige ich dafür? Welche Spannung und Stromstärke sind erforderlich, um es problemlos zu betreiben? Es wird ein DC-Stecker mit einer 5,5 mm x 2,1 mm DC-Buchse verwendet. (Laut Beschreibung im Set)

Zweitens, gibt es eine Möglichkeit, das Touch-Radio mit einem DC-Stecker auf USB zu betreiben, indem ich es mit einem USB-Adapter verbinde?

Ich freue mich auf Ihre professionelle Antwort.
Vielen Dank voraus .

Reinhard Gränz

Reinhard Gränz

Bitte um Vergebung, die SSID war falsch, erläuft

Reinhard Gränz

Reinhard Gränz

Ergänzung zu Radiowecker findet keine Netzwerkdaten: Nach dem Neustart zeigt er die SSID an findet aber keine ip-Adresse und fällt wieder zurück auf 192.168.4.1

Reinhard Gränz

Reinhard Gränz

Hallo, ich habe meinen 10 Jahre alten O2-Router durch eine Fritzbox 7530 AX getauscht. Mit der Methode radioweckerconf 192.168.4.1 kann ich die SSID und das neue WLAN-Passwort eingeben. Beim Neustart findet er aber das WLAN nicht, obwohl er fast neben dem Router liegt. Er schaltet dann wieder in den o.g. Modus. Kann ich die Netzwerkdaten manuell eingeben oder welche Lösung gibt es noch.

René Herzmann

René Herzmann

Hallo, dieses Projekt ist echt super. Konnte mir jetzt auch das Gehäuse drucken. Habe den Vollausbau durchgeführt. Nutze die Software von „kunigundes GitHub“. Bis jetzt hatte ich die Helligkeit nur per Slider eingestellt. Jetzt habe ich auch den LDR dazu genommen und diesen ins Gehäuse mit integriert. Bei Nutzung des LDR (Slider Helligkeit auf „0“) fing das Display an zu flackerte, das war nicht schön. Aus meinen anderen Projekten mit Display kannte ich das Problem schon. Habe folgende Änderung vorgenommen und nun schaut das „void setBGLight(uint8_t prct)“ jetzt bei mir so aus:

//adjust the brightness of the background led
void setBGLight(uint8_t prct) {
uint16_t ledb;
//if brightness is 0, we read the ambient light from LDR
if (prct == 0) {
static unsigned long prevMillis = -20000;
if (millis() – prevMillis < 10000) return;
prevMillis = millis();
ledb = analogRead(LDR) * 255 / 4096;
} else {
ledb = 255 * prct / 100;
}
if (ledb > 255) ledb = 255;
if (ledb < 3) ledb = 3; //minimal brightness
if (LED_ON == 0) ledb = 255 – ledb;
Serial.printf(“percent = %i LED = %i\n”, prct, ledb);
//set the LED
analogWrite(TFT_LED, ledb);
}

Jetzt wird nur alle 10 Sekunden die Helligkeit des Displays eingestellt. Den Wert kann man je nach Belieben ändern.

Peter Kruger

Peter Kruger

Mir ist noch nicht ganz klar, wie ich einen Kanal auswählen soll. Sowohl bei normaler Radionutzung als auch bei der Weckerfunktion. Wenn ich einen Kanal aus der Dropdown-Liste auf dem az-touch auswähle (also nicht über die Website), springt der Kanal regelmäßig entweder zum Standardkanal oder es passiert nichts (möglicherweise wird die Stream-URL nicht gefunden?). Was genau ist hier das Ministerium, das befolgt werden muss?

Gerald Lechner

Gerald Lechner

@Martin Krüger: In diesem Zustand hat der Radiowecker eine AccesPoint mit der SSID radioweckerconf ohne Passwort gestartet. Sie müssen mit diesewm Netzwerk eine Verbindung herstellen, dann können Sie über die angezeigte IP-Adresse die Konfiguration vornehmen.
@Knut: Der Helligkeitswert wird in dauerhaft in der Konfiguration gespeichert. Das heißt Sie müssen ihn nur einmal auf 0 Stellen. Imp Programmcode radiowecker.ino können Sie in den Zeilen 122 und 123 folgende Änderung vornehmen:
122 bright = 0; //default value
123 //if (pref.isKey(“bright”)) bright = pref.getUShort(“bright”);
Damit ist der Wert nach dem Einschalten immer auf 0 auch wenn Sie vorher etwas anderes eingestellt haben.

Peter Kruger

Peter Kruger

@Martin Krüger

Did you change the wifi connection on your computer to connect to the SSID radioweckerconf network?

Knut

Knut

Hallo,
ich möchte gern in dem Prgrammcode die Helligkeit auf Null stellen. So dass der Lichtsensor auf hell- und dunkel regiert, ohne das ich dies erst, manuell einstellen muss.
Gibt es dazu eine Möglkichkeit?
Mit freundlichen Grüssen Knut

Martin Krüger

Martin Krüger

Hallo, ich habe die Hardware aufgebaut, bleibe jedoch an der Stelle stehen, wo die Abforderung kommt “connect to SSID radioweckerconf configuration on IP:192.168.4.1”.
Ich bekomme da keine Verbindung.
wie ist da der Werdegang?

brezel64

brezel64

@Klaus-Peter Schildt: danke fürs antworten, da es hier doch manchmal recht lang dauert bevor die Kommentare veröffentlicht werden und weil kunigunde schon sehr gute Arbeit geleistet hat bin ich auf seinem Github Kanal fündig geworden.
Glaube gute Ideen sind dort genau an der richtigen Stelle.

brezel64

brezel64

@Klaus-Peter Schildt: danke werde es testen, nutze jetzt die Version 2.1.1 von kunigunde der gute Arbeit geleistet hat.
Da hier die Kommentare manchmal lange brauchen bis sie veröffentlicht werden hab ich zu kunigundes GitHub Kanal gewechselt.
Sicherlich ist da jeder willkommen der sich einbringen will.

Klaus-Peter Schildt

Klaus-Peter Schildt

@brezel64:Sorry seconds muss in der Basis Version natürlich global vereinbart sein!
Ich habe einiges verändert. Deswegen passte es bei mir.
Ein kleiner Tipp zum Test:
1. Die Zeilen am Ende von setup() ab diesem Kommentar ersetzen.
//remember the tick count for the timed event
tick=millis();//Wichtig, aktuelle Systemzeit holen
uint8_t Sekunden=ti.tm_sec;
uint8_t Minuten =ti.tm_min;
uint8_t Stunden =ti.tm_hour;
Serial.printf(“Startzeit Programm: %i:%i.%i\n”,Stunden,Minuten,Sekunden);
tick=(tick-Sekunden*1000);//Wichtig, 1. Startzeit von getLocalTime im loop setzen
start_conf=0;
2. Radio Controll Uhr mit Sekundenanzeige o.ä. als Referenz nutzen.
Bei Uhrzeit xx:xx.30 als Beispiel, den ESP32 RESET Button drücken.
Im seriellen Monitor sollten dann, nach der CPU Start Sequenz, die Stunden, Minuten und Sekunden vom Programmstart angezeigt werden. Mit einer Differenz von Referenz Start Zeit plus ca. 5-10 Sekunden Zeit für die Startsequenz CPU etc.
Die nächsten Zeit Aufrufe von getLocalTime im loop, müssten nun synchron zur Referenz erfolgen. Übrigens… Stunde und Minute werden auch zur Kontrolle, jede Minute, im Monitor angezeigt;-)
Show Time
Zeit = XX:XX
mfG. Peter

kunigunde

kunigunde

Version 2.1.1 ist veröffentlicht.

Ab jetzt auch mit Senderwechsel auf der Website.
Somit ist eine Benutzung komplett ohne Display möglich.

https://github.com/beabel/radiowecker/releases/tag/v2.1.1

Peter Kruger

Peter Kruger

@Klaus-Peter Schildt u.a.
In weckerradio.ino also the variable uint16_t seconds should be defined in the global section to avoid an error that secondes is unknown

Peter Kruger

Peter Kruger

Nach einer Reihe von Updates melden die Arduino IDE und der Radiowecker regelmäßig einen Authentifizierungsfehler. Wenn ich die Skizze über USB hochlade, ist das Problem für eine Weile behoben. Allerdings muss ich dafür immer den ESP32 vom Az-Touch entfernen, da das USB-Kabel nicht neben die angelöteten Pins und Elko passt (leider ist die Position von Elko vielleicht nicht ganz günstig gewählt, aber sie ist da) .

Gibt es dafür eine andere Lösung, damit ich über die Netzwerkbuchse wieder darauf zugreifen kann, ohne den ESP32-Sketch immer über USB laden zu müssen?

Gilles Pasquier

Gilles Pasquier

Hello, I finished assembling the kit. Now it works. I have 2 questions.
1) Where can I change the color of the time in the code ?
2) I added some french channels. The sounds is bad for these channels (kind of echo and vibration). When I listen them on a web browser it’s fine. Maybe the stream is not the same as german channels. What can I do ?
Thanks in advance.

Gilles Pasquier

Gilles Pasquier

@Gerald Lechner. I found the problem. I sed used the precompiled binary provided on the blog which seems to have a defect. I tried comiling myself the code, now it works.

brezel64

brezel64

@Klaus-Peter Schildt: danke, habe es so umgesetzt : uint16_t seconds; in globale Variablen eingetragen, dann uint16_t seconds = ti.tm_sec * 1000; eingefügt und am setup() Ende tick=(tick-seconds); Uhrzeit ist aber immer noch ca 30sek nachhängend.
Spannende Sachen die du noch einbauen willst, leider sind meine C-Kenntnisse nicht gut genug um allein so etwas umzusetzen, in meiner Jugend hatten die Radios noch Röhren;-)
Aber macht mir Spass immer noch etwas dazu zu lernen.

kunigunde

kunigunde

@Dennis
Nein mit dem 0.6 verringerst du alle Werte die übergeben werden.
Normal wird zwischen 3 und 255 übergeben, danach zwischen 3*0.6 und 255*0.6 = zwischen 1.8 und 153. Somit alles verringert.

Gerald Lechner

Gerald Lechner

@Gilles Pasquier: May be your ESP32 has not good contacts on the right side where the controller is located. Press it into the socket. Sometimes I had also this problem. The red led on the modul is on in this case.

Gilles Pasquier

Gilles Pasquier

Hello, I finished assembling the component except amplifiers. When I plug the 9V power adapter, the screen stays black. I made sure with a voltmeter that it is powered correctly.
The led on the EPS32 is on. What can I check else ?

Dennis

Dennis

@kunigunde
Du hattest geschrieben:
@Dennis
Du könntest in der Function setBGLight vor analogWrite(TFT_LED, ledb);
diese Zeile einfügen:
ledb = ledb * 0.6;
damit verringerst du auf max 60%

Damit begrenze ich aber nur die maximale Helligkeit, oder?
Mir (eigentlich Familienangehöriger) ist ja die minimale Helligkeit ein kleines bisschen zu hell.

//adjust the brightness of the background led
void setBGLight(uint8_t prct) {
uint16_t ledb;
//if brightness is 0, we read the ambient light from LDR
if (prct == 0) {
ledb = analogRead(LDR) * 255 /4096;
} else {
ledb = 255*prct/100;
}
if (ledb > 255) ledb = 255;
if (ledb <3) ledb = 3; //minimal brightness, bei 0 geht es ganz aus

Wenn ich hier anstatt der 3 eine 0 einfüge, dann geht das Display ganz aus wenn es im Raum dunkel genug ist. Könnte man hier eine Variable einfügen welche in der Webkonfigurationsseite definiert werden kann. z.B. eine Checkbox, Haken drin ist 0 ansonsten 3.
Wenn das Display in der Nacht dann aus ist sollte es per tippen auf das Display für z.B. 5 Sekunden wieder heller werden um dann wieder auszugehen.

Wäre das ein umsetzbares Szenario?

Klaus-Peter Schildt

Klaus-Peter Schildt

@brezel64: Zeilennummern sind andere, weil neuer Code eingefügt wurde. Einfach nach den originalen Kommentaren suchen.
//fill timestarukture ti, minutes and weekday with now => original Kommentar.
getLocalTime(&ti); //lokale Zeit holen.
Anschließend neu einfügen:
uint16_t second = ti.tm_sec * 1000; //Zeit Fenster präparieren für ersten tick Aufruf.
Dann weiter bis:
//remember the tick count for the timed event => original Kommentar.
tick=millis(); //aktuelle Systemzeit abfragen.
Anschließend Differenz bis 1. Time Event neu einfügen: Wird im loop() ausgewertet.
tick=(tick-seconds);
Fertig:-)))
Habe momentan alternativ die Touch Events durch TV Remote erweitert, der dicken Finger wegen;-)). Außerdem, sie durch Buzzer Click hörbar gemacht.
Im Kontext, das Einstellen der Weck Zeit etc. ohne Smartphon ermöglicht.
Mikrowellenradar Bewegungssensor wird zum löschen des Weckevent genutzt.
Bin dabei, auch Musik oder Sprache von SD Card zu verwenden. Beim wecken z.B.
Angedacht: Wetter und Raumklima Daten anzeigen.
Peter

Heinz Wanger

Heinz Wanger

Ich bekomme keine Verbindung zur Fritzbox laut den eingegebenen Werten SSID und Passwort. Leider kann ich keine neuen Werte eingeben, da nach Restart, Verbindung zu radioweckerconf und Starten von Chrome Browser sofort ein Reset ausgelöst und mit den (eventuell) fehlerhaften Werten ein neuer Connect versucht wird. Ich habe die letzte Korrektur laut Nachtrag (Zeile 232 bis 238 …) angebracht und alles neu geladen. Leider kein Erfolg. Man muss wohl das EEPROM löschen um wieder auf den Anfang zu kommen, oder?

brezel64

brezel64

@Klaus-Peter Schildt: wegen der Uhrzeit,kannst du deinen Setup Teil zur Verfügung stellen?

kunigunde

kunigunde

@Peter Kruger
der weg vom bild zu code geht recht einfach.
1. Bild in der größe erstellen (Uhrzeit = 50×70)
2. auf dieser Seite in code wandeln: https://javl.github.io/image2cpp/
3. den entsprechenden Abschnitt in der Ziffer.ino mit dem Code ersetzen.

@Dennis
Du könntest in der Function setBGLight vor analogWrite(TFT_LED, ledb);
diese Zeile einfügen:
ledb = ledb * 0.6;
damit verringerst du auf max 60%

@Konrad
Ja, habe ich auch bereits bemängelt, ich werde das wohl noch mit integrieren.
Vielleicht am Wochenende. :-)

@brezel64
Ich habe keine hörbaren Unterbrechungen.
Die habe ich wenn ich einen One Wire DS18B20 Temp Sensor abfrage, ich habe noch keine Lösung gefunden den abzufragen ohne den Stream zu unterbrechen. Ich wollte extra diesen Sensor nutzen, da er aussieht wie eine kleine WLAN Antenne.

Gerald Lechner

Gerald Lechner

@brezel64: Der Pluspol des Elkos muss an die 3.3V, also der mit – bezeichnete Pin des LDR-Moduls und der Minuspol an den mit S bezeichneten Pin.

Peter Kruger

Peter Kruger

@Bernd-Steffen Großmann und/oder @Gerald Lechner
Wenn ich einen Elektrolytkondensator einbaue, sind, wenn ich es richtig lese, die Polarität und die Spannung wichtig. Um sicherzustellen, dass ich nichts Dummes tue.

Der ESP32 kann maximal 35 V verarbeiten. Ein Elektrolytwandler mit einer maximalen Betriebsspannung deutlich darüber (z. B. 40 V oder höher) sollte also in Ordnung sein? Oder raten Sie mir konkret zu etwas?

Im Schaltplan sind die 3,3 V mit dem – des LDR verbunden. Stimmt es, dass ich das Plus des Elektrolytkondensators mit dem Minus des LDR und das Minus des Elektrolytkondensators mit dem S des LDR verbinden sollte?

brezel64

brezel64

@Heiko Janisch: Problem Gesamtlautstärke ist meiner Meinung nach kein Softwareproblem sondern liegt an der nicht richtigen Beschaltung des MAX98357A für den linken Kanal der übersteuert wird.
Habe am linken MAX98357A vor SD einen Widerstand von 150k zu Vin geschaltet, jetzt hört sich das ganze auch nach Stereo an und nicht mehr so übersteuert.
Gemessen habe ich jetzt am rechten MAX98357A SD zu GND = 1,08 Volt, am linken MAX98357A SD zu GND = 1,93 Volt ( vorher waren das 5 Volt).
Im AZ- Blog gibt es dazu auch Informationen: MAX98357 – Was ist eigentlich I2S? vom 4.April 22.
@Gerald Lechner,
@kunigunde:
Das Aktualisieren der Uhrzeit oder der Wechsel der angezeigten Tags führt
manchmal zu kleineren hörbaren Unterbrechungen.

Konrad

Konrad

Hallo kunigunde,
wie immer läuft Deine Version sauber und die Optimierungen sind wie immer gut durchdacht. Großes Lob.
Stand beim Hochladen: Die OTA Variante hat zu lange gedauert. Bin dann nach 30 min an den USB mit Laptop direkt dran: Zeitbedarf: 15 min.

Einen Hinweis noch. Eine Browseränderung des Radiosenders ist auch in der 2.1.0 Variante nicht möglich. Zwar kann man über den “Testen” Button im Browser eine Höränderung herbeiführen. Einen kompletten Switch auch auf dem Touchscreen leider nicht.
Aber das ist schon wieder sehr “erbsenzählerisch”. Ich bin super zufrieden mit dem Ergebnis.

Danke an Alle die das möglich machten.

Konrad

Dennis

Dennis

@kunigunde
Wenn die Helligkeit auf 0 gesetzt ist übernimmt der LDR die Helligkeit des Display. Das Display ist mir dann aber immer noch ein wenig zu hell. Kann man im Sketch einen Wert verändern der die Regelung des LDR insgesamt das Display noch ein klein wenig dunkler macht?

Klaus-Peter Schildt

Klaus-Peter Schildt

@Gerald Lechner
Es funktioniert! setup() wie folgt ändern:
getLocalTime(&ti);
//tick value for show correct first time
secondes = ti.tm_sec * 1000;
minutes = ti.tm_hour * 60 + ti.tm_min;
weekday = ti.tm_wday;
dann später am setup() Ende
//remember the tick count for the timed event
tick=millis();
//first tick for show correct first time
tick=(tick-secondes);
Peter ;-))

Peter Kruger

Peter Kruger

Entschuldigung, aber meine vorherige Frage kann ignoriert werden, da ich glaube, jetzt zu verstehen, wie 01_ziffern.ino funktioniert. Erst jetzt suche ich nach einem Tool, das den Binärcode in die Bitmap konvertieren kann, sodass ich die Bitmap anpassen und zurück in den Binärcode übersetzen kann, ohne mir darüber Gedanken machen zu müssen.

Peter Kruger

Peter Kruger

Ich würde gerne verstehen, wie man die Zahlenzeichen ändert (also wie man die Codes in 01_ziffern.ino liest) und wie die Struktur der Daten ist, die ich sehe.

Gibt es jemanden, der bereit und in der Lage ist, zu erklären, wie das geht, oder darauf hinzuweisen, wo dies im Internet beschrieben wird?

Ich habe übrigens die neue 01_ziffern.ino heruntergeladen, aber bei mir steht die 3 immer noch auf dem Kopf.

Klaus-Peter Schildt

Klaus-Peter Schildt

@Gerald Lechner
Sorry, so einfach wie in meiner letzten Mail beschrieben ist mein Problem wohl nicht zu lösen. Wenn ich es richtig verstanden habe, wird die im Setup gelesene Lokalzeit im Display sofort dargestellt. Das heißt, wenn das Programm z.B. mit der Zeit XX:XX.59 startet, aktualisiert Loop sie hier nach 60 Sec. . Wird also im extrem Fall um 60 Sec. verzögert falsch angezeigt.
Denkbare Lösung: Im Setup den ersten tick minus der aktuellen Sekunden Differenz anpassen um die 1. Zeit Aktualisierung korrekt zu realisieren. Sehe ich das richtig?
Peter

Klaus-Peter Schildt

Klaus-Peter Schildt

Respekt, gute Arbeit wie immer. Im Vergleich mit meinem kommerziellen Internet Radio
ist die Anzeige der aktuellen Urzeit im Display um eine Minute verspätet.
Meine Abhilfe:
Nach WiFi connect im setup() die um 1 Minute verspätete Aktualisierung der Anzeige im loop() durch den tick counter ausgleichen.
//fill timestarukture ti, minutes and weekday with now
getLocalTime(&ti);
minutes = ti.tm_hour * 60 + ti.tm_min; //etc.
ändern in:
minutes = (ti.tm_hour * 60 + ti.tm_min)+1;
Peter

Peter Kruger

Peter Kruger

Vielen Dank Herr Lechner für dieses schöne Projekt und die gute und schnelle Unterstützung, die Sie leisten. Ich genieße es sehr.

Ich habe gerade den Hardware-Teil abgeschlossen und die binäre Firmware verwendet, um zu testen, ob alles funktioniert. Er tut es. Der nächste Schritt für mich wird darin bestehen, die Bildschirme ins Niederländische zu übersetzen und sie an meinen eigenen Geschmack anzupassen. Angesichts des aktiven Forums unter diesem Blog wird das sicherlich funktionieren.

Gerald Lechner

Gerald Lechner

@Giles Pasquier: Most German Messages are in tft_display.ino and for configuration web page in index.h

Gilles Pasquier

Gilles Pasquier

Hello, I would like to translate the texts on the display in French. Is that possible ? If yes, which files are involded in the code ?

Deja un comentario

Todos los comentarios son moderados antes de ser publicados