#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); // Adres 0x3F może się różnić w zależności od Twojego wyświetlacza
int buttonPins[] = {2, 3, 4, 5}; // Piny dla przycisków
int buttonState[] = {HIGH, HIGH, HIGH, HIGH}; // Aktualny stan przycisków
int lastButtonState[] = {HIGH, HIGH, HIGH, HIGH}; // Poprzedni stan przycisków
unsigned long lastDebounceTime[] = {0, 0, 0, 0}; // Czas ostatniego odczytu stanu przycisków
unsigned long debounceDelay = 50; // Opóźnienie dla filtrowania drgań przycisku
byte seconds, minutes, hours; // Dane dotyczące czasu zegara DS1307
void setup() {
lcd.begin(20, 4); // Inicjalizacja LCD
lcd.backlight(); // Włączenie podświetlenia
for (int i = 0; i < 4; i++) {
pinMode(buttonPins[i], INPUT_PULLUP); // Ustawienie pinów przycisków jako wejście z rezystorem podciągającym
}
Wire.begin(); // Inicjalizacja komunikacji I2C
}
void loop() {
readButtons(); // Odczytanie stanu przycisków
if (buttonState[0] == LOW) {
adjustTime(1); // Zwiększenie sekund
}
if (buttonState[1] == LOW) {
adjustTime(60); // Zwiększenie minut
}
if (buttonState[2] == LOW) {
adjustTime(3600); // Zwiększenie godzin
}
if (buttonState[3] == LOW) {
resetTime(); // Wyzerowanie czasu
}
updateTime(); // Aktualizacja wyświetlacza zegara
}
void readButtons() {
for (int i = 0; i < 4; i++) {
int reading = digitalRead(buttonPins[i]);
if (reading != lastButtonState[i]) {
lastDebounceTime[i] = millis();
}
if ((millis() - lastDebounceTime[i]) > debounceDelay) {
if (reading != buttonState[i]) {
buttonState[i] = reading;
}
}
lastButtonState[i] = reading;
}
}
void adjustTime(int adjustValue) {
Wire.beginTransmission(0x68); // Adres DS1307 - 0x68
Wire.write(0); // Początek rejestru z danymi czasu
Wire.endTransmission();
Wire.requestFrom(0x68, 3); // Odczytanie danych czasu z DS1307
if (Wire.available()) {
seconds = Wire.read();
minutes = Wire.read();
hours = Wire.read();
}
seconds += adjustValue;
if (seconds >= 60) {
seconds = 0;
minutes++;
}
if (minutes >= 60) {
minutes = 0;
hours++;
}
if (hours >= 24) {
hours = 0;
}
Wire.beginTransmission(0x68);
Wire.write(0); // Początek rejestru z danymi czasu
Wire.write(seconds); // Zapisanie zwiększonych sekund
Wire.write(minutes); // Zapisanie minut
Wire.write(hours); // Zapisanie godzin
Wire.endTransmission();
}
void resetTime() {
Wire.beginTransmission(0x68);
Wire.write(0); // Początek rejestru z danymi czasu
Wire.write(0); // Wyzerowanie sekund
Wire.write(0); // Wyzerowanie minut
Wire.write(0); // Wyzerowanie godzin
Wire.endTransmission();
}
void updateTime() {
Wire.beginTransmission(0x68);
Wire.write(0); // Początek rejestru z danymi czasu
Wire.endTransmission();
Wire.requestFrom(0x68, 3); // Odczytanie danych czasu z DS1307
if (Wire.available()) {
seconds = Wire.read();
minutes = Wire.read();
hours = Wire.read();
}
lcd.setCursor(0, 0);
lcd.print("Czas: ");
if (hours < 10) {
lcd.print("0");
}
lcd.print(hours);
lcd.print(":");
if (minutes < 10) {
lcd.print("0");
}
lcd.print(minutes);
lcd.print(":");
if (seconds < 10) {
lcd.print("0");
}
lcd.print(seconds);
}