Erschließung der DS3231 RTC mit MicroPython und Terkin

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

Das trifft sich sehr gut.
Ich kämpfe gerade mit folgenden Zeilen:

    def __init__(self, i2cClockPin, i2cDataPin):
        # create RTC instance with I2C Pins
        # i2cClockPin =  'P9'
        # i2cDataPin  = 'P10'
        # self.sclPin = machine.Pin(i2cClockPin, pull = machine.Pin.PULL_UP, mode=machine.Pin.OPEN_DRAIN)
        # self.sdaPin = machine.Pin(i2cDataPin,  pull = machine.Pin.PULL_UP, mode=machine.Pin.OPEN_DRAIN)
        # self.sclPin = 'P9'
        # self.sdaPin = 'P10'
        # self.sclPin = P9
        # self.sdaPin = P10
        # self.sclPin = 9
        # self.sdaPin = 10
        # self.i2cVar = machine.I2C(-1, scl=self.sclPin, sda=self.sdaPin)

        #self.i2cVar = machine.I2C(0, I2C.MASTER, pins=('P9', 'P10'))

Mit ‘den beiden’ meinst Du die µpy-chinese-community-lib sowie die von notUnique, oder?

1 Like

Hier wird das i2c Objekt in der lib erzeugt. Das brauchen wir nicht, da es im Terkin schon existiert.
Einfach noch ein bißchen Geduld. :slight_smile:

Ja, genau. Es gibt noch die von Adafruit, die aber sehr in deren Universum integriert ist und eine von RobertHH, der aber die Alarme nicht unterstützt. Beide für uns eher nicht von Nutzen.

Danke!

Wäre es vielleicht möglich, auf die GitHub - notUnique/DS3231micro: Micropython library for DS3231 aufzusetzen? So wären wir zumindest API-kompatibel und einige Hilfsfunktionen könnten bestimmt gut wiederverwendet werden.

In unserem Fork bei GitHub - hiveeyes/DS3231micro: Micropython library for DS3231 hast Du bereits entsprechende Berechtigungen.

Die habe ich noch nicht entdeckt. Meintest Du vielleicht die GitHub - scudderfish/uDS3231: DS3231 for the Wipy?

Unabhängig davon habe ich gerade noch eine CPython-Implementierung bei GitHub - nivekg/python-ds3231: Python module for controlling the DS3231 RTC from Maxim Integrated gefunden. Vielleicht kann die bei Deinen Arbeiten ebenfalls weiterhelfen.

Ja, ist es auch schon. Richtig API kompatibel wird es nicht, ich hab aber alles Nützliche geklaut. Sobald ich mit dem Testen durch bin, schieb ichs dahin (auf Github)

Nee, aber ich habe Robert und Peter verwechselt. :grimacing:

DIese Library ist schon gut programmiert, aber ich finde die Fehler bei den Alarmen nicht.

Diese Library ist unübersichtlich:

Die Register als Konstanten definiert zu haben, ist auf jeden Fall sinnvoll und macht die Bibliothek übersichtlicher, ja!

Ich ziehe meinen Wunsch hiermit zurück und bin gespannt, was @poesel uns da liefern wird.

Den Code dort einzupflegen macht dann vermutlich keinen Sinn. Ich werde den Fork wieder löschen und wir machen ein neues Repository auf.

P.S.: Bei der CPython-Bibliothek GitHub - nivekg/python-ds3231: Python module for controlling the DS3231 RTC from Maxim Integrated sind die Register noch besser definiert:

So können die _encode()- bzw. _decode()-Methoden generisch arbeiten:

In jener Bibliothek wird sogar schon das Auslesen des Temperatur-Sensors unterstützt. Daran sieht man exemplarisch, wie kompakt das Ganze dann ist:

Leider wird dort die Registeradresse wieder numerisch kodiert. Noch besser wäre es, beide Ansätze der Konstantendefinition zu kombinieren und an den entsprechenden Stellen mit DS3231_REG_CTRL bzw. DS3231_REG_TEMP zu arbeiten.

Die erste Version der Library ist fertig. Ich hab noch nicht alles getestet, bin aber recht zuversichtlich.
Der code ist in src. In main.py ist ein kleines Testprogramm.
Darin wird auch ein MAX17043 ausgelesen. Wer keinen hat, kann die entsprechenden Zeilen einfach rausschmeissen.
Weiterhin werden zwei Ausgänge nach dem booten kurz eingeschaltet. Da hab ich eine LED und eine kleine Piezohupe dran. Damit kann man die Intervalle hören beim Testen.
Die Lib und ihre Funktionen sind hoffentlich selbsterklärend. Bei Fragen fragen.

Die KiCAD-Sachen sind nicht vollständig. Das hab ich mehr für mich selbst gemacht, um obiges Board zu entwerfen. Falls Interesse besteht, mache ich das noch hübsch.

Die Integration in den Terkin kommt als nächstes.

Anbei noch zwei Tabellen, die mir beim Entwickeln geholfen haben. Falls es jemand nochmal braucht.


4 Likes

Die Library funktioniert ganz gut. Einige Testprogramme und Ergänzungen werde ich bald posten.
Ich kann mit dem Ausgang SQW eine LED per Alarm ein- und ausschalten.
Nun wollte ich mit einem IRF520-Modul ( https://www.az-delivery.de/products/irf520-mos-driver-modul-0-24v-5a ) mehr Leistung ( z.B. einen FiPy ) schalten. Doch leider ist der Eingangsstrom des IRF520-Moduls SIG zu gross für den DS3231 - Ausgang SQW. Die Spannung bricht zusammen.
Hat jemand eine Idee für ein anderes Modul, oder muss ich mir mit Transistoren etwas basteln?

Der IRF520 ist ein N-Kanal MOSFET. Du brauchst einen P-Kanal MOSFET. Der schaltet, wenn das Gate low ist und genau das macht der DS3231, wenn der Alarm getriggert wird.
Ich hab z.B. einen NDP6020P genommen. Vollkommen überdimensioniert - hatte aber den Vorteil, das er in der Schublade lag. :slight_smile:

Schau mal oben im thread, was ich da gebastelt habe. Die Platine kann man ganz leicht selber zusammen löten. Ich schalte damit den ganzen TTGO T-Call samt Sensoren während des Schlafs weg.

Vielen Dank für die Tipps. Ich hatte übersehen, dass N-Kanal MOSFETs die Minus-Leitung schalten.
Hättest Du vielleicht eine kleine Skizze/Schaltplan für die Beschaltung des P-Kanal MOSFETs ?
Ich wollte auch noch einen INA219 einbauen, um Spannung, Strom und Leistung zu messen.

Hier Beispiele mit P-channel MOSFETs zur schaltbaren Stromversorgung (hier für ein SIM800-Modul):

Folgende Schaltungen sollten funktionieren:

image image