Make noise with a piezo buzzer. Use a pwm pin.
Dependents: acd52832_beep_buzzer
Fork of beep by
beep.cpp
- Committer:
- jurica238814
- Date:
- 2016-09-22
- Revision:
- 5:49c961e79a12
- Parent:
- 4:d8e14429a95f
File content as of revision 5:49c961e79a12:
#include "beep.h"
#include "mbed.h"
#include "notes.h"
/** class to make sound with a buzzer, based on a PwmOut
* The class use a timeout to switch off the sound - it is not blocking while making noise
*
* Example:
* @code
* // Beep with 1Khz for 0.5 seconds
* #include "mbed.h"
* #include "beep.h"
*
* Beep buzzer(p21);
*
* int main() {
* ...
* buzzer.beep(1000,0.5);
* ...
* }
* @endcode
*/
int notes[] = { 0,
NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};
using namespace mbed;
// constructor
/** Create a Beep object connected to the specified PwmOut pin
*
* @param pin PwmOut pin to connect to
*/
Beep::Beep(PinName pin) : _pwm(pin) {
_pwm.write(0.0); // after creating it have to be off
}
/** stop the beep instantaneous
* usually not used
*/
void Beep::nobeep() {
_pwm.write(0.0);
}
/** Beep with given frequency and duration.
*
* @param frequency - the frequency of the tone in Hz
* @param time - the duration of the tone in seconds
*/
void Beep::beep(float freq, float time) {
_pwm.period(1.0/freq);
_pwm.write(0.5); // 50% duty cycle - beep on
toff.attach(this,&Beep::nobeep, time); // time to off
}
void Beep::playRttl(char *p){
char default_dur = 4;
char default_oct = 6;
int bpm = 63;
int num;
long wholenote;
long duration;
char note;
char scale;
// format: d=N,o=N,b=NNN:
// find the start (skip name, etc)
while(*p != ':') p++; // ignore name
p++; // skip ':'
// get default duration
if(*p == 'd')
{
p++; p++; // skip "d="
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
if(num > 0) default_dur = num;
p++; // skip comma
}
// get default octave
if(*p == 'o')
{
p++; p++; // skip "o="
num = *p++ - '0';
if(num >= 3 && num <=7) default_oct = num;
p++; // skip comma
}
// get BPM
if(*p == 'b')
{
p++; p++; // skip "b="
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
bpm = num;
p++; // skip colon
}
// BPM usually expresses the number of quarter notes per minute
wholenote = (60 * 1000L / bpm) * 4; // this is the time for whole note (in seconds)
// now begin note loop
while(*p)
{
// first, get note duration, if available
num = 0;
while(isdigit(*p))
{
num = (num * 10) + (*p++ - '0');
}
if(num) duration = wholenote / num;
else duration = wholenote / default_dur; // we will need to check if we are a dotted note after
// now get the note
note = 0;
switch(*p)
{
case 'c':
note = 1;
break;
case 'd':
note = 3;
break;
case 'e':
note = 5;
break;
case 'f':
note = 6;
break;
case 'g':
note = 8;
break;
case 'a':
note = 10;
break;
case 'b':
note = 12;
break;
case 'p':
default:
note = 0;
}
p++;
// now, get optional '#' sharp
if(*p == '#')
{
note++;
p++;
}
// now, get optional '.' dotted note
if(*p == '.')
{
duration += duration/2;
p++;
}
// now, get scale
if(isdigit(*p))
{
scale = *p - '0';
p++;
}
else
{
scale = default_oct;
}
scale += OCTAVE_OFFSET;
if(*p == ',')
p++; // skip comma for next note (or we may be at the end)
// now play the note
if(note)
{
beep(notes[(scale - 4) * 12 + note], (float)duration/1000);
wait((float)duration/1000);
}
else
{
//wait((float)duration/1000);
}
}
}
