Ds1307 problem with

i make 3 files ino, cpp, h for ds 1307 and cant normally set and display day of month.

#include "DS1307.h"

// Создаем объект класса DS1307
DS1307 rtc;

void setup() {
  // Инициализация последовательного порта для вывода данных
  Serial.begin(9600);

  // Инициализация DS1307 (I2C)
  rtc.begin();

  // Устанавливаем текущее время и дату (например, 2025 год, 3 марта, 12:00:00)
  rtc.setDate(11, 12, 2025);  // Установка даты (день, месяц, год)
  rtc.setTime(12, 0, 0);     // Установка времени (часы, минуты, секунды)

  // Печатаем сообщение в Serial Monitor
  Serial.println("RTC initialized and time set.");
}

void loop() {
  // Переменные для получения времени и даты
  int hour, minute, second;
  int day, month, year;

  // Получаем время и дату из DS1307
  rtc.getTime(hour, minute, second);
  rtc.getDate(day, month, year);

  // Выводим время и дату в Serial Monitor
  Serial.print("Time: ");
  if (hour < 10) Serial.print("0");  // Добавляем ведущий ноль, если час < 10
  Serial.print(hour);
  Serial.print(":");
  if (minute < 10) Serial.print("0");  // Добавляем ведущий ноль, если минута < 10
  Serial.print(minute);
  Serial.print(":");
  if (second < 10) Serial.print("0");  // Добавляем ведущий ноль, если секунда < 10
  Serial.println(second);

  Serial.print("Date: ");
  if (day < 10) Serial.print("0");  // Добавляем ведущий ноль, если день < 10
  Serial.print(day);
  Serial.print("/");
  if (month < 10) Serial.print("0");  // Добавляем ведущий ноль, если месяц < 10
  Serial.print(month);
  Serial.print("/");
  Serial.println(year);

  // Задержка 1 секунда перед следующим обновлением
  delay(1000);
}```


next

#ifndef DS1307_h
#define DS1307_h

#include <Wire.h>
#include <Arduino.h>

class DS1307 {
public:
DS1307(); // Конструктор
void begin(); // Инициализация
void setTime(int hour, int minute, int second); // Установка времени
void setDate(int day, int month, int year); // Установка даты
void getTime(int &hour, int &minute, int &second); // Получение времени
void getDate(int &day, int &month, int &year); // Получение даты
void setAlarm(int hour, int minute, int second); // Установка будильника

private:
byte decToBcd(byte val); // Преобразование из десятичной в двоичную кодировку
byte bcdToDec(byte val); // Преобразование из двоичной в десятичную кодировку
void writeTimeToRTC(); // Запись времени в DS1307
void readTimeFromRTC(); // Чтение времени из DS1307
};

#endif


next

#include "DS1307.h"
#include <Arduino.h>

DS1307::DS1307() {
// Если в конструкторе нет инициализации, можно оставить его пустым
}

/*
byte DS1307::decToBcd(byte val) {
return ((val / 10) << 4) | (val % 10); // Используем битовую операцию | для объединения десятков и единиц
}

byte DS1307::bcdToDec(byte val) {
return ((val >> 4) * 10) + (val & 0x0F); // Извлекаем десятки (старшие 4 бита) и единицы (младшие 4 бита)
}*/

uint8_t DS1307::decToBcd(uint8_t num)
{
return ((num/10 * 16) + (num % 10));
}

// Convert Binary Coded Decimal (BCD) to Decimal
uint8_t DS1307::bcdToDec(uint8_t num)
{
return ((num/16 * 10) + (num % 16));
}

void DS1307::begin() {
Wire.begin(); // Инициализация I2C
}

void DS1307::setTime(int hour, int minute, int second) {
Wire.beginTransmission(0x68); // Адрес DS1307
Wire.write(0); // Переход в регистр времени
Wire.write(decToBcd(second)); // Запись секунд
Wire.write(decToBcd(minute)); // Запись минут
Wire.write(decToBcd(hour)); // Запись часов
Wire.endTransmission();
}

void DS1307::setDate(int day, int month, int year) {
Wire.beginTransmission(0x68); // Адрес DS1307
Wire.write(0x03); // Переход к регистру даты
Wire.write(decToBcd(day)); // Запись дня
Wire.write(decToBcd(month)); // Запись месяца
Wire.write(decToBcd(year - 2000)); // Запись года (с 2000)
Wire.endTransmission();
}

void DS1307::getTime(int &hour, int &minute, int &second) {
Wire.beginTransmission(0x68);
Wire.write(0); // Переход к регистру времени
Wire.endTransmission();

Wire.requestFrom(0x68, 3); // Чтение времени (3 байта)
second = bcdToDec(Wire.read() & 0x7f); // Маска для секунд
minute = bcdToDec(Wire.read());
hour = bcdToDec(Wire.read());
}

void DS1307::getDate(int &day, int &month, int &year) {
Wire.beginTransmission(0x68);
Wire.write(0x03); // Переход к регистру даты
Wire.endTransmission();

Wire.requestFrom(0x68, 3); // Чтение даты (3 байта)
day = bcdToDec(Wire.read());
month = bcdToDec(Wire.read());
year = bcdToDec(Wire.read()) + 2000;
}

and what i see at serial monitor
09:21:29.738 -> Time: 12:09:29
09:21:29.738 -> Date: 01/12/2005
pls help and explain.

and help how to insert more than one part of code

Thank god for Christmas and newbies.

First fix your OP, put all the code in code tags. Secondly, is there a particular reason to use the very old and inaccurate 1307 rather than the modern DS3231?

There are many RTC libraries available that have been tested for years and proven to work. This one is very common:

How does your code compare to that?