Skocz do zawartości

Rozbudowanie Zegarka z budzikiem


Pomocna odpowiedź

Napisano (edytowany)
#include <Wire.h>
#include <LiquidCrystal.h>
#include <DS3231.h>
#include <Encoder.h>
#include <Bounce2.h>

#define PIN_ENCODER_CLK 3
#define PIN_ENCODER_DAT 2
#define PIN_MODE_SELECT 8
#define PIN_BUZZER      9
#define LCD_ADDR  0x27  // Adres I2C wyświetlacza LCD

LiquidCrystal lcd(LCD_ADDR);
DS3231 clock;
Encoder encoder(PIN_ENCODER_CLK, PIN_ENCODER_DAT);
Bounce modeSelect = Bounce(); 

bool displayCurrentTime = true;
unsigned long alarmFiredTime = 0;
long lastEncoderPos = -1;

void setup() {
pinMode(PIN_MODE_SELECT, INPUT_PULLUP);
  pinMode(PIN_BUZZER, OUTPUT);
  modeSelect.attach(PIN_MODE_SELECT);
  modeSelect.interval(5);

  Wire.begin();
  lcd.begin(16, 2);
  lcd.setBacklight(true);
  
  lcd.print("Zagar");
  lcd.setCursor(0, 1);
  lcd.print("Arduino");
  delay(1000);
  lcd.clear();
}

void loop() {
  handleAlarms();
  handleButtonClick();
  
  if(displayCurrentTime) {
    displayDateTime();
  } else {
    displayAlarmSettings();
  }
}

void displayDateTime() {
static unsigned long lastExecute = millis();

  if(millis() - lastExecute >= 1000) {
  lcd.clear();
  lcd.print(getDateString());
  lcd.setCursor(0, 1);
  lcd.print(getTimeString());
}
}

long getEncoderPositionOverflow() {
  long currentEncoderValue = encoder.read();
  while(currentEncoderValue < 0) {
    currentEncoderValue += 24 * 60;
  }
  currentEncoderValue %= 24 * 60;
  encoder.write(currentEncoderValue);
  return currentEncoderValue;
}

String encoderPositionToTimeString() {
  long currentEncoderValue = getEncoderPositionOverflow();
  
  byte hour = (currentEncoderValue / 60);
  byte minute = currentEncoderValue % 60;

  return toStringWithLeadingZeros(hour) + ":" + toStringWithLeadingZeros(minute);
}

String getDateString() {
  bool century;
  
  String day = toStringWithLeadingZeros(clock.getDate());
  String month = toStringWithLeadingZeros(clock.getMonth(century));
  String year = String(clock.getYear() + 2000);

  return day + "." + month + "." + year + "r.";
}

String getTimeString() {
  bool h12, pm;
  
  String hour = toStringWithLeadingZeros(clock.getHour(h12, pm));
  String minute = toStringWithLeadingZeros(clock.getMinute());
  String second = toStringWithLeadingZeros(clock.getSecond());

  return hour + ":" + minute + ":" + second;
}

String toStringWithLeadingZeros(byte number) {
  String result = String(number);
  if(number < 10) {
    result = "0" + result;
  }

void handleAlarms() {
  if(clock.checkIfAlarm(2)) {
    alarmFiredTime = millis();
    displayCurrentTime = true;
  }

  if(alarmFiredTime > 0) {
    bool state = (millis() % 400) < 200;
    lcd.setBacklight(state);
    analogWrite(PIN_BUZZER, 128 * state);
  } else {
    lcd.setBacklight(true);
    analogWrite(PIN_BUZZER, 0);
  }
}

void handleButtonClick() {
  modeSelect.update();
  if(modeSelect.fell()) {
    if(alarmFiredTime > 0) {
      alarmFiredTime = 0;
      return;
    }
    
    if(displayCurrentTime) {
      encoder.write(determineEncoderPosition());
      lastEncoderPos = -1;
    } else {
      long currentEncoderValue = getEncoderPositionOverflow();
      byte hour = (currentEncoderValue / 60) % 24;
      byte minute = currentEncoderValue % 60;
      setAlarm(hour, minute);
    }
    displayCurrentTime = !displayCurrentTime;
  }
}
void setAlarm(byte hour, byte minute) {
  clock.setA2Time(1, hour, minute, 0b01000000, false, false, false);
  clock.turnOnAlarm(2);
}
long determineEncoderPosition() {
  if(!clock.checkAlarmEnabled(2)) {
     return 0;
  }
  byte day, hour, minute, alarmBits;
  bool dy, h12, pm;
  
  clock.getA2Time(day, hour, minute, alarmBits, dy, h12, pm);

  return ((long) 60) * hour + minute;
}
  return result;
}

Witam,

Dopiero zaczynam prace z moim arduino.

Zbudowałem zegarek z budzikiem, lecz chciałem go rozbudować o dni tygodnia na wyświetlaczu oraz o 7 diód, które budziły by mnie każda względem odpowiedniego dnia budziła sygnałem świetlnym wraz z sygałem głosowym z buzzera.

Proszę o pomoc w dalszym programowaniu i budowania schematu.

Zegar z budzikiem.png

include(1).pdf

Edytowano przez Saltador
Wstawienie bloku kodu
(edytowany)

@Salathar witam na forum 🙂

Czy mógłbyś umieścić kod programu w swoim temacie? Służy do tego blok kodu z kolorowaniem składni, będzie na pewno łatwiej zwłaszcza dla czytelników forum posługujących się wersją mobilną.

Edytowano przez Gieneq

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...