STM32作品设计:蓝牙彩灯V1.4(WS2812全彩、声控、光控、人体红外、小科语音控制、手机APP、蓝牙无线升级)

@

蓝牙彩灯V1.4

在这里插入图片描述
biliblil视频链接:https://www.bilibili.com/video/BV14L411V78b/
资料可联系作者:2809786963
在这里插入图片描述

一、功能描述

1、手机APP控制亮度、颜色
2、多种显示模式:闪烁、渐变、呼吸、流水
3、拾音灯模式(随音起舞)
4、手机设置:光控模式、声控模式、声光控模式、人体红外模式、人体红外+光控模式
5、语音模式:
我:小明
它:我在
我:打开灯
它:已为您打开灯(设备开灯)
我:关闭灯
它:已为您关闭灯(设备关灯)
6、按键控制:
单击:切换颜色
双击:切换显示模式
长按:关灯

二、原理图设计

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、程序设计


int main(void)
{
    
    
		SCB->VTOR = FLASH_BASE | 0xA000; /* Vector Table Relocation in Internal FLASH. */
    SetSystemClock();                       //配置系统时钟
	//SystemClock_Config();
    System_Init();                          //系统初始化
    SCHTaskCreate(&ScanTcb,   SCAN_TASK);      //创建开始及按键编码器、采样率扫描任务
    SCHTaskCreate(&DisTcb,    DIS_TASK);       //创建显示信息任务
    SCHTaskCreate(&UpdateTcb, UPDATE_TASK);    //自动更新、检测、音频流处理任务
    SCHTaskCreate(&UsagelogTcb, USAGELOG_TASK);//使用时间任务
    SCHTaskSchedStart();                    //启动调度器,永不返回
}


void System_Init(void)
{
    
    
    //GPIO_ALL_Denit();
    OPEN_GPIOA_To_GPIOF_RCC_CLK();//打开GPIOA到GPIOF的RCC时钟
    delay_init();             //延时初始化
    UartInit(UART_BOUND);     //串口初始化
    UartPrint("\r\nUSART OK\r\n");
    KEY_Init();               //按键初始化
	Ws2812b_Configuration();
	BT_init(9600);
	LED_Init();
	LED0_ON();
	SysParame_Init();//系统参数初始化
//    PowerOff();               //阻塞进入待机状态
}
/****************************************
* 函数名称: SCAN_TASK()
* 输入参数: 无
* 输出参数: 无
* 功    能: 开始任务
*
*****************************************/
void SCAN_TASK(void)
{
    
    
    static  uint16_t value;
    SCHTaskBegin();//开始 固定格式一定要的
    while (1)
    {
    
    
		value = Key_GetValue();          //按键扫描
		if (value)
		{
    
    
			Key_Deal(value);
		}
		
		Query_IN_Response();
    SCHCurTaskDly(10);//延时Ticks个时钟周期
    }
    SCHTaskEnd();//结束 固定格式一定要的
}

/****************************************
* 函数名称: DIS_TASK()
* 输入参数: 无
* 输出参数: 无
* 功    能: 显示任务
*
*****************************************/

void DIS_TASK(void)
{
    
    
	static u8 r=0,g=0,b=0,a=0,dir=0;
	static int i,cnt=0;
	static int color_rgb;
    SCHTaskBegin(); //开始固定格式一定要的
    while (1)
    {
    
    
		if(SysState.Dis_flag == 1)//可以更新显示
		{
    
    
					/***********************静态*******************************/
					if(SysState.Dismode == DisMode_Static)//静态
					{
    
    
						SysState.Dis_flag = 0;
						RGB_Refresh(SysState.StaticRgb,LED_NUM);//显示
						RGB2_Refresh(SysState.StaticRgb,LED_NUM);//显示
					}
					
					/***********************呼吸*******************************/
					else if(SysState.Dismode == DisMode_Breathe)//呼吸
					{
    
    
						SysState.Dedlay_Time=20;
						if(dir==0)
						{
    
    
							a += (1+a*10/0xff);
							if(a > 0xf0)dir = 1;
						}else if(dir)
						{
    
    
							a -= (1+a*10/0xff);
							if(a <= 4)dir = 0;
						}
						
						r = ((SysState.StaticRgb>>16)%0x100)*a/0xff;
						g = ((SysState.StaticRgb>>8)%0x100)*a/0xff;
						b = ((SysState.StaticRgb>>0)%0x100)*a/0xff;
						color_rgb = (r<<16) + (g<<8) + b;
						printf("%d %d %d %d\r\n",r,g,b,a);
						RGB_Refresh(color_rgb,LED_NUM);//显示
						RGB2_Refresh(color_rgb,LED_NUM);//显示
						SCHCurTaskDly(SysState.Dedlay_Time);
					}
					
					/***********************闪烁*******************************/
					else if(SysState.Dismode ==DisMode_Twinkle)//闪烁
					{
    
    
						SysState.Dedlay_Time=200;//*SysState.Dedlay_Ratio/0x0f;;
						RGB_Refresh(SysState.StaticRgb,LED_NUM);
						RGB2_Refresh(SysState.StaticRgb,LED_NUM);
						SCHCurTaskDly(SysState.Dedlay_Time);
						RGB_Refresh(0,LED_NUM);
						RGB2_Refresh(0,LED_NUM);
						SCHCurTaskDly(SysState.Dedlay_Time);
					}
					
					/***********************渐变*******************************/
					else if(SysState.Dismode ==DisMode_GraChange)//渐变
					{
    
    
						extern u8 GraChange_flag;
						SysState.Dedlay_Time=50;//*SysState.Dedlay_Ratio/0x0f;
						GraChange_RgbAlg(&SysState.StaticRgb,&GraChange_flag);//渐变算法
						RGB_Refresh(SysState.StaticRgb,LED_NUM);//显示
						RGB2_Refresh(SysState.StaticRgb,LED_NUM);//显示
						SCHCurTaskDly(SysState.Dedlay_Time);
					}
					
					/***********************蹦迪*******************************/
					else if(SysState.Dismode == DisMode_DiscoDance)//蹦迪
					{
    
    
						SysState.Dedlay_Time=20;//*SysState.Dedlay_Ratio/0x0f;
						RGB_Refresh(Static_DisColor[cnt],LED_NUM);
						RGB2_Refresh(Static_DisColor[cnt],LED_NUM);
						SCHCurTaskDly(SysState.Dedlay_Time);
						RGB_Refresh(0,LED_NUM);
						RGB2_Refresh(0,LED_NUM);
						SCHCurTaskDly(SysState.Dedlay_Time*50);
					}
					
					/***********************流水*******************************/
					else if(SysState.Dismode == DisMode_RunWater)//流水
					{
    
    
						static int i=0,flag=0;
						SysState.Dedlay_Time=100;
						i++;
						if(i == LED_NUM)
						{
    
    
							i=0;flag=!flag;
						}
						if(flag){
    
    		//设置颜色		
							RGB_Refresh(SysState.StaticRgb,i+1);
							RGB2_Refresh(SysState.StaticRgb,i+1);
							SysState.Dedlay_Time=50;//*SysState.Dedlay_Ratio/0x0f;
							SCHCurTaskDly(SysState.Dedlay_Time);
						}
						else{
    
    		//灭
							RGB_Refresh(0,i+1);
							RGB2_Refresh(0,i+1);
							SysState.Dedlay_Time=50;//*SysState.Dedlay_Ratio/0x0f;
							SCHCurTaskDly(SysState.Dedlay_Time);
						}
						
					}
					
					/***********************用户*******************************/
					else if(SysState.Dismode ==DisMode_User1)  //用户
					{
    
    
						SysState.Dedlay_Time=1000;
						RGB_Refresh(SysState.StaticRgb,1);
						RGB2_Refresh(0,1);
						SCHCurTaskDly(SysState.Dedlay_Time);
						RGB2_Refresh(SysState.StaticRgb,1);
						RGB_Refresh(0,1);
						SCHCurTaskDly(SysState.Dedlay_Time);
					}
		}
		SCHCurTaskDly(5);
    }
    SCHTaskEnd();  //结束固定格式一定要的
}
/****************************************
* 函数名称: UpdateInfTask()
* 输入参数: 无
* 输出参数: 无
* 功    能: 更新并保存数据
*
*****************************************/
void UPDATE_TASK(void)
{
    
    
    SCHTaskBegin(); //开始固定格式一定要的
    while (1) {
    
    
       
        SCHCurTaskDly(10);//延时Ticks个时钟周期
    }
    SCHTaskEnd();  //结束固定格式一定要的
}
/****************************************
* 函数名称: USAGELOG_TASK()
* 输入参数: 无
* 输出参数: 无
* 功    能: 更新并保存使用记录数据
*
*****************************************/
void USAGELOG_TASK(void)
{
    
    
    SCHTaskBegin(); //开始固定格式一定要的
	
    while (1)
    {
    
    
		if(++SysState.RunMin == 60)
		{
    
    
			SysState.RunHour++;
			SysState.RunMin = 0;
		}
        UartPrint("\r\n系统已运行%d时%d分\r\n",SysState.RunHour,SysState.RunMin);
        SCHCurTaskDly(1000 * 60); //延时1min
    }
    SCHTaskEnd();  //结束固定格式一定要的
}

/****************************************
* 函数名称: RgbAlg()
* 输入参数: color mode
* 输出参数: 无
* 功    能: 渐变模式算法
*
 		RGB
 						0x00ff00
0		+-0  		0xff0000
1		-0+			0x0000ff
2		+0f     0xff00ff
3		-+f     0x00ffff
4		+f-     0xffff00
5		ff+     0xffffff
6		-f-     0x00ff00
*****************************************/
extern  int GraChange_Cnt;
void GraChange_RgbAlg(int * color, u8 *mode)
{
    
    
	if(GraChange_Cnt == 0xff)
	{
    
    
		GraChange_Cnt=0;
		(*mode)++;
		if(*mode == 7)
			*mode = 0;
	}++GraChange_Cnt;
    switch(*mode)
	{
    
    
		case 0:
			*color += (1<<16);*color -= (1<<8);*color &= ~(0xff<<0);
			break;
		case 1:
			*color -= (1<<16);*color &= ~(0xff<<8);*color += (1<<0);
			break;
		case 2:
			*color += (1<<16);*color &= ~(0xff<<8);*color |= (0xff<<0);
			break;
		case 3:
			*color -= (1<<16);*color += (1<<8);*color |= 0xff;
			break;
		case 4:
			*color += (1<<16);*color |= (0xff<<8); *color -= (1<<0);
			break;
		case 5:
			*color |= (0xff<<16);*color |= (0xff<<8); *color += (1<<0);
			break;
		case 6:
			*color -= (1<<16);*color |= (0xff<<8); *color -= (1<<0);
			break;
	}
}


/****************************************
* 函数名称: RgbAlg()
* 输入参数: color mode
* 输出参数: 无
* 功    能: 蹦迪模式算法
*****************************************/
void Disco_RgbAlg(int * color, u8 *mode)
{
    
    
	
}

四、蓝牙彩灯功能说明

****
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mbs520/article/details/121440831
今日推荐