在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

聚豐項(xiàng)目 > 基于rtt的智能播放器的設(shè)計(jì)方法

基于rtt的智能播放器的設(shè)計(jì)方法

基于rtt的智能播放器,能夠在sd card播放多個(gè)音樂(lè),歌曲與歌曲之間的切換,RGB燈實(shí)現(xiàn)的閃爍效果。能夠隨著音樂(lè)的播放實(shí)現(xiàn)燈光同步。

jf_56333662 jf_56333662

分享
0 喜歡這個(gè)項(xiàng)目
團(tuán)隊(duì)介紹

jf_56333662 jf_56333662

團(tuán)隊(duì)成員

吳迪 負(fù)責(zé)人

分享
項(xiàng)目簡(jiǎn)介
基于rtt的智能播放器,能夠在sd card播放多個(gè)音樂(lè),歌曲與歌曲之間的切換,RGB燈實(shí)現(xiàn)的閃爍效果。能夠隨著音樂(lè)的播放實(shí)現(xiàn)燈光同步。
硬件說(shuō)明

RT-Thread版本:4.0.3

通過(guò)rtt的sd卡接口,放入無(wú)損的wav格式音樂(lè)。

untitled.png

通過(guò)板載的3.5mm耳機(jī)口。插入揚(yáng)聲器

從而實(shí)現(xiàn)音樂(lè)的輸出。




軟件說(shuō)明

開(kāi)啟音樂(lè)播放條件

image.png

開(kāi)啟對(duì)WAV格式的支持。

image.png

開(kāi)啟對(duì)sd卡的支持。

image.png

開(kāi)啟按鈕控制功能

image.png

這樣設(shè)置好了以后,能夠播放音樂(lè)的基本條件就已經(jīng)實(shí)現(xiàn)了。

1.首先查找 Audio 設(shè)備獲取設(shè)備句柄。

2.以只寫(xiě)方式打開(kāi) Audio 設(shè)備。

3.設(shè)置音頻參數(shù)信息(采樣率、通道等)。

4.解碼音頻文件的數(shù)據(jù)。

5.寫(xiě)入音頻文件數(shù)據(jù)。

6.播放完成,關(guān)閉設(shè)備。

int wavplayer_play(char *uri);//音樂(lè)播放

int wavplayer_stop(void);// 結(jié)束播放

int wavplayer_pause(void);//暫停播放

int wavplayer_resume(void):// 繼續(xù)播放

int wavplayer_volume_set(int volume);//音量設(shè)置

 

RGB燈效的控制方法

#include "led_app.h"

 

#define THREAD_PRIORITY         7

#define THREAD_STACK_SIZE       512

#define THREAD_TIMESLICE        3

 

uint32_t pulse_pulse = 90000;

 

#define PWM_DEV_NAME_R        "t5pwm"  /* PWM設(shè)備名稱 */

#define PWM_DEV_CHANNEL_R     1       /* PWM通道 */

 

#define PWM_DEV_NAME_G        "lpwm0"  /* PWM設(shè)備名稱 */

#define PWM_DEV_CHANNEL_G     1       /* PWM通道 */

 

#define PWM_DEV_NAME_B        "lpwm2"  /* PWM設(shè)備名稱 */

#define PWM_DEV_CHANNEL_B     3       /* PWM通道 */

 

struct rt_device_pwm *pwm_dev_r;      /* PWM設(shè)備句柄 */

struct rt_device_pwm *pwm_dev_g;      /* PWM設(shè)備句柄 */

struct rt_device_pwm *pwm_dev_b;      /* PWM設(shè)備句柄 */

 

static rt_thread_t pwm_led_tid = RT_NULL;

 

/* 線程 pwm_led_thread_entry 的入口函數(shù) */

/**

  * @brief  pwm_led_thread_entry

  * @param  parameter

  * @retval None

  */

static void pwm_led_thread_entry(void *parameter)

{

    rt_uint32_t period, pulse_r,pulse_g,pulse_b, dir_r,dir_g,dir_b;

 

    period = 655360;    /* 周期為0.5ms,單位為納秒ns */

    dir_r = 1;           /* PWM脈沖寬度值的增減方向 */

    dir_g = 1;

    dir_b = 1;

    pulse_r = 0;          /* PWM脈沖寬度值,單位為納秒ns */

    pulse_g = 0;

    pulse_b = 0;

 

    rt_uint16_t r,g,b;

 

    /* 查找設(shè)備 */

    pwm_dev_r = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME_R);

    if (pwm_dev_r == RT_NULL)

    {

        rt_kprintf("pwm led r run failed! can't find %s device!\n", PWM_DEV_NAME_G);

    }

 

    pwm_dev_g = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME_G);

    if (pwm_dev_g == RT_NULL)

    {

        rt_kprintf("pwm led g run failed! can't find %s device!\n", PWM_DEV_NAME_G);

    }

 

    pwm_dev_b = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME_B);

    if (pwm_dev_b == RT_NULL)

    {

        rt_kprintf("pwm led b run failed! can't find %s device!\n", PWM_DEV_NAME_B);

    }

 

    /* 設(shè)置PWM周期和脈沖寬度默認(rèn)值 */

    rt_pwm_set(pwm_dev_r, PWM_DEV_CHANNEL_R, period, pulse_r);

    rt_pwm_set(pwm_dev_g, PWM_DEV_CHANNEL_G, period, pulse_g);

    rt_pwm_set(pwm_dev_b, PWM_DEV_CHANNEL_B, period, pulse_b);

 

    /* 使能設(shè)備 */

    rt_pwm_enable(pwm_dev_r, PWM_DEV_CHANNEL_R);

    rt_pwm_enable(pwm_dev_g, PWM_DEV_CHANNEL_G);

    rt_pwm_enable(pwm_dev_b, PWM_DEV_CHANNEL_B);

 

    while (1)

    {

        for (r =0 ; r < 8; r++)

        {

            if (dir_r)

            {

                pulse_r += pulse_pulse;      /* 從0值開(kāi)始每次增加5000ns */

            }

            else

            {

                pulse_r -= pulse_pulse;      /* 從最大值開(kāi)始每次減少5000ns */

            }

            if ((pulse_r) >= period)

            {

                dir_r = 0;

            }

            if (81920 > pulse_r)

            {

                dir_r = 1;

            }

            /* 設(shè)置PWM周期和脈沖寬度 */

            rt_pwm_set(pwm_dev_r, PWM_DEV_CHANNEL_R, period, pulse_r);

            for(g = 0; g < 8; g++)

            {

                if (dir_g)

                {

                    pulse_g += pulse_pulse;      /* 從0值開(kāi)始每次增加5000ns */

                }

                else

                {

                    pulse_g -= pulse_pulse;      /* 從最大值開(kāi)始每次減少5000ns */

                }

                if ((pulse_g) >= period)

                {

                    dir_g = 0;

                }

                if (81920 > pulse_g)

                {

                    dir_g = 1;

                }

                rt_pwm_set(pwm_dev_g, PWM_DEV_CHANNEL_G, period, pulse_g);

                for(b = 0; b < 8; b++)

                {

                    rt_thread_mdelay(10);

                    if (dir_b)

                    {

                        pulse_b += pulse_pulse;      /* 從0值開(kāi)始每次增加5000ns */

                    }

                    else

                    {

                        pulse_b -= pulse_pulse;      /* 從最大值開(kāi)始每次減少5000ns */

                    }

                    if ((pulse_b) >= period)

                    {

                        dir_b = 0;

                    }

                    if (81920 > pulse_b)

                    {

                        dir_b = 1;

                    }

 

                    rt_pwm_set(pwm_dev_b, PWM_DEV_CHANNEL_B, period, pulse_b);

                }

            }

 

        }

    }

}

 

/* 線程初始化*/

int pwm_led(void)

{

    /* 創(chuàng)建線程,名稱是 pwm_led_thread,入口是 pwm_led_thread*/

    pwm_led_tid = rt_thread_create("pwm_led_thread",

                                   pwm_led_thread_entry,

                                   RT_NULL,

                                   THREAD_STACK_SIZE,

                                   THREAD_PRIORITY,

                                   THREAD_TIMESLICE);

 

    /* 如果獲得線程控制塊,啟動(dòng)這個(gè)線程 */

    if (pwm_led_tid != RT_NULL)

        rt_thread_startup(pwm_led_tid);

 

    return 0;

}

 

/* 導(dǎo)出到 msh 命令列表中 */

//MSH_CMD_EXPORT(pwm_led, pwm led);

 

INIT_APP_EXPORT(pwm_led);

 

音頻設(shè)備的控制方法。

 

#include "uart_app.h"

#include "key_app.h"

#include "led_app.h"

 

#define SAMPLE_UART_NAME                 "uart1"

 

uint8_t ch;

uint8_t r_index = 0;

uint8_t flag = 0;

extern uint32_t cnt_music;

extern uint32_t cnt_channels;

extern uint32_t cnt_volume;

extern uint32_t  start_flag;

extern char *table[NUM_OF_SONGS];

 

extern uint32_t pulse_pulse;

 

struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;  /* 初始化配置參數(shù) */

 

/* 用于接收消息的信號(hào)量 */

static struct rt_semaphore rx_sem;

static rt_device_t serial;

 

void analyticald_data(void)

{

    uint8_t sum;

 

    if(ch == 0x01)

    {

        wavplayer_play(table[(cnt_music++) % NUM_OF_SONGS]);

    }

    else if(ch == 0x02)

    {

        if (cnt_volume < 11 )

        {

            if(start_flag)

            {

                start_flag = 0;

                cnt_volume = (int)saia_volume_get()/10;

                pulse_pulse = 9000;

            }

            else

            {

                saia_volume_set(cnt_volume * 10);

                pulse_pulse = cnt_volume*9000;

            }

        }

        else

        {

            saia_volume_set(10);

            cnt_volume = 1;

            rt_kprintf("The volume has been adjusted to maximum\n");

        }

        cnt_volume ++;

        rt_kprintf("vol=%d\n", saia_volume_get());

    }

    else if(ch == 0x03)

    {

        if (cnt_channels < 3)

        {

            saia_channels_set(cnt_channels);

        }

        else

        {

            saia_channels_set(cnt_channels);

            cnt_channels = 1;

        }

        cnt_channels++;

    }

}

 

/* 接收數(shù)據(jù)回調(diào)函數(shù) */

static rt_err_t uart_rx_ind(rt_device_t dev, rt_size_t size)

{

    /* 串口接收到數(shù)據(jù)后產(chǎn)生中斷,調(diào)用此回調(diào)函數(shù),然后發(fā)送接收信號(hào)量 */

    if (size > 0)

    {

        rt_sem_release(&rx_sem);

    }

    return RT_EOK;

}

 

static char uart_sample_get_char(void)

{

    uint8_t ch;

 

    while (rt_device_read(serial, 0, &ch, 1) == 0)

    {

        rt_sem_control(&rx_sem, RT_IPC_CMD_RESET, RT_NULL);

        rt_sem_take(&rx_sem, RT_WAITING_FOREVER);

    }

    return ch;

}

 

/* 數(shù)據(jù)解析線程 */

static void data_parsing(void)

{

    while (1)

    {

        ch = uart_sample_get_char();

        flag = 1;

    }

}

 

int uart_init(void)

{

    rt_err_t ret = RT_EOK;

    char uart_name[RT_NAME_MAX];

    //char str[] = "hello RT-Thread!\r\n";

 

    rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);

 

    /* 查找系統(tǒng)中的串口設(shè)備 */

    serial = rt_device_find(uart_name);

    if (!serial)

    {

        rt_kprintf("find %s failed!\n", uart_name);

        return RT_ERROR;

    }

    /* step2:修改串口配置參數(shù) */

    config.baud_rate = BAUD_RATE_9600;        //修改波特率為9600

    config.data_bits = DATA_BITS_8;           //數(shù)據(jù)位 8

    config.stop_bits = STOP_BITS_1;           //停止位 1

    config.bufsz     = 128;                   //修改緩沖區(qū) buff size 為 128

    config.parity    = PARITY_NONE;           //無(wú)奇偶校驗(yàn)位

 

    /* step3:控制串口設(shè)備。通過(guò)控制接口傳入命令控制字,與控制參數(shù) */

    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);

 

    /* 初始化信號(hào)量 */

    rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);

    /* 以中斷接收及輪詢發(fā)送模式打開(kāi)串口設(shè)備 */

    rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);

    /* 設(shè)置接收回調(diào)函數(shù) */

    rt_device_set_rx_indicate(serial, uart_rx_ind);

    /* 發(fā)送字符串 */

    //rt_device_write(serial, 0, str, (sizeof(str) - 1));

 

    /* 創(chuàng)建 serial 線程 */

    rt_thread_t thread = rt_thread_create("serial", (void (*)(void *parameter))data_parsing, RT_NULL, 2048, 5, 5);

    /* 創(chuàng)建成功則啟動(dòng)線程 */

    if (thread != RT_NULL)

    {

        rt_thread_startup(thread);

    }

    else

    {

        ret = RT_ERROR;

    }

 

    return ret;

}

 

/* 導(dǎo)出到 msh 命令列表中 */

MSH_CMD_EXPORT(uart_init, uart device sample);

 

 

#define THREAD_PRIORITY      9

#define THREAD_TIMESLICE     5

 

#define EVENT_FLAG (1 << 3)

 

/* 事件控制塊 */

static struct rt_event event;

 

ALIGN(RT_ALIGN_SIZE)

 

/* 線程 1 入口函數(shù) */

static void thread1_recv_event(void *param)

{

    rt_uint32_t e;

 

    while(1)

    {

        /* 第一次接收事件,事件 3 或事件 5 任意一個(gè)可以觸發(fā)線程 1,接收完后清除事件標(biāo)志 */

        if (rt_event_recv(&event, (EVENT_FLAG ),

                          RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,

                          RT_WAITING_FOREVER, &e) == RT_EOK)

        {

            rt_kprintf("thread1: recv event 0x%x\n", e);

            analyticald_data();

            rt_kprintf("thread1: delay 1s to prepare the second event\n");

        }

        rt_thread_mdelay(100);

 

    }

}

 

ALIGN(RT_ALIGN_SIZE)

 

/* 線程 2 入口 */

static void thread2_send_event(void *param)

{

    while(1)

    {

        if(flag==1)

        {

            flag = 0;

            rt_kprintf("thread2: send event\n");

            rt_event_send(&event, EVENT_FLAG);

        }

 

        rt_thread_mdelay(200);

    }

}

 

int event_wavplayer(void)

{

    rt_err_t result;

 

    /* 初始化事件對(duì)象 */

    result = rt_event_init(&event, "event", RT_IPC_FLAG_FIFO);

    if (result != RT_EOK)

    {

        rt_kprintf("init event failed.\n");

        return -1;

    }

 

    rt_thread_t thread1 = rt_thread_create("serial", thread1_recv_event, RT_NULL, 512, 10, 5);

    rt_thread_startup(thread1);

 

    rt_thread_t thread2 = rt_thread_create("serial", thread2_send_event, RT_NULL, 512, 9, 5);

    rt_thread_startup(thread2);

 

    return 0;

}

 

/* 導(dǎo)出到 msh 命令列表中 */

//MSH_CMD_EXPORT(event_wavplayer, event sample);

 

INIT_APP_EXPORT(event_wavplayer);


演示效果

image.png

評(píng)論區(qū)(0 )
主站蜘蛛池模板: 九月丁香婷婷亚洲综合色 | 国产伦子一区二区三区四区 | 怡红院影院 | 高清一本之道加勒比在线 | 色播亚洲 | 国产美女在线免费观看 | 免费在线视频播放 | 一区二区视频 | 免费观看欧美一级高清 | 国产三级视频在线播放 | 久久综合狠狠综合久久综合88 | 国产逼逼视频 | 夜夜夜夜夜夜夜工噜噜噜 | 精品国产乱码一区二区三区 | 久久天天丁香婷婷中文字幕 | xxxx免费大片 | 免费一级大片 | 2021精品综合久久久久 | 欧美色图色就是色 | 天堂-bt种子 | 2018天天操夜夜操 | 国产呦系列呦交 | 欧美黑人巨大日本人又爽又色 | 天天搞天天搞 | 国产午夜a理论毛片在线影院 | 天天综合天天做天天综合 | 啪啪调教所29下拉式免费阅读 | 午夜影院色 | 久久www免费人成高清 | 日本在线视频一区二区三区 | 欧美大香a蕉免费 | 欧美黑人三级 | 酒色成人 | 欲色综合 | 国产精品网址你懂的 | 午夜精品久久久久蜜桃 | 97天天操 | 午夜在线视频 | 亚洲国产成人精品久久 | 69pao强力打造免费高清 | 奇米影视第四色7777 |