Der heutige Beitrag befasst sich mit einer anderen Methode, Uhrzeit und Meßwerte anzuzeigen, nämlich mit Sprachausgabe. Eine einfache Möglichkeit zur Sprachausgabe ist es, für einzelne Wörter MP3 Dateien aufzunehmen. Aus diesen Wörtern kann dann die Ausgabe zusammengesetzt werden. Zum Abspielen kann ein Mini MP3 Player verwendet werden, der dann die MP3 Dateien von einer Micro SD-Card abspielt.
Benötigte Hardware
Anzahl |
Bauteil |
Anmerkung |
---|---|---|
1 |
|
|
1 |
|
|
1 |
|
|
1 |
Mini Lautsprecher 8 Ohm |
|
1 |
Elko 1000 bis 2200 µF / 10V |
|
2 |
Micro-Taster |
|
Schaltung
Für den DFPlayer brauchen wir neben der Stromversorgung die Verbindung zu einer seriellen Schnittstelle. Wir werden als serielle Schnittstelle eine Softwarelösung wählen, damit wir die verwendeten Pins frei wählen können. Für die Sendeleitung vom Mikrocontroller zum DFPlayer verwenden wir GPIO14, beschriftet mit D5. Für die Gegenrichtung verwenden wir GPIO12, beschriftet mit D6. Den Mini Lautsprecher verbinden wir direkt mit den Lautsprecherausgängen des DFPlayers. Plus-Leitung orange dargestellt, Minus-Leitung hellblau. Da es am Beginn der Wiedergabe zu kurzen Stromspitzen kommt, sollte man einen Elektrolyt-Kondensator parallel zur Versorgungsspannung anschließen, um Störungen zu vermeiden.
Der Sensor BME280 arbeitet mit dem I2CBus. Die Default Pins dafür sind GPIO5/D1 für den Takt (SCL) und GPIO4/D2 für die Daten (SDA).
Den Taster zur Ausgabe der Uhrzeit verbinden wir mit GPIO0/D3 und Masse. Den Taster zur Ausgabe der Sensor-Meßwerte mit GPIO2/D4.
Will man nur die Uhr, so kann man den Sensor und den zweiten Taster weglassen. Auch ein anderer Sensor kann verwendet werden. In beiden Fällen muss das Programm entsprechend geändert werden.
Damit ist die Verdrahtung fertig und wir können uns mit dem Programm befassen.
Programm
Da wir Datum und Uhrzeit von einem NTP-Zeitserver im Internet beziehen wollen, brauchen wir eine Internet Verbindung. Diese kann mit dem ESP8266 sehr einfach hergestellt werden.
Für den BME280 verwenden wir die Bibliothek „BlueDot_BME280.h“, die wir über die Arduino Bibliotheksverwaltung installieren können.
Zur Sprachausgabe verwenden wir die Bibliothek Talking_Display.h, die ich speziell für die Sprachausgabe mit dem DFPlayer entwickelt habe. Auch diese Bibliothek sollte über die Arduino Bibliotheksverwaltung installiert werden können.Diese Bibliothek hat mehrere Funktionen zur einfachen Sprachausgabe:
void say(uint16_t wort_index)
Das Wort mit dem entsprechenden Index wird ausgegeben.
void sayInt(int32_t zahl)
Die Zahl wird mit Vorzeichen ausgegeben. Zahlen im Bereich von −2147483647 bis 2147483647 sind möglich.
void sayFloat(float zahl, uint8_t dezimalstellen)
Die Zahl wird mit Vorzeichen und Kommastellen ausgegeben. Es können nur entweder eine oder zwei Kommastellen gewählt werden. Werte für die Kommastellen kleiner als zwei ergeben 1, Werte größer oder gleich zwei ergeben zwei. Der Wertebereich reicht von −2147483647.99 bis 2147483647.99.
void sayTime(struct tm * Zeitstruktur, bool Format24, bool Sekunden)
Die durch die Struktur Zeitstruktur repräsentierte Zeit wird ausgegeben. Ist das Argument Format24 wahr, so wird das 24-Stunden Format benutzt, sonst das 12-Stunden Format mit vormittag und nachmittag. Ist das Argument Sekunden wahr, werden die Sekunden ausgegeben, sonst weggelassen.
void sayDate(struct tm * Zeitstruktur, bool Wochentag, bool Jahr)
Das durch die Struktur Zeitstruktur repräsentierte Datum wird ausgegeben. Ist das Argument Wochentag wahr, so wird zuerst der Wochentag ausgegeben, sonst nicht. Ist das Argument Jahr wahr, wird das Jahr ausgegeben, sonst weggelassen.
Einen Link zu den MP3 Dateien mit den Wörtern findet ihr am Ende des Beitrags. Einfach die ZIP Datei entpacken und auf eine SD Karte ins Root Verzeichnis kopieren.
#include <ESP8266WiFi.h> //WLAN Unterstützung #include <TZ.h> //Zeitzonen Konstanten #include <SoftwareSerial.h> //Serielle Schnittstelle #include <Talking_Display.h> //Sprachausgabe #include <Wire.h> //Kommunikation für I2C #include <BlueDot_BME280.h> //Bibliothek für den Sensor //SSID und PSK vom lokalen WLAN #define STASSID "****************" #define STAPSK "****************" #define BTN1 0 //Pin für den Knopf zur Zeitausgabe #define BTN2 2 //Pin für den Knopf zur Ausgabe der Sensorwerte #define DFPLAYER_RX 12 //RX Anschluss für die Kommunikation mit dem DFPlayer #define DFPLAYER_TX 14 //TX Anschluss für die Kommunikation mit dem DFPlayer //Zeitzone mit Sommer/Winterzeit Information #define MYTZ TZ_Europe_Berlin //Internet Zeitserver #define NTP_SERVER "pool.ntp.org" //Instanz der seriellen Schnittstelle SoftwareSerial ss(DFPLAYER_RX,DFPLAYER_TX); // RX, TX //Instanz für die Sprachausgabe Talking_Display<SoftwareSerial> td(ss); //Instanz für den Sensor BlueDot_BME280 bme; //Ausgabe von Uhrzeit und Datum void speak() { time_t now = time(nullptr); //aktuelle Zeit struct tm * s_time = localtime(&now); //Zeitstruktur aufgesplittet in Jahr, Monat, Tag, Stunden, Minuten und Sekunden td.sayDate(s_time,true,false); //Datum ausgeben mit Wochentag aber ohne Jahr td.sayTime(s_time,true,true); //Zeit ausgeben mit 24-Stunden Format und Sekunden } //Ausgabe der Meßwerte vom Sensor void speakSensor() { float temp,hum,pr; temp = bme.readTempC(); //Temperatur lesen hum = bme.readHumidity(); //Luftfeuchtigkeit lesen pr = bme.readPressure(); //Luftdruck lesen //Kontrollausgabe auf der seriellen Schnittstelle Serial.printf("Temp %4.1f °C Hum %4.1f %% Pr %6.1f hPa \n",temp,hum,pr); //Ausgabe der Temperatur mit 1 Kommastelle td.say(WORD_TEMPERATURE); td.sayFloat(temp,1); td.say(WORD_DEGREE); td.say(WORD_CELSIUS); //Ausgabe der Luftfeuchtigkeit mit 1 Kommastelle td.say(WORD_HUMIDITY); td.sayFloat(hum,1); td.say(WORD_PERCENT); //Ausgabe des Luftdruckes mit 1 Kommastelle td.say(WORD_AIR_PRESSURE); td.sayFloat(pr,1); td.say(WORD_HECTOPASCAL); } //Callback Funktion für Felermeldungen vom DFPlayer void tdError(String msg) { Serial.println(msg); } //Setup Funktion void setup() { Serial.begin(74880); //Serielle Schnittstelle initialisieren //Pins für die Taster pinMode(BTN1,INPUT_PULLUP); pinMode(BTN2,INPUT_PULLUP); Serial.println(); Serial.println("Start"); //DFPlayer vorbereiten td.begin(); td.setVolume(25); Serial.println("Sprachausgabe bereit"); td.setEnglish(false); td.setWordTimeout(2); //Callback Funktion registrieren td.registerOnError(tdError); //Sensor vorbereiten bme.parameter.communication = 0; //Kommunikation über I2C bme.parameter.I2CAddress = 0x76; //I2C Adresse bme.parameter.sensorMode = 0x3; //kontinuierliche Messung bme.parameter.IIRfilter = 0x04; //IIR Filter bme.parameter.humidOversampling = 0x05; //Oversampling Luftfeuchtigkeit bme.parameter.tempOversampling = 0x05; //Oversampling Temperatur bme.parameter.pressOversampling = 0x05; //Oversampling Luftdruck Serial.println(bme.init()); //Interne Uhr konfigurieren configTime(MYTZ, NTP_SERVER); //WLAN initialisieren und mit dem WLAN verbinden uint8_t cnt = 0; Serial.println("Netzwerkverbindung herstellen"); WiFi.persistent(false); WiFi.mode(WIFI_STA); WiFi.begin(STASSID, STAPSK); //Auf Verbindung warten while ((WiFi.status() != WL_CONNECTED) && (cnt<20)){ delay(500); Serial.print("."); cnt++; } Serial.println(); //Wenn die Verbindung erfolgreich war, wird die IP-Adresse angezeigt if (WiFi.status() == WL_CONNECTED) { Serial.print("IP-Adresse = "); Serial.println(WiFi.localIP()); } else { Serial.println("Keine Internetverbindung möglich"); } } //Hauptschleife void loop() { if (digitalRead(BTN1) == 0) { //Zeit vorlesen speak(); } if (digitalRead(BTN2) == 0) { //Zeit vorlesen speakSensor(); } td.loop(); }
Variante mit D1-Mini und Busy Leitung
Hier auf vielfachen Wunsch eine Variante der Schaltung mit D1-Mini als MCU und mit Verwendung der Busy-Leitung des DFPlayers.
Der zugehörige Sketch
#include <ESP8266WiFi.h> //WLAN Unterstützung #include <TZ.h> //Zeitzonen Konstanten #include <SoftwareSerial.h> //Serielle Schnittstelle #include <Talking_Display.h> //Sprachausgabe #include <Wire.h> //Kommunikation für I2C #include <BlueDot_BME280.h> //Bibliothek für den Sensor //SSID und PSK vom lokalen WLAN #define STASSID "*******************" #define STAPSK "*******************" #define BTN1 0 //D3 Pin für den Knopf zur Zeitausgabe #define BTN2 2 //D4 Pin für den Knopf zur Ausgabe der Sensorwerte #define DFPLAYER_RX 12 //D6 RX Anschluss für die Kommunikation mit dem DFPlayer #define DFPLAYER_TX 13 //D7 TX Anschluss für die Kommunikation mit dem DFPlayer #define BUSY 14 //D5 Busy Leitung vom DFPlayer //Zeitzone mit Sommer/Winterzeit Information #define MYTZ TZ_Europe_Berlin //Internet Zeitserver #define NTP_SERVER "pool.ntp.org" //Instanz der seriellen Schnittstelle SoftwareSerial ss(DFPLAYER_RX,DFPLAYER_TX); // RX, TX //Instanz für die Sprachausgabe Talking_Display<SoftwareSerial> td(ss,BUSY); //Instanz für den Sensor BlueDot_BME280 bme; //Ausgabe von Uhrzeit und Datum void speak() { time_t now = time(nullptr); //aktuelle Zeit struct tm * s_time = localtime(&now); //Zeitstruktur aufgesplittet in Jahr, Monat, Tag, Stunden, Minuten und Sekunden td.sayDate(s_time,true,false); //Datum ausgeben mit Wochentag aber ohne Jahr td.sayTime(s_time,true,true); //Zeit ausgeben mit 24-Stunden Format und Sekunden } //Ausgabe der Meßwerte vom Sensor void speakSensor() { float temp,hum,pr; temp = bme.readTempC(); //Temperatur lesen hum = bme.readHumidity(); //Luftfeuchtigkeit lesen pr = bme.readPressure(); //Luftdruck lesen //Kontrollausgabe auf der seriellen Schnittstelle Serial.printf("Temp %4.1f °C Hum %4.1f %% Pr %6.1f hPa \n",temp,hum,pr); //Ausgabe der Temperatur mit 1 Kommastelle td.say(WORD_TEMPERATURE); td.sayFloat(temp,1); td.say(WORD_DEGREE); td.say(WORD_CELSIUS); //Ausgabe der Luftfeuchtigkeit mit 1 Kommastelle td.say(WORD_HUMIDITY); td.sayFloat(hum,1); td.say(WORD_PERCENT); //Ausgabe des Luftdruckes mit 1 Kommastelle td.say(WORD_AIR_PRESSURE); td.sayFloat(pr,1); td.say(WORD_HECTOPASCAL); } //Callback Funktion für Felermeldungen vom DFPlayer void tdError(String msg) { Serial.println(msg); } //Setup Funktion void setup() { Serial.begin(74880); //Serielle Schnittstelle initialisieren //Pins für die Taster pinMode(BTN1,INPUT_PULLUP); pinMode(BTN2,INPUT_PULLUP); Serial.println(); Serial.println("Start"); //DFPlayer vorbereiten td.begin(); ss.setTimeout(2000); td.setVolume(25); Serial.println("Sprachausgabe bereit"); td.setEnglish(false); td.setWordTimeout(1); //Callback Funktion registrieren td.registerOnError(tdError); //Sensor vorbereiten bme.parameter.communication = 0; //Kommunikation über I2C bme.parameter.I2CAddress = 0x76; //I2C Adresse bme.parameter.sensorMode = 0x3; //kontinuierliche Messung bme.parameter.IIRfilter = 0x04; //IIR Filter bme.parameter.humidOversampling = 0x05; //Oversampling Luftfeuchtigkeit bme.parameter.tempOversampling = 0x05; //Oversampling Temperatur bme.parameter.pressOversampling = 0x05; //Oversampling Luftdruck Serial.println(bme.init()); //Interne Uhr konfigurieren configTime(MYTZ, NTP_SERVER); //WLAN initialisieren und mit dem WLAN verbinden uint8_t cnt = 0; Serial.println("Netzwerkverbindung herstellen"); WiFi.persistent(false); WiFi.mode(WIFI_STA); WiFi.begin(STASSID, STAPSK); //Auf Verbindung warten while ((WiFi.status() != WL_CONNECTED) && (cnt<20)){ delay(500); Serial.print("."); cnt++; } Serial.println(); //Wenn die Verbindung erfolgreich war, wird die IP-Adresse angezeigt if (WiFi.status() == WL_CONNECTED) { Serial.print("IP-Adresse = "); Serial.println(WiFi.localIP()); } else { Serial.println("Keine Internetverbindung möglich"); } } //Hauptschleife void loop() { if (digitalRead(BTN1) == 0) { //Zeit vorlesen speak(); } if (digitalRead(BTN2) == 0) { //Zeit vorlesen speakSensor(); } td.loop(); }
Hier ein Link zu einer MP3 Datei,damit ihr euch das Ergebnis anhören könnt
Viel Spass mit der sprechenden Uhr.
47 Kommentare
peter
Sehr schönes Projekt, habs genau so gemacht mit dem nodemcu und hab das gleiche Problem mit der verzögerten Sprachausgabe. Wie kann ich das verändern?
Andreas Wolter
@Flaves: ich kann nicht sagen, welcher Programmteil diese Fehlermeldung ausgibt. Wenn Sie alles aus dem Beitrag verwendet haben, könnte eine falsch formatierte SD-Karte das Problem sein. Wenn die Fehlermeldung vom SD-Karten-Leser des DF-Players kommt.
Könnten Sie genauer beschreiben, wann die Meldung erscheint?
Eventuell könnten Sie einige Textausgaben als Debug-Hilfe einfügen, um den genauen Zeitpunkt zu verifizieren.
Grüße,
Andreas Wolter
AZ-Delivery Blog
Flaves
Ich habe mich mal an der sprechenden Uhr versucht. Im Gegensatz zu den anderen Kommentaren (bis auf einen) erhalte ich nur die Fehlermeldung: wrong file type. Dabei benutze ich die auf dieser Seite mitgelieferten Sprachdateien. Was mache ich falsch?
Flaves
Rainer Hoffmann
@Gerald Lechner. Ein schönes Projekt, das aber wohl in vielen Fällen am DFPlayer scheitert. Warum?
Nun, es gibt verschiedene Versionen des Players mit ebenso verschiedenen Macken. Bleiben wir beim Player von AZ-Delivery mit dem GD3200B Chip. Ich habe damit das Projekt weder mit dem “NodeMCU Lua Lolin V3” noch mit dem “D1 Mini” zum Laufen gebracht. (Ich gehe mal davon aus, dass es eine gewisse Fertigungsstreuung bei der Chipfertigung gibt und andere das Projekt sehr wohl erfolgreich realisieren konnten.)
Das Problem in diesem Projekt scheint die Spannung von 3,3V zu sein. Sowohl “DFRobot” als auch “Flyron Technology” geben in ihren Datenblätter eine Betriebsspannung von 3,3 bis 5V für den Player an. Obwohl diese beiden Hersteller einen anderen Chip verwenden, habe ich nun einfach mal am “D1 Mini” den 5V Anschluss genommen. Und siehe da: es läuft!
Andreas Wolter
@René: als zusätzliche Inspiration könnten Sie auch in die Reihe "Der sprechende Farbdetektor reinschauen:
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/der-sprechende-farbdetektor-mit-dfplayer-und-tcs3200-teil-1
Grüße,
Andreas Wolter
René
@Gerald Lechner:
Ihr Projekt Talking_Display.h ist wirklich genial!
Vielen Dank dafür!
Zwei Projekte schweben mir jetzt vor:
- Die sprechende Plüschkatze für meine Tochter. (z.B. Zeitansage bei Druck der linken Tatze usw.)
- Ausgabe der per mqtt ausgelesenen Sensordaten im Hinweisfall (z.B. “Luftfeuchtigkeit zu hoch, bitte Lüften!”)
Gerald Lechner
Da der ESP8266 nur eine vollwertige serielle Schnittstelle hat und diese am Modul mit den Anschlüssen 1(TX) und 3(RX) mit dem USB-Bus verbunden sind,
kann man bei Benutzung dieser Schnittstelle den seriellen Monitor nicht mehr nutzen. Es müssen dann alle Aufrufe mit Serial.* entfernt werden. Um die Hardware Schnittstelle zu nutzen müsste der Aufruf
Talking_Display td(Serial,BUSY);
lauten. Die Definition der SoftwareSerial Instanz kann dann entfallen. Zusätzlich muss der Player dann mit 3 und 1 statt mit 12 und 13 verbunden werden.
Getestet habe ich diese Variante nicht.
Stefan
Hi. Ich finde diese Schaltungsidee total supi.
Funktioniert das Ganze auch mit einer Hardware-Seriellen-Schnittstelle oder nur mit SoftSerial? Ich bin gerade am Rätseln, wie ich die 2 Zeilen anpassen muss um die HardwareSerial zu nutzen.
SoftwareSerial ss(DFPLAYER_RX,DFPLAYER_TX); // RX, TX
Talking_Display td(ss,BUSY);
Kann mir jemand einen Tipp geben?
Grüße, Stefan.
Reimund
Habe die Uhr nachgebaut. Scheint zu funktionieren. Allerdings ist die Sprachausgabe nicht komplett, sondern abgehackt. Wird nicht vollständig ausgesprochen.
Ist es richtig dass die MP3 Dateien direkt auf die SD Karte kopiert werden ? Also nicht im Ordner MP3 ?
Im Seriellen Monitor sehe ich folgendes.
ip-adresse = 192.168.178.97
wrong file type
device bussy
illegal argument
Reimund Konertz
Es läuft nun einwandfrei. Aber kann man auch die Zeit zu jeder Stunde sprechen lassen, ohne einen Knopf zu drücken ?
Reimund
Es klappt leider nicht. Bekomme die Meldung.
exit status 1
‘TZ_Europe_Berlin’ was not declared in this scope
Reimund
Hallo kann man das auch so einstellen, dass jede Stunde eine Sprachausgabe erfolgt. So dass man keine Schalter braucht.. bzw. jede Stunde Sprachausgabe und wenn man den Schalter drückt, die aktuelle Uhrzeit.
Gerald Lechner
Sie müssen nur in der Hauptschleife die Bedingung
if (digitalRead(BTN1) == 0) {
//Zeit vorlesen
speak(); }
durch
time_t now = time(nullptr); //aktuelle Zeit
struct tm * s_time = localtime(&now);
if ((s_time→tm_min = 0) &&
(s_time→tm_sec = 0) &&
(s_time→tm_hour >= 8) &&
(s_time→tm_hour <= 23)) {
speak();
}
ersetzen.
Jozsef Majtenyi
Tolle Projekt!
Ich habe genau solche gewollt, nur mit eine kleine “Änderung” :)
Wie kann ich einstellen oder was muss ich umschreiben, dass ich nicht die Zeittaste drücken muss, sondern jeder 59:59 fangt an selber die eingestellte MP3s zu spielen? aber z.B von 23 – 5 Uhr Silent bleibt?
Vielen Dank voraus
Gerald Lechner
Die Fehlermeldung “wrong stack” kommt vom DFPlayer und besagt, dass die serielle Kommunikation nicht richtig funktioniert. Die irrealen Werte des BMP280 deuten darauf hin, dass Takt- und Datenleitung entweder vertauscht sind oder eine der Leitungen fehlt. Dieser zweite Fehler hat aber nichts mit dem Problem zum DFPlayer zu tun.
ow
wie muss ich den D1 in der Arduino-Ide zum Hochladen einstellen?
Er verbindet sich und ich erhalte eine ip. Danach erscheint im Seriellen-Monitor “wrong stack”. Beim drücken der Sensor-Taste erhalte ich utopische Werte: 141Grad, 0,0 Luftfeuchte. Nach dem Drücken der Uhrzeittaste erscheint im Seriellen-Monitor “wrong stack” und ab und an erfolgt die Sprach Ausgabe “Null”
Die Verdrahtung habe ich gefühlt tausendmal überprüft. Was mache ich falsch?
Gruß ow
Gerald Lechner
Die Bibliothek Talking_Display ist vom verwendeten Mikrocontroller unabhängig funktioniert also nicht nur mit dem ESP8266 sonder n auch mit dem ESP32 oder irgend einem Arduino.
Jochen Ferger
Hallo,
gibt es die Möglichkeit, die Bibliothek Talking_Display für einen ESP32 zu bekommen?
Viele Grüße
JOchen Ferger
Ralf Quest
Fehlermeldung “Illegal Argument” – Gelöst
Ich konnte die serielle Kommunikation zwischen NodeMCU und DFPlayer “belauschen” (PuTTY sei Dank) Es zeigte sich, dass die serielle Kommunikation ok war, lediglich die SD hatte ein Problem.
Etwas aussagekräftigere error codes werde ich noch in den code bauen…
Nette Idee, die “talking Clock”, vielen Dank
Ralf Quest
Fehlermeldung “Illegal Argument”:
Leider bekomme ich dieses Problem nicht gelöst, Es scheint als sei entweder mein MiniPlayer defekt oder sonst was ; hat jemand eine einfache Idee, wie ich die serielle Schnittstelle prüfen kann?
Bernd-Steffen Großmann
Hallo Pit, wie hier schon mehrfach geschrieben wurde: in der Zeile unter //Instanz für die Sprachausgabe fehlt nach „Talking_Display“ der Text „Software serial“ aber ohne Anführungszeichen sondern in spitzen Klammern – s. auch im ersten Sketch. Der funktioniert auch für den ESP8266 D1-Mini, wenn die Busy-Leitung auf GPIO13 gelegt wird und die Ergänzungen von Reiner eingefügt werden – die Rx und Tx- Belegung aber auf 12 und 14 belassen. Viele Grüße von Bernd-Steffen
Pit Richter
Die erste Version von „Sprechende Uhr“ lief bei mir problemlos. Was mir nicht gefiel waren die Pausen von ca. 10s zwischen den Ansagen. Also Sonntag 10s – 14er-10s usw.
Bei der neuen Version mit Talking_Display td(ss,DFPLAYER_Busy);
oder jetzt
Talking_Display td(ss,BUSY);
Auch mit dem neuen Programm für D1
kommt immer dieser Fehler:
no matching function for call to ‘Talking_Display::Talking_Display(SoftwareSerial&, int)’ Finde keine Lösung für das Problem
Gerald Lechner
Für alle, die die Busy-Leitung verwenden und den D1-Mini einsetzen möchten, hab ich eine Variante inklusive dem zugehörigen Sketch hinzugefügt.
Thomas
Hier der Fix in der Talkind_Display.h, damit im 12h-Format-Ausgabe “12 Uhr…” statt “0 Uhr…” angesagt wird – ich hab einfach auf 0 abgefragt und platt auf 12 gesetzt:
//say a time using 24 hours and switching seconds off can be done by parameter void sayTime(struct tm * s_time, boolean h24 = true, boolean seconds = false) { uint16_t ampm = WORD_AM; uint8_t hour = s_time→tm_hour; if ((hour > 11) && (!h24)) { ampm = WORD_PM; hour = hour – 12;//say 12 instead 0, if 12 hours is used and time between 12 and 1
if (hour == 0) {
hour = 12;
}
Horst Zeh
@Reiner
Text in spitzen Klammern wird in Kommentaren offenbar unterdrückt. In der Zeile:
Talking_Display td(ss,DFPLAYER_Busy);
fehlt deshalb nach “Talking_Display” der Text “SoftwareSerial” in spitzen Klammern. So wie es im Originalsketch steht.
Horst Zeh
@Reiner
Es sieht so aus, als ob in Kommentaren Text in spitzen Klammern unterdrückt wird (also einfach fehlt).
Die Zeile:
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
erzeugt einen Compilierfehler
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
ist korrekt.
Diesen Kommentar hatte ich schon vor Tagen abgegeben. Ist kommentarlos ignoriert worden.
Horst
Geht Text in spitzen Klammern in Kommentaren verloren?
Horst
@Reiner
Ist mir ein Rätsel, wie es zu ddiesem Schreibfehler kam. Hier nochmal:
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
erzeugt einen Compilierfehler
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
ist korrekt.
Horst
@Reiner
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
erzeugt einen Compilierfehler
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
ist korrekt.
Diesen Kommentar hatte ich schon vor Tagen abgegeben. Ist kommentarlos ignoriert worden.
Gerald Lechner
Hallo hier noch einmal einHinweis zum Problem mit der Fehlermeldung “Illegal Argument”. Diese Fehlermeldung wird bei Kommunikationsproblemen über die serielle Schnittstelle zwischen Mikrocontroller und DFPlayer ausgelöst. Meist iist die Ursache eine Störung auf der Versorgungsspannung. Deshalb wurde auch bei der Schaltung der 1000µF Kondensator hinzugefügt.
Jochen Ferger
Hallo,
ich bekomme ebenso nur Illegal Argument aus der Bibliothek.
WLAN-Verbindung steht, Port 123 wurde auf der Firewall freigegeben.
Wolfgang
Hallo,
wie sieht der Sketch und die Pin Belegung für die Talking Clock aus für das Wemos D1 mini Board?
An welche Pins werden die Taster angeschlossen?
Claude
Hallo, bin Anfänger, hab alles soweit hinbekommen, aber ausser Geräusch ~~" shrep " " shrep " … ( 9xUhrzeit 17x Sensorwerte ) kommt kein Laut aus dem Lautsprecher !? Die einzelnen Mp3 files sind per io1 oder io2 ( Test ) abrufbar ?! bin echt am Verzweifeln und wäre für jede Hilfe dankbar :-)
mit besten Grüssen und vielen Dank !
Wolfgang
Hallo Reiner,
wie hat die Hardware und der Sketch für das D1 mini Board auszusehen, wo werden die Taster angeschlossen?
Oder beim NodeMCU Lua Lolin V3,
Tom
Nach etwas tüfteln hat’s bei mir gestern Abend auch geklappt – und v.a. erst mit der Ergänzung von Reiner – ein großes Danke dafür!
Ich möchte damit eine kleine Box für meine Tochter bauen, auf der ich oben eine echte Uhr mit Zeigern montiere, damit sie die Uhrzeit spielerisch lesen, hören und lernen kann.
Heute Mittag wollte ich es ihr präsentieren und dabei ist mir aber eine Unschönheit aufgefallen. Ich hab zwei aufeinanderfolgende Ausgaben programmiert – eine für im 12h-Format und eine im 24h-Format. Bei der 12h-Format-Ausgabe kommt aber zwischen 12…13 Uhr eine Ausgabe von “0 Uhr Nachmittag”. Die 24h-Ausgabe ist korrekt. Kein Mensch sagt aber mittags “0 Uhr…”. :-(
Bekommt man das vielleicht gefixt, damit dann eine Ausgabe <12 Uhr Nachmittag" zu hören wäre?
Ansonsten nette Idee und ohne großem Aufwand schnell umzusetzen!
Horst
Hallo Reiner
Kleine Ursache – große Wirkung
.
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
.
müsste
.
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
.
lauten
Reiner
Nachdem Gerald die Library jetzt auf 1.3 upgedated hat, funktioniert das Teil perfekt.
Für die Sprachausgabe fragt er die Busy Leitung vom DFPlayer ab. Die muss dann auch verbunden sein.
Der Sketch Talking clock muss dann wie folgt ergänzt werden:
Achtung … habe das Ganze für ein Wemos D1 mini Board angepasst …d.h. evtl. sind Eure Pins anders …
#define DFPLAYER_RX D3 //RX Anschluss für die Kommunikation mit dem DFPlayer
#define DFPLAYER_TX D4 //TX Anschluss für die Kommunikation mit dem DFPlayer
#define DFPLAYER_Busy D5 //Busy Anschluss vom DFPlayer
.
.
//Instanz für die Sprachausgabe
Talking_Display td(ss,DFPLAYER_Busy);
.
.
void setup () {
.
.
pinMode(DFPLAYER_Busy,INPUT);
Reiner
Hallo Wolfgang,
hier musst Du Deine SSID und Dein Passwort für das WLAN eintragen …
//SSID und PSK vom lokalen WLAN
#define STASSID “****************”
#define STAPSK “****************”
Sternchen raus und SSID und Passwort rein ;-)
Markus
Schade: Was ich auch tue, ich erhalte immer nur “Illegal argument” aus der Library. Was läuft falsch? Hilfe wäre schön.
Horst
Wolfgang
Hallo Rainer,
wo im Programmcode wird die die SSID und das Passwort eintragen, bin Anfänger.
Dieter
Hallo Gerald, danke – jetzt funtioniert alles. :-)
Reiner
via WLAN, einfach die SSID und das Passwort im Programmcode eintragen, dann verbindet sich der ESP mit dem Internet und holt die Zeit und das Datum
Wolfgang
Wie wird eine Internet Verbindung mit dem ESP8266 hergestellt ,um die Uhrzeit zu bekommen?
Reiner
Hi Dieter,
mach einen Update der Library. Gerald hat das schon gefixed …
Reiner
Hallo Gerald,
erst mal Gratulation für die tolle Idee :-). Ich hätte da nur ein kleines Problem …
Der deutsche Teil funktioniert nicht … bei der Uhrzeit kommt nur …Sekunden .. sonst nichts.
Wenn ich die deutsche mp3 Dateien ins englische Direktory kopiere funktioniert es, abgesehen von der Reihenfolge mit Tag, Monat und Jahr. Passt aber von den Files.
Scheinbar stimmt etwas mit der Zerlegung nach EN/DE nicht … muss ich aber erst noch suchen …
beste Grüße
Reiner
Dieter
Hallo, habe die Schaltung nachgebaut aber leider ein Problem. Initialisierung läuft, auch die IP Adresse erscheint. Nach drücken des Tasters ertönt aber nur das Wort “Sekunden”.
Wo könnte der Fehler liegen??
Vielen Dank