#include <avr/io.h>
#include <util/delay.h>
// Definindo as constantes para as notas musicais
enum tom{
NOTA_DO = 0 ,
NOTA_DO_SUSTENIDO = 1,
NOTA_RE = 2,
NOTA_RE_SUSTENIDO = 3,
NOTA_MI = 4,
NOTA_FA = 5,
NOTA_FA_SUSTENIDO = 6,
NOTA_SOL = 7,
NOTA_SOL_SUSTENIDO = 8,
NOTA_LA = 9,
NOTA_LA_SUSTENIDO = 10,
NOTA_SI = 11
};
enum faixa{
ligando,
beep,
alarme,
desligando
};
// Definindo a quantidade de notas em uma oitava
#define NOTAS_POR_OITAVA 12
// Número de oitavas
#define NUM_OITAVAS 9
// Frequências das notas em Hz para a oitava 0 até a oitava 8
float frequencias_notas[NUM_OITAVAS][NOTAS_POR_OITAVA] = {
// Oitava 0
{16.35, 17.32, 18.35, 19.45, 20.60, 21.83, 23.12, 24.50, 25.96, 27.50, 29.14, 30.87},
// Oitava 1
{32.70, 34.65, 36.71, 38.89, 41.20, 43.65, 46.25, 49.00, 51.91, 55.00, 58.27, 61.74},
// Oitava 2
{65.41, 69.30, 73.42, 77.78, 82.41, 87.31, 92.50, 98.00, 103.83, 110.00, 116.54, 123.47},
// Oitava 3
{130.81, 138.59, 146.83, 155.56, 164.81, 174.61, 185.00, 196.00, 207.65, 220.00, 233.08, 246.94},
// Oitava 4
{261.63, 277.18, 293.66, 311.13, 329.63, 349.23, 369.99, 392.00, 415.30, 440.00, 466.16, 493.88},
// Oitava 5
{523.25, 554.37, 587.33, 622.25, 659.26, 698.46, 739.99, 783.99, 830.61, 880.00, 932.33, 987.77},
// Oitava 6
{1046.50, 1108.73, 1174.66, 1244.51, 1318.51, 1396.91, 1479.98, 1567.98, 1661.22, 1760.00, 1864.66, 1975.53},
// Oitava 7
{2093.00, 2217.46, 2349.32, 2489.02, 2637.02, 2793.83, 2959.96, 3135.96, 3322.44, 3520.00, 3729.31, 3951.07},
// Oitava 8
{4186.01, 4434.92, 4698.64, 4978.03, 5274.04, 5587.65, 5919.91, 6271.93, 6644.88, 7040.00, 7458.62, 7902.13}
};
//-------------------------------------------------------------------------------------------------------
#define F_CPU 16000000UL // Frequência do clock do microcontrolador (16 MHz para Arduino Mega)
float FREQUENCIA_PWM; // Frequência desejada do PWM em Hz
void inicializar_pwm_buzzer(){
// Configura o pino 13 (ou qualquer pino que deseje) como saída
DDRE |= (1 << PE3); // PB5 corresponde ao pino 13 no Arduino Mega
//PORTB |= (1 << PB5); //SAIDA
// Configura o Timer1 para PWM
TCCR3A |= (1 << COM3A1) | (1 << WGM31); // Configura o modo de saída não invertido (OC2A) e o modo de contagem PWM de 10 bits
TCCR3B |= (1 << WGM33) | (1 << WGM32) | (1 << CS31) | (1 << CS30); // Configura o pré-scaler para 64 (frequência do clock / 64)
ICR3 = F_CPU / 64 / FREQUENCIA_PWM - 1; // Configura o TOP para obter a frequência desejada
// O PWM está configurado, você pode ajustar o ciclo de trabalho alterando o valor do registrador OCR1A
// Exemplo: 50% de ciclo de trabalho (eficiente e audivel)
OCR3A = ICR3 / 2; //duty cyle (INMPORTANTE)
}
void beep_buzzer(int oitava, enum tom nota){
FREQUENCIA_PWM = frequencias_notas[oitava][nota];
ICR3 = F_CPU / 64 / FREQUENCIA_PWM - 1; // valor limite do temporizado TCN1 -> (TOP)
}
//padrao duracao = 250
void tocar_faixa_musical(enum faixa fx) {
//inicializa os registradores para fast pwm
inicializar_pwm_buzzer();
// Duração de cada nota em milissegundos
int duracao_nota = 250; // 0.250 segundos
// Sequência de notas para uma música simples (por exemplo)
enum tom notas_musica[] = {NOTA_DO, NOTA_RE, NOTA_MI};
//ligando
if(fx == ligando){
// Tocar cada nota na sequência
for (int i = 0; i < sizeof(notas_musica) / sizeof(notas_musica[0]); i++) {
beep_buzzer(5, notas_musica[i]); // Toca a nota
_delay_ms(300); // Aguarda a duração da nota
}
}
//beep
if(fx == beep){
// Duração de cada nota em milissegundos
beep_buzzer(5, NOTA_FA);
_delay_ms(333);
}
//alarme
if(fx == alarme){
beep_buzzer(7, NOTA_SI); // Toca a nota
_delay_ms(duracao_nota); // Aguarda a duração da nota
}
//desligando
if(fx == desligando){
// Tocar cada nota na sequência
for (int i = 3; i >= 0; i--) {
beep_buzzer(5, notas_musica[i]); // Toca a nota
_delay_ms(duracao_nota); // Aguarda a duração da nota
}
}
//parar a musica e PWM no pino
parar_musica();
}
void parar_musica() {
// Desativa o timer para parar completamente o sinal PWM
TCCR3B = 0x00; // Desativa o clock do timer
// Desativa a saída PWM
TCCR3A = 0x00;
// Zera o registrador de comparação para manter o pino em nível baixo
OCR3A = 0;
// Define o pino como entrada
//DDRB &= ~(1 << PB5);
}
void alarme_buzzer(){
tocar_faixa_musical(alarme);
_delay_ms(333);
tocar_faixa_musical(alarme);
_delay_ms(333);
tocar_faixa_musical(alarme);
}
int main(){
//tipos
tocar_faixa_musical(ligando);
_delay_ms(333);
tocar_faixa_musical(beep);
_delay_ms(333);
alarme_buzzer();
_delay_ms(333);
tocar_faixa_musical(desligando);
while(1) {
}
return 0;
}