Skocz do zawartości

Rozbudowanie Zegarka z budzikiem


Saltador

Pomocna odpowiedź

#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
Link do komentarza
Share on other sites

@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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.