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