Hallo zusammen. Ich habe da ein Problem. Ich habe ein Projekt nachgebaut und wollte es auf einem Arduino übertragen. http://www.kh-gps.de/ardu_clock.htm
Und zwar die Version mit RTC.
// Decodierung und Sprechen der Datums- und Zeitinformationen von DS1307
// DFPlayer an #4,#5; Busy-Signal an Port #2
#include <string.h>
#include <ctype.h>
#include <DFPlayer_Mini_Mp3.h>
#include <avr/pgmspace.h>
#include <SoftwareSerial.h>;
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
SoftwareSerial mySerial(4, 5); // RX, TX MP3-Player Module
int zeit, time_h, time_m, time_s, date_d, date_m, date_y;
int wochentag;
int ledPin = 13; // LED test pin
String DOW;
boolean stringComplete = false;
int buusyPin = 2;// buusyPin = 2; // sound player busy
int bsy = 0;
int z = 0;
/////////////////////////////////////////////////////////
void setup()
{
Wire.begin(); // Initialisiere I2C
RTC.begin(); // Initialisiere RTC
Serial.begin(9600); // Kommunikation
Serial.println("WAITING FOR CLOCK DATA!");
delay(100);
pinMode(14, INPUT_PULLUP); // A0 as input
pinMode(15, INPUT_PULLUP); // A1 as input
pinMode(16, INPUT_PULLUP); // A2 as input
pinMode(17, INPUT_PULLUP); // A3 as input
mySerial.begin (9600); // data rate sound module
mp3_set_serial (&mySerial); // softwareSerial for MP3-Player
delay(100);
mp3_play (91); // speak startmessage
delay(3000);
// mp3_play (94); // speak info
// delay(3000);
}
///////////////////////////////////////////////////////////
void loop()
{
int sensorVal1 = digitalRead(14);
int sensorVal2 = digitalRead(15);
int sensorVal3 = digitalRead(16);
int sensorVal4 = digitalRead(17);
DateTime now=RTC.now(); // aktuelle Zeit abrufen
show_time_and_date(now); // Datum und Uhrzeit ausgeben
speak_time_and_date();
// delay(10000); // 10 Sekunden warten bis zur nächsten Ausgabe
}
////////////////////////////////////////////////////////////////
// Datum und Uhrzeit ausgeben
void show_time_and_date(DateTime datetime)
{
// Wochentag
// Serial.print(get_day_of_week(datetime.dayOfWeek()));
// Serial.print(", ");
wochentag=(datetime.dayOfWeek()); // Wochentag
date_d=(datetime.day()); // Tag
date_m=(datetime.month()); // Monat
date_y=(datetime.year()); // Jahr
time_h=(datetime.hour()); // Stunde
time_m=(datetime.minute()); // Minute
time_s=(datetime.second()); // Sekunde
day_of_week(); // Wochentag
Serial.print(DOW);
Serial.print(", ");
if(datetime.day()<10)Serial.print(0);
Serial.print(date_d);
Serial.print(".");
if(datetime.month()<10)Serial.print(0);
Serial.print(date_m);
Serial.print(".");
Serial.println(date_y);
if(datetime.hour()<10)Serial.print(0);
Serial.print(time_h);
Serial.print(":");
if(datetime.minute()<10)Serial.print(0);
Serial.print(time_m);
Serial.print(":");
if(datetime.second()<10)Serial.print(0);
Serial.println(time_s);
}
/////////////////////////////////////////////////////////////
void speak_time_and_date()
{
// speak day
mp3_play(98); // "Heute ist"
waitend();
speak_dow(); // <Wochentag>
mp3_play(99); // "der"
waitend();
speak_day(); // <Tag>
speak_month(); // <Monat>
mp3_play(120); // "Zwanzig"
waitend();
speak_year(); // <Jahr>
// speak time
mp3_play(95); // "Die Uhrzeit ist"
waitend();
zeit = time_h;
speak_time(); // <Stunde>
mp3_play(90); // "Uhr"
waitend();
zeit = time_m;
speak_time(); // <Minute>
mp3_play(97); // "und"
waitend();
zeit = time_s;
speak_time(); // <Sekunden>
mp3_play(96); // "Sekunden"
waitend();
delay(10000);
}
/////////////////////////////////////////////////////////////
void day_of_week()
{
if(wochentag==0) { DOW = "So"; } else
if(wochentag==1) { DOW = "Mo"; } else
if(wochentag==2) { DOW = "Di"; } else
if(wochentag==3) { DOW = "Mi"; } else
if(wochentag==4) { DOW = "Do"; } else
if(wochentag==5) { DOW = "Fr"; } else
if(wochentag==6) { DOW = "Sa"; }
}
/////////////////////////////////////////////////////////////////////
void speak_time()
{
mp3_play(zeit+100);
waitend();
}
///////////////////////////////////////////////////////////////////////////////
void speak_day()
{
mp3_play(date_d+200);
waitend();
}
///////////////////////////////////////////////////////////////////////////////
void speak_month()
{
mp3_play(date_m+240);
waitend(); // 1-12
}
///////////////////////////////////////////////////////////////////////////////
void speak_year()
{
mp3_play(date_y-1900);
waitend(); // <59
}
/////////////////////////////////////////////////////////////////
void speak_dow()
{
mp3_play(wochentag+80);
waitend();
}
//////////////////////////////////////////////////////////////////////////////
void waitend()
{
int bsyflag = 0;
for ( z = 0; z <= 10000; z++) {
bsy = digitalRead(buusyPin);
delay(50);
if (bsyflag == 1 && bsy == 1) {
break;
}
if (bsy == 0) {
bsyflag = 1;
}
}
}
Die Fehlermeldung lautet bei mir.
exit status 1
no matching function for call to 'mp3_set_serial(SoftwareSerial*)'
Kann mir da bitte jemand weiterhelfen.
Die Mail Adresse des Verfassers scheint es nicht mehr zu geben.
Gut, da Du den nicht zeigen willst, dann ist das der aus dem .zip:
// Decodierung und Sprechen der Datums- und Zeitinformationen von DS1307
// DFPlayer an #4,#5; Busy-Signal an Port #2
#include <string.h>
#include <ctype.h>
#include <DFPlayer_Mini_Mp3.h>
#include <avr/pgmspace.h>
#include <SoftwareSerial.h>;
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
SoftwareSerial mySerial(4, 5); // RX, TX MP3-Player Module
int zeit, time_h, time_m, time_s, date_d, date_m, date_y;
int wochentag;
int ledPin = 13; // LED test pin
String DOW;
boolean stringComplete = false;
int buusyPin = 2;// buusyPin = 2; // sound player busy
int bsy = 0;
int z = 0;
/////////////////////////////////////////////////////////
void setup()
{
Wire.begin(); // Initialisiere I2C
RTC.begin(); // Initialisiere RTC
Serial.begin(9600); // Kommunikation
Serial.println("WAITING FOR CLOCK DATA!");
delay(100);
pinMode(14, INPUT_PULLUP); // A0 as input
pinMode(15, INPUT_PULLUP); // A1 as input
pinMode(16, INPUT_PULLUP); // A2 as input
pinMode(17, INPUT_PULLUP); // A3 as input
mySerial.begin (9600); // data rate sound module
mp3_set_serial (&mySerial); // softwareSerial for MP3-Player
delay(100);
mp3_play (91); // speak startmessage
delay(3000);
// mp3_play (94); // speak info
// delay(3000);
}
///////////////////////////////////////////////////////////
void loop()
{
int sensorVal1 = digitalRead(14);
int sensorVal2 = digitalRead(15);
int sensorVal3 = digitalRead(16);
int sensorVal4 = digitalRead(17);
DateTime now=RTC.now(); // aktuelle Zeit abrufen
show_time_and_date(now); // Datum und Uhrzeit ausgeben
speak_time_and_date();
// delay(10000); // 10 Sekunden warten bis zur nächsten Ausgabe
}
////////////////////////////////////////////////////////////////
// Datum und Uhrzeit ausgeben
void show_time_and_date(DateTime datetime)
{
// Wochentag
// Serial.print(get_day_of_week(datetime.dayOfWeek()));
// Serial.print(", ");
wochentag=(datetime.dayOfWeek()); // Wochentag
date_d=(datetime.day()); // Tag
date_m=(datetime.month()); // Monat
date_y=(datetime.year()); // Jahr
time_h=(datetime.hour()); // Stunde
time_m=(datetime.minute()); // Minute
time_s=(datetime.second()); // Sekunde
day_of_week(); // Wochentag
Serial.print(DOW);
Serial.print(", ");
if(datetime.day()<10)Serial.print(0);
Serial.print(date_d);
Serial.print(".");
if(datetime.month()<10)Serial.print(0);
Serial.print(date_m);
Serial.print(".");
Serial.println(date_y);
if(datetime.hour()<10)Serial.print(0);
Serial.print(time_h);
Serial.print(":");
if(datetime.minute()<10)Serial.print(0);
Serial.print(time_m);
Serial.print(":");
if(datetime.second()<10)Serial.print(0);
Serial.println(time_s);
}
/////////////////////////////////////////////////////////////
void speak_time_and_date()
{
// speak day
mp3_play(98); // "Heute ist"
waitend();
speak_dow(); // <Wochentag>
mp3_play(99); // "der"
waitend();
speak_day(); // <Tag>
speak_month(); // <Monat>
mp3_play(120); // "Zwanzig"
waitend();
speak_year(); // <Jahr>
// speak time
mp3_play(95); // "Die Uhrzeit ist"
waitend();
zeit = time_h;
speak_time(); // <Stunde>
mp3_play(90); // "Uhr"
waitend();
zeit = time_m;
speak_time(); // <Minute>
mp3_play(97); // "und"
waitend();
zeit = time_s;
speak_time(); // <Sekunden>
mp3_play(96); // "Sekunden"
waitend();
delay(10000);
}
/////////////////////////////////////////////////////////////
void day_of_week()
{
if(wochentag==0) { DOW = "So"; } else
if(wochentag==1) { DOW = "Mo"; } else
if(wochentag==2) { DOW = "Di"; } else
if(wochentag==3) { DOW = "Mi"; } else
if(wochentag==4) { DOW = "Do"; } else
if(wochentag==5) { DOW = "Fr"; } else
if(wochentag==6) { DOW = "Sa"; }
}
/////////////////////////////////////////////////////////////////////
void speak_time()
{
mp3_play(zeit+100);
waitend();
}
///////////////////////////////////////////////////////////////////////////////
void speak_day()
{
mp3_play(date_d+200);
waitend();
}
///////////////////////////////////////////////////////////////////////////////
void speak_month()
{
mp3_play(date_m+240);
waitend(); // 1-12
}
///////////////////////////////////////////////////////////////////////////////
void speak_year()
{
mp3_play(date_y-1900);
waitend(); // <59
}
/////////////////////////////////////////////////////////////////
void speak_dow()
{
mp3_play(wochentag+80);
waitend();
}
//////////////////////////////////////////////////////////////////////////////
void waitend()
{
int bsyflag = 0;
for ( z = 0; z <= 10000; z++) {
bsy = digitalRead(buusyPin);
delay(50);
if (bsyflag == 1 && bsy == 1) {
break;
}
if (bsy == 0) {
bsyflag = 1;
}
}
}
Die RTC.lib ist die von Paul Stoffregen adafruit:
Die mini von DFROBOT:
Warnungen gibt es wegen einem Semikolon hinter dem SoftwareSerial include und der nicht verwendeten Variablen.
Einen Fehler gibt es bei der RTC/Wochentage:
wochentag=(datetime.dayOfWeek()); // Wochentag
Das hat sich geändert und heisst jetzt:
wochentag=(datetime.dayOfTheWeek()); // Wochentag
ansonsten gehht der Sketch ganz klar auf einem MEGA durch.
/tmp/arduino_modified_sketch_578789/DS1307_DFP_WAITEND_1.ino:8:29: warning: extra tokens at end of #include directive
#include <SoftwareSerial.h>;
^
/tmp/arduino_modified_sketch_578789/DS1307_DFP_WAITEND_1.ino: In function 'void loop()':
/tmp/arduino_modified_sketch_578789/DS1307_DFP_WAITEND_1.ino:53:7: warning: unused variable 'sensorVal1' [-Wunused-variable]
int sensorVal1 = digitalRead(14);
^~~~~~~~~~
/tmp/arduino_modified_sketch_578789/DS1307_DFP_WAITEND_1.ino:54:7: warning: unused variable 'sensorVal2' [-Wunused-variable]
int sensorVal2 = digitalRead(15);
^~~~~~~~~~
/tmp/arduino_modified_sketch_578789/DS1307_DFP_WAITEND_1.ino:55:7: warning: unused variable 'sensorVal3' [-Wunused-variable]
int sensorVal3 = digitalRead(16);
^~~~~~~~~~
/tmp/arduino_modified_sketch_578789/DS1307_DFP_WAITEND_1.ino:56:7: warning: unused variable 'sensorVal4' [-Wunused-variable]
int sensorVal4 = digitalRead(17);
^~~~~~~~~~
Compiling libraries...
[....]
Der Sketch verwendet 9564 Bytes (3%) des Programmspeicherplatzes. Das Maximum sind 253952 Bytes.
Globale Variablen verwenden 623 Bytes (7%) des dynamischen Speichers, 7569 Bytes für lokale Variablen verbleiben. Das Maximum sind 8192 Bytes.
Sprachausgabe funktioniert. Jedoch habe ich noch folgendes Problem.
Es erfolgt jede Minute die Sprache mit Datum und Uhrzeit, obwohl alle Schalter offen sind. Das sollte laut Beschreibung nicht sein, sondern nur die Zeitausgabe. Wie kann ich das beheben und wie kann ich statt 1 Minute Sprachausgabe auf 60 Minuten erhöhen. Finde das im Sketch nicht. Danke
Da ist auch nichts drin was durch die Schalter beeinflusst wird. Die Zustände werden eingelesen und das war es dann. Das ist immer das Problem wenn Projekte die ins Internet gestellt werden nicht fertig sind...
Bleiben also 2 Möglichkeiten:
Den Ersteller fragen ob es einen kompletten Code gibt
Den vorhandenen Code selbst (mit oder ohne Hilfe) erweitern
Wegen dem Problem der Ausgabe nur zu jeder Stunde:
Es gibt im Sketch die Variable time_m. Dann braucht man noch einen Merker das die Sprachausgabe erfolgt ist. Nur wenn die time_m == 0 und der Merker 0 ist, die Sprachausgabe starten und einen Merker setzen das es ausgegeben wurde. Dann z.B. wenn time_m == 1 ist den Merker wieder löschen. Damit erfolgt die Sprachausgabe dann nur 1 mal pro Stunde, aber nicht bei 0 Sekunden. Ich würde die Ansage der Sekunden einfach entfernen. Sonst wird es ein wenig komplizierter.