ESP32使用有源蜂鸣器演奏《反方向的钟》

主程序

#include <iostream>
#include <memory>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "beepObject.h"
#include "music.h"
gpio_num_t beep_port;
TaskHandle_t beeptask   = NULL;
TaskHandle_t soundtask   = NULL;
std::unique_ptr<Beep> beep;
static int musicSelect = 0,peroidSelect = 0;

void soundTone(void *param)
{
    int v = *(int *)(param);
    std::cout<<"v = "<< v<<std::endl;
    if(v !=P)
    {
        while(true)
        {
            beep->beepRun(); //蜂鸣器响
            usleep(v);
            beep->beepStop();
            usleep(v);
        }
    }
    else
    {
        while(true)
        {
            vTaskDelay(1000/ portTICK_PERIOD_MS);
        }   
    }
}
void sound(const unsigned int v)
{
        beep->beepStop();
        xTaskCreate(soundTone,"soundtask",1024*5,(void *)&v,11,&soundtask);//在该音调的所有节拍之间,要一直演奏这个音调,因此开一个任务,一直演奏此调
        vTaskDelay(MUSIC_SPEED/4*Music[musicSelect+1]/ portTICK_PERIOD_MS);//等待该音调的所需节拍数
        vTaskDelete(soundtask);
}
void beepTask(void *param)
{
    while(true)
    {
        if(Music[musicSelect]!=0XFF)
        {
            peroidSelect = Music[musicSelect]; //选择音阶频率
            sound(HalfPeroidTable[peroidSelect]);
            musicSelect+=2;
            vTaskDelay(10/ portTICK_PERIOD_MS);
        }
        else
        {
            musicSelect = 0;
            peroidSelect  = 0;
        }
    }
}
extern "C" void app_main(void)
{
    beep_port = GPIO_NUM_23; //蜂鸣器端口
    beep = std::unique_ptr<Beep>(new Beep(beep_port));
    xTaskCreate(beepTask,"beeptask",1024*5,NULL,10,&beeptask);
    while (true) {
       vTaskDelay(2000/ portTICK_PERIOD_MS);
    }
}


music.h:

#define P	0
#define L1	1
#define L1_	2
#define L2	3
#define L2_	4
#define L3	5
#define L4	6
#define L4_	7
#define L5	8
#define L5_	9
#define L6	10
#define L6_	11
#define L7	12
#define M1	13
#define M1_	14
#define M2	15
#define M2_	16
#define M3	17
#define M4	18
#define M4_	19
#define M5	20
#define M5_	21
#define M6	22
#define M6_	23
#define M7	24
#define H1	25
#define H1_	26
#define H2	27
#define H2_	28
#define H3	29
#define H4	30
#define H4_	31
#define H5	32
#define H5_	33
#define H6	34
#define H6_	35
#define H7	36
#define MUSIC_SPEED 500    //500ms


const unsigned int HalfPeroidTable[]={
	0, 
	1908,1805,1701,1608,1515,1433,1351,1276,1205,1136,1073,1008,
	956,903,852,804,759,716,676,638,602,568,536,506,
	478,451,426,402,379,358,338,319,301,284,268,263,
};
const unsigned char  Music[]= //反方向的钟高潮部分
{
	M6,2,
	M5,2,
	M3,2,
	M2,4+2,
	M3,2,
	M1,2+2,
	M2,4,
	M3,2+2,
	M5,4+2,
	M6,2,
	M5,2,
	M3,2,
	M2,4+2,
	M3,2,
	M2,2+4,
	M1,2,
	M2,4,
	M1,2+4,
	0XFF
};

beepObject.h:

#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include <stdio.h>
class Beep{
public:
    Beep(gpio_num_t beep_port);
    ~Beep();
    void beepRun();
    void beepStop();
    bool isRunning();
private:
    const gpio_num_t m_port ;
};

beepObject.cpp

#include "beepObject.h"
Beep::Beep(gpio_num_t beep_port):m_port(beep_port)
{
    printf("beep object creaate\n");
    gpio_reset_pin(beep_port);
    gpio_set_direction(beep_port, GPIO_MODE_OUTPUT);
}
Beep::~Beep()
{
    printf("beep object delete\n");
}
void Beep::beepRun()
{
    gpio_set_level(this->m_port,1);
}
void Beep::beepStop()
{
    gpio_set_level(this->m_port,0);
}
  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值