Make noise with a piezo buzzer. Use a pwm pin. IO expander ints done.
Fork of beep by
beep.cpp
- Committer:
- jurica238814
- Date:
- 2016-09-23
- Revision:
- 6:936ba3699e47
- Parent:
- 5:49c961e79a12
File content as of revision 6:936ba3699e47:
#include "beep.h" #include "mbed.h" #include "notes.h" #include "MCP23017.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); } /* * SEE IF THERE'S INTERRUPT OCCURED */ if (getInt()){ nobeep(); return; } } }