From e76c8152ff2bb7603177e3be366bb41f802cda43 Mon Sep 17 00:00:00 2001 From: Fred BORRY Date: Thu, 26 Oct 2023 23:09:01 +0200 Subject: [PATCH 1/5] Removed ledcSetup for ESP32 target since it is not used for ledcWriteTone + removed associated default values. Added setVolume() for ESP32 bases on duty cycle. Fixed issue on ESP32 of inconsistent sound when calling ledcWriteTone while a sound is already playing. --- src/Config.h | 6 +++--- src/EasyBuzzer.cpp | 47 ++++++++++++++++++++++++++++------------------ src/EasyBuzzer.h | 6 +++++- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/Config.h b/src/Config.h index 0cebe72..f4b47a7 100644 --- a/src/Config.h +++ b/src/Config.h @@ -12,11 +12,11 @@ Copyright (c) 2017 Evert Arias #ifndef _Config_h #define _Config_h -#define DEFAULT_PIN 4 // Default pin number where the buzzer is connected. +#define DEFAULT_PIN 4 // Default pin number where the buzzer is connected. 0 #define DEFAULT_FREQ 1000 // Default frequency. #define DEFAULT_CHANNEL 0 // Default PWM channel. -#define DEFAULT_RESOLUTION 8 // Default resolution. -#define MINIMUM_INTERVAL 20 // Minimum interval allowed in milliseconds(ms). +#define DEFAULT_VOLUME 0x1FF // 10 bit resolution => 50% duty cycle is 0x3FF/2 = 0x1FF +#define MINIMUM_INTERVAL 5 // Minimum interval allowed in milliseconds(ms). #define DEFAULT_ON_DURATION 100 // Default ON duration of a cycle in milliseconds(ms). #define DEFAULT_OFF_DURATION 100 // Default OFF duration of a cycle in milliseconds(ms). diff --git a/src/EasyBuzzer.cpp b/src/EasyBuzzer.cpp index cbafc25..0d4365e 100644 --- a/src/EasyBuzzer.cpp +++ b/src/EasyBuzzer.cpp @@ -13,9 +13,6 @@ Github: https://github.com/evert-arias/EasyBuzzer /* Class constructor */ EasyBuzzerClass::EasyBuzzerClass() { -#if defined ESP32 - ledcSetup(mChannel, mFreq, mResolution); -#endif } /* Class destructor */ EasyBuzzerClass::~EasyBuzzerClass() {} @@ -37,16 +34,7 @@ void EasyBuzzerClass::beep(unsigned int frequency, unsigned int beeps, void (*fi /* Beep sequence at a given frequency. */ void EasyBuzzerClass::beep(unsigned int frequency, unsigned int const onDuration, unsigned int const offDuration, byte const beeps, unsigned int const pauseDuration, unsigned int const sequences) { - mFreq = frequency; - mOnDuration = onDuration ? max(MINIMUM_INTERVAL, onDuration) : 0; - mOffDuration = offDuration ? max(MINIMUM_INTERVAL, offDuration) : 0; - mBeeps = beeps; - mPauseDuration = pauseDuration ? max(MINIMUM_INTERVAL, pauseDuration) : 0; - mSequences = sequences; - mFinishedCallbackFunction = NULL; - mStartTime = max(millis(), 1); - mLastRunTime = 0; - update(); + beep(frequency,onDuration,offDuration,beeps,pauseDuration,sequences,NULL); } /* Beep sequence at a given frequency, with callback functionality. */ void EasyBuzzerClass::beep(unsigned int frequency, unsigned int const onDuration, unsigned int const offDuration, byte const beeps, unsigned int const pauseDuration, unsigned int const sequences, void (*finishedCallbackFunction)()) @@ -60,21 +48,24 @@ void EasyBuzzerClass::beep(unsigned int frequency, unsigned int const onDuration mFinishedCallbackFunction = finishedCallbackFunction; mStartTime = max(millis(), 1); mLastRunTime = 0; + mTurnedOn = false; + mTurnedOff = false; update(); } /* Start beeping at a given frequency, for an specific duration. */ void EasyBuzzerClass::singleBeep(unsigned int frequency, unsigned int duration) { - beep(frequency, duration, mOffDuration, 1, mPauseDuration, 1, NULL); + beep(frequency, duration, 0, 1, DEFAULT_PAUSE_DURATION, 1, NULL); } /* Start beeping at a given frequency, for an specific duration, with callback functionality. */ void EasyBuzzerClass::singleBeep(unsigned int frequency, unsigned int duration, void (*finishedCallbackFunction)()) { - beep(frequency, duration, mOffDuration, 1, mPauseDuration, 1, finishedCallbackFunction); + beep(frequency, duration, 0, 1, DEFAULT_PAUSE_DURATION, 1, finishedCallbackFunction); } /* Stop beeping. */ void EasyBuzzerClass::stopBeep() { + mBeeps = 0; #if defined ESP32 ledcDetachPin(mPin); pinMode(mPin, INPUT); @@ -102,6 +93,10 @@ void EasyBuzzerClass::setPauseDuration(unsigned int duration) { mPauseDuration = duration; } + +/* Set Buzzer Volume. */ +void EasyBuzzerClass::setVolume(byte volume) { mVolume = map(volume,0,0xFF,0,0x3FF); } + /* Update function that keeps the library running. */ void EasyBuzzerClass::update() { @@ -123,6 +118,8 @@ void EasyBuzzerClass::update() if (!sequenceDuration || (mSequences != 0 && elapsedTime / sequenceDuration >= mSequences)) { mStartTime = 0; + mTurnedOn = false; + mTurnedOff = false; if (mFinishedCallbackFunction) { mFinishedCallbackFunction(); @@ -136,12 +133,26 @@ void EasyBuzzerClass::update() #if defined ESP32 if (timeInSequence < blinkingDuration && timeInSequence % blinkDuration < mOnDuration) { - ledcAttachPin(mPin, mChannel); - ledcWriteTone(mChannel, mFreq); + if(!mTurnedOn) + { + ledcAttachPin(mPin, mChannel); + ledcWriteTone(mChannel, mFreq); + if(mVolume != DEFAULT_VOLUME) + { // Set Volume by changing duty cycle + ledcWrite(mChannel,mVolume); + } + mTurnedOn = true; + mTurnedOff = false; + } } else { - ledcDetachPin(mPin); + if(!mTurnedOff) + { + ledcDetachPin(mPin); + mTurnedOff = true; + mTurnedOn = false; + } }; #else if (timeInSequence < blinkingDuration && timeInSequence % blinkDuration < mOnDuration) diff --git a/src/EasyBuzzer.h b/src/EasyBuzzer.h index 0dc5564..2b480c4 100644 --- a/src/EasyBuzzer.h +++ b/src/EasyBuzzer.h @@ -57,6 +57,8 @@ class EasyBuzzerClass void setOffDuration(unsigned int duration); /* Set Pause duration. */ void setPauseDuration(unsigned int duration); + /* Set buzzer volume. */ + void setVolume(byte volume); /* Update function that keeps the library running. */ void update(); @@ -65,15 +67,17 @@ class EasyBuzzerClass unsigned int mPin = DEFAULT_PIN; unsigned int mFreq = DEFAULT_FREQ; unsigned int mChannel = DEFAULT_CHANNEL; - unsigned int mResolution = DEFAULT_RESOLUTION; byte mBeeps; unsigned int mOnDuration = DEFAULT_ON_DURATION; unsigned int mOffDuration = DEFAULT_OFF_DURATION; unsigned int mPauseDuration = DEFAULT_PAUSE_DURATION; unsigned int mSequences; + unsigned int mVolume = DEFAULT_VOLUME; unsigned long mStartTime; unsigned long mLastRunTime; void (*mFinishedCallbackFunction)(); + bool mTurnedOn = false; + bool mTurnedOff = false; }; extern EasyBuzzerClass EasyBuzzer; From 926c94fc9c2936e656b430a3ac93527622fff973 Mon Sep 17 00:00:00 2001 From: Fred BORRY Date: Fri, 27 Oct 2023 00:55:43 +0200 Subject: [PATCH 2/5] Added siren mode --- src/Config.h | 6 ++- src/EasyBuzzer.cpp | 102 ++++++++++++++++++++++++++++++++++++++++++++- src/EasyBuzzer.h | 15 ++++++- 3 files changed, 120 insertions(+), 3 deletions(-) diff --git a/src/Config.h b/src/Config.h index f4b47a7..5174015 100644 --- a/src/Config.h +++ b/src/Config.h @@ -16,7 +16,11 @@ Copyright (c) 2017 Evert Arias #define DEFAULT_FREQ 1000 // Default frequency. #define DEFAULT_CHANNEL 0 // Default PWM channel. #define DEFAULT_VOLUME 0x1FF // 10 bit resolution => 50% duty cycle is 0x3FF/2 = 0x1FF -#define MINIMUM_INTERVAL 5 // Minimum interval allowed in milliseconds(ms). +#define MINIMUM_INTERVAL 0 // Minimum interval allowed in milliseconds(ms). +#define DEFAULT_START_FREQ 700 // Default start frequency for siren mode. +#define DEFAULT_END_FREQ 800 // Default end frequency for siren mode. +#define DEFAULT_SIREN_DELAY 45 // Default delay between siren frequency increment +#define SIREN_INCREMENT 3 #define DEFAULT_ON_DURATION 100 // Default ON duration of a cycle in milliseconds(ms). #define DEFAULT_OFF_DURATION 100 // Default OFF duration of a cycle in milliseconds(ms). diff --git a/src/EasyBuzzer.cpp b/src/EasyBuzzer.cpp index 0d4365e..748e367 100644 --- a/src/EasyBuzzer.cpp +++ b/src/EasyBuzzer.cpp @@ -13,6 +13,7 @@ Github: https://github.com/evert-arias/EasyBuzzer /* Class constructor */ EasyBuzzerClass::EasyBuzzerClass() { + ledcSetup(mChannel,1000,10); } /* Class destructor */ EasyBuzzerClass::~EasyBuzzerClass() {} @@ -39,6 +40,7 @@ void EasyBuzzerClass::beep(unsigned int frequency, unsigned int const onDuration /* Beep sequence at a given frequency, with callback functionality. */ void EasyBuzzerClass::beep(unsigned int frequency, unsigned int const onDuration, unsigned int const offDuration, byte const beeps, unsigned int const pauseDuration, unsigned int const sequences, void (*finishedCallbackFunction)()) { + mMode = Mode::BEEP; mFreq = frequency; mOnDuration = onDuration ? max(MINIMUM_INTERVAL, onDuration) : 0; mOffDuration = offDuration ? max(MINIMUM_INTERVAL, offDuration) : 0; @@ -62,8 +64,34 @@ void EasyBuzzerClass::singleBeep(unsigned int frequency, unsigned int duration, { beep(frequency, duration, 0, 1, DEFAULT_PAUSE_DURATION, 1, finishedCallbackFunction); } + +/** Start siren with the specified mode, the given start and end fequency and the provided delay */ +void EasyBuzzerClass::siren(bool riseAndFall, unsigned int startFrequency, unsigned int endFrequency, unsigned int delay) +{ + mMode = Mode::SIREN; + mSirenRiseAndFall = riseAndFall; + if(endFrequency > startFrequency) + { + mStartFreq = startFrequency; + mEndFreq = endFrequency; + } + else + { // Reverse way + mStartFreq = endFrequency; + mEndFreq = startFrequency; + mSirenRise = false; + } + mFreq = startFrequency; + mSirenDelay = delay; + mStartTime = max(millis(), 1); + mLastRunTime = 0; + mTurnedOn = false; + mTurnedOff = false; + update(); +} + /* Stop beeping. */ -void EasyBuzzerClass::stopBeep() +void EasyBuzzerClass::stop() { mBeeps = 0; #if defined ESP32 @@ -111,6 +139,20 @@ void EasyBuzzerClass::update() return; } + switch(mMode) + { + case Mode::SIREN : + updateSiren(currentTime); + break; + case Mode::BEEP : + default: + updateBeep(currentTime); + break; + } +} + +void EasyBuzzerClass::updateBeep(unsigned long currentTime) +{ unsigned long elapsedTime = currentTime - mStartTime; unsigned int blinkDuration = mOnDuration + mOffDuration; unsigned int sequenceDuration = blinkDuration * mBeeps + mPauseDuration - mOffDuration; @@ -166,4 +208,62 @@ void EasyBuzzerClass::update() #endif } +void EasyBuzzerClass::updateSiren(unsigned long currentTime) +{ + if(!mTurnedOn) + { +#if defined ESP32 + ledcAttachPin(mPin, mChannel); + ledcWriteTone(mChannel, mFreq); + if(mVolume != DEFAULT_VOLUME) + { // Set Volume by changing duty cycle + ledcWrite(mChannel,mVolume); + } +#else + tone(mPin, mFreq); +#endif + mTurnedOn = true; + mLastSirenUpdateTime = currentTime; + } + else if(currentTime - mLastSirenUpdateTime >= mSirenDelay) + { + if(mSirenRise) + { + mFreq+=SIREN_INCREMENT; + if(mFreq>=mEndFreq) + { + if(mSirenRiseAndFall) + { + mSirenRise = false; + } + else + { + mFreq = mStartFreq; + } + } + } + else + { + mFreq-=SIREN_INCREMENT; + if(mFreq<=mStartFreq) + { + if(mSirenRiseAndFall) + { + mSirenRise = true; + } + else + { + mFreq = mEndFreq; + } + } + } +#if defined ESP32 + ledcWriteTone(mChannel, mFreq); +#else + tone(mPin, mFreq); +#endif + mLastSirenUpdateTime = currentTime; + } +} + EasyBuzzerClass EasyBuzzer; diff --git a/src/EasyBuzzer.h b/src/EasyBuzzer.h index 2b480c4..1a3b44e 100644 --- a/src/EasyBuzzer.h +++ b/src/EasyBuzzer.h @@ -31,6 +31,7 @@ Github: https://github.com/evert-arias/EasyBuzzer class EasyBuzzerClass { public: + enum class Mode { BEEP, SIREN }; EasyBuzzerClass(); ~EasyBuzzerClass(); /* Beep continuously. */ @@ -47,8 +48,10 @@ class EasyBuzzerClass void singleBeep(unsigned int frequency, unsigned int duration); /* Beep at a given frequency, for an specific duration, with callback functionality. */ void singleBeep(unsigned int frequency, unsigned int duration, void (*finishedCallbackFunction)()); + /** Start siren with the specified mode, the given start and end fequency and the provided delay */ + void siren(bool riseAndFall, unsigned int startFrequency = DEFAULT_START_FREQ, unsigned int endFrequency = DEFAULT_END_FREQ, unsigned int delay = DEFAULT_SIREN_DELAY); /* Stop beeping. */ - void stopBeep(); + void stop(); /* Set the pin where the buzzer is connected. */ void setPin(unsigned int pin); /* Set On duration. */ @@ -78,6 +81,16 @@ class EasyBuzzerClass void (*mFinishedCallbackFunction)(); bool mTurnedOn = false; bool mTurnedOff = false; + Mode mMode = Mode::BEEP; + unsigned int mStartFreq = DEFAULT_START_FREQ; + unsigned int mEndFreq = DEFAULT_END_FREQ; + unsigned int mSirenDelay = DEFAULT_SIREN_DELAY; + bool mSirenRiseAndFall = true; + unsigned long mLastSirenUpdateTime; + bool mSirenRise = true; + + void updateBeep(unsigned long currentTime); + void updateSiren(unsigned long currentTime); }; extern EasyBuzzerClass EasyBuzzer; From 448563524c93137d91dda71efe9ef3c2949458ce Mon Sep 17 00:00:00 2001 From: Fred BORRY Date: Fri, 27 Oct 2023 00:57:38 +0200 Subject: [PATCH 3/5] Removed unncessary code. --- src/EasyBuzzer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/EasyBuzzer.cpp b/src/EasyBuzzer.cpp index 748e367..30eb1a7 100644 --- a/src/EasyBuzzer.cpp +++ b/src/EasyBuzzer.cpp @@ -13,7 +13,6 @@ Github: https://github.com/evert-arias/EasyBuzzer /* Class constructor */ EasyBuzzerClass::EasyBuzzerClass() { - ledcSetup(mChannel,1000,10); } /* Class destructor */ EasyBuzzerClass::~EasyBuzzerClass() {} From 998b39693c5a02fe0a0edab4fb28977e6179139e Mon Sep 17 00:00:00 2001 From: Fred BORRY Date: Fri, 27 Oct 2023 08:25:00 +0200 Subject: [PATCH 4/5] Removed ESP32 specific code since tone() function is now available in ESP32 Ardiuino Framework. Also removed volume() function whch was not really working and is ESP32 specific... --- src/Config.h | 1 - src/EasyBuzzer.cpp | 43 +++---------------------------------------- src/EasyBuzzer.h | 4 +--- 3 files changed, 4 insertions(+), 44 deletions(-) diff --git a/src/Config.h b/src/Config.h index 5174015..4414133 100644 --- a/src/Config.h +++ b/src/Config.h @@ -15,7 +15,6 @@ Copyright (c) 2017 Evert Arias #define DEFAULT_PIN 4 // Default pin number where the buzzer is connected. 0 #define DEFAULT_FREQ 1000 // Default frequency. #define DEFAULT_CHANNEL 0 // Default PWM channel. -#define DEFAULT_VOLUME 0x1FF // 10 bit resolution => 50% duty cycle is 0x3FF/2 = 0x1FF #define MINIMUM_INTERVAL 0 // Minimum interval allowed in milliseconds(ms). #define DEFAULT_START_FREQ 700 // Default start frequency for siren mode. #define DEFAULT_END_FREQ 800 // Default end frequency for siren mode. diff --git a/src/EasyBuzzer.cpp b/src/EasyBuzzer.cpp index 30eb1a7..c49eab2 100644 --- a/src/EasyBuzzer.cpp +++ b/src/EasyBuzzer.cpp @@ -92,13 +92,8 @@ void EasyBuzzerClass::siren(bool riseAndFall, unsigned int startFrequency, unsig /* Stop beeping. */ void EasyBuzzerClass::stop() { - mBeeps = 0; -#if defined ESP32 - ledcDetachPin(mPin); - pinMode(mPin, INPUT); -#else + mStartTime = 0; noTone(mPin); -#endif } /* Set the pin where the buzzer is connected. */ void EasyBuzzerClass::setPin(unsigned int pin) @@ -121,9 +116,6 @@ void EasyBuzzerClass::setPauseDuration(unsigned int duration) mPauseDuration = duration; } -/* Set Buzzer Volume. */ -void EasyBuzzerClass::setVolume(byte volume) { mVolume = map(volume,0,0xFF,0,0x3FF); } - /* Update function that keeps the library running. */ void EasyBuzzerClass::update() { @@ -171,17 +163,11 @@ void EasyBuzzerClass::updateBeep(unsigned long currentTime) unsigned int blinkingDuration = blinkDuration * mBeeps; unsigned int timeInSequence = elapsedTime % sequenceDuration; -#if defined ESP32 if (timeInSequence < blinkingDuration && timeInSequence % blinkDuration < mOnDuration) { if(!mTurnedOn) { - ledcAttachPin(mPin, mChannel); - ledcWriteTone(mChannel, mFreq); - if(mVolume != DEFAULT_VOLUME) - { // Set Volume by changing duty cycle - ledcWrite(mChannel,mVolume); - } + tone(mPin, mFreq); mTurnedOn = true; mTurnedOff = false; } @@ -190,37 +176,18 @@ void EasyBuzzerClass::updateBeep(unsigned long currentTime) { if(!mTurnedOff) { - ledcDetachPin(mPin); + noTone(mPin); mTurnedOff = true; mTurnedOn = false; } }; -#else - if (timeInSequence < blinkingDuration && timeInSequence % blinkDuration < mOnDuration) - { - tone(mPin, mFreq); - } - else - { - noTone(mPin); - }; -#endif } void EasyBuzzerClass::updateSiren(unsigned long currentTime) { if(!mTurnedOn) { -#if defined ESP32 - ledcAttachPin(mPin, mChannel); - ledcWriteTone(mChannel, mFreq); - if(mVolume != DEFAULT_VOLUME) - { // Set Volume by changing duty cycle - ledcWrite(mChannel,mVolume); - } -#else tone(mPin, mFreq); -#endif mTurnedOn = true; mLastSirenUpdateTime = currentTime; } @@ -256,11 +223,7 @@ void EasyBuzzerClass::updateSiren(unsigned long currentTime) } } } -#if defined ESP32 - ledcWriteTone(mChannel, mFreq); -#else tone(mPin, mFreq); -#endif mLastSirenUpdateTime = currentTime; } } diff --git a/src/EasyBuzzer.h b/src/EasyBuzzer.h index 1a3b44e..3ca78d8 100644 --- a/src/EasyBuzzer.h +++ b/src/EasyBuzzer.h @@ -60,8 +60,6 @@ class EasyBuzzerClass void setOffDuration(unsigned int duration); /* Set Pause duration. */ void setPauseDuration(unsigned int duration); - /* Set buzzer volume. */ - void setVolume(byte volume); /* Update function that keeps the library running. */ void update(); @@ -76,7 +74,7 @@ class EasyBuzzerClass unsigned int mPauseDuration = DEFAULT_PAUSE_DURATION; unsigned int mSequences; unsigned int mVolume = DEFAULT_VOLUME; - unsigned long mStartTime; + unsigned long mStartTime = 0; unsigned long mLastRunTime; void (*mFinishedCallbackFunction)(); bool mTurnedOn = false; From 9bae29159dc06973412620f74c6e25d2fc3f49fb Mon Sep 17 00:00:00 2001 From: Fred BORRY Date: Fri, 27 Oct 2023 08:25:44 +0200 Subject: [PATCH 5/5] Fixed compilation --- src/EasyBuzzer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/EasyBuzzer.h b/src/EasyBuzzer.h index 3ca78d8..e8426cc 100644 --- a/src/EasyBuzzer.h +++ b/src/EasyBuzzer.h @@ -73,7 +73,6 @@ class EasyBuzzerClass unsigned int mOffDuration = DEFAULT_OFF_DURATION; unsigned int mPauseDuration = DEFAULT_PAUSE_DURATION; unsigned int mSequences; - unsigned int mVolume = DEFAULT_VOLUME; unsigned long mStartTime = 0; unsigned long mLastRunTime; void (*mFinishedCallbackFunction)();