Saltador Napisano Maj 26, 2020 Udostępnij Napisano Maj 26, 2020 (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. include(1).pdf Edytowano Maj 26, 2020 przez Saltador Wstawienie bloku kodu Cytuj Link do komentarza Share on other sites More sharing options...
Gieneq Maj 26, 2020 Udostępnij Maj 26, 2020 (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 Maj 26, 2020 przez Gieneq Cytuj Link do komentarza Share on other sites More sharing options...
Saltador Maj 28, 2020 Autor tematu Udostępnij Maj 28, 2020 @Gieneq umieściłem jak chciałeś 1 Cytuj Link do komentarza Share on other sites More sharing options...
Planmet Czerwiec 3, 2020 Udostępnij Czerwiec 3, 2020 Cześć Możesz powiedzieć jak zmodyfikowałeś kod? Bo mam problem z linijką handleAlarms(); Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Pomocna odpowiedź
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!