|
用STM32做的顏色感應(yīng),開(kāi)始需要白平衡。
RGB用算法轉(zhuǎn)換成了HVS。
視頻:http://v.youku.com/v_show/id_XNDY1NDEwMTQ0.html
單片機(jī)源程序如下:
- /************************************************************************************
- * TCS3200 STM32版
- * RGB顏色傳感器
- ****************************************************************************************/
- //正點(diǎn)原子開(kāi)發(fā)板
- //陳新梢
- #include <stm32f10x_lib.h>
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- #include "led.h"
- #include "key.h"
- #include "exti.h"
- #include "wdg.h"
- #include "timer.h"
- #include "lcd.h"
- #include "rtc.h"
- #include "wkup.h"
- #include "adc.h"
- #include "dma.h"
- #include "24cxx.h"
- #include "flash.h"
- #include "touch.h"
- #include "24l01.h"
- #include "mmc_sd.h"
- #include "remote.h"
- #include "ds18b20.h"
- #include "mouse.h"
- #include "text.h"
- #include "fat.h"
- #include "fontupd.h"
- #include "tcs3200.h"
- /*****************************************************************************
- H指hue(色相)、S指saturation(飽和度)、L指lightness(亮度)、V指value(色調(diào))、B指brightness(明度)。
- 色相(H)是色彩的基本屬性,就是平常所說(shuō)的顏色名稱,如紅色、黃色等。
- 飽和度(S)是指色彩的純度,越高色彩越純,低則逐漸變灰,取0-100%的數(shù)值。
- 明度(V),亮度(B),取0-100%。
-
- 0度: 紅色,RGB:(255, 0, 0), 255:R, 0:B,G+
- 60度: 黃色,RGB:(255,255, 0),255:G, 0:B, R-
- 120度: 綠色,RGB:( 0,255, 0),255:G, 0:R,B+
- 180度: 青色,RGB:( 0,255,255),255:B, 0:R,G-
- 240度: 藍(lán)色,RGB:( 0, 0,255),255:B, 0:G,R+
- 300度: 紫色,RGB:(255, 0,255),255:R, 0:G,B-
- 360度: 紅色,RGB:(255, 0, 0),255:R, 0:B,G+
- RGB轉(zhuǎn)化到HSV的算法
- max=max(R,G,B)
- min=min(R,G,B)
- if R = max, H = (G-B)/(max-min)
- if G = max, H = 2 + (B-R)/(max-min)
- if B = max, H = 4 + (R-G)/(max-min)
- H = H * 60
- if H < 0, H = H + 360
- V=max(R,G,B)
- S=(max-min)/max
- ******************************************************************************/
- //============================
- void chromatogram(void); //函數(shù)聲明
- //============================
- int main(void)
- {
- float Max=0,Min=0;
- float Rhsv=0,Ghsv=0,Bhsv=0;
- float H=0,S=0,V=0;
- u16 i;
- u8 R=0x00,G=0x00,B=0x00;
- u16 RGB=0x0000;
-
- Stm32_Clock_Init(9);//系統(tǒng)時(shí)鐘設(shè)置
- delay_init(72); //延時(shí)初始化
- uart_init(72,9600); //串口1初始化
- LCD_Init(); //初始化液晶
- LED_Init(); //LED初始化
- LCD_Clear(WHITE);
- POINT_COLOR=RED;
- LCD_ShowString(10,180,"TCS3200 init");
- for(i=0;i<50;i++) delay_ms(50);
- tcs3200_init(1,1);//初始化(速率調(diào)整)
- whitebalance(); //白平衡
- LCD_ShowString(0,0,"Rgena:");
- LCD_ShowString(0,18,"Ggena:");
- LCD_ShowString(0,36,"Bgena:");
- LCD_ShowNum(50,0,Rgena,5,12); //顯示一個(gè)數(shù)字
- LCD_ShowNum(50,18,Ggena,5,12); //顯示一個(gè)數(shù)字
- LCD_ShowNum(50,36,Bgena,5,12); //顯示一個(gè)數(shù)字
- POINT_COLOR=BLACK;
- LCD_ShowString(30,50,"R:");
- LCD_ShowString(30,70,"G:");
- LCD_ShowString(30,90,"B:");
- LCD_ShowString(30,110,"H:");
- LCD_ShowString(30,130,"V:");
- LCD_ShowString(30,150,"S:");
- chromatogram();//色譜調(diào)出
- while(1)
- {
- //=================================================================================
- R = tcs3200_RED();
- G = tcs3200_GREEN(); //取RGB值
- B = tcs3200_BLUE();
- //================================================================================
- Rhsv = (float) R/25/10;
- Ghsv = (float) G/25/10; //RGB轉(zhuǎn)換成0,1.
- Bhsv = (float) B/25/10;
- //=================================================================================
- //RGB轉(zhuǎn)HSV算法
- Max = (Rhsv>Ghsv)?Rhsv:Ghsv; //RGB轉(zhuǎn)HSV算法
- Max = (Max>Bhsv)?Max:Bhsv; //取RGB最大值 //RGB轉(zhuǎn)HSV算法
- Min = (Rhsv<Ghsv)?Rhsv:Ghsv; //RGB轉(zhuǎn)HSV算法
- Min = (Min<Bhsv)?Min:Bhsv; //去RGB最小值 //RGB轉(zhuǎn)HSV算法
- //RGB轉(zhuǎn)HSV算法
- if(Rhsv==Max) H = (Ghsv-Bhsv)/(Max-Min); //RGB轉(zhuǎn)HSV算法
- if(Ghsv==Max) H = 2+(Bhsv-Rhsv)/(Max-Min); //RGB轉(zhuǎn)HSV算法
- if(Bhsv==Max) H = 4+(Rhsv-Ghsv)/(Max-Min); //RGB轉(zhuǎn)HSV算法
- H =(int) (H*60); //RGB轉(zhuǎn)HSV算法
- if(H<0) H = H+360; //RGB轉(zhuǎn)HSV算法
- //RGB轉(zhuǎn)HSV算法
- V = (Rhsv>Ghsv)?Rhsv:Ghsv; //RGB轉(zhuǎn)HSV算法
- V = (V>Bhsv)?V:Bhsv; //取V的數(shù)值 //RGB轉(zhuǎn)HSV算法
- //RGB轉(zhuǎn)HSV算法
- S = (Max-Min)/Max; //取S的數(shù)值 //RGB轉(zhuǎn)HSV算法
- //RGB轉(zhuǎn)HSV算法
- V = (int) (V*100); //RGB轉(zhuǎn)HSV算法
- S = (int) (S*100); //RGB轉(zhuǎn)HSV算法
- //======================================================================================================
- LCD_ShowNum(50,50,R,5,12); //顯示一個(gè)數(shù)字
- LCD_ShowNum(50,70,G,5,12); //顯示一個(gè)數(shù)字
- LCD_ShowNum(50,90,B,5,12); //顯示一個(gè)數(shù)字
- LCD_ShowNum(50,110,H,5,12); //顯示一個(gè)數(shù)字
- LCD_ShowNum(50,130,V,5,12); //顯示一個(gè)數(shù)字
- LCD_ShowNum(50,150,S,5,12); //顯示一個(gè)數(shù)字
- // R = 0xff;
- // G = 0xff;
- // B = 0xff;
- //=====================================================
- RGB = 0x0000;
- RGB |=(unsigned long) R*1000/8225<<11;
- RGB |=(unsigned long) G*1000/4047<<5; //轉(zhuǎn)換成屏幕的4W色顯示
- RGB |=(unsigned long) B*1000/8225;
- //=====================================================
- LCD_Fill(10,170,80,260,RGB); //顯示色彩
- delay_ms(50); //刷新次數(shù)
- }
- }
- /**********************************************
- *函數(shù)名:void chromatogram(void)
- *功能:在屏幕上面顯示一張色譜
- *參數(shù):木有
- *返回值:木有
- ***********************************************/
- void chromatogram(void)
- {
- u16 i=0;
- u16 color;
- u16 Ri=0,Gi=0,Bi=0;
- //======================================================================
- Ri = 240;Gi = 0x00;Bi = 0x00;
- for(i=0;i<60;i++)
- {
- color = (unsigned long) Gi*1000/4047<<5;
- color |= (unsigned long) Ri*1000/8225<<11; //G加上去
- color |= (unsigned long) Bi*1000/8225;
- LCD_Fill(100,i,230,i,color);
-
- Gi = Gi+4;
- }
- Ri = 240;Gi = 240;Bi = 0x00;
- for(i=60;i<120;i++)
- {
- color = (unsigned long) Ri*1000/8225<<11;
- color |= (unsigned long) Gi*1000/4047<<5; //R降下來(lái)
- color |= (unsigned long) Bi*1000/8225;
- LCD_Fill(100,i,230,i,color);
- Ri = Ri-4;
- }
- Ri = 0x00;Gi = 240;Bi = 0x00;
- for(i=120;i<180;i++)
- {
- color = (unsigned long) Bi*1000/8225;
- color |= (unsigned long) Ri*1000/8225<<11; //B加上去
- color |= (unsigned long) Gi*1000/4047<<5;
- LCD_Fill(100,i,230,i,color);
- Bi = Bi+4;
- }
- Ri = 0x00;Gi = 240;Bi = 240;
- for(i=180;i<240;i++)
- {
- color = (unsigned long) Gi*1000/4047<<5;
- color |= (unsigned long) Bi*1000/8225; //G降下來(lái)
- color |= (unsigned long) Ri*1000/8225<<11;
- LCD_Fill(100,i,230,i,color);
- Gi = Gi-4;
- }
- Ri = 0x00;Gi = 0x00;Bi = 240;
- for(i=240;i<300;i++)
- {
- color = (unsigned long) Ri*1000/8225<<11;
- color |= (unsigned long) Gi*1000/4047<<5; //R加上去
- color |= (unsigned long) Bi*1000/8225;
- LCD_Fill(100,i,230,i,color);
- Ri = Ri+4;
- }
- Ri = 240;Gi = 0x00;Bi = 240;
- for(i=300;i<360;i++)
- {
- color = (unsigned long) Bi*1000/8225;
- color |= (unsigned long) Ri*1000/8225<<11;
- color |= (unsigned long) Gi*1000/4047<<5; //B降下來(lái)
- LCD_Fill(100,i,230,i,color);
- Bi = Bi-4;
- }
- //===========================================================================
-
- }
復(fù)制代碼
所有資料51hei提供下載:
STM32 TCS3200.rar
(157.55 KB, 下載次數(shù): 86)
2018-10-31 17:31 上傳
點(diǎn)擊文件名下載附件
|
|