为了能更好地解决RGB三基色LED灯亮度的调节对颜色影响的问题,通常采用三路

PWM来控制三色灯的每种颜色的导通程度来实现彩色混色,调节亮度如果采用三种

基色同时递加或递减来实现亮度的调节,那么会造成颜色发生偏移问题,为了能解决

此问题,采用HSV空间颜色来实现亮度调节的

首先将RGB空间颜色转换成HSV空间颜色,然后调节V的值,调整之后,再将HSV空间

颜色转回到RGB空间颜色这样就实现了三色灯亮度的调节

step 1:

在头文件中加入#include "math.h"

step 2:

定义2个结构体数据类型

//color data struct
typedef struct{
 unsigned char R;
 unsigned char G;
 unsigned char B;
 unsigned char l;
}COLOR_RGB;
//hsv data struct
typedef struct{
 float H;
 float S;
 float V;
}COLOR_HSV;

step 3:

定义一个COLOR_RGB结构体变量rgb_v

COLOR_RGB rgb_v;

step 4:

定义2个函数,一个求最大数,一个求最小数

/**------------------------------------------------------------------------------------------------
  * @brief  : This is return  a and b of minimum value
  * @param  : None
  * @retval : None
  *----------------------------------------------------------------------------------------------*/
static float minValue(float a,float b)  //calc minimum value
	float temp = b;
	if(a < temp)
		temp = a;
	return temp;
/**------------------------------------------------------------------------------------------------
  * @brief  : This is return  a and b of maximum value
  * @param  : None
  * @retval : None
  *----------------------------------------------------------------------------------------------*/
static float maxValue(float a,float b) //calc maximum value
	float temp = b;
	if(a > temp)
		temp = a;
	return temp;

step 5:

   定义一个RGB空间颜色向HSV空间颜色转变的函数

/**------------------------------------------------------------------------------------------------
  * @brief  : This is RGB to HSV convert function
  * @param  : None
  * @retval : None
  *----------------------------------------------------------------------------------------------*/
static void RGB_TO_HSV(const COLOR_RGB* input,COLOR_HSV* output)  // convert RGB value to HSV value 
     float r,g,b,minRGB,maxRGB,deltaRGB;
     r = input->R/255.0f;
     g = input->G/255.0f;
     b = input->B/255.0f;
        minRGB = minValue(r,minValue(g,b));
        maxRGB = maxValue(r,maxValue(g,b));
     deltaRGB = maxRGB - minRGB;
     output->V = maxRGB;
     if(maxRGB != 0.0f)
      output->S = deltaRGB / maxRGB;
      output->S = 0.0f;
     if (output->S <= 0.0f)
      output->H = 0.0f;
      if (r == maxRGB)
       output->H = (g-b)/deltaRGB;
       if (g == maxRGB)
        output->H = 2.0f + (b-r)/deltaRGB;
        if (b == maxRGB)
         output->H = 4.0f + (r-g)/deltaRGB;
      output->H = output->H * 60.0f;
      if (output->H < 0.0f)
       output->H += 360;
      output->H /= 360;

step 6:

定义一个HSV空间颜色向RGB空间颜色转变的函数

/**------------------------------------------------------------------------------------------------
  * @brief  : This is HSV to RGB convert function
  * @param  : None
  * @retval : None
  *----------------------------------------------------------------------------------------------*/
static void HSV_TO_RGB(COLOR_HSV* input,COLOR_RGB* output)  //convert HSV value to RGB value
     float R,G,B;
     int k;
     float aa,bb,cc,f;
     if (input->S <= 0.0f)
      R = G = B = input->V;
      if (input->H == 1.0f)
       input->H = 0.0f;
      input->H *= 6.0f;
      k = (int)floor(input->H);
      f = input->H - k;
      aa = input->V * (1.0f - input->S);
      bb = input->V * (1.0f - input->S * f);
      cc = input->V * (1.0f -(input->S * (1.0f - f)));
      switch(k)
      case 0:
       R = input->V; 
       G = cc; 
       B =aa;
       break;
      case 1:
       R = bb; 
       G = input->V;
       B = aa;
       break;
      case 2:
       R =aa;
       G = input->V;
       B = cc;
       break;
      case 3:
       R = aa;
       G = bb;
       B = input->V;
       break;
      case 4:
       R = cc;
       G = aa;
       B = input->V;
       break;
      case 5:
       R = input->V;
       G = aa;
       B = bb;
       break;
     output->R = (unsigned char)(R * 255);
     output->G = (unsigned char)(G * 255);
     output->B = (unsigned char)(B * 255);

step 7:

   定义一个调整亮度函数

  /**---------------------------------------------------------------------------
  * @brief  : This is brightness adjusting function
  * @param  : None
  * @retval : None
  *-----------------------------------------------------------------------------*/
void adjustBrightness(int step)             //adjust RGB brightness
    COLOR_HSV hsv_v;
    RGB_TO_HSV(&rgb_v,&hsv_v);
    rgb_v.l += step;
    if(rgb_v.l <= 0)
       rgb_v.l = 1;
    }else if(rgb_v.l >= 100)
        rgb_v.l = 100;
    hsv_v.V = rgb_v.l /100.0;
    HSV_TO_RGB(&hsv_v,&rgb_v); 

step 8:

  在main函数中测试RGB亮度调节  

/**@brief Application main function. int main(void) bool erase_bonds; // Initialize. // uart_init(); log_init(); timers_init(); buttons_leds_init(&erase_bonds); power_management_init(); ble_stack_init(); gap_params_init(); gatt_init(); services_init(); advertising_init(); conn_params_init(); // Start execution. // printf("\r\nUART started.\r\n"); NRF_LOG_INFO("Debug logging for UART over RTT started."); advertising_start(); // 亮度调节测试 rgb_v.R = 0xef; rgb_v.G = 0x36; rgb_v.B = 0x86; rgb_v.l = 0x64; adjustBrightness(-30); //亮度减少30% //打印转换后的RGB值及亮度值 NRF_LOG_INFO("R=%02x,G=%02x,B=%02x,L=%02x\n",rgb_v.R, rgb_v.G ,rgb_v.B,rgb_v.l); // Enter main loop. for (;;) idle_state_handle();

DEMO下载地址:https://download.csdn.net/download/mygod2008ok/11180344

目的 为了能更好地解决RGB三基色LED灯亮度的调节对颜色影响的问题,通常采用三路PWM来控制三色灯的每种颜色的导通程度来实现彩色混色,调节亮度如果采用三种基色同时递加或递减来实现亮度的调节,那么会造成颜色发生偏移问题,为了能解决此问题,采用HSV空间颜色来实现亮度调节的 原理 首先将RGB空间颜色转换成HSV空间颜色,然后调节V的值,调整之...
本源码附带了仿真程序,采用Proteus7.8进行仿真,不低于这个版本的软件都能打开,亲测Proteus8完美运行,附带AD原理图可以进行pcb画板操作,适用于毕业设计,学习提升,资料齐全。 程序介绍: 智能家居 1、测量环境亮度,根据亮度调节RBG亮度 2、测量室内温度,根据温度改变RGB的颜色 3、LCD显示当前温度和亮度
对于灰度图像,改变亮度只需同时增加或减少整张图像的灰度值即可,但是对于彩色图像,相对来说就比较麻烦点。对RGB空间的图像来说,需将RGB空间转换到HSL,H是色调,S是饱和度,L是亮度。改变亮度时将RGB颜色转换成HSL表示,修改L,其他不变,再将HSL转换为RGBRGB to HSL: HSL to RGB: 代码实现:#ifndef max #define max(a
    首先要能记住十大天干和十二地支,十天干:甲、乙、丙、丁、戊、己、庚、辛、壬、癸;十二地支:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥;     天干地支纪年法首先是天干在前,地支在后,比如今年2005就为-乙酉年。     天干算法: 4、 5、 6、 7、 8、 9、 0、 1、 2、 3 对应的十天干就...
要使用Python调节图像的亮度,可以使用一个名为Lightness.py的脚本。这个脚本可以通过命令行参数指定图像路径、亮度值和基于当前亮度调整。具体的使用方法如下: 1. 打开命令行终端或者命令提示符。 2. 运行以下命令:python Lightness.py path value basedOnCurrentValue 其中,path是图像的文件路径,value是亮度调整的值,basedOnCurrentValue是一个布尔值,决定是否基于当前亮度进行调整。 举个例子,如果你想要调节路径为C:\Users\PDD\Desktop\pdd.jpg的图像亮度为0.3,并且基于当前亮度进行调整,你可以运行以下命令:python Lightness.py C:\Users\PDD\Desktop\pdd.jpg 0.3 1。 在Lightness.py脚本中,还有一个名为RGBAlgorithm的函数可以用来实现亮度调节。这个函数接受一个RGB图像和亮度值作为参数,并可以选择是否基于当前亮度进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python语言之图像处理:亮度调整算法](https://blog.csdn.net/cuixiang0620/article/details/100439601)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
C语言入门之自定义结构体数据struct Student { int num; char name[20]; char sex; int age; 类型 51100 Location specified by ndk.dir (C:\Users\xxxxx\AppData\Local\Android\Sdk\ndk-bundle) did not cont