## Arduino-Library RtcDS3231 ohne Adafruit

Vollständig ohne Adafruit geht am saubersten mit **gar keiner RTC-Library**, sondern nur mit der Arduino-I2C-Standardbibliothek:

```cpp
#include <Wire.h>
```

Der DS3231 wird direkt über I2C angesprochen. Adresse: `0x68`.

Die Arduino-Library-Seite zur `DS3231`-Library bestätigt übrigens, dass diese ein Mix aus Ayars und Jeelabs/Ladyada/Adafruit-Code ist. Für „wirklich ohne Adafruit“ ist direkter I²C-Zugriff daher die klarste Lösung. ([docs.arduino.cc][1])

## Demo-Code: DS3231 ohne Adafruit, ohne externe Library

```cpp
#include <Wire.h>

#define DS3231_ADDR 0x68

byte decToBcd(byte val) {
  return ((val / 10 * 16) + (val % 10));
}

byte bcdToDec(byte val) {
  return ((val / 16 * 10) + (val % 16));
}

void setDS3231Time(
  byte second,
  byte minute,
  byte hour,
  byte dayOfWeek,
  byte dayOfMonth,
  byte month,
  byte year
) {
  Wire.beginTransmission(DS3231_ADDR);
  Wire.write(0x00);

  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));       // 24h-Modus
  Wire.write(decToBcd(dayOfWeek));  // 1 = Sonntag, 2 = Montag ...
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));       // z.B. 26 für 2026

  Wire.endTransmission();
}

void readDS3231Time() {
  Wire.beginTransmission(DS3231_ADDR);
  Wire.write(0x00);
  Wire.endTransmission();

  Wire.requestFrom(DS3231_ADDR, 7);

  byte second     = bcdToDec(Wire.read() & 0x7F);
  byte minute     = bcdToDec(Wire.read());
  byte hour       = bcdToDec(Wire.read() & 0x3F);
  byte dayOfWeek  = bcdToDec(Wire.read());
  byte dayOfMonth = bcdToDec(Wire.read());
  byte month      = bcdToDec(Wire.read() & 0x1F);
  byte year       = bcdToDec(Wire.read());

  Serial.print("20");
  if (year < 10) Serial.print("0");
  Serial.print(year);
  Serial.print("-");

  if (month < 10) Serial.print("0");
  Serial.print(month);
  Serial.print("-");

  if (dayOfMonth < 10) Serial.print("0");
  Serial.print(dayOfMonth);
  Serial.print(" ");

  if (hour < 10) Serial.print("0");
  Serial.print(hour);
  Serial.print(":");

  if (minute < 10) Serial.print("0");
  Serial.print(minute);
  Serial.print(":");

  if (second < 10) Serial.print("0");
  Serial.print(second);

  Serial.print("  Wochentag: ");
  Serial.println(dayOfWeek);
}

float readDS3231Temperature() {
  Wire.beginTransmission(DS3231_ADDR);
  Wire.write(0x11);
  Wire.endTransmission();

  Wire.requestFrom(DS3231_ADDR, 2);

  int8_t msb = Wire.read();
  byte lsb = Wire.read();

  return msb + ((lsb >> 6) * 0.25);
}

void setup() {
  Serial.begin(115200);
  Wire.begin();

  // Nur EINMAL aktivieren, danach wieder auskommentieren!
  // Sekunden, Minuten, Stunden, Wochentag, Tag, Monat, Jahr
  // setDS3231Time(0, 30, 14, 3, 19, 5, 26);
}

void loop() {
  readDS3231Time();

  Serial.print("Temperatur: ");
  Serial.print(readDS3231Temperature());
  Serial.println(" C");

  delay(1000);
}
```

## Verdrahtung Arduino UNO

| DS3231 | Arduino UNO |
| ------ | ----------- |
| VCC    | 5V          |
| GND    | GND         |
| SDA    | A4          |
| SCL    | A5          |

Das ist vollständig ohne Adafruit, ohne RTClib und ohne externe DS3231-Library.

[[1]: "DS3231 | Arduino Documentation"](https://docs.arduino.cc/libraries/ds3231/)
