@
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)
{
}