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

这篇具有很好参考价值的文章主要介绍了STM32作品设计:蓝牙彩灯V1.4(WS2812全彩、声控、光控、人体红外、小科语音控制、手机APP、蓝牙无线升级)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@

蓝牙彩灯V1.4

STM32作品设计:蓝牙彩灯V1.4(WS2812全彩、声控、光控、人体红外、小科语音控制、手机APP、蓝牙无线升级)
biliblil视频链接:https://www.bilibili.com/video/BV14L411V78b/
资料可联系作者:2809786963
STM32作品设计:蓝牙彩灯V1.4(WS2812全彩、声控、光控、人体红外、小科语音控制、手机APP、蓝牙无线升级)
实物链接:https://m.tb.cn/h.5hxssok?tk=vEQCWYHTKs0 CZ0001

一、功能描述

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

二、原理图设计

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

三、程序设计


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

四、蓝牙彩灯功能说明

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

STM32作品设计:蓝牙彩灯V1.4(WS2812全彩、声控、光控、人体红外、小科语音控制、手机APP、蓝牙无线升级)
STM32作品设计:蓝牙彩灯V1.4(WS2812全彩、声控、光控、人体红外、小科语音控制、手机APP、蓝牙无线升级)文章来源地址https://www.toymoban.com/news/detail-515708.html

到了这里,关于STM32作品设计:蓝牙彩灯V1.4(WS2812全彩、声控、光控、人体红外、小科语音控制、手机APP、蓝牙无线升级)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于stm32作品设计:多功能氛围灯、手机APP无线控制ws2812,MCU无线升级程序

    作品哔哩哔哩视频:https://www.bilibili.com/video/BV1Yb4y1a7AQ#reply5536921990 资料链接: 蓝牙彩灯v1.01资料链接: CSDN: https://download.csdn.net/download/mbs520/25149435 百度网盘: https://pan.baidu.com/s/14Vout7Q2P6JBDZCCd8Gm6w 提取码:b7it 蓝牙彩灯v1.03资料链接: https://download.csdn.net/download/mbs520/25150035 取

    2024年02月09日
    浏览(46)
  • STM32 HAL库 PWM+DMA 驱动WS2812B彩灯(STM32F030F4P6)

    博主使用STM32驱动WS2812B主要参考了这位佬的文章,因为需求问题,采用了Cortex-M0的stm32f030f4p6(16k的flash,4k的sram)来驱动,原文中写的是stm32f103c8t6,个人认为其实区别并不是很大,需要修改部分参数即可移植(cv战士申请出战)。 上图是我的一圈灯,一共8个,第一个LED的数

    2024年02月06日
    浏览(66)
  • WS2812B彩灯 STM32HAL库开发:PWM+DMA(stm32f103c8t6)

    目录 一、摘要 二、WS2812B介绍 三、CUBEMX配置 四、程序介绍(KEIL编译器) 五、数据手册         1、本文使用示例单片机型号为 stm32f103c8t6 ,RGB型号为 WS2812B ;          2、主要实现功能是实现用 PWM+DMA 使RGB_LED亮起不同颜色的灯光;         3、目的:简单调通该型号

    2024年02月03日
    浏览(49)
  • STM32系列(HAL库)——F103C8T6驱动WS2812全彩RGB模块(PWM+DMA方式)

    (1)编程平台:Keil5 (2)CubeMX (1)某宝买的RGB模块(4个灯珠级联) (2)F1的板子,本例使用经典F103C8T6 (3)ST-link 下载器 (4)杜邦线若干 (1)模块简介: 没什么比手册讲得更加清楚了,模块中文数据手册:ws2812b中文资料_数据手册_参数 (2)驱动原理:          以上这是数据手册中提到

    2023年04月11日
    浏览(49)
  • 普冉PY32系列(十三) SPI驱动WS2812全彩LED

    普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单 普冉PY32系列(四) PY32F002A/003/030的时钟设置 普冉PY32系列(五) 使用JLink RTT代替串口输出日志 普冉PY32系列(六) 通过I2C接口驱动PCF8574扩

    2024年02月05日
    浏览(51)
  • WS2812全彩RGB驱动方法

    买了一个圆形的WS2812模块玩玩,特来总结一下驱动方法,感觉对比于普通的RGB灯来说,还是有点不一样的。 踩了一些坑,也在此列出。 驱动方法其实很简单,就是发送一个24bit的数据即可,数据0和1的定义分别如下。 它没有所谓的空闲态,如果两个24bit的数据传输时间间隔相

    2024年02月12日
    浏览(43)
  • 【雕爷学编程】Arduino动手做(86)---4*4位 WS2812 全彩模块4

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)

    2024年02月15日
    浏览(39)
  • (STM32笔记5)ws2812驱动开发

    ws2812 需要开发的外设:ws2812 开发环境:MDK 开发板:stm32最小系统板 杜邦线无数 一、原理阐述 (一) 这个ws2812有很多种,一个小灯、灯带,矩形像素屏等等。 这些都是DIN连接输入,DOUT连接输出,另外两个引脚是GNE和VCC   (二) 数据传输原理: 第1个WS2812B灯珠接收到了第1个

    2024年01月19日
    浏览(44)
  • [HAL]STM32 SPI+DMA驱动WS2812

    该程序是纯手敲,非Cube生成!所有代码均注释。 源码在文章后面获取 Keyword: 单线通讯、归零码、Reset、RGB顺序 RGB一共有24bit位 -相当于驱动一个灯要24bit位 -驱动若干个灯要24* n bit位,通过Reset码决定数据终止(保持) 24bit位应该如何发送? 可见: 表示低电平需要 T0H和T0L的配

    2024年02月09日
    浏览(53)
  • 关于STM32利用TIM+PWM+DMA控制WS2812

    MCU:STM32F103c8t6 开发工具:STM32CubeMX  使用板子参考原理图:STM32F103C8T6最小系统板开源链接 脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等但宽度不一致的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输

    2024年02月01日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包