He hecho una cosa: Módulo de Python para DS3231 para Onion Omega

Hace unas semanas recibí mi Onion Omega2+.

Es un pequeño ordenador basado en el Ralink MT7688, viene con una distribución Linux basada en OpenWRT que se llama LEDE, y aunque el firmware está todavía en fase beta funciona bastante bien, hasta el punto de que ya he comenzado a desarrollar un nuevo proyecto con él.

Unas de las partes del proyecto requiere un RTC (Real Time Clock) y tengo un puñado de DS3231 por casa, así que he cogido el módulo de Python para la Raspberry Pi y lo he modificado para los Onion Omega. El resultado está en mi Github.

Es muy fácil de usar, importas el módulo y creas un objeto con la clase SDL_DS3231.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from SDL_DS3231 import *

rtc = SDL_DS3231()

No es necesario ningún parámetro porque tanto el puerto i2c, la dirección del DS3231 y de la memoria flash están definidas en la función de inicio.

Hay diferentes métodos para introducir y acceder a la fecha y la hora, voy a intentar explicar los que me parecen más importantes.

La mejor forma de introducir la fecha y hora actual es mediante el método write_now, que toma la fecha y hora del sistema y la escribe en el RTC.

rtc.write_now()

Si quisiesemos introducir otra fecha y hora, por ejemplo la UTC, podemos hacerlo mediante el método write_datetime pasándole el objeto datetime correspondiente.

utc = datetime.utcnow()
rtc.write_datetime(utc)

Para acceder a la fecha y hora existen varios métodos pero los más útiles son read_all y read_datetime. El primero devuelve un tuple que contiene: año, mes, día, día de la semana, hora, minutos y segundos.

rtc.read_all()
(17, 1, 18, 2, 8, 38, 14)

La otra opción es read_datetime, que devuelve un objeto datetime que es mucho más versátil.

rtc.read_datetime()
datetime.datetime(2017, 1, 18, 8, 38, 49)

Existen más métodos en la clase SDL_DS3231 pero el código está bien cometado y tiene docstrings que creo dejan claro el funcionamiento de la clase. En el caso de que no sea así estoy abierto a preguntas.

No tengo ningún módulo con DS1307 con que probarlo, pero dado que las direcciones i2c y los registros en la memoría son los mismo el código debería también funcionar con los DS1307.