Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplified ESP32 code + siren effect #23

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/Config.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,14 @@ 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 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).
Expand Down
135 changes: 104 additions & 31 deletions src/EasyBuzzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {}
Expand All @@ -37,20 +34,12 @@ 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)())
{
mMode = Mode::BEEP;
mFreq = frequency;
mOnDuration = onDuration ? max(MINIMUM_INTERVAL, onDuration) : 0;
mOffDuration = offDuration ? max(MINIMUM_INTERVAL, offDuration) : 0;
Expand All @@ -60,27 +49,51 @@ 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);
}

/** 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()
{
#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)
Expand All @@ -102,6 +115,7 @@ void EasyBuzzerClass::setPauseDuration(unsigned int duration)
{
mPauseDuration = duration;
}

/* Update function that keeps the library running. */
void EasyBuzzerClass::update()
{
Expand All @@ -116,13 +130,29 @@ 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;

if (!sequenceDuration || (mSequences != 0 && elapsedTime / sequenceDuration >= mSequences))
{
mStartTime = 0;
mTurnedOn = false;
mTurnedOff = false;
if (mFinishedCallbackFunction)
{
mFinishedCallbackFunction();
Expand All @@ -133,26 +163,69 @@ void EasyBuzzerClass::update()
unsigned int blinkingDuration = blinkDuration * mBeeps;
unsigned int timeInSequence = elapsedTime % sequenceDuration;

#if defined ESP32
if (timeInSequence < blinkingDuration && timeInSequence % blinkDuration < mOnDuration)
{
ledcAttachPin(mPin, mChannel);
ledcWriteTone(mChannel, mFreq);
if(!mTurnedOn)
{
tone(mPin, mFreq);
mTurnedOn = true;
mTurnedOff = false;
}
}
else
{
ledcDetachPin(mPin);
if(!mTurnedOff)
{
noTone(mPin);
mTurnedOff = true;
mTurnedOn = false;
}
};
#else
if (timeInSequence < blinkingDuration && timeInSequence % blinkDuration < mOnDuration)
}

void EasyBuzzerClass::updateSiren(unsigned long currentTime)
{
if(!mTurnedOn)
{
tone(mPin, mFreq);
mTurnedOn = true;
mLastSirenUpdateTime = currentTime;
}
else
else if(currentTime - mLastSirenUpdateTime >= mSirenDelay)
{
noTone(mPin);
};
#endif
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;
}
}
}
tone(mPin, mFreq);
mLastSirenUpdateTime = currentTime;
}
}

EasyBuzzerClass EasyBuzzer;
20 changes: 17 additions & 3 deletions src/EasyBuzzer.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ Github: https://github.com/evert-arias/EasyBuzzer
class EasyBuzzerClass
{
public:
enum class Mode { BEEP, SIREN };
EasyBuzzerClass();
~EasyBuzzerClass();
/* Beep continuously. */
Expand All @@ -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. */
Expand All @@ -65,15 +68,26 @@ 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 long mStartTime;
unsigned long mStartTime = 0;
unsigned long mLastRunTime;
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;
Expand Down