Inhaltsverzeichnis:

Verwenden der Echtzeituhrmodule DS1307 und DS3231 mit Arduino - Gunook
Verwenden der Echtzeituhrmodule DS1307 und DS3231 mit Arduino - Gunook

Video: Verwenden der Echtzeituhrmodule DS1307 und DS3231 mit Arduino - Gunook

Video: Verwenden der Echtzeituhrmodule DS1307 und DS3231 mit Arduino - Gunook
Video: Arduino Projekt: Echtzeituhr DS1307 am Arduino 2024, November
Anonim
Verwenden der Echtzeituhrmodule DS1307 und DS3231 mit Arduino
Verwenden der Echtzeituhrmodule DS1307 und DS3231 mit Arduino
Verwenden der Echtzeituhrmodule DS1307 und DS3231 mit Arduino
Verwenden der Echtzeituhrmodule DS1307 und DS3231 mit Arduino

Wir erhalten immer wieder Anfragen zur Verwendung von DS1307- und DS3231-Echtzeituhrmodulen mit Arduino aus verschiedenen Quellen – dies ist also der erste von einem zweiteiligen Tutorial, wie man sie verwendet. Für dieses Arduino-Tutorial haben wir zwei Echtzeituhrmodule zu verwenden, eines basierend auf dem Maxim DS1307 (das quadratische Modul) und das DS3231 (das rechteckige Modul).

Es gibt zwei Hauptunterschiede zwischen den ICs auf den Echtzeituhrmodulen, nämlich die Genauigkeit der Zeitmessung. Der im ersten Modul verwendete DS1307 funktioniert sehr gut, jedoch kann die externe Temperatur die Frequenz des Oszillatorkreises beeinflussen, der den internen Zähler des DS1307 antreibt.

Dies mag nach einem Problem klingen, führt jedoch normalerweise dazu, dass die Uhr etwa fünf Minuten pro Monat ausgeschaltet ist. Der DS3231 ist viel genauer, da er über einen internen Oszillator verfügt, der von äußeren Einflüssen nicht beeinflusst wird – und somit höchstens auf wenige Minuten pro Jahr genau ist. Wenn Sie ein DS1307-Modul haben, fühlen Sie sich nicht schlecht, es ist immer noch ein gutes Preis-Leistungs-Verhältnis und wird Ihnen gute Dienste leisten. Bei beiden Modulen ist eine Pufferbatterie erforderlich.

Es empfiehlt sich, eine neue CR2032-Batterie zu kaufen und in das Modul einzubauen. Neben der Anzeige von Uhrzeit und Datum verfügen diese Module über ein kleines EEPROM, eine Alarmfunktion (nur DS3231) und die Möglichkeit, eine Rechteckwelle mit verschiedenen Frequenzen zu erzeugen – all dies wird in einem zweiten Tutorial behandelt.

Schritt 1: Verbinden Sie Ihr Modul mit einem Arduino

Beide Module verwenden den I2C-Bus, was den Anschluss sehr einfach macht.

Zuerst müssen Sie identifizieren, welche Pins auf Ihrem Arduino oder kompatiblen Boards für den I2C-Bus verwendet werden – diese werden als SDA (oder Daten) und SCL (oder Takt) bezeichnet. Auf Arduino Uno oder kompatiblen Boards sind diese Pins A4 und A5 für Daten und Takt; Beim Arduino Mega sind die Pins D20 und D21 für Daten und Takt; Und wenn Sie ein Pro Mini-kompatibles Gerät verwenden, sind die Pins A4 und A5 für Daten und Takt, die parallel zu den Hauptpins liegen.

DS1307-Modul

Wenn Sie das DS1307-Modul haben, müssen Sie die Drähte an die Platine löten oder einige Inline-Header-Pins anlöten, damit Sie Überbrückungsdrähte verwenden können. Verbinden Sie dann die SCL- und SDA-Pins mit Ihrem Arduino und den Vcc-Pin mit dem 5V-Pin und GND mit GND.

DS3231-Modul

Der Anschluss dieses Moduls ist einfach, da die Stiftleisten werkseitig auf der Platine installiert sind. Sie können einfach die Jumperdrähte erneut von SCL und SDA zum Arduino und erneut von den Vcc- und GND-Pins des Moduls zu den 5V oder 3.3. V und GND Ihres Boards führen. Diese werden jedoch auf der anderen Seite dupliziert, um Ihre eigenen Drähte zu löten. Beide Module verfügen über die erforderlichen Pull-Up-Widerstände, sodass Sie keine eigenen hinzufügen müssen. Versuchen Sie wie bei allen Geräten, die an den I2C-Bus angeschlossen sind, die Länge der SDA- und SCL-Kabel auf ein Minimum zu beschränken.

Schritt 2: Lesen und Schreiben der Uhrzeit von Ihrem RTC-Modul

Sobald Sie Ihr RTC-Modul verkabelt haben. Geben Sie die folgende Skizze ein und laden Sie sie hoch. Obwohl sich die Hinweise und Funktionen in der Skizze nur auf den DS3231 beziehen, funktioniert der Code auch mit dem DS1307.

#include "Wire.h"#define DS3231_I2C_ADDRESS 0x68 // Konvertiere normale Dezimalzahlen in binär codiertes Dezimalbyte decToBcd(byte val) { return((val/10*16) + (val%10)); } // Konvertieren von binär codierten Dezimalzahlen in normale Dezimalzahlen byte bcdToDec(byte val) { return((val/16*10) + (val%16)); aufrechtzuerhalten. Void setup () { Wire.begin (); Serial.begin (9600); // hier die Anfangszeit einstellen: // DS3231 Sekunden, Minuten, Stunden, Tag, Datum, Monat, Jahr // setDS3231time(30, 42, 21, 4, 26, 11, 14); aufrechtzuerhalten. Void setDS3231time (Byte Sekunde, Byte Minute, Byte Stunde, Byte DayOfWeek, Byte DayOfMonth, Byte Monat, Byte Jahr) {// setzt Zeit- und Datumsdaten auf DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write(0); // Setzen Sie den nächsten Eingang so, dass er beim Sekundenregister beginnt Wire.write (decToBcd (second)); // Sekunden setzen Wire.write (decToBcd (Minute)); // Minuten einstellen Wire.write (decToBcd (hour)); // Stunden setzen Wire.write (decToBcd (dayOfWeek)); // Wochentag einstellen (1=Sonntag, 7=Samstag) Wire.write(decToBcd(dayOfMonth)); // Datum einstellen (1 bis 31) Wire.write (decToBcd (Monat)); // Monat setzen Wire.write (decToBcd (Jahr)); // Jahr einstellen (0 bis 99) Wire.endTransmission(); aufrechtzuerhalten. Void readDS3231time (Byte *Sekunde, Byte *Minute, Byte *Stunde, Byte *DayOfWeek, Byte *DayOfMonth, Byte *Monat, Byte *Jahr) { Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write(0); // DS3231-Registerzeiger auf 00h setzen Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // sieben Byte Daten von DS3231 ab Register 00h anfordern *second = bcdToDec(Wire.read() & 0x7f); *Minute = bcdToDec(Wire.read()); *Stunde = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *Monat = bcdToDec(Wire.read()); *Jahr = bcdToDec(Wire.read()); aufrechtzuerhalten. Void displayTime () { Byte Sekunde, Minute, Stunde, DayOfWeek, DayOfMonth, Monat, Jahr; // Daten von DS3231 abrufen readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // an den seriellen Monitor senden Serial.print (Stunde, DEC); // Konvertieren Sie die Byte-Variable in eine Dezimalzahl, wenn sie angezeigt wird Serial.print (":"); wenn (Minute <10) {Serial.print ("0"); } Serial.print (Minute, DEZ); Serial.print (":"); wenn (zweite <10) {Serial.print ("0"); } Serial.print (zweite, DEZ); Serial.print (" "); Serial.print (dayOfMonth, DEC); Serial.print("/"); Serial.print (Monat, DEZ); Serial.print("/"); Serial.print (Jahr, DEZ); Serial.print("Wochentag:"); switch (dayOfWeek) {Fall 1: Serial.println ("Sonntag"); brechen; Fall 2: Serial.println ("Montag"); brechen; Fall 3: Serial.println ("Dienstag"); brechen; Fall 4: Serial.println ("Mittwoch"); brechen; Fall 5: Serial.println ("Donnerstag"); brechen; Fall 6: Serial.println ("Freitag"); brechen; Fall 7: Serial.println ("Samstag"); brechen; }} Void Schleife () { DisplayTime (); // Anzeige der Echtzeituhrdaten auf dem seriellen Monitor, Verzögerung (1000); // jede Sekunde }

Es mag viel Code geben, aber er lässt sich gut in überschaubare Teile zerlegen.

Es enthält zunächst die Wire-Bibliothek, die für die I2C-Buskommunikation verwendet wird, gefolgt von der Definition der Busadresse für die RTC als 0x68. Es folgen zwei Funktionen, die Dezimalzahlen in BCD (binär codierte Dezimalzahlen) umwandeln und umgekehrt. Diese sind notwendig, da die RTC-ICs in BCD und nicht dezimal arbeiten.

Die Funktion setDS3231time() dient zum Stellen der Uhr. Die Verwendung ist sehr einfach. Geben Sie einfach die Werte von Jahr zu Sekunde ein, und die RTC startet ab dieser Zeit. Wenn Sie beispielsweise das folgende Datum und die folgende Uhrzeit einstellen möchten – Mittwoch, 26. November 2014 und 21:42 Uhr und 30 Sekunden – würden Sie Folgendes verwenden:

setDS3231time (30, 42, 21, 4, 26, 11, 14);

Schritt 3:

Beachten Sie, dass die Uhrzeit im 24-Stunden-Format eingestellt wird und der vierte Parameter der „Wochentag“ist. Dieser fällt zwischen 1 und 7, also jeweils von Sonntag bis Samstag. Diese Parameter sind Bytewerte, wenn Sie Ihre eigenen Variablen ersetzen.

Sobald Sie die Funktion einmal ausgeführt haben, ist es ratsam, ihr // voranzustellen und Ihren Code erneut hochzuladen, damit die Zeit nicht zurückgesetzt wird, nachdem die Stromversorgung aus- oder der Mikrocontroller zurückgesetzt wurde. Das Auslesen der Uhrzeit von Ihrem RTC ist genauso einfach, tatsächlich kann der Vorgang in der Funktion displayTime() genau verfolgt werden. Sie müssen sieben Byte-Variablen definieren, um die Daten von der RTC zu speichern, und diese werden dann in die Funktion readDS3231time() eingefügt. Zum Beispiel, wenn Ihre Variablen sind:

Byte Sekunde, Minute, Stunde, DayOfWeek, DayOfMonth, Monat, Jahr;

… würden Sie sie mit den aktuellen Daten aus dem RTC aktualisieren, indem Sie Folgendes verwenden:

readDS3232time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

Dann können Sie die Variablen nach Belieben verwenden, vom Senden von Uhrzeit und Datum an den seriellen Monitor wie in der Beispielskizze bis hin zur Umwandlung der Daten in eine geeignete Form für alle möglichen Ausgabegeräte.

Um zu überprüfen, ob alles funktioniert, tragen Sie die entsprechende Uhrzeit und das Datum in die Demonstrationsskizze ein, laden Sie sie hoch, kommentieren Sie die Funktion setDS3231time() und laden Sie sie erneut hoch. Öffnen Sie dann den seriellen Monitor, und Sie sollten eine laufende Anzeige der aktuellen Uhrzeit und des Datums erhalten.

Ab diesem Zeitpunkt verfügen Sie nun über die Softwaretools, um Daten auf Ihr Echtzeituhrmodul einzustellen und von diesem abzurufen, und wir hoffen, dass Sie mit der Verwendung dieser kostengünstigen Module vertraut sind.

Auf der Website des Herstellers erfahren Sie mehr über die jeweiligen Echtzeituhr-ICs – DS1307 und DS3231.

Dieser Beitrag wird Ihnen von pmdway.com bereitgestellt - alles für Macher und Elektronik-Enthusiasten, mit kostenloser Lieferung weltweit.

Empfohlen: