First version. Demo of PWM setup and speaker operation. Fine grain control of the PWM parameters is an advantage Mbed has over the Arduino environment.
Diff: main.cpp
- Revision:
- 111:ac492142f160
- Parent:
- 110:e80444a6fe3a
--- a/main.cpp Tue Oct 05 13:18:23 2021 +0000 +++ b/main.cpp Thu Oct 28 02:28:59 2021 +0000 @@ -1,45 +1,32 @@ /* - Project: 21_BC_Improved_v5 (Improved Binary Counter (while loop) Version) + Project: 21_Speaker_v5 File: main.cpp - - Displays 8-bit binary count on bar graph display. This version uses a while - loop which provides a much better starting point for an Up/Down counter. - - Error in pow function use corrected in v. 1.0. - - Note: I tried to use count for the loop counter but this resulted in an - ambiguous name error. - + + Use PWM to sound speaker audio alarm. + Written by: Dr. C. S. Tritt - Created: 10/5/21 (v. 1.1) + Created: 10/27/21 (v. 1.0) */ #include "mbed.h" -DigitalIn uB(USER_BUTTON); // Button is active low (up = 1, down = 0). -const int bits = 8; // Number of bits to use. -const int c_max = pow(2, bits) - 1; // Maximum count. pow is type double. -const int sleepTime = 100; // Sleep time in milliseconds. -int myCount = 0; // Count to be displayed. Loop counter. -BusOut barGraph(D2, D3, D4, D5, D6, D7, D8, D9); // The display. +DigitalIn uB(USER_BUTTON); // The user button input (normally high). +PwmOut spkrOut(D12); // The speaker output. -int main() { - // Test the wiring. - ThisThread::sleep_for(400); // For 0.4 seconds. - barGraph = 0b01010101; // Odd bars on (binary). - ThisThread::sleep_for(400); // Test even bars for 0.4 seconds. - barGraph = 0b10101010; // Even bars on (binary). - ThisThread::sleep_for(400); // Test even bars for 0.4 seconds. - barGraph = 0xFF; // All bars on. Hex. - ThisThread::sleep_for(400); // For 0.4 seconds. - - barGraph = myCount; // Initialize the display to myCount. - // Enter main loop. +const int SLP_TIME = 100; // 0.1 s sample interval. +// PWM period: 2500 uS = 2.5 mS --> 400 Hz. +const int PWM_PRD = 2500; +const float DUTY_CYCLE = 0.5f; // Duty cycle as a fraction. +int main(void) +{ + // Setup. + spkrOut.period_us(PWM_PRD); + // Enter main loop. while(true) { - while (myCount >= 0 && myCount <= c_max) { - barGraph = myCount; // Set display to myCount. - ThisThread::sleep_for(sleepTime); // Display value for 0.1 seconds. - myCount++; + if (uB) { + spkrOut.write(0); // No sound. + } else { + spkrOut.write(DUTY_CYCLE); // Set duty cycle to sound speaker. } - myCount = 0; + ThisThread::sleep_for(SLP_TIME); // Display value for 0.1 seconds. } } \ No newline at end of file