主程序
#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);
}