Die sprechende Uhr

La publicación de hoy trata sobre un método diferente para mostrar el tiempo y los valores medidos, es decir, con salida de voz. Una opción simple para la salida de voz es grabar archivos MP3 para palabras individuales. La salida se puede ensamblar a partir de estas palabras. Se puede usar un mini reproductor de MP3 para la reproducción, que luego reproduce los archivos MP3 desde una tarjeta micro SD.

Hardware requerido

Número

Componente

Anotación

1

NodeMCU Lua Lolin V3


1

Mini reproductor MP3


1

GY-BME280


1

Mini altavoz de 8 ohmios


1

Elko 1000 a 2200 µF / 10V


2

Botón micro



Circuito

Para el DFPlayer, necesitamos una conexión a una interfaz en serie además de la fuente de alimentación. Elegiremos una solución de software como interfaz serial para que podamos elegir libremente los pines utilizados. Para la línea de transmisión del microcontrolador al DFPlayer usamos GPIO14, etiquetado como D5. Para la dirección opuesta usamos GPIO12, etiquetado D6. Conectamos el mini altavoz directamente a las salidas de altavoz del reproductor DF. La línea más se muestra en naranja, la línea menos en azul claro. Dado que se producen picos de corriente cortos al comienzo de la reproducción, se debe conectar un condensador electrolítico en paralelo a la tensión de alimentación para evitar interferencias.
El sensor BME280 funciona con el I2CBus. Los pines predeterminados para esto son GPIO5 / D1 para el reloj (SCL) y GPIO4 / D2 para los datos (SDA).
Conectamos el botón para dar salida a la hora a GPIO0 / D3 y tierra. El botón para dar salida a los valores medidos del sensor con GPIO2 / D4.
Si solo desea el reloj, puede omitir el sensor y el segundo botón. También se puede utilizar otro sensor. En ambos casos, el programa debe cambiarse en consecuencia.


Con eso el cableado está hecho y podemos ocuparnos del programa.

Programa

Como queremos obtener la fecha y la hora de un servidor de hora NTP en Internet, necesitamos una conexión a Internet. Esto se puede hacer muy fácilmente con el ESP8266.
Para el BME280 usamos la biblioteca "BlueDot_BME280.h", que podemos instalar a través de la administración de la biblioteca Arduino.
Para la salida de voz usamos la biblioteca Talking_Display.h, que desarrollé especialmente para la salida de voz con DFPlayer. Esta biblioteca también debería poder instalarse a través de la administración de la biblioteca Arduino. Esta biblioteca tiene varias funciones para una salida de voz simple:

void say (uint16_t word_index)
Se emite la palabra con el índice correspondiente.

void sayInt (int32_t número)
El número se emite con un signo. Son posibles números en el rango de −2147483647 a 2147483647.

void sayFloat (número flotante, uint8_t decimales)
El número se emite con un signo y decimales. Solo se pueden seleccionar uno o dos decimales. Los valores para los lugares decimales menores que dos dan como resultado 1, los valores mayores o iguales que dos dan como resultado dos. El rango de valores es de −2147483647,99 a 2147483647,99.

void sayTime (struct tm * estructura de tiempo, bool Format24, bool segundos)
Se emite el tiempo representado por la estructura estructura de tiempo. Si el argumento Format24 es verdadero, se usa el formato de 24 horas; de lo contrario, el formato de 12 horas con mañana y tarde. Si el argumento segundos es verdadero, se emiten los segundos; de lo contrario, se omite.

void sayDate (struct tm * estructura de tiempo, bool día de la semana, bool año)
Se emite la fecha representada por la estructura temporal. Si el argumento del día de la semana es verdadero, primero se emite el día de la semana, de lo contrario no. Si el argumento año es verdadero, se imprime el año; de lo contrario, se omite.


#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();
}


Boceto para descargar

Blog como PDF (solo en aleman)

Aquí hay un enlace a uno Archivo MP3para que puedas escuchar el resultado

Diviértete con el reloj parlante.

 

 

 



Esp-32Proyectos para principiantesSensores

33 comentarios

Gerald Lechner

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

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

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

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

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

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

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

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

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

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

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

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

Horst

Geht Text in spitzen Klammern in Kommentaren verloren?

Horst

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

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

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

Jochen Ferger

Hallo,
ich bekomme ebenso nur Illegal Argument aus der Bibliothek.
WLAN-Verbindung steht, Port 123 wurde auf der Firewall freigegeben.

Wolfgang

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

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

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

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

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

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

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

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

Horst

td.sayFloat(21.999,1); gibt “einundzwanzig Komma zehn” aus.
Wolfgang

Wolfgang

Hallo Rainer,
wo im Programmcode wird die die SSID und das Passwort eintragen, bin Anfänger.

Dieter

Dieter

Hallo Gerald, danke – jetzt funtioniert alles. :-)

Reiner

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

Wolfgang

Wie wird eine Internet Verbindung mit dem ESP8266 hergestellt ,um die Uhrzeit zu bekommen?

Reiner

Reiner

Hi Dieter,
mach einen Update der Library. Gerald hat das schon gefixed …

Reiner

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

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

Deja un comentario

Todos los comentarios son moderados antes de ser publicados

Artículos de blog

  1. Ahora instalamos el esp32 a través de la administración.
  2. Lüftersteuerung Raspberry Pi
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1
  4. ESP32 - das Multitalent
  5. Transporte Aéreo - programación de ESP mediante redes locales inalámbricas