Hi!
Wisst ihr oder habt Ihr eine Idee, wie ich aus dem Aufruf der Zeit "rtc.get.Time()" die Stunden und Minuten in unterschiedliche Variablen packen kann?
Gruß
|
Anzeige
|
Extrahierung der Zeit - DS3231Hi! Wisst ihr oder habt Ihr eine Idee, wie ich aus dem Aufruf der Zeit "rtc.get.Time()" die Stunden und Minuten in unterschiedliche Variablen packen kann? Gruß Fragen, die mir die Ente innerhalb von Sekunden beantworten kann -- darauf brauche ich hier nicht zu antworten... Jop, weiß ich.
Moin, Guck Dir mal die key word Link hier an: https://github.com/adafruit/RTClib https://github.com/adafruit/RTClib/blob/master/keywords.txt Am besten Du studierst die Referenz der rtc Bibliothek. Mit dem damit vorhandenen Syntax kann man auf alle internen RTC Register zugreifen. Beispiel:
Sieh Dir die Beispiele dort an. Hier siehst Du wie man sie gebraucht. Es ist wichtig, daß wie im folgenden Beispiel die Lib richtig gebraucht wird. Studiere jede Programmzeile dort, die sich auf diese Lib bezieht. https://github.com/adafruit/RTClib/blob/master/examples/ds3231/ds3231.ino Gerhard Vielen Dank Gerhard! Scheint einfach. Hatte ich nicht gedacht. Probiere ich aus, sobald ich kann. Schönen Tag noch :) Verstehe ich das richtig, dass ein neues Objekt erzeugt wird "now" und dem dann die Methode rtc.now(); zugewiesen wird? Tut mir leid, aber bin da noch frisch, was Klassen und so angeht.
Nein, dem wird das /Ergebnis/ bzw. der Rückgabewert der Funktion zugewiesen. Stehen denn "DateTime now" und "now.hour();" in Verbindung. Verwirrt mich etwas, da in beiden "now" steht. rtc.now() liefert einen Rückgabewert des Typs DateTime, was dann an ein Objekt "now" des Typs DateTime zugewiesen wird. Objekte des Typs DateTime haben eine Funktion .hour() im Bauch, die dir dann nur die Stunde im Basisdatentyp int als Rückgabewert liefert. Oder eben so:
mfg mf Vielen Dank! Wieso muss ich die Zeit zwischenspeichern und kann die Stunden nicht direkt in eine Variable packen?
Musst Du nicht.
Kannst Du:
Wenn Du aber noch andere Zeitanteile bestimmen willst, ist diese Vorgehensweise nicht zu empfehlen, sie ist einerseits ineffizient (weil für jeden Aufruf ein Objekt vom Typ DateTime angelegt und wieder weggeworfen wird), und weil die verschiedenen Aufrufe nacheinander erfolgen, die Uhrzeit aber weiterläuft. Stell' Dir mal vor, daß es gerade 3:59:59 und 999 Millisekunden ist. Der erste Aufruf liefert "3" für die Stunden. Zwischenzeitlich verstreicht aber etwas Zeit, die RTC schaltet um auf 4:00:00, und der zweite Aufruf, der die Minuten holen soll, liefert "00". Das Ergebnis ist dann 3:00, obwohl es 4:00 ist. Dagegen hilft die Verwendung der "Hilfsvariablen", denn die darin gespeicherten Werte verändern sich nicht. Ansonsten könntest Du auch /nachsehen/, welche anderen Funktionen die Klasse zur Verfügung stellt, von deren Typ das Objekt rtc ist. Dazu könntest Du entweder die /Dokumentation/ zu Rate ziehen oder aber in der Headerdatei mit der Klassendekaration nachsehen.
Stunden und Minuten kannst du direkt per I2C unter Adresse 02h bzw. 01h aus der DS3231 auslesen - fertig.
Dann mußt Du wohl einfach mal die Doku zu Deiner ungenannten Lib lesen. Typisch werden die Variablen in einer Struct abgelegt. Es kann auch sein, daß sie nicht binär (uint8_t), sondern packed BCD sind, wie sie im Chip vorliegen.
Klingt gut. Wie funktioniert das?
Leuchtet jetzt mehr ein - zumindest weiß ich jetzt wie. Aber nicht ganz warum. Ich kenne es nur nach dem Schema Objekt.Funktion/Methode();" Verstehe jetzt nicht, was rtc.now() ist.
Die Elementfunktion now() des Objektes in rtc liefert ein temporäres, anonymes Objekt des Typs DateTime zurück. Und für dieses Objekt rufst Du dann die Elementfunktion hour() auf.
Einfach ein paar Softwareschichten weglassen. Die IIC-Zugriffe sind im Datenblatt genau beschrieben.
Okay, es ist noch ein wenig klarer. Muss aber noch einmal nachfragen - bitte nicht steinigen. "now()" - Elementenfuktion, weil die sich im der Klasse, im Bereich "public" Befindet!? Der Begriff Elementenfunktion ist mir nämlich ebenfalls neu. Richtig? Wieso schreibst du "des Objektes in"? Ist "rtc" nicht ein erzeugtes Objekt, für das dann die Funktion "now()" aufgerufen wird?! Gruß
C++ kennt Funktionen in zwei Arten: freie Funktionen und Funktionen als Elemente einer Klasse, die Elementfunktionen. Dieser Name ist mit Bedacht gewählt, weil C++ ein paar mehr Möglichkeiten als bspw. Java hat. Bei Java haben wir nur "Elementfunktionen", die dort dann aber Methoden heißen, weil Java ein Sprache ist, in der man sinnvoll nur OO programmieren kann. Mit C++ kann man aber rein prozedural, OO, functional und meta-programmatisch programmieren. Daher der generelle Name Funktion: freie Funktion und Elementfunktion. Free function and element function. Die Variablen in einer Klasse nennt man dementsprechend auch Datenelemente.
Ja.
Ich empfehle folgende Nomenklatur: Datentyp: Der Datentyp definiert eine Menge von möglichen Werten sowie eine Menge von Operationen. Objekt: Ein Objekt ist ein Speicherbereich, in dem ein Wert des gegebenen Datentyps abgelegt ist. Wert: Ein Wert ist eine Folge von Bits mit einem Datentyp. Variable: Demzufolge kannst Du auch Variable zu rtc sagen, oder in Langform: rtc ist reine abstrakte Referenz (ein Name) für ein Objekt. Folgendes Beispiel macht das deutlich:
Es gibt hier ein Objekt vom Typ int und a ist ein Name dafür. Genauso ist aber ra ein (weiterer) Name dafür. Es gibt aber nur ein(!) Objekt und zwei Namen. Ich habe das deswegen so geschrieben, damit Du auch den Unterschied zu einem temporären-anonymen Objekt erkennen kannst, was die Elementfunktion now() zurückliefert. Im Compiler-Jargon sagt man dazu auch rvalue (im Gegensatz zu lvalue, was im wesentlichen einem benannten Objekt gleich kommt). Diese Unterscheidung ist für C++ wesentlich. Vielen Dank für die Erläuterung! Was davon ist dann "rtc". Finde das, nur für sich stehend, nicht in der Lib.
https://github.com/adafruit/RTClib/blob/master/examples/ds3231/ds3231.ino Das ist ein einfaches Beispiel.
RTC_DS3231 ist eine Klasse, welche in der Bibliothek definiert wird. rtc ist der vom Programmierer gewählte Name für eine Variable vom Typ RTC_DS3231. Man kann auch sagen, rtc ist ein (Daten)objekt.
Hier wird eine Methode des Objekts rtc aufgerufen, welches die RTC initialisiert. Ähnlich wie Serial.begin();
Hier wird eine neue Variable vom Typ DateTime und dem Namen now definiert, welche sofort mit der Methode rtc.now() beschrieben wird. now enthält sowohl das Datum als auch die Uhrzeit in einem internen Format. Wie das aufgebaut ist, spielt keine Rolle, den der Zugriff auf Zeit und Datum erfolgt mittels der dazugehörigen Methoden. Was hier irritiert ist, das now sowohl der Name der Variablen ist als auch der Name der Methode der Klasse im Objekt rtc. Beides sind verschiedene Dinge, auch wenn sie mit der gleichen Sache zu tun haben.
Diese Methode des Objekts now liefert das Jahr. Etc. für Tag, Tag der Woche, Stunde, Minute, Sekunde etc.
Mit der Funktion kann man sogar die Temperatur der RTC auslesen, da ist halt eine Sonderfunktion dieses ICs. Die meisten RTCs haben das nicht. Oh, hab in den falschen Dateien gesucht - .h und .cpp Steige mit der Ordner-/Dateistruktur von den Libs nicht durch. Danke! Ist "rtc" also ein anderes Wort für die Klasse "RTC_DS3231"? Tut mir leid, so 100%ig verstehe ich das noch nicht. Kenne es so, dass wenn eine Klasse genannt wird, das neue Objekt mit Parametern in Klammern folgt, mit den in der Klasse gearbeitet wird. Ist es hier also was anderes? Bsp.: RTC_DS3231 rct(var.); Mach doch bitte mal einen C++ Kurs oder sowas. Muss dieser Thread jetzt hier als Grundkurs Klassen und Objekte herhalten? Einfach mal selber einlesen. Und DANACH fette Projekte mit RTC machen. So geht die richtige Reihenfolge.
Nö. rtc ist ein vom Programmierer des Beispiels gewählter Variablenname. Man könnte es auch MeineEchtzeituhr nennen, ist halt mehr Schreibaufwand.
Das sind Initialisierungsparameter. Die gibt es manchmal, aber nicht immer. Also ist es das, ohne Initialisierungsparameter?
Was sollen den Initialisierungsparameter sein? Bitte verwirre den armen Tim nicht nocht mehr.
RTC_DS3231: eine Datentyp rtc: ein Variablenname var: ein Argument (für den Konstruktor von rtc) Vgl. mit: int abc(42); int: ein Datentyp (in diesem Fall ein eingebauter Datentyp) abc: ein Variablenname 42: ein Argument (für den "Konstruktor" von abc)
Der Versuch einer Beschreibung eines armen C-Programmierers ;-) Dachte, dass die oft genannten Variablen, Objekte sind, in den Variablen hinterlegt werden. Also ruft man mit "rtc" die Klasse auf?
Guggst Du hier: Beitrag "Re: Extrahierung der Zeit - DS3231"
Nein. Eine Klasse kann man nicht aufrufen, nur Funktionen.
Was ist das denn für ein Kauderwelsch? Mach es mal nicht komplizierter als es sein muss! KISS! Nop Meine, dass man durch die Variable auf die Elementfunktionen zugreifen kann. OK 😄 Ich hatte jetzt ein wenig rumprobiert... Wieso benötige ich, scheinbar, zwei Variablen mit den speziellen Datenformaten? Im Beispiel wird, zu Anfang, RTC_DS3231 rtc; und später DateTime now = rtc.now(); erstellt. Sowohl RTC_DS3231 als auch DateTime sind Klassen. Gruß
Weil das so ist ;-)
Da stecken alle Daten für den Zugriff auf die RTC drin.
Das ist nur eine Variable, welche Zeit und Datum enthält.
Irgendwie lernst Du aus den Antworten gar nichts, oder Dir fehlt jegliches Wissen bzgl. Programmierung. Nimm erst einmal ein C++ Buch, und dann meldest Du Dich wieder. Tatsächlich stecke ich da noch in den Kinderschuhen. Aber ich glaube, dass ich das jetzt nachvollziehen kann. Vielen Dank für die viele Hilfe! Ich tue mich bei einigen Dinge sehr schwer. Kann nicht immer alles hinnehmen, wie es ist. Will es oft mehr verstehen, als nötig. Aber mein Kopf halt... Schönen Abend noch :)
Richtig. Du nimmst die Klasse RTC_DS3231 und gibst ihr die variable rtc für den Zugriff auf die Funktionen innerhalb der Klasse und um den Wert den die Funktion zurück gibt zu speichern. Nun nimmst du die DateTime Klasse gibst ihr auch wieder eine variable (now) für das Speichern der Rückgabewerte der Funktion UND übergibst von der rtc Klasse die von der aufgerufenen Funktion rtc.now() zuruckgegebenen werte der Klasse DateTime, die verabeitet werden mit der variable now und Funktion now. now.now(); Wenn dir (beispielsweise) die Funktion rtc.now() die Unixzeit ausgibt, wird die Klasse DateTime mit der Funktion now.now() das ganze in ein lesbares Datumsformat wandeln. Oder anders gesagt, du verwendest den Rückgabewert von rtc.now() in der Funktion now() der DateTime Klasse und speicherst dessen Rückgabe in der variable now. Doof zu erklären, du kannst das aber veranschaulichen in dem du dir den Wert von rtc.now() ausgeben lässt und danach den von now.now().
Krasse Fehleinschätzung. Du willst eben NICHT mehr verstehen als nötig. Das Gegenteil trifft zu. Du willst nur so viel verstehen dass du deinen aktuellen Quatsch machen kannst. WENN du mehr verstehen wollen würdest, hättest du dich schon lange in C++ eingelesen und würdest seit Tagen Anfängerbeispiele zu Klassen und Objekten abarbeiten.
Nur doof zu erklären wenn man nicht mal die Grundbegriffe von OOP beherrscht. Du verwechselt ständig Klasse und Objekt. Sowie Feld und Variable. Sowie Funktion und Methode. Unter anderem.
Was bringt es ihm wenn ich es ihm in den gleichen Worten Versuche zu erklären die der Rest von euch benutzt, die er NICHT VERSTEHT!? Ändert nichts daran das ich mich an anfängerfreundlichen Erklärungen Versuche! P.S Ich kenne OOP bereits seit PHP4/5... Aber du hast ja den absoluten Durchblick. ;-)
Begriffe kann man nachschlagen. Er will doch lernen. Aber erst mal mit falschen Begriffen loslegen hilft keinem Anfänger. Korrekte Terminologie ist wichtig.
Hat sich stets bemüht...
Puh welche Relevanz soll das haben? Du erklärst es schlicht falsch. Nur warum muss man das hier überhaupt erklären? Das sind GRUNDLAGEN! C++ Quellen wurden verlinkt. Wieso kann er nicht selber mal was nachlesen? Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|