Hi,
Ich habe zum lernen wie ich den RTC mit dem Arduino Mega ansteuer einen Code dazu im Internet gefunden. Zudem nutze ich noch ein 1602 Display. Mein Problem ist jetzt das wenn ich das Programm hochgeladen habe das die Uhr immer bei 0 anfängt und der Text RTC ERROR:SYNC ausgegeben wird. Was genau mache ich falsch?
Hier der Code
// A quick demo of how to use DS1302-library to make a quick
// clock using a DS1302 and a 16x2 LCD.
//
// I assume you know how to connect the DS1302 and LCD.
// DS1302: CE pin -> Arduino Digital 29
// I/O pin -> Arduino Digital 31
// SCLK pin -> Arduino Digital 33
// VCC pin -> Arduino Digital 37
// GND pin -> Arduino Digital 35
//
// LCD: DB7 -> Arduino Digital 7
// DB6 -> Arduino Digital 6
// DB5 -> Arduino Digital 5
// DB4 -> Arduino Digital 4
// E -> Arduino Digital 9
// RS -> Arduino Digital 8
#include <LiquidCrystal.h>
#include <DS1302RTC.h>
#include <Time.h>
// Init the DS1302
// Set pins: CE, IO,CLK
DS1302RTC RTC(31, 29, 33);
// Optional connection for RTC module
#define DS1302_GND_PIN 35
#define DS1302_VCC_PIN 37
// Init the LCD
// initialize the library with the numbers of the interface pins
// lcd(RS, E, d4, d5, d6, d7)
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
// Setup LCD to 16x2 characters
lcd.begin(16, 2);
// Activate RTC module
digitalWrite(DS1302_GND_PIN, LOW);
pinMode(DS1302_GND_PIN, OUTPUT);
digitalWrite(DS1302_VCC_PIN, HIGH);
pinMode(DS1302_VCC_PIN, OUTPUT);
lcd.print("RTC activated");
delay(500);
// Check clock oscillation
lcd.clear();
if (RTC.haltRTC())
lcd.print("Clock stopped!");
else
lcd.print("Clock working.");
// Check write-protection
lcd.setCursor(0,1);
if (RTC.writeEN())
lcd.print("Write allowed.");
else
lcd.print("Write protected.");
delay ( 2000 );
// Setup Time library
lcd.clear();
lcd.print("RTC Sync");
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus() == timeSet)
lcd.print(" Ok!");
else
lcd.print(" FAIL!");
delay ( 2000 );
lcd.clear();
}
void loop()
{
// Display time centered on the upper line
lcd.setCursor(3, 0);
print2digits(hour());
lcd.print(" ");
print2digits(minute());
lcd.print(" ");
print2digits(second());
// Display abbreviated Day-of-Week in the lower left corner
lcd.setCursor(0, 1);
lcd.print(dayShortStr(weekday()));
// Display date in the lower right corner
lcd.setCursor(5, 1);
lcd.print(" ");
print2digits(day());
lcd.print("/");
print2digits(month());
lcd.print("/");
lcd.print(year());
// Warning!
if(timeStatus() != timeSet) {
lcd.setCursor(0, 1);
lcd.print(F("RTC ERROR: SYNC!"));
}
delay ( 1000 ); // Wait approx 1 sec
}
void print2digits(int number) {
// Output leading zero
if (number >= 0 && number < 10) {
lcd.write('0');
}
lcd.print(number);
}
void setTime()
{
rtc.writeProtect(false);
rtc.halt(false);
Time t(2016, 2, 19, 15, 30, 50, Time::kFriday;
rtc.time(t);
}
Du schreibst nicht, ob die Meldung "Clock stopped!" oder ob "Clock working" ausgegeben wird
(eins von beiden sollte ca. 2 sec lang nach reset zu sehen sein)
Du setzt dich vor den Arduino und das LCD Display, drückst den Reset Knopf und passt auf, was du siehst:
Wenn für ca eine halbe Sekunde "LCD activated" auf dem Display erscheint, ist das richtig angeschlossen.
Wenn nicht, musst du dich erstmal darum kümmern oder deine Untersuchung der DS1302 anders machen.
(z.B. mit Serial Testausgaben.)
Wenn ja, kommt danach für 2 Sekunden was anderes.
Du solltest - auch als Anfänger - erkennen, woher diese Ausgaben in deinem Sketch kommen, und soviel Englich verstehen um raten zu können, was diese Texte bedeuten.
setTime aufrufen kannst du, indem du an passender Stelle in deinen Sketch setTime();einfügst.
eventuell hier:
...
if (RTC.haltRTC()) {
lcd.print("Uhr Starten");
setTime();
}
else
...
Okay, das habe ich soweit auch verstanden. Mein Problem lag darin den Code so zuerweitern das es funktioniert.
Zur Info wie das Programm aktuell abläuft:
RTC activated
Clock working
Write allowed
RTC Sync Fail
jetzt statret das Arduino von 0 an hoch zu zählen unter der Uhr steht dann RTC ERROR: SYNC!
Zudem bekomme ich folgenden Fehlercode:
Arduino: 1.6.7 (Windows 10), Board: "Arduino Nano, ATmega328"
C:\Users\Tim\AppData\Local\Temp\arduino_0373aec93c954ffd0300e1f1e28f3454\sketch_feb20a.ino: In function 'void setTime()':
sketch_feb20a:126: error: 'rtc' was not declared in this scope
rtc.writeProtect(false);
^
sketch_feb20a:128: error: 'Time' was not declared in this scope
Time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);
^
sketch_feb20a:128: error: 'Time' is not a class, namespace, or enumeration
Time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);
^
sketch_feb20a:129: error: 't' was not declared in this scope
rtc.time(t);
^
exit status 1
'rtc' was not declared in this scope
Dieser Report hätte mehr Informationen mit
"Ausführliche Ausgabe während der Kompilierung"
aktiviert in Datei > Einstellungen.
Arduino: 1.6.7 (Windows 10), Board: "Arduino Nano, ATmega328"
C:\Users\Tim\AppData\Local\Temp\arduino_55e9be357d7b59010bcfecffaaabf58e\sketch_feb20a.ino: In function 'void setTime()':
sketch_feb20a:126: error: 'class DS1302RTC' has no member named 'writeProtect'
RTC.writeProtect(false);
^
sketch_feb20a:127: error: 'class DS1302RTC' has no member named 'halt'
RTC.halt(false);
^
sketch_feb20a:128: error: 'time' was not declared in this scope
time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);
^
sketch_feb20a:128: error: 'Time' has not been declared
time.t(2016, 2, 19, 15, 30, 50, Time::kFriday);
^
sketch_feb20a:129: error: 'class DS1302RTC' has no member named 'time'
RTC.time(t);
^
sketch_feb20a:129: error: 't' was not declared in this scope
RTC.time(t);
^
exit status 1
'class DS1302RTC' has no member named 'writeProtect'
Dieser Report hätte mehr Informationen mit
"Ausführliche Ausgabe während der Kompilierung"
aktiviert in Datei > Einstellungen.
Wenn ich das richtig verstehe soll das DS1302 bei einem Stromausfall die Uhrzeit speichern. Bei mir ist das leider nicht der fall. Aktuell könnte ich mir auch das teil sparen, da es auch ohne bei 0 schafft zu zählen.
Nur mal so als Gedankenspiel, hast du dir mal überlegt, eine andere Library zu verwenden? Z.B. funktioniert die RTC1302 auch mit der DS3231 Library zusammen.
Die ist nicht so merkwürdig kompliziert.
Daann kommt noch das Problem mit der Genauigkeit der 1302.
Wie gesagt ich bin ein Anfänger im bereich Arduino und weiß nicht was es alles für möglichkeiten gibt die Uhrzeit über ein DS1302 zu steuern. Ich bin über jede Hilfestellung sehr dankbar. Wenn ihr jetzt sagt das was ich habe ist von grund an nix, bin ich für verbesserungen immer offen.
Ich will ja nicht alles schlecht reden, aber was die Genauigkeit der RTC betrifft, ist die DS3231 deutlich besser.
Und die dazu gehörige Library ist besser dokumentiert mit Beispielen.
Aber was ich im letzten Post geschrieben habe, war leider verkehrt. Die Library für die DS3231 kannst du nicht mit der DS1302 einsetzen. Also bitte nicht testen.
Allerdings hatte hier kürzlich schon einer Probleme mit der DS1302 und ist glaube ich auch auf die DS3231 umgestiegen.
DS1307 war mal der Standard, hängt aber - wie die DS1302 - von einem externen Quarz ab.
Und da findet man viel Müll, der nicht einmal den Standard 20 ppm (2 sec am Tag) einhält.
Mein Vorschlag:
Entweder du setzt deinen sportlichen Ehrgeiz darin, deine vorhandene DS1302 in den Griff zu kriegen,
oder du besorgst dir zum gleichen Preis wie eine DS1307 die bessere DS3231 [ Link enfernt ]
Ds 1307 ist zu ungenau,geht mehrere Sekunden falsch pro Tag. nimm wie schon erwähnt die 3231 und brauchst keine Uhr mehr vor oder zurückstellen.
Wirklich sehr geanau
michael_x:
Mein Vorschlag:
Entweder du setzt deinen sportlichen Ehrgeiz darin, deine vorhandene DS1302 in den Griff zu kriegen,
oder du besorgst dir zum gleichen Preis wie eine DS1307 die bessere DS3231
Egal welche von den DS3231 du auswählst, Preis und Lieferzeit solltest du beachten.
Aber dank der Temperaturkompensation ist diese RTC sehr genau, was die 1302 oder 1307 nicht bieten können.
In der Wartezeit kannst Du schon mal etwas über I2C lesen. Mir hat das Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino beim Verständnis geholfen und bislang habe ich auch den Code ohne Bibliothek verwendet. Für mich war das der leichter zu durchschauenede Weg.
Damit spreche ich meine DS3231 auch an. Im Gegensatz zu mit irgendwelchen Libs funktionierte es genau so, wie ich wollte. Gleichzeitig habe ich eine Menge über das Ansprechen von I2C gelernt.