Treiberunterstützung für die DS3231 RTC

C++ / Arduino

Diese Bibliothek scheint recht toll zu sein, v.a. weil sie auch Unterstützung für die DS1307 und die PCF8523 bietet.

Ich wollte jedoch trotzdem auch jene Bibliothek nicht unerwähnt lassen.

MicroPython

Lustig - ich hab gerade den ausprobiert:

Das geht ziemlich einfach. Ist nur ein kleiner Bug im Beispiel. Das muss statt ‘ds.PER_DISABLE’ ‘DS3231.PER_DISABLE’ usw… heißen.
Man kann die Zeit setzen und lesen. Temperatursensor hat er auch (der scheint sogar recht genau zu sein s.u.).
Alarme gibt es ebenfalls. Den PER_MINUTE habe ich ausprobiert. Der zieht dann bei Alarm den SQW Ausgang auf 0. Das funktioniert aber anscheinend nur, solange der DS3231 mit Strom versorgt wird. Nur mit der CR2032 fällt der Ausgang sofort ab. Der DS3231 muss also versorgt bleiben (war mir vorher nicht klar).
Damit könnte man eigentlich recht simpel mit einem P-Kanal MOSFET die ganze Stromversorgung (bis auf den DS3231) kappen. Das wäre doch was für den Solarbetrieb?

Hier hat sich jemand länger mit dem Chip beschäftigt:

2 Likes

Hi @poesel,

Merci fürs Testen! Gut, dass dort die Pin-Objekte nicht im Treiber erzeugt werden – so müsste sie kompatibel zu Genuine- und Pycom-MicroPython sein.

Soweit ich das verstehe – absolut! @weef, @roh und @wtf haben das mit dem NCP380 gemacht.

Viele Grüße,
Andreas.

Der Portable driver for DS3231 von Peter Hinch micropython-samples/ds3231_port.py at master · peterhinch/micropython-samples · GitHub ist auch nicht so schlecht. Er hat ein ganz anderes Interface, das aber nicht unpraktisch sein kann.

Leider keine Unterstützung für Alarme und den Alarmausgang. Deshalb leider nichts für uns.

1 Like

Wenn wir eine Komplettabschaltung machen - was wären denn dann typische Schlafintervalle?

Bin gerade dabei, den DS3231 zu integrieren. Der hat drei nützliche Dinge: RTC, Alarm & Temperatursensor.
Die RTC setzt bei der Initialisierung die Systemzeit (wenn die RTC gültige Werte hat).
Der Temperatursensor funktioniert wie ein normaler Sensor.
Die Alarme sind etwas diffiziler. Da könnte man viele Dinge tun, ich hab mich für das entschieden:

# Measurement intervals in seconds, for shutoff in minutes.

    'interval': {
        # Apply this interval if device is in field mode.
        'field': 15.0,

        # Apply this interval if device is in maintenance mode.
        # https://community.hiveeyes.org/t/wartungsmodus-fur-den-terkin-datenlogger/2274
        'maintenance': 15.0,

        # Apply this interval if device goes into shutoff
        'shutoff': 10,
        # night & winter mode: during the night or winter interval is doubled (-> in a winter night it is quadrupled)
        # beginning & end months are included: night from 20 to 5 -> 20.00h to 5.59h, winter from 10 to 2 -> October 1st to February 29th
        # a start value of 0 means there is no night/winter, night_start > night_end, winter_start > winter_end
        'night_start': 20,
        'night_end' : 5,
        'winter_start' : 10,
        'winter_end' : 2,
    },

Ich hoffe, die Kommentare sind selbsterklärend. Wenn nicht, merk ichs ja dann. :slight_smile:

1 Like

Wer testet gerade den DS3231 und mit welcher Software?

Ich, Terkin
:slight_smile:

Welche Treiber benutzt Du? Ich habe in Terkin nichts gefunden, was auf den DS3231 hinweist.
In Github gibt es zwar etwas, aber das ist für mich etwas unübersichtlich und ich wollte nicht alles ausprobieren müssen, um dann festzustellen, dass es nicht läuft wegen falscher Hardware oder Firmware oder oder oder…
Besonders habe ich nichts über die Alarme gefunden.

Der Treiber ist in /dist-packages und heißt auch einfach DS3231.py. Die Alarme sind da auch drin erklärt, aber etwas verschwurbelt.
Ich hab auch einen PR dazu - nur noch nicht getestet. Liegt alles auf dem Schreibtisch. Sollte ich mal langsam fertig machen. :slight_smile:

1 Like

Die Zeit auslesen und schreiben funktioniert, bei den Alarmen habe ich noch meine Probleme.
Hat zufällig jemand etwas Code, den ich testen könnte?

Ja, hier:

Ich bin immer noch nicht zum Testen gekommen. Ich denke aber, das lange Wochenende gibt mir Gelegenheit genug. Wir können auch gerne mal telefonieren.

1 Like

Da ist noch ein fetter Bock in der Library. Jedesmal, wenn der Alarm gesetzt wird, wird die Uhrzeit gelöscht. Da hat die chinesische Qualitätskontrolle wieder hervorragend gerabeitet. :frowning:
Das Ding muss ich wohl ein wenig umschreiben.

Zu Testzwecken hab ich mir ein kleines Board gebastelt. ‘Unbestückt’:

Und hier (fast) belegt:

Links oben 5V rein, links unten 5V raus (zum TTGO T-Call - dafür ist das ganze gedacht).
Links unten ein P-Kanal MOSFET, der den Ausgang schaltet. Daneben ein MAX17043 zum Spannungsmessen. Daneben ein Level-Shifter (oben 5V, unten 3,3V). Ganz rechts ein Schalter, der den Ausgang permanent auf an setzt (zum Testen).
Mitte oben der DS3231 (leider verdeckt das Kabel ein wenig die Beschriftung).
Im Grunde eine sehr simple Schaltung, die einen (wenn der DS funktioniert…) vollkommen unabhängig von dem Stromverbrauch des angeschlossenen Geräts macht (im Deepsleep für langsame Messfrequenzen).

2 Likes

Welche Library benutzt Du?
Ich teste gerade DS3231a.py (5,7 KB)
und DS3231-alarm1.py (2,2 KB)
Der Code ist noch nicht richtig ausgetestet!!!
Ich bin noch auf einem Breadboard

Ja - genau die. Die machen da ein paar wirre Sachen mit den Registern - das funktioniert nicht richtig.
Uhrzeit setzen und auslesen geht, die Alarme nicht.

Vielleicht helfen auch Codeschnipsel aus der Implementierung von Adafruit weiter.

Siehe auch:

Ich hatte noch den gefunden:


und Andreas hat mich überzeugt, lieber den zu nehmen. :slight_smile:
Der ist deutlich expliziter und mit weniger bugs. Leider aber auch nicht ohne. Der wird es aber (nach ein paar Anpassungen) wohl werden.

Ich doktore schon seit Tagen an DS3231-Treibern herum. Das Setzen und Auslesen der Zeit funktioniert.
Aber bei den Alarmen wird es schwierig. Ich kann sie setzen und im Status-Register das Auslösen verfolgen. Aber das Löschen funktioniert nicht zuverlässig.
Ebenso wird der Pin INT/SQW, der zum Schalten dienen soll, nicht immer zuverlässig gesetzt ( z.B. beim ersten Mal ist alles OK, aber dann bleibt er immer ON )

Hat jemand Code, der funktioniert?

Ich schreibe gerade eine neue library. Mehr so ein ‘best of’ der beiden libraries. Die haben beide so ihre bugs bzw. bestimmte features fehlen.
Work in progress.

1 Like