Binäre Uhr Knöpfe zu "stellen"

Anbei ein Beispiel wie man die Zeit über die serielle Schnittstelle setzen kann.

#include <Wire.h>
#include "ds3231.h"

#define BUFF_MAX 128

struct ts t;
uint8_t time[8];
char recv[BUFF_MAX];
char in;
char buff[BUFF_MAX];
unsigned int recv_size = 0;
int oldSEC;
int oldMIN;
int oldSTU;
int SEC;
int MIN;
int STU;
int STUsummertime;

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

  DS3231_init(DS3231_INTCN);
  memset(recv, 0, BUFF_MAX);
  Serial.println(F("Bitte Zeit UTC+1 und Datum eingeben Format: [T]ssmmhhWTTMMJJJJ"));

/*
[T]  Buchstabe T für Timeset
ss Sekunden
mm Minuten
hh Stunden 24h Format Winterzeit
W Wochentag 0 = Sonntag
TT Tag
mm Monat
JJJJ Jahr
*/

  DS3231_get(&t);
  oldMIN = t.min;
  oldSEC = t.sec;
  STUsummertime = summertime_EU(t.year, t.mon, t.mday, t.hour, 1); // Anfang / Ende Sommerzeit berechnen
}

void loop() {
  if (Serial.available() > 0) {
    in = Serial.read();

    // Wenn der String abgeschlossen ist oder ein Zeichen empfangen wurde
    if ((in == 10 || in == 13) && (recv_size > 0))   //String abgeschlossen mit /n oder /r oder Länge größer als 0
    {
      parse_cmd(recv, recv_size);     // String teilen und Zeit setzen.
      recv_size = 0;
      recv[0] = 0;
    }
    else if (in < 48 || in > 122)    // ignorieren alle Zeichn die nicht Buchstaben oder Nummer sind  ~[0-9A-Za-z]
    {
      ;      
    }
    else if (recv_size > BUFF_MAX - 2)  // drop lines that are too long
    { 
      // drop
      recv_size = 0;
      recv[0] = 0;
    }
    else if (recv_size < BUFF_MAX - 2)
    {
      recv[recv_size] = in;
      recv[recv_size + 1] = 0;
      recv_size += 1;
    }
  }
}

byte summertime_EU(int year, byte month, byte day, byte hour, byte tzHours)
// European Daylight Savings Time calculation by "jurs" for German Arduino Forum
// input parameters: "normal time" for year, month, day, hour and tzHours (0=UTC, 1=MEZ)
// return value: returns 1 during Daylight Saving Time, 0 otherwise
{
  if (month < 3 || month > 10) return false; // keine Sommerzeit in Jan, Feb, Nov, Dez
  if (month > 3 && month < 10) return true; // Sommerzeit in Apr, Mai, Jun, Jul, Aug, Sep
  if (month == 3 && (hour + 24 * day) >= (1 + tzHours + 24 * (31 - (5 * year / 4 + 4) % 7)) || month == 10 && (hour + 24 * day) < (1 + tzHours + 24 * (31 - (5 * year / 4 + 1) % 7)))
    return 1;
  else
    return 0;
}

void parse_cmd(char *cmd, int cmdsize)    // Zeit und Datumsstring aufteilen und Zeit setzen
{
  uint8_t i;
  uint8_t reg_val;
  char buff[BUFF_MAX];
  struct ts t;

  // TssmmhhWDDMMYYYY aka set time
  if (cmd[0] == 84 && cmdsize == 16) {
    //T355720619112011
    t.sec = inp2toi(cmd, 1);
    t.min = inp2toi(cmd, 3);
    t.hour = inp2toi(cmd, 5);
    t.wday = cmd[7] - 48;
    t.mday = inp2toi(cmd, 8);
    t.mon = inp2toi(cmd, 10);
    t.year = inp2toi(cmd, 12) * 100 + inp2toi(cmd, 14);

    DS3231_set(t);
    Serial.println(F("settato ora e data."));
  } else {
    Serial.print(F("comando sconosciuto: "));
    Serial.print(cmd[0]);
    Serial.print(F(" "));
    Serial.println(cmd[0], DEC);
  }
}

Ich weiß nicht, ob der Sketch kopiliert. Ich habe einen Sketch auf das minimum gekürzt.
Auch weiß auch nicht, wo ich die Bibliothek für die DS3231 RTC heruntergeladen habe. Das Teil war ein Beispiel der Bibliothek und aufgebessert Durch die Sommerzeitberechnung von jurs, user dieses Forums.

Der Sketch soll ein Beispiel sein, wie man die Zeit über die serielle Schnittstelle setzen kann.
Das Format ist [T]ssmmhhWTTMMJJJJ. Für heute um die Zeit 21:38:23, 25.11.2020, Mittwoch ist
der String: T233821425112020

Die Variablen zum Setzen der Zeit sind: t.sec, t.min, t.hour, t.wday, t.mday, t.mon, t.year . Das muß auf die verwendete Bibliothek angepaßt werden.

Grüße Uwe