You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.9 KiB

Introduction

A tiny and simple buzzer library, implements a simple turnon, turnoff, and the capabilitie to play loops and ringtones.

All functions works in NON BLOCKING MODE, so, you application will never stops the execution while handling with the device, and, inclusivelly, implementing a callback when an operation end.

Supports any microcontroller and Passive or Active buzzer.

How to Use

First, declares your buzzer_t with, at least, the pwmOut or gpioOut (just pick one! the other fxn must be NULL). About the functions:

  • void pwmOut(uint32_t freq) : Is used for PASSIVE buzzers, this function returns void and receive only the the freq argument. When implementing, the freq=0, the device MUST turnoff PWM.
  • void gpioOut(uint32_t val) : Is used for ACTIVE buzzer, the value val needs to be turnon when is 1, and 0 turnoff the Buzzer. These buzzers, doesn't can set frequency values.

The lib will automatically identifies the Buzzer type on buzzer_init(), by checking the defined fxn.

Another parameter that needs to be implemented, if user want's to user buzzer_start and buzzer_start_array, is the interruptMs, that only indicates how often you will call the buzzer_interrupt in a timer/task routine, in milliseconds.

This parameter serves to cronometer the buzzer, turning on and off, for loops, ringtones, etc.

Configuring for PASSIVE Buzzer

Bellow, is this example, we are configuring a buzzer in a generic chipset, with a 50ms timer interrupt and a PWM function.

void __pwm_buzzer_chipset(uint32_t freq);

// Buzzer Handler
buzzer_t Buzzer = {
  .pwmOut = __pwm_chipset,
  .interruptMs = 50
}

// Functions
void __pwm_buzzer_chipset(uint32_t freq){
  if (freq == 0){
    chipset_pwm_turnoff();
  }
  else{
    chipset_pwm_turnon();
    chipset_pwM_set_freq(freq);
  }
}

// Interrupts
void __tim_interrupt_50ms(){
  buzzer_interrupt(&Buzzer);
}

// Main
void main(){
  buzzer_init(&Buzzer);
}

Configuring for ACTIVE Buzzer

In this example, an active buzzer is configured and implemented, with 100ms timer interrupt and GPIO to control the Buzzer.

void __gpio_pwm_chipset(uint32_t val);

// Buzzer Handler
buzzer_t Buzzer = {
  .pwmOut = __pwm_chipset,
  .interruptMs = 100
}

// Functions
void __gpio_pwm_chipset(uint32_t val){
  chipset_gpio(BUZZER_GPIO_Port, BUZZER_Pin, val);
}

// Interrupts
void __tim_interrupt_100ms(){
  buzzer_interrupt(&Buzzer);
}

// Main
void main(){
  buzzer_init(&Buzzer);
}

Examples

For the examples, consideer a Passive Buzzer, configured with timer and everything :) For Active buzzers, all freq parameters can be 0 or NULL.

Turnon buzzer and Turnoff manually

void main(){
  ...
  // turnon buzzer with a 1500Hz frequency
  buzzer_turn_on(&Buzzer, 1500);
  
  // delay for 500ms
  chipset_delay_ms(500);
  
  // turnoff buzzer
  buzzer_stop(&Buzzer);
}

Turnon buzzer for 500ms

void main(){
  ...
  // turnon buzzer with a 1500Hz frequency for 500ms
  buzzer_start(&Buzzer, 1500, 500, BUZZER_LOOP_OFF);
}
void main(){
  ...
  // turnon buzzer with a 2500Hz frequency
  buzzer_start(&Buzzer, 2500, 500, BUZZER_LOOP_ON);
  
  // The BUZZER_LOOP_ON parameter indicates that the Buzzer will be turnon for 500ms,
  // turnoff for the same period, and repeat the process
}

Play Super Mario Ringtone and turnon a LED after finish

// this callback is called when a buzzer_start or buzzer_start_array finish
// the solicitaded operation. In this case, when the Mario Ringtone is
// finished, the callback will be called
void buzzer_end_callback(buzzer_t *buzzer){
  led_red(TRUE);
}

void main(){
  ...
  // play Mario Theme ringtone, that's included on the library :D
  buzzer_start_array(&Buzzer, mario_theme_time, mario_theme_melody, mario_theme_len);

}

Doubts

Any doubts, or issues, just post an issue.

Best regards folks.