#include #include "pico/stdlib.h" #include "inventor.hpp" /* This example shows you how you can use Inventor 2040's audio output with a speaker to play different notes and string them together into a bleepy tune. It uses code written by Avram Piltch - check out his Tom's Hardware article! https://www.tomshardware.com/uk/how-to/buzzer-music-raspberry-pi-pico Press "User" button to start or stop the song. */ using namespace inventor; // List frequencies (in hz) to play in sequence here. Use zero for when silence or a pause is wanted // Song from PicoExplorer noise.py constexpr float SONG[] = {1397, 1397, 1319, 1397, 698, 0, 698, 0, 1047, 932, 880, 1047, 1397, 0, 1397, 0, 1568, 1480, 1568, 784, 0, 784, 0, 1568, 1397, 1319, 1175, 1047, 0, 1047, 0, 1175, 1319, 1397, 1319, 1175, 1047, 1175, 1047, 932, 880, 932, 880, 784, 698, 784, 698, 659, 587, 523, 587, 659, 698, 784, 932, 880, 784, 880, 698, 0, 698}; constexpr uint SONG_LENGTH = count_of(SONG); // The time (in seconds) to play each note for. Change this to make the song play faster or slower const uint NOTE_DURATION_MS = 150; // Create a new Inventor2040W Inventor2040W board; // Variables for recording the button state and if it has been toggled // Starting as True makes the song play automatically static bool button_toggle = true; static bool last_button_state = false; // Checks if the button has been pressed, toggling a value that is also returned. bool check_button_toggle() { bool button_state = board.switch_pressed(); if(button_state && !last_button_state) { button_toggle = !button_toggle; } last_button_state = button_state; return button_toggle; } int main() { stdio_init_all(); // Attempt to initialise the board if(board.init()) { // Set the volume of the speaker output board.volume(0.25f); while(true) { // Has the button been toggled? if(check_button_toggle()) { // Play the song for(uint i = 0; i < SONG_LENGTH && check_button_toggle(); i++) { // Get the frequency of the note float freq = SONG[i]; if(freq == 0) { // This is a "pause" note, so stop the motors board.play_silence(); } else { // Get the frequency of the note and play it board.play_tone(freq); } sleep_ms(NOTE_DURATION_MS); } button_toggle = false; board.stop_playing(); } sleep_ms(10); } } return 0; }