Make noise with a piezo buzzer. Use a pwm pin. IO expander ints done.

Dependencies:   aconno_bsp mbed

Fork of beep by Jurica Resetar

Committer:
jurica238814
Date:
Thu Sep 22 18:11:47 2016 +0000
Revision:
5:49c961e79a12
Parent:
4:d8e14429a95f
Child:
6:936ba3699e47
Beep RTTL done =)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:18e4a9c978ec 1 #include "beep.h"
dreschpe 0:18e4a9c978ec 2 #include "mbed.h"
jurica238814 5:49c961e79a12 3 #include "notes.h"
dreschpe 0:18e4a9c978ec 4
dreschpe 2:a34405c20cf5 5 /** class to make sound with a buzzer, based on a PwmOut
dreschpe 3:5a8242af60ba 6 * The class use a timeout to switch off the sound - it is not blocking while making noise
dreschpe 3:5a8242af60ba 7 *
dreschpe 3:5a8242af60ba 8 * Example:
dreschpe 3:5a8242af60ba 9 * @code
dreschpe 3:5a8242af60ba 10 * // Beep with 1Khz for 0.5 seconds
dreschpe 3:5a8242af60ba 11 * #include "mbed.h"
dreschpe 3:5a8242af60ba 12 * #include "beep.h"
dreschpe 3:5a8242af60ba 13 *
dreschpe 3:5a8242af60ba 14 * Beep buzzer(p21);
dreschpe 3:5a8242af60ba 15 *
dreschpe 3:5a8242af60ba 16 * int main() {
dreschpe 3:5a8242af60ba 17 * ...
dreschpe 3:5a8242af60ba 18 * buzzer.beep(1000,0.5);
dreschpe 3:5a8242af60ba 19 * ...
dreschpe 3:5a8242af60ba 20 * }
dreschpe 3:5a8242af60ba 21 * @endcode
dreschpe 3:5a8242af60ba 22 */
dreschpe 2:a34405c20cf5 23
jurica238814 5:49c961e79a12 24 int notes[] = { 0,
jurica238814 5:49c961e79a12 25 NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
jurica238814 5:49c961e79a12 26 NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
jurica238814 5:49c961e79a12 27 NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
jurica238814 5:49c961e79a12 28 NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
jurica238814 5:49c961e79a12 29 };
jurica238814 5:49c961e79a12 30
jurica238814 5:49c961e79a12 31
dreschpe 0:18e4a9c978ec 32 using namespace mbed;
dreschpe 3:5a8242af60ba 33 // constructor
dreschpe 2:a34405c20cf5 34 /** Create a Beep object connected to the specified PwmOut pin
dreschpe 3:5a8242af60ba 35 *
dreschpe 3:5a8242af60ba 36 * @param pin PwmOut pin to connect to
dreschpe 3:5a8242af60ba 37 */
dreschpe 2:a34405c20cf5 38
dreschpe 0:18e4a9c978ec 39 Beep::Beep(PinName pin) : _pwm(pin) {
dreschpe 0:18e4a9c978ec 40 _pwm.write(0.0); // after creating it have to be off
dreschpe 0:18e4a9c978ec 41 }
dreschpe 0:18e4a9c978ec 42
dreschpe 2:a34405c20cf5 43 /** stop the beep instantaneous
dreschpe 3:5a8242af60ba 44 * usually not used
dreschpe 3:5a8242af60ba 45 */
dreschpe 0:18e4a9c978ec 46 void Beep::nobeep() {
dreschpe 0:18e4a9c978ec 47 _pwm.write(0.0);
dreschpe 0:18e4a9c978ec 48 }
dreschpe 0:18e4a9c978ec 49
dreschpe 2:a34405c20cf5 50 /** Beep with given frequency and duration.
dreschpe 3:5a8242af60ba 51 *
dreschpe 3:5a8242af60ba 52 * @param frequency - the frequency of the tone in Hz
dreschpe 3:5a8242af60ba 53 * @param time - the duration of the tone in seconds
dreschpe 3:5a8242af60ba 54 */
dreschpe 2:a34405c20cf5 55
dreschpe 0:18e4a9c978ec 56 void Beep::beep(float freq, float time) {
dreschpe 0:18e4a9c978ec 57
dreschpe 0:18e4a9c978ec 58 _pwm.period(1.0/freq);
dreschpe 0:18e4a9c978ec 59 _pwm.write(0.5); // 50% duty cycle - beep on
dreschpe 0:18e4a9c978ec 60 toff.attach(this,&Beep::nobeep, time); // time to off
dreschpe 0:18e4a9c978ec 61 }
dreschpe 0:18e4a9c978ec 62
dreschpe 0:18e4a9c978ec 63
jurica238814 5:49c961e79a12 64 void Beep::playRttl(char *p){
jurica238814 5:49c961e79a12 65 char default_dur = 4;
jurica238814 5:49c961e79a12 66 char default_oct = 6;
jurica238814 5:49c961e79a12 67 int bpm = 63;
jurica238814 5:49c961e79a12 68 int num;
jurica238814 5:49c961e79a12 69 long wholenote;
jurica238814 5:49c961e79a12 70 long duration;
jurica238814 5:49c961e79a12 71 char note;
jurica238814 5:49c961e79a12 72 char scale;
jurica238814 5:49c961e79a12 73
jurica238814 5:49c961e79a12 74 // format: d=N,o=N,b=NNN:
jurica238814 5:49c961e79a12 75 // find the start (skip name, etc)
jurica238814 5:49c961e79a12 76
jurica238814 5:49c961e79a12 77 while(*p != ':') p++; // ignore name
jurica238814 5:49c961e79a12 78 p++; // skip ':'
jurica238814 5:49c961e79a12 79
jurica238814 5:49c961e79a12 80 // get default duration
jurica238814 5:49c961e79a12 81 if(*p == 'd')
jurica238814 5:49c961e79a12 82 {
jurica238814 5:49c961e79a12 83 p++; p++; // skip "d="
jurica238814 5:49c961e79a12 84 num = 0;
jurica238814 5:49c961e79a12 85 while(isdigit(*p))
jurica238814 5:49c961e79a12 86 {
jurica238814 5:49c961e79a12 87 num = (num * 10) + (*p++ - '0');
jurica238814 5:49c961e79a12 88 }
jurica238814 5:49c961e79a12 89 if(num > 0) default_dur = num;
jurica238814 5:49c961e79a12 90 p++; // skip comma
jurica238814 5:49c961e79a12 91 }
jurica238814 5:49c961e79a12 92
jurica238814 5:49c961e79a12 93
jurica238814 5:49c961e79a12 94 // get default octave
jurica238814 5:49c961e79a12 95 if(*p == 'o')
jurica238814 5:49c961e79a12 96 {
jurica238814 5:49c961e79a12 97 p++; p++; // skip "o="
jurica238814 5:49c961e79a12 98 num = *p++ - '0';
jurica238814 5:49c961e79a12 99 if(num >= 3 && num <=7) default_oct = num;
jurica238814 5:49c961e79a12 100 p++; // skip comma
jurica238814 5:49c961e79a12 101 }
jurica238814 5:49c961e79a12 102
jurica238814 5:49c961e79a12 103
jurica238814 5:49c961e79a12 104 // get BPM
jurica238814 5:49c961e79a12 105 if(*p == 'b')
jurica238814 5:49c961e79a12 106 {
jurica238814 5:49c961e79a12 107 p++; p++; // skip "b="
jurica238814 5:49c961e79a12 108 num = 0;
jurica238814 5:49c961e79a12 109 while(isdigit(*p))
jurica238814 5:49c961e79a12 110 {
jurica238814 5:49c961e79a12 111 num = (num * 10) + (*p++ - '0');
jurica238814 5:49c961e79a12 112 }
jurica238814 5:49c961e79a12 113 bpm = num;
jurica238814 5:49c961e79a12 114 p++; // skip colon
jurica238814 5:49c961e79a12 115 }
jurica238814 5:49c961e79a12 116
jurica238814 5:49c961e79a12 117
jurica238814 5:49c961e79a12 118 // BPM usually expresses the number of quarter notes per minute
jurica238814 5:49c961e79a12 119 wholenote = (60 * 1000L / bpm) * 4; // this is the time for whole note (in seconds)
jurica238814 5:49c961e79a12 120
dreschpe 0:18e4a9c978ec 121
dreschpe 0:18e4a9c978ec 122
jurica238814 5:49c961e79a12 123 // now begin note loop
jurica238814 5:49c961e79a12 124 while(*p)
jurica238814 5:49c961e79a12 125 {
jurica238814 5:49c961e79a12 126 // first, get note duration, if available
jurica238814 5:49c961e79a12 127 num = 0;
jurica238814 5:49c961e79a12 128 while(isdigit(*p))
jurica238814 5:49c961e79a12 129 {
jurica238814 5:49c961e79a12 130 num = (num * 10) + (*p++ - '0');
jurica238814 5:49c961e79a12 131 }
jurica238814 5:49c961e79a12 132
jurica238814 5:49c961e79a12 133 if(num) duration = wholenote / num;
jurica238814 5:49c961e79a12 134 else duration = wholenote / default_dur; // we will need to check if we are a dotted note after
jurica238814 5:49c961e79a12 135
jurica238814 5:49c961e79a12 136 // now get the note
jurica238814 5:49c961e79a12 137 note = 0;
jurica238814 5:49c961e79a12 138
jurica238814 5:49c961e79a12 139 switch(*p)
jurica238814 5:49c961e79a12 140 {
jurica238814 5:49c961e79a12 141 case 'c':
jurica238814 5:49c961e79a12 142 note = 1;
jurica238814 5:49c961e79a12 143 break;
jurica238814 5:49c961e79a12 144 case 'd':
jurica238814 5:49c961e79a12 145 note = 3;
jurica238814 5:49c961e79a12 146 break;
jurica238814 5:49c961e79a12 147 case 'e':
jurica238814 5:49c961e79a12 148 note = 5;
jurica238814 5:49c961e79a12 149 break;
jurica238814 5:49c961e79a12 150 case 'f':
jurica238814 5:49c961e79a12 151 note = 6;
jurica238814 5:49c961e79a12 152 break;
jurica238814 5:49c961e79a12 153 case 'g':
jurica238814 5:49c961e79a12 154 note = 8;
jurica238814 5:49c961e79a12 155 break;
jurica238814 5:49c961e79a12 156 case 'a':
jurica238814 5:49c961e79a12 157 note = 10;
jurica238814 5:49c961e79a12 158 break;
jurica238814 5:49c961e79a12 159 case 'b':
jurica238814 5:49c961e79a12 160 note = 12;
jurica238814 5:49c961e79a12 161 break;
jurica238814 5:49c961e79a12 162 case 'p':
jurica238814 5:49c961e79a12 163 default:
jurica238814 5:49c961e79a12 164 note = 0;
jurica238814 5:49c961e79a12 165 }
jurica238814 5:49c961e79a12 166 p++;
jurica238814 5:49c961e79a12 167
jurica238814 5:49c961e79a12 168 // now, get optional '#' sharp
jurica238814 5:49c961e79a12 169 if(*p == '#')
jurica238814 5:49c961e79a12 170 {
jurica238814 5:49c961e79a12 171 note++;
jurica238814 5:49c961e79a12 172 p++;
jurica238814 5:49c961e79a12 173 }
jurica238814 5:49c961e79a12 174
jurica238814 5:49c961e79a12 175 // now, get optional '.' dotted note
jurica238814 5:49c961e79a12 176 if(*p == '.')
jurica238814 5:49c961e79a12 177 {
jurica238814 5:49c961e79a12 178 duration += duration/2;
jurica238814 5:49c961e79a12 179 p++;
jurica238814 5:49c961e79a12 180 }
jurica238814 5:49c961e79a12 181
jurica238814 5:49c961e79a12 182 // now, get scale
jurica238814 5:49c961e79a12 183 if(isdigit(*p))
jurica238814 5:49c961e79a12 184 {
jurica238814 5:49c961e79a12 185 scale = *p - '0';
jurica238814 5:49c961e79a12 186 p++;
jurica238814 5:49c961e79a12 187 }
jurica238814 5:49c961e79a12 188 else
jurica238814 5:49c961e79a12 189 {
jurica238814 5:49c961e79a12 190 scale = default_oct;
jurica238814 5:49c961e79a12 191 }
jurica238814 5:49c961e79a12 192
jurica238814 5:49c961e79a12 193 scale += OCTAVE_OFFSET;
jurica238814 5:49c961e79a12 194
jurica238814 5:49c961e79a12 195 if(*p == ',')
jurica238814 5:49c961e79a12 196 p++; // skip comma for next note (or we may be at the end)
jurica238814 5:49c961e79a12 197
jurica238814 5:49c961e79a12 198 // now play the note
jurica238814 5:49c961e79a12 199
jurica238814 5:49c961e79a12 200 if(note)
jurica238814 5:49c961e79a12 201 {
jurica238814 5:49c961e79a12 202 beep(notes[(scale - 4) * 12 + note], (float)duration/1000);
jurica238814 5:49c961e79a12 203 wait((float)duration/1000);
jurica238814 5:49c961e79a12 204 }
jurica238814 5:49c961e79a12 205 else
jurica238814 5:49c961e79a12 206 {
jurica238814 5:49c961e79a12 207 //wait((float)duration/1000);
jurica238814 5:49c961e79a12 208 }
jurica238814 5:49c961e79a12 209 }
jurica238814 5:49c961e79a12 210 }
jurica238814 5:49c961e79a12 211