#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
// Настройки дисплея SH1107
#define SCREEN_WIDTH 64
#define SCREEN_HEIGHT 128
#define SH110X_I2C_ADDRESS 0x3C // Замените на 0x3D, если это адрес вашего дисплея
Adafruit_SH1107 display = Adafruit_SH1107(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
// Настройки кнопок
#define BUTTON_HOURS 2
#define BUTTON_MINUTES 3
#define BUTTON_RESET 4
// Настройки часов DS3231
RTC_DS3231 rtc;
DateTime now;
void setup()
{
Serial.begin(9600);
// Инициализация кнопок
pinMode(BUTTON_HOURS, INPUT_PULLUP);
pinMode(BUTTON_MINUTES, INPUT_PULLUP);
pinMode(BUTTON_RESET, INPUT_PULLUP);
// Инициализация дисплея
if (!display.begin(SH110X_I2C_ADDRESS, true))
{
Serial.println("SH1107 not found");
while (1)
;
}
display.display(); // Показывает буфер дисплея
delay(2000); // Задержка на 2 секунды
display.clearDisplay();
display.setRotation(1);// 0-3 поворот изображения на дисплее
// Инициализация часов
if (!rtc.begin())
{
Serial.println("Couldn't find RTC");
while (1)
;
}
if (rtc.lostPower())
{
Serial.println("RTC lost power, let's set the time!");
// Установите время на текущее время компиляции
rtc.adjust(DateTime(F([B]DATE[/B]), F([B]TIME[/B])));
}
}
void loop()
{
// Получаем текущее время
now = rtc.now();
// Проверка нажатия кнопок
if (digitalRead(BUTTON_HOURS) == LOW)
{
adjustHours();
delay(200); // Задержка для предотвращения дребезга кнопок
}
if (digitalRead(BUTTON_MINUTES) == LOW)
{
adjustMinutes();
delay(200); // Задержка для предотвращения дребезга кнопок
}
if (digitalRead(BUTTON_RESET) == LOW)
{
resetMinutes();
delay(200); // Задержка для предотвращения дребезга кнопок
}
// Обновляем дисплей
display.clearDisplay();
display.setTextSize(4);
display.setTextColor(SH110X_WHITE);
display.setCursor(0, 0);
// Форматируем и выводим время на дисплей
if (now.hour() < 10)
display.print("0");
display.print(now.hour());
display.print(":");
if (now.minute() < 10)
display.print("0");
display.print(now.minute());
display.print(":");
if (now.second() < 10)
display.print("0");
display.print(now.second());
display.display();
delay(1000); // Обновление каждую секунду
}
void adjustHours()
{
now = rtc.now();
int hours = now.hour();
hours = (hours + 1) % 24;
rtc.adjust(DateTime(now.year(), now.month(), now.day(), hours, now.minute(), now.second()));
}
void adjustMinutes()
{
now = rtc.now();
int minutes = now.minute();
minutes = (minutes + 1) % 60;
rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), minutes, now.second()));
}
void resetMinutes()
{
now = rtc.now();
rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), 0, 0));
}