#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/clocks.h"
#include "hardware/pwm.h"
// Vetores de notas musicais (frequências) e durações (em ms)
int notas[] = {
659, 698, 587, 698, 880, 659, 554, 880, 659, 698, 587, 698, 880, 659, 554, 880, 659, 698, 587, 698, 880, 659, 554, 880, 294, 330, 349, 440, 392, 440, 262, 294, 330, 349, 330, 392, 440, 392, 349, 349, 349, 349, 440, 440, 392, 349,
440, 440, 440, 392, 440, 392, 349, 349, 349, 349, 440, 440, 392, 349, 440, 440, 440, 554, 554, 554, 349, 349, 349, 440, 440, 392, 349,
466, 466, 466, 392, 523, 440, 659, 698, 587, 698, 880, 659, 554, 880, 1109, 1175
}; // notas musicais
int tempo[] = {
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 400, 200, 400, 200, 200, 200, 400, 400, 200, 200, 200, 200, 200, 200, 200, 100, 100, 100, 100, 100, 100, 200,
100, 100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 100, 200, 100, 100, 200, 100, 100, 200, 100, 100, 100, 100, 100, 100, 200,
100, 100, 100, 200, 200, 200, 200, 50, 50, 50, 50, 50, 50, 50, 50, 1000
}; // duração das notas musicais (em ms)
int pausa[] = {
65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 200, 0, 400, 100, 100, 0, 400, 200, 0, 200, 200, 200, 200, 200, 400, 100, 100, 100, 100, 100, 100, 200, 100, 100, 100, 100, 100, 200,
100, 100, 100, 100, 100, 100, 200, 100, 100, 200, 100, 100, 200, 100, 100, 100, 100, 100, 100, 200, 100, 100, 100, 200, 200, 200, 200,
50, 50, 50, 50, 50, 50, 50, 50, 1000
}; // duração das pausas entre as notas (em ms)
const uint LED_PIN = 13; // Pino do LED (ajustado para o pino 10)
const uint BUZZER_PIN = 21; // Pino do buzzer (ajustado para o pino 8)
// Função para configuração do Buzzer
void configurar_buzzer(int pin)
{
gpio_set_function(pin, GPIO_FUNC_PWM); // Escolhe o pino para PWM (buzzer)
uint slice_num = pwm_gpio_to_slice_num(pin);
pwm_config configuracao = pwm_get_default_config();
pwm_config_set_clkdiv(&configuracao, 0.5); // Reduz o divisor de clock para aumentar a frequência
pwm_init(slice_num, &configuracao, true);
pwm_set_gpio_level(pin, 0); // Inicializa o nível de PWM em 0 (sem som)
}
// Função para ajustar a frequência usada
void ajustar_frequencia(int pin, int freq)
{
uint slice_num = pwm_gpio_to_slice_num(pin);
uint32_t clock_div = clock_get_hz(clk_sys) / (freq * 5000);
pwm_set_wrap(slice_num, 5000 - 1); // Ajusta o wrap para o valor adequado para a frequência
pwm_set_clkdiv(slice_num, clock_div); // Configura o divisor de clock com base na frequência
}
// Função responsável por emitir o som no pino escolhido
void emitir_som(int pin, int freq, int duracao_ms)
{
ajustar_frequencia(pin, freq); // Ajusta a frequência
pwm_set_gpio_level(pin, 2500); // Ativa o PWM com um nível de duty cycle (volume)
sleep_ms(duracao_ms); // Toca a nota pelo tempo determinado
pwm_set_gpio_level(pin, 0); // Desliga o PWM após a duração da nota
}
int main() {
stdio_init_all(); // Inicializa a comunicação serial (se necessário)
// Inicializa o LED
gpio_init(LED_PIN);
gpio_set_dir(LED_PIN, GPIO_OUT);
// Inicializa o Buzzer
configurar_buzzer(BUZZER_PIN);
// Loop para tocar a música
while (true) {
for (int i = 0; i < sizeof(notas) / sizeof(notas[0]); i++) {
// Toca a nota correspondente no buzzer
emitir_som(BUZZER_PIN, notas[i], tempo[i]);
//printf("Nota %d: %d Hz\n", i + 1, notas[i]);
// Acende o LED enquanto o buzzer está tocando
gpio_put(LED_PIN, 1);
sleep_ms(tempo[i]); // Mantém o LED aceso durante a duração da nota
gpio_put(LED_PIN, 0);
sleep_ms(pausa[i]); // Pausa entre as notas, com o LED apagado
}
}
}