Skocz do zawartości
Saltador

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

Udostępnij ten post


Link to post
Share on other sites
(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

Udostępnij ten post


Link to post
Share on other sites

Cześć 

Możesz powiedzieć jak zmodyfikowałeś kod? Bo mam problem z linijką handleAlarms();

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...