RGB(三色)灯配置常用颜色数据,用法讲解,基于C语言的程序讲解,七彩渐变程序讲解

     本人新手,此讲解适合新手朋友,大神不喜勿喷。通过实际测试过的,请放心消化。

1:灯的计数配置如下:

 2:七色在模拟PWM程序中的配置,原理:在一个周期中      灯亮的时长 / 周期时长  =  占空比 ,此程序是通过占空比来调节各个灯的亮度,上表的配置参数为三种灯的比例参数,按照此参数配置为最亮。所以在配置橙的灯时,红色灯整个周期都亮,绿色灯只亮周期的一半时长。

七彩渐变是每一种灯由暗变亮,在由亮变暗,然后在切换到另一种灯光的最暗状态继续循环。

代码如下:

/******************************************************************
************************RGB灯使用**********************************
******************************************************************/
bool rgb_over = true;		//翻转标志
bool is_qcding = false;		//控制灯是否开启
uint8_t rgb_colour = 0;		//八种灯色0-7分别对应:白,红,绿,蓝,橙,黄,青,紫
uint8_t duty_num_b = 10;	//灯光亮度(0-255)

/************脚位说明*****************
LEDR_GPIO	  红色灯控制脚位
LEDG_GPIO	  绿色灯控制脚位
LEDB_GPIO	  蓝色灯控制脚位
*************************************/

void _close_all_led(){		//关闭所有灯光	
	user_gpio_set_value(LEDR_GPIO, LEDRGB_CLOSE);	
	user_gpio_set_value(LEDG_GPIO, LEDRGB_CLOSE);	
	user_gpio_set_value(LEDB_GPIO, LEDRGB_CLOSE);		
}

//此函数在定时器中断中使用,每隔100us进入一次
void _RGB_timer_shade(){		//七彩渐变函数
	if(rgb_over){	//暗->亮
		duty_num_b += 4;
		if(duty_num_b > 251){
			rgb_over = false;
			duty_num_b = 255;
		}
	}else{			//亮->暗
		duty_num_b -= 4;
		if(duty_num_b < 10){
			rgb_over = true;
			duty_num_b = 10;
			rgb_colour++;
			if(rgb_colour > 7){
				rgb_colour = 1;
			}
		}
	}
}


//此函数可在定时器中断中使用,也可在循环函数中使用,每隔25us进入一次
void _RGB_timer_handle( ){		//单独开启某种灯色的灯光,灯色由rgb_colour控制
	static uint8_t count = 0;			//计数范围0-255,每隔25us此变量加1
	uint8_t dutynum = 255;				//临时亮度值
	
	dutynum = duty_num_b;		//亮度赋值
	if(is_qcding){
		if(rgb_colour < 8){						//rgb_colour灯色
			//橙色灯和紫色灯由于单个灯的配置比例不同,所以单独配置
			if(rgb_colour == 4){			//橙
				if(count <= dutynum){
					user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);	//红的灯配置亮
				}else{
					user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);//红的灯配置灭
				}
				if(count <= (dutynum/2)){	//绿的灯的亮度为红色灯的一半
					user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
				}else{
					user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
				}
				user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
			}else if(rgb_colour == 7){		//紫
				if(count <= (dutynum/2)){	//红色灯的亮度为蓝色灯的一半
					user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
				}else{
					user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
				}
				if(count <= dutynum){
					user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
				}else{
					user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
				}
				user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
			}else{
				if(count <= dutynum){
					switch(rgb_colour) {
						case 0:{	//白
							user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
							break;
						}
						case 1:{	//红
							user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
							user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
							break;
						}
						case 2:{	//绿
							user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
							user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
							break;      
						}               
						case 3:{	//蓝
							user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
							user_gpio_set_value(LEDG_GPIO,LEDRGB_CLOSE);
							break;      
						}                   
						case 5:{	//黄
							user_gpio_set_value(LEDR_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDB_GPIO,LEDRGB_CLOSE);
							break;      
						}               
						case 6:{	//青
							user_gpio_set_value(LEDG_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDB_GPIO,LEDRGB_OPEN);
							user_gpio_set_value(LEDR_GPIO,LEDRGB_CLOSE);
							break;      
						}               
					}
				}else{
					_close_all_led();		//关闭所有灯光
				}
			}
			count++;
			if(count >= 255){	//一个周期结束,配置为0进行下一个周期
				count = 0; 
			}
		}else{
			count = 0;
			rgb_colour = 0;
		}
	}else{
		_close_all_led();		//关闭所有灯光
	}
}

                                                                                 看完有帮助的话记得点个赞哈,制作不易啊

  • 32
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值