单片机RGB三色灯七彩渐变以及SOS效果实现

首先我们需要使用硬件定时器来实现类似软件PWM,开一个定时器,运行如下代码来达到我们想要的目的,之后我们只需要依次改变r_duty、g_duty、b_duty  占空比就可以实现想要的效果。

		if(r_duty == 0)
		{
				BSP_LED_Off(LEDR);
		}
		else if(r_duty == 255)
		{
				BSP_LED_On(LEDR);
		}
		else 
		{
				if(now_duty < r_duty)	
				{
						BSP_LED_On(LEDR);
				}
				else
				{
						BSP_LED_Off(LEDR);
				}
		}
		if(g_duty == 0)
		{
				BSP_LED_Off(LEDG);
		}
		else if(g_duty == 255)
		{
				BSP_LED_On(LEDG);
		}
		else 
		{
				if(now_duty < g_duty)	
				{
						BSP_LED_On(LEDG);
				}
				else
				{
						BSP_LED_Off(LEDG);
				}
		}
		if(b_duty == 0)
		{
				BSP_LED_Off(LEDB);
		}
		else if(b_duty == 255)
		{
				BSP_LED_On(LEDB);
		}
		else 
		{
				if(now_duty < b_duty)	
				{
						BSP_LED_On(LEDB);
				}
				else
				{
						BSP_LED_Off(LEDB);
				}
		}
}
now_duty ++;

七彩渐变效果实现,本例七彩渐变灯,前面还有红、绿、蓝、黄、紫、青、白七种单色灯,且七彩以这七种颜色实现,单色灯只需要给定初始占空比即可实现,本例不讨论,故now_rgb从8开始。以下代码仅供学习参考使用。

if(now_rgb == 8)//七彩灯模式
{
		if(now_duty == 255)
		{
				switch(now_Seven_and_SOS_Step)
				{
				case 0 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(r_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
										r_duty ++;
						}
						else
						{
								if(r_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step ++;
								}
								else
										r_duty --;													
						}
				break;
				case 1 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(g_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
										g_duty ++;
						}
						else
						{
								if(g_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step ++;
								}
								else
										g_duty --;													
						}
				break;
				case 2 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(b_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
										b_duty ++;
						}
						else
						{
								if(b_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step ++;
								}
								else
										b_duty --;													
						}
				break;
				case 3 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(g_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
								{
										r_duty ++;																
										g_duty ++;
								}
						}
						else
						{
								if(g_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step ++;
								}
								else
								{
										r_duty --;															
										g_duty --;
								}															
						}
				break;
				case 4 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(r_duty == 128)
								{
										now_seven_and_SOS_Cnt = 2;
								}
								else
								{
										now_seven_and_SOS_Cnt = 1;		
								}
						}
						else if(now_seven_and_SOS_Cnt == 1)
						{
								r_duty ++;																
								b_duty ++;
								now_seven_and_SOS_Cnt = 0;		
						}
						else if(now_seven_and_SOS_Cnt == 2)
						{
								if(r_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;		
										now_Seven_and_SOS_Step ++;
								}
								else
								{
										now_seven_and_SOS_Cnt = 3;		
								}
						}
						else if(now_seven_and_SOS_Cnt == 3)
						{
								r_duty --;																
								b_duty --;
								now_seven_and_SOS_Cnt = 2;		
						}
				break;
				case 5 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(b_duty == 128)
								{
										now_seven_and_SOS_Cnt = 2;
								}
								else
								{
										now_seven_and_SOS_Cnt = 1;		
								}
						}
						else if(now_seven_and_SOS_Cnt == 1)
						{
								g_duty ++;																
								b_duty ++;
								now_seven_and_SOS_Cnt = 0;		
						}
						else if(now_seven_and_SOS_Cnt == 2)
						{
								if(b_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;		
										now_Seven_and_SOS_Step ++;
								}
								else
								{
										now_seven_and_SOS_Cnt = 3;		
								}
						}
						else if(now_seven_and_SOS_Cnt == 3)
						{
								g_duty --;																
								b_duty --;
								now_seven_and_SOS_Cnt = 2;		
						}
				break;
				case 6 :	
						if(now_seven_and_SOS_Cnt == 0)
						{
								if(g_duty == 255)
								{
										now_seven_and_SOS_Cnt = 1;
								}
								else
								{
										r_duty ++;																
										g_duty ++;
										b_duty ++;
								}
						}
						else
						{
								if(g_duty == 0)
								{
										now_seven_and_SOS_Cnt = 0;
										now_Seven_and_SOS_Step = 0;
								}
								else
								{
										r_duty --;															
										g_duty --;
										b_duty --;					
								}															
						}
				break;
				}
		}
}

SOS功能实现    红灯快闪3下,然后慢闪3下,再快闪3下,接着停顿8s,再继续上述循环闪烁,(快闪1s三下,慢闪2s一下)

else if(now_rgb == 9)//SOS模式
{
		if(now_duty == 255)
		{
				switch(now_Seven_and_SOS_Step)
				{
				case 0 :	
				case 1 :	
				case 2 :	
						if(now_seven_and_SOS_Cnt < 30)
						{
								r_duty = 255;
								g_duty = 0;
								b_duty = 0;
						}
						else if(now_seven_and_SOS_Cnt < 60)
						{
								r_duty = 0;
						}
						else
						{
								now_Seven_and_SOS_Step ++;
								now_seven_and_SOS_Cnt = 255;
						}
						now_seven_and_SOS_Cnt ++;
				break;
				case 3 :
				case 4 :	
				case 5 :	
						if(now_seven_and_SOS_Cnt < 180)
						{
								r_duty = 255;
								g_duty = 0;
								b_duty = 0;
						}
						else if(now_seven_and_SOS_Cnt < 240)
						{
								r_duty = 0;
						}
						else
						{
								now_Seven_and_SOS_Step ++;
								now_seven_and_SOS_Cnt = 255;
						}
						now_seven_and_SOS_Cnt ++;
				break;
				case 6 :
				case 7 :	
				case 8 :
						if(now_seven_and_SOS_Cnt < 30)
						{
								r_duty = 255;
								g_duty = 0;
								b_duty = 0;
						}
						else if(now_seven_and_SOS_Cnt < 60)
						{
								r_duty = 0;
						}
						else
						{
								now_Seven_and_SOS_Step ++;
								now_seven_and_SOS_Cnt = 255;
						}
						now_seven_and_SOS_Cnt ++;										
				break;
				case 9 :
				case 10 :	
				case 11 :	
				case 12 :
				case 13 :	
				case 14 :	
						if(now_seven_and_SOS_Cnt >= 240)
						{
								if(now_Seven_and_SOS_Step == 14)
										now_Seven_and_SOS_Step = 0;
								else
										now_Seven_and_SOS_Step ++;
								now_seven_and_SOS_Cnt = 255;		
						}
						now_seven_and_SOS_Cnt ++;										
				break;										
				}
		}
}

以上代码都是利用上述rgb占空比所用定时器时基now_duty实现,具体时间可以适时调整。

RGB三色灯七彩渐变以及SOS效果实现源码

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WS2812是一种基于数字信号的RGB LED带,渐变算法是指通过控制WS2812珠的亮度和颜色,使得带能够呈现渐变效果渐变算法的基本原理是通过改变RGB个颜色通道的亮度,来实现颜色的渐变。首先,我们需要定义起始颜色和目标颜色。可以将起始颜色的RGB值分别记为R1、G1和B1,目标颜色的RGB值分别记为R2、G2和B2。 接下来,计算RGB通道之间的差值,即ΔR、ΔG和ΔB。通过将差值除以渐变时间,得到每个渐变时间间隔内RGB通道的增量。 然后,在每个渐变时间间隔内,根据当前时间和总的渐变时间比例,计算出当前的RGB值。具体地,当前时刻t的RGB值可以通过如下公式计算: R = R1 + ΔR * (t / 渐变时间) G = G1 + ΔG * (t / 渐变时间) B = B1 + ΔB * (t / 渐变时间) 最后,将计算出的RGB值设置给WS2812珠,便能够实现颜色的渐变效果。 需要注意,渐变算法的实现还需考虑到颜色在RGB空间中的距离,以及渐变时间的设置。合理选择起始颜色、目标颜色和渐变时间,能够使得渐变效果更加平滑和自然。 总结起来,WS2812的渐变算法是通过改变RGB通道的亮度来实现颜色的渐变效果。通过计算起始颜色与目标颜色之间的差值,并根据渐变时间来确定每个时间间隔内的RGB增量。最后,将计算得出的RGB值设置给WS2812珠,就能够呈现出华丽的颜色渐变效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值