From a09710fa4b13077fd961f742dab533e1b45f864b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Thu, 13 Mar 2025 14:47:14 +0100 Subject: [PATCH] beeper, buzzer --- src/beeper.cpp | 33 +++++++++++++++++++++++++++++++++ src/beeper.h | 10 ++++++++++ src/buzzer.cpp | 15 +++++++++++++++ src/buzzer.h | 8 ++++++++ src/countdown.cpp | 33 ++++++++++++++++++++++++++++++++- src/main.cpp | 8 ++++++++ 6 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 src/beeper.cpp create mode 100644 src/beeper.h create mode 100644 src/buzzer.cpp create mode 100644 src/buzzer.h diff --git a/src/beeper.cpp b/src/beeper.cpp new file mode 100644 index 0000000..e89c8e4 --- /dev/null +++ b/src/beeper.cpp @@ -0,0 +1,33 @@ +#include "beeper.h" + +#include + +#define BEEPER_GPIO 22 +#define BEEPER_INVERT true + +unsigned long beeperDuration = 0; + +unsigned long beeperLast = 0; + +void beeperEnable(const bool enabled) { + digitalWrite(BEEPER_GPIO, (enabled ^ BEEPER_INVERT) ? HIGH : LOW); +} + +void beeperSetup() { + pinMode(BEEPER_GPIO, OUTPUT); + beeperEnable(false); +} + +void beeperLoop() { + const auto now = millis(); + if (beeperDuration != 0 && now - beeperLast >= beeperDuration) { + beeperEnable(false); + beeperDuration = 0; + } +} + +void beep(const unsigned long duration) { + beeperDuration = duration; + beeperLast = millis(); + beeperEnable(beeperDuration > 0); +} diff --git a/src/beeper.h b/src/beeper.h new file mode 100644 index 0000000..b78bc73 --- /dev/null +++ b/src/beeper.h @@ -0,0 +1,10 @@ +#ifndef BEEPER_H +#define BEEPER_H + +void beeperSetup(); + +void beeperLoop(); + +void beep(unsigned long duration); + +#endif diff --git a/src/buzzer.cpp b/src/buzzer.cpp new file mode 100644 index 0000000..b4558da --- /dev/null +++ b/src/buzzer.cpp @@ -0,0 +1,15 @@ +#include "buzzer.h" + +#include + +#define BUZZER_GPIO 23 +#define BUZZER_INVERT true + +void buzzerSetup() { + pinMode(BUZZER_GPIO, OUTPUT); + buzzerEnable(false); +} + +void buzzerEnable(const bool enabled) { + digitalWrite(BUZZER_GPIO, (enabled ^ BUZZER_INVERT) ? HIGH : LOW); +} diff --git a/src/buzzer.h b/src/buzzer.h new file mode 100644 index 0000000..c4047d3 --- /dev/null +++ b/src/buzzer.h @@ -0,0 +1,8 @@ +#ifndef BUZZER_H +#define BUZZER_H + +void buzzerSetup(); + +void buzzerEnable(bool enabled); + +#endif diff --git a/src/countdown.cpp b/src/countdown.cpp index 1ad49e9..1d2c4ae 100644 --- a/src/countdown.cpp +++ b/src/countdown.cpp @@ -1,10 +1,16 @@ -#include "countdown.h" #include + +#include "countdown.h" +#include "beeper.h" +#include "buzzer.h" #include "display.h" #define COUNTDOWN_END_SEQUENCE_STEPS 5 #define COUNTDOWN_END_SEQUENCE_REPEAT 3 +#define HALF_BEEP_DURATION 1000 +#define LAST_10_BEEP_DURATION 100 + enum CountdownState { CONFIG, READY, RUNNING, PAUSED, END }; @@ -25,6 +31,10 @@ unsigned long countdownEndSequenceDelay = 0; unsigned long countdownEndSequenceLast = 0; +bool countdownHalfTimeBeep = false; + +long countdownBeepSeconds = -1; + void setState(const CountdownState newState) { if (countdownState == newState) { return; @@ -32,6 +42,7 @@ void setState(const CountdownState newState) { countdownState = newState; const char* name; + bool buzzer = false; switch (countdownState) { case CONFIG: countdownRest = countdownMillis; @@ -39,6 +50,8 @@ void setState(const CountdownState newState) { break; case READY: countdownRest = countdownMillis; + countdownHalfTimeBeep = false; + countdownBeepSeconds = -1; name = "READY"; break; case RUNNING: @@ -49,6 +62,7 @@ void setState(const CountdownState newState) { name = "PAUSED"; break; case END: + buzzer = true; countdownEndSequenceDelay = 0; countdownEndSequenceStep = 0; name = "END"; @@ -57,6 +71,7 @@ void setState(const CountdownState newState) { name = "[???]"; break; } + buzzerEnable(buzzer); Serial.printf("Mode: %s\n", name); } @@ -165,6 +180,22 @@ void updateTime() { if (countdownLast != 0) { const auto diff = now - countdownLast; countdownRest -= static_cast(diff); + + if (countdownRest <= countdownMillis / 2) { + if (!countdownHalfTimeBeep) { + beep(HALF_BEEP_DURATION); + countdownHalfTimeBeep = true; + } + } + + const auto seconds = static_cast(ceil(countdownRest / 1000.0)); + if (seconds <= 10 && seconds > 0) { + if (countdownBeepSeconds != seconds) { + beep(LAST_10_BEEP_DURATION); + countdownBeepSeconds = seconds; + } + } + if (countdownRest <= 0) { countdownRest = 0; setState(END); diff --git a/src/main.cpp b/src/main.cpp index 4787c89..3baa5c5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,6 @@ +#include "beeper.h" #include "button.h" +#include "buzzer.h" #include "countdown.h" #include "display.h" @@ -6,12 +8,18 @@ void setup() { delay(500); Serial.begin(115200); Serial.println("\n\n\nstartup"); + + beeperSetup(); buttonSetup(); + buzzerSetup(); + displaySetup(); + countdownSetup(); } void loop() { + beeperLoop(); buttonLoop(); countdownLoop(); }