1. 團隊風采和作品展示1.1. 團隊風采
1.2. 作品展示 |
功能描述:小組Logo,白平衡檢測,色塊顯示,液晶顯示屏顯示等。 |
| | |
| | |
2. 任務2.1. 描述2.1.1. 組成硬件設計是以STM32 OPEN407Z-C測試版,顏色識別傳感器以及彩色液晶顯示屏組成。
2.1.2. 功能啟動后,在液晶屏上顯示歡迎界面,按USER鍵進入主界面,主界面的屏幕被分為三個部分,其中三個部分:左邊為RGB數值,也分上中下三個部分,最上面3個值是白平衡時的值,也就是白色的RGB值;中間3個值是實時測得的RGB值;最后3個HVS是把RGB值轉換到HVS值;當傳感器放在一種顏色上,按B,C,D鍵,分別設置此顏色為標準顏色,然后對顏色依次掃描,當掃到標準顏色界面會顯示“識別一”,“識別二”,“識別三”;當掃到其它顏色界面會顯示“未識別”。
2.1.3. 性能白平衡檢測后可識別三種顏色
2.2. 要求2.2.1. 基本要求定了標準色后,可識別對應的顏色,其他顏色未識別。
2.2.2. 擴展要求加上小組logo,在按下指定的幾個按鍵,可識別多種相應的顏色。
3. 方案
3.1. 可選方案使用KEIL uvision5 軟件對STM32 OPEN407Z-C測試版編程。
3.1.1. 方案1選擇使用STM32F103ZET6的開發板。
3.1.2. 方案2選擇使用STM32 OPEN407Z-C的開發板。
3.2. 方案確定3.2.1. 基本結構使用方案2.
3.2.2. 主要思路將傳感器相應的線連接到開發板,修改編譯好的程序下載進入,再通過按鍵來進行顏色識別。
4. 設計4.1. 硬件設計4.1.1. 核心板
核心板 F407及芯片外圍電路
4.1.2. 用戶按鍵
4.1.3. 彩色液晶屏端口4.2. 軟件設計1. 按鍵USER控制
- /*********************************************************************************
- * File : KEY.C
- * Hardware Environment:
- * Build Environment : REALVIEW MDK-ARM Version: 4.20
- * Version : V1.0
- * By : DING.J.Q_TEC.SUDA 2013-10-26
- * Department of Electronics and Information
- * (c) Copyright 2013,Applied Technology College
- * http://tec.suda.edu.cn
- * All Rights Reserved
- **********************************************************************************/
- //== 包含的 h 文件
- #include "KEY.H"
- #include "stm32f4xx.h"
- //== 定義KEY端口
- //-- USER KEY --> PF10
- #define USER_KEY_PORT GPIOF
- #define USER_KEY_PIN GPIO_Pin_10
- #define USER_KEY_RCC_AHBPERIPH RCC_AHB1Periph_GPIOF
- //-- WAKEUP Key --> PA0
- #define WAKEUP_KEY_PORT GPIOA
- #define WAKEUP_KEY_PIN GPIO_Pin_0
- #define WAKEUP_KEY_RCC_AHBPERIPH RCC_AHB1Periph_GPIOA
- //-- JOY Key A-B-C-D-CTR--> PC13-PE6-PE4-PE2-PA5
- #define JOY_A_KEY_PORT GPIOC
- #define JOY_A_KEY_PIN GPIO_Pin_13
- #define JOY_A_KEY_RCC_AHBPERIPH RCC_AHB1Periph_GPIOC
- //--
- #define JOY_B_KEY_PORT GPIOE
- #define JOY_B_KEY_PIN GPIO_Pin_6
- #define JOY_B_KEY_RCC_AHBPERIPH RCC_AHB1Periph_GPIOE
- //--
- #define JOY_C_KEY_PORT GPIOE
- #define JOY_C_KEY_PIN GPIO_Pin_4
- #define JOY_C_KEY_RCC_AHBPERIPH RCC_AHB1Periph_GPIOE
- //--
- #define JOY_D_KEY_PORT GPIOE
- #define JOY_D_KEY_PIN GPIO_Pin_2
- #define JOY_D_KEY_RCC_AHBPERIPH RCC_AHB1Periph_GPIOE
- //--
- #define JOY_CTR_KEY_PORT GPIOA
- #define JOY_CTR_KEY_PIN GPIO_Pin_5
- #define JOY_CTR_KEY_RCC_AHBPERIPH RCC_AHB1Periph_GPIOA
- //== 定義函數的實現
- //-- 初始化 JOY_KEY GPIO
- void JOY_KEY_GPIO_INIT(void){
- // 定義 GPIO初始化結構變量
- GPIO_INITTYPEDEF GPIO_INITSTRUCTURE;
- // 使能外設時鐘 GPIO PERIPH clock enable
- RCC_AHB1PeriphClockCmd(USER_KEY_RCC_AHBPERIPH | WAKEUP_KEY_RCC_AHBPERIPH | JOY_A_KEY_RCC_AHBPERIPH |
- JOY_B_KEY_RCC_AHBPERIPH | JOY_C_KEY_RCC_AHBPERIPH | JOY_D_KEY_RCC_AHBPERIPH |
- JOY_CTR_KEY_RCC_AHBPERIPH, ENABLE);
- // 配置輸入上拉模式 Configure Input PUSHPULL mode
- GPIO_INITSTRUCTURE.GPIO_PIN = USER_KEY_PIN;
- GPIO_INITSTRUCTURE.GPIO_MODE = GPIO_MODE_IN;
- GPIO_INITSTRUCTURE.GPIO_OTYPE = GPIO_OTYPE_PP;
- GPIO_INITSTRUCTURE.GPIO_SPEED = GPIO_Speed_100MHz;
- GPIO_INITSTRUCTURE.GPIO_PUPD = GPIO_PUPD_UP;
- GPIO_INIT(USER_KEY_PORT, &GPIO_INITSTRUCTURE);
- //--
- GPIO_INITSTRUCTURE.GPIO_PIN = WAKEUP_KEY_PIN;
- GPIO_INIT(WAKEUP_KEY_PORT, &GPIO_INITSTRUCTURE);
- //--
- GPIO_INITSTRUCTURE.GPIO_PIN = JOY_A_KEY_PIN;
- GPIO_INIT(JOY_A_KEY_PORT, &GPIO_INITSTRUCTURE);
- GPIO_INITSTRUCTURE.GPIO_PIN = JOY_B_KEY_PIN;
- GPIO_INIT(JOY_B_KEY_PORT, &GPIO_INITSTRUCTURE);
- GPIO_INITSTRUCTURE.GPIO_PIN = JOY_C_KEY_PIN;
- GPIO_INIT(JOY_C_KEY_PORT, &GPIO_INITSTRUCTURE);
- GPIO_INITSTRUCTURE.GPIO_PIN = JOY_D_KEY_PIN;
- GPIO_INIT(JOY_D_KEY_PORT, &GPIO_INITSTRUCTURE);
- GPIO_INITSTRUCTURE.GPIO_PIN = JOY_CTR_KEY_PIN;
- GPIO_INIT(JOY_CTR_KEY_PORT, &GPIO_INITSTRUCTURE);
- }
- //-- 讀取狀態 JOY_KEY
- unsigned char READ_JOY_KEY_STATE(void) {
- if(!GPIO_READINPUTDATABIT(USER_KEY_PORT,USER_KEY_PIN))
- return USER_KEY;
- else if(!GPIO_READINPUTDATABIT(WAKEUP_KEY_PORT,WAKEUP_KEY_PIN))
- return WAKEUP_KEY;
- else if(!GPIO_READINPUTDATABIT(JOY_A_KEY_PORT,JOY_A_KEY_PIN))
- return JOY_A_KEY;
- else if(!GPIO_READINPUTDATABIT(JOY_B_KEY_PORT,JOY_B_KEY_PIN))
- return JOY_B_KEY;
- else if(!GPIO_READINPUTDATABIT(JOY_C_KEY_PORT,JOY_C_KEY_PIN))
- return JOY_C_KEY;
- else if(!GPIO_READINPUTDATABIT(JOY_D_KEY_PORT,JOY_D_KEY_PIN))
- return JOY_D_KEY;
- else if(!GPIO_READINPUTDATABIT(JOY_CTR_KEY_PORT,JOY_CTR_KEY_PIN))
- return JOY_CTR_KEY;
- return NULL_KEY;
- }
- //===============
- // End of KEY.C
- //===============
- 2. TCS3200傳感器驅動函數
- #include "stm32f4xx.h" // Device header
- #include "tcs3200.h"
- //02#include "EXTI.H"
- //03#include "DELAY.H"
- uint8_t RGENA,GGENA,BGENA;
- uint16_t RAMOUNT,GAMOUNT,BAMOUNT;
- uint16_t amount;
- void tcs3200_init(uint8_t s0,uint8_t s1)
- {
- GPIO_INITTYPEDEF GPIO_INITSTRUCTURE;
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
- //A0123
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
- GPIO_INITSTRUCTURE.GPIO_MODE=GPIO_MODE_OUT;
- GPIO_INITSTRUCTURE.GPIO_OTYPE=GPIO_OTYPE_PP;
- GPIO_INITSTRUCTURE.GPIO_PUPD=GPIO_PUPD_UP;
- GPIO_INITSTRUCTURE.GPIO_SPEED=GPIO_Speed_50MHz;
- GPIO_INIT(GPIOA,&GPIO_INITSTRUCTURE);
- GPIO_SETBITS(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
- //A4
- GPIO_INITSTRUCTURE.GPIO_PIN=GPIO_PIN_4;
- GPIO_INITSTRUCTURE.GPIO_MODE=GPIO_MODE_IN;
- GPIO_INITSTRUCTURE.GPIO_OTYPE=GPIO_OTYPE_PP;
- GPIO_INITSTRUCTURE.GPIO_PUPD=GPIO_PUPD_UP;
- GPIO_INITSTRUCTURE.GPIO_SPEED=GPIO_SPEED_50MHZ;
- GPIO_INIT(GPIOA,&GPIO_INITSTRUCTURE);
- GPIO_SETBITS(GPIOA,GPIO_PIN_4);
- if(s0==0)
- S0L;
- else
- S0H ;
- if(s1==0)
- S1L;
- else
- S1H ;
- }
- void WHITEBALANCE(void)
- {
- EXTIX_INIT(); //外部中斷初始化
- S2L;S3L;//紅色通道
- amount=0; //開始計數
- DELAY_MS(10);
- RGENA = amount; //求出紅色因子
- amount=0;
- //----------------------------------
- S2H;S3H;//綠色通道
- amount=0;
- DELAY_MS(10);
- GGENA = amount; //求出綠色因子
- amount=0;
- //----------------------------------
- S2L;S3H;//藍色通道
- amount=0;
- DELAY_MS(10);
- BGENA = amount; //求出藍色因子
- amount=0;
- S2H;S3L;//關閉通道
- }
- uint16_t tcs3200_RED(void)
- {
- S2L;S3L;
- amount=0;
- DELAY_MS(10);
- RAMOUNT=(uint32_t) amount*255/RGENA; //取R值
- if(RAMOUNT>255) RAMOUNT = 255;
- return RAMOUNT;
- // amount=0;
- }
- uint16_t tcs3200_GREEN(void)
- {
- S2H;S3H;
- amount=0;
- DELAY_MS(10);
- GAMOUNT=(uint32_t) amount*255/GGENA; //取G值
- if(GAMOUNT>255) GAMOUNT = 255;
- return GAMOUNT;
- // amount=0;
- }
- uint16_t tcs3200_BLUE(void)
- {
- S2L;S3H;
- amount=0;
- DELAY_MS(10);
- BAMOUNT=(uint32_t) amount*255/BGENA;//去B值
- if(BAMOUNT>255) BAMOUNT = 255;
- return BAMOUNT;
- // amount=0;
- }
- void EXTI4_IRQHandler(void)
- {
- amount++;
- EXTI->PR=1<<4;
- }
- void EXTIX_INIT(void)
- {
- NVIC_INITTYPEDEF NVIC_INITSTRUCTURE;
- EXTI_INITTYPEDEF EXTI_INITSTRUCTURE;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
- SYSCFG_EXTILINECONFIG(EXTI_PORTSOURCEGPIOA, EXTI_PinSource4);
- EXTI_INITSTRUCTURE.EXTI_LINE = EXTI_LINE4;
- EXTI_INITSTRUCTURE.EXTI_MODE = EXTI_MODE_INTERRUPT;
- EXTI_INITSTRUCTURE.EXTI_TRIGGER = EXTI_TRIGGER_FALLING;
- EXTI_INITSTRUCTURE.EXTI_LINECMD = ENABLE;
- EXTI_INIT(&EXTI_INITSTRUCTURE);
- NVIC_INITSTRUCTURE.NVIC_IRQCHANNEL = EXTI4_IRQN;
- NVIC_INITSTRUCTURE.NVIC_IRQCHANNELPREEMPTIONPRIORITY = 0X02;
- NVIC_INITSTRUCTURE.NVIC_IRQCHANNELSUBPRIORITY = 0X02;
- NVIC_INITSTRUCTURE.NVIC_IRQCHANNELCMD = ENABLE;
- NVIC_INIT(&NVIC_INITSTRUCTURE);
- }
復制代碼
3. 主函數
- #include "stm32f4xx.h"
- #include "LCD/LCD.H"
- #include <STDIO.H>
- #include "tcs3200.h"
- #include "PICTURE.H"
- #include "ASCIILIB.H"
- #include "KEY.H"
- /*******************************************************************************
- * Function Name : Delay
- * Description : Delay Time
- * Input : - NCOUNT: Delay Time
- * Output : None
- * Return : None
- * Attention : None
- *******************************************************************************/
- /*****************************************************************************
- H指hue(色相)、S指saturation(飽和度)、L指lightness(亮度)、V指value(色調)、B指brightness(明度)。
- 色相(H)是色彩的基本屬性,就是平常所說的顏色名稱,如紅色、黃色等。
- 飽和度(S)是指色彩的純度,越高色彩越純,低則逐漸變灰,取0-100%的數值。
- 明度(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度: 藍色,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轉化到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); //函數聲明
- //============================
- /*******************************************************************************
- * Function Name : main
- * Description : Main program
- * Input : None
- * Output : None
- * Return : None
- * Attention : None
- *******************************************************************************/
- int main(void)
- {
- uint8_t ss[20];
- //01添加
- float Max=0,Min=0;
- float Rhsv=0,Ghsv=0,Bhsv=0;
- float H=0,S=0,V=0;
- uint16_t i;
- uint8_t R=0x00,G=0x00,B=0x00;
- uint16_t RGB=0x0000;
- //-- 定義 基準變量
- uint8_t R0=0xff,G0=0xff,B0=0xff,R1=0xff,G1=0xff,B1=0xff,R2=0xff,G2=0xff,B2=0xff,R3=0xff,G3=0xff,B3=0xff,R4=0xff,G4=0xff,B4=0xff;
- int dR0=0,dG0=0,dB0=0;
- uint16_t RGB1=0xff,RGB2=0xff,RGB3=0xff,RGB4=0xff;
- uint8_t wc=50; //-- 誤差
- //
- NVIC_PRIORITYGROUPCONFIG(NVIC_PriorityGroup_2);//
- LCD_INITIALIZTION();
- JOY_KEY_GPIO_INIT();
- //02添加
- LCD_CLEAR(Yellow);
- LCD_DRAWPICTURE(0,17,74,91,gImage_picture);
- GUI_CHINESE(125,40,"蘇州大學",BLACK,YELLOW);
- GUI_CHINESE(105,60,"應用技術學院",BLACK,YELLOW);
- GUI_TEXT(125,80,"15",Black,Yellow);
- GUI_CHINESE(140,80,"電子轉",BLACK,YELLOW);
- GUI_CHINESE(80,105,"基于",BLACK,YELLOW);
- GUI_TEXT(110,105,"TCS3200",Black,Yellow);
- GUI_CHINESE(170,105,"的顏色識別",BLACK,YELLOW);
- GUI_CHINESE(80,125,"外援",BLACK,YELLOW);
- GUI_CHINESE(80+15+15+15,125,"丁高杰",BLACK,YELLOW);
- GUI_CHINESE(80+15+15+15+15+15+15+15,125,"范佳新",BLACK,YELLOW);
- GUI_CHINESE(80,150,"陳佳玲",BLACK,YELLOW);
- GUI_CHINESE(150,150,"付亞茹",BLACK,YELLOW);
- GUI_CHINESE(160+15+15+15+15,150,"成澄",BLACK,YELLOW);
- GUI_TEXT(10,220,"2016.11",BLACK,YELLOW);
- GUI_CHINESE(160,220,"按",BLACK,YELLOW);
- GUI_TEXT(180,220,"USER",Black,Yellow);
- GUI_CHINESE(220,220,"鍵進入主界面",BLACK,YELLOW);
- //-- 等待User鍵
- while(USER_KEY!=READ_JOY_KEY_STATE())
- ;
- //-- 進入第二界面
- //for(i=0;i<20;i++) Delay_Ms(5000);
- LCD_CLEAR(WHITE);
- GUI_CHINESE(125,60,"請在此進行",BLACK,RED);
- GUI_CHINESE(125,80,"白平衡調整",BLACK,RED);
- DELAY_MS(5000);
- //-- 顯示 基準色塊
- //LCD_DRAWSQUARE(10,170,200,190,RGB0);
- //03添加
- GUI_TEXT(10,210,"TCS3200",RED,WHITE);
- DELAY_MS(5000);
- FOR(I=0;I<20;I++) DELAY_MS(5000);
- tcs3200_init(1,1);//初始化(速率調整)
- WHITEBALANCE(); //白平衡
- GUI_TEXT(0,0,"Rgena:",Red,White);
- GUI_TEXT(0,18,"Ggena:",Red,White);
- GUI_TEXT(0,36,"Bgena:",Red,White);
- //PUTCHAR(50,0,5,Red,White); //顯示一個數字
- SPRINTF((char *)ss,"%3d",Rgena);
- GUI_TEXT(50,0,ss,Black,White);
- //PUTCHAR(50,18,6,Red,White); //顯示一個數字
- SPRINTF((char *)ss,"%3d",Ggena);
- GUI_TEXT(50,18,ss,Black,White);
- //PUTCHAR(50,36,7,Red,White); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3D",BGENA);
- GUI_TEXT(50,36,ss,Black,White);
- //03添加
- //04添加
- GUI_TEXT(30,50,"R:",Black,White);
- GUI_TEXT(30,70,"G:",Black,White);
- GUI_TEXT(30,90,"B:",Black,White);
- GUI_TEXT(30,110,"H:",Black,White);
- GUI_TEXT(30,130,"V:",Black,White);
- GUI_TEXT(30,150,"S:",Black,White);
- chromatogram();//色譜調出
- /* Infinite loop */
- while (1)
- {
- //=================================================================================
- R = tcs3200_RED();
- G = tcs3200_GREEN(); //取RGB值
- B = tcs3200_BLUE();
- RGB = 0x0000;
- RGB |=(unsigned long) R*1000/8225<<11;
- RGB |=(unsigned long) G*1000/4047<<5; //轉換成屏幕的4W色顯示
- RGB |=(unsigned long) B*1000/8225;
- //================================================================================
- RHSV = (float) R/25/10;
- GHSV = (float) G/25/10; //RGB轉換成0,1.
- BHSV = (float) B/25/10;
- //=================================================================================
- //RGB轉HSV算法
- Max = (RHSV>GHSV)?RHSV:GHSV; //RGB轉HSV算法
- Max = (MAX>BHSV)?MAX:BHSV; //取RGB最大值 //RGB轉HSV算法
- Min = (RHSV<GHSV)?RHSV:GHSV; //RGB轉HSV算法
- Min = (Min<BHSV)?MIN:BHSV; //去RGB最小值 //RGB轉HSV算法
- //RGB轉HSV算法
- if(RHSV==Max) H = (GHSV-BHSV)/(Max-Min); //RGB轉HSV算法
- if(GHSV==Max) H = 2+(BHSV-RHSV)/(Max-Min); //RGB轉HSV算法
- if(BHSV==Max) H = 4+(RHSV-GHSV)/(Max-Min); //RGB轉HSV算法
- H =(INT) (H*60); //RGB轉HSV算法
- if(H<0) H = H+360; //RGB轉HSV算法
- //RGB轉HSV算法
- V = (RHSV>GHSV)?RHSV:GHSV; //RGB轉HSV算法
- V = (V>BHSV)?V:BHSV; //取V的數值 //RGB轉HSV算法
- //RGB轉HSV算法
- S = (Max-Min)/Max; //取S的數值 //RGB轉HSV算法
- //RGB轉HSV算法
- V = (INT) (V*100); //RGB轉HSV算法
- S = (INT) (S*100); //RGB轉HSV算法
- //==============================
- //-- 記錄 基準色塊
- // while(USER_KEY == READ_JOY_KEY_STATE())
- // {
- // R0=R;G0=G;B0=B;
- // RGB0=RGB;
- // LCD_DRAWSQUARE( 233, 60, 317, 120, RGB0 );
- // DELAY_MS(100);
- // };
- /*
- while (JOY_A_KEY == READ_JOY_KEY_STATE())
- {
- R1=R;G1=G;B1=B;
- RGB1=RGB;
- LCD_DRAWSQUARE( 233, 60, 317, 120, RGB1 );
- DELAY_MS(100);
- }; */
- while (JOY_B_KEY == READ_JOY_KEY_STATE())
- {
- R2=R;G2=G;B2=B;
- RGB2=RGB;
- LCD_DRAWSQUARE( 233, 60, 317, 120, RGB2 );
- DELAY_MS(100);
- };
- while (JOY_C_KEY == READ_JOY_KEY_STATE())
- {
- R3=R;G3=G;B3=B;
- RGB3=RGB;
- LCD_DRAWSQUARE( 233, 60, 317, 120, RGB3 );
- DELAY_MS(100);
- };
- while (JOY_D_KEY == READ_JOY_KEY_STATE())
- {
- R4=R;G4=G;B4=B;
- RGB4=RGB;
- LCD_DRAWSQUARE( 233, 60, 317, 120, RGB4 );
- DELAY_MS(100);
- };
- //if
- //==============================
- //======================================================================================================
- // PUTCHAR(50,50,R,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3D",R);
- GUI_TEXT(50,50,SS,BLACK,WHITE);
- // PUTCHAR(50,70,G,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3D",G);
- GUI_TEXT(50,70,SS,BLACK,WHITE);
- //PUTCHAR(50,90,B,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3D",B);
- GUI_TEXT(50,90,SS,BLACK,WHITE);
- // PUTCHAR(50,110,H,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3.0F",H);
- GUI_TEXT(50,110,SS,BLACK,WHITE);
- // PUTCHAR(50,130,V,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3.0F",V);
- GUI_TEXT(50,130,SS,BLACK,WHITE);
- // PUTCHAR(50,150,S,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3.0F",S);
- GUI_TEXT(50,150,SS,BLACK,WHITE);
- //==============================
- //-- 判斷 白色的
- //if(R==255& G == 255& B == 255) {
- // GUI_CHINESE(50,220,"白色的",BLACK,RED);
- //h}
- //-- 判斷 基準色
- dR0=R-R0;dG0=G-G0;dB0=B-B0;
- // PUTCHAR(50,50,R,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3D",DR0);
- GUI_TEXT(240,145,SS,BLACK,WHITE);
- // PUTCHAR(50,70,G,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3D",DG0);
- GUI_TEXT(240,165,SS,BLACK,WHITE);
- //PUTCHAR(50,90,B,BLACK,WHITE); //顯示一個數字
- SPRINTF((CHAR *)SS,"%3D",DB0);
- GUI_TEXT(240,185,ss,Black,White);
- // if ((R>(R0-wc)&&R<(R0+wc)) && (G>(G0-wc) && G<(G0+wc)) && (B>(B0-wc) && B<(B0+wc)) )
- // {
- // GUI_CHINESE(240,125,"識別一",BLACK,GREEN);
- // }
- // if((R>(R1-wc)&&R<(R1+wc)) && (G>(G1-wc) && G<(G1+wc)) && (B>(B1-wc) && B<(B1+wc)) )
- // {
- // GUI_CHINESE(240,125,"識別一 ",BLACK,GREEN);
- // }
- if((R>(R2-wc)&&R<(R2+wc)) && (G>(G2-wc) && G<(G2+wc)) && (B>(B2-wc) && B<(B2+wc)))
- {
- GUI_CHINESE(240,125,"識別一",BLACK,GREEN);
- }
- else if((R>(R3-wc)&&R<(R3+wc)) && (G>(G3-wc) && G<(G3+wc)) && (B>(B3-wc) && B<(B3+wc)) )
- {
- GUI_CHINESE(240,125,"識別二",BLACK,GREEN);
- }
- else if((R>(R4-wc)&&R<(R4+wc)) && (G>(G4-wc) && G<(G4+wc)) && (B>(B4-wc) && B<(B4+wc)) )
- {
- GUI_CHINESE(240,125,"識別三",BLACK,GREEN);
- }
- else
- {
- GUI_CHINESE(240,125,"未識別",BLACK,RED);
- }
- // GUI_CHINESE(240,125,"未識別",BLACK,RED);
- LCD_DRAWSQUARE( 233, 0, 317, 50, RGB );
- }
- }
- void chromatogram(void)
- {
- uint16_t I=0;
- uint16_t color;
- uint16_t 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_DRAWLINE(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降下來
- color |= (unsigned long) Bi*1000/8225;
- LCD_DRAWLINE(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_DRAWLINE(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降下來
- color |= (unsigned long) RI*1000/8225<<11;
- LCD_DRAWLINE(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_DRAWLINE(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降下來
- LCD_DRAWLINE(100,i,230,i,color);
- Bi = Bi-4;
- }
- //===========================================================================
- }
復制代碼
4.3. 流程圖(見附件)5.1. 測試內容5.1.1. 測試結果啟動后,用液晶屏上顯示歡迎界面,按USER鍵進入主界面,主界面的屏幕被分為三個部分,其中三個部分:左邊為RGB數值,也分上中下三個部分,最上面3個值是白平衡時的值,也就是白色的RGB值;中間3個值是實時測得的RGB值;最后3個是把RGB值轉換到HVS值;可以識別三種顏色,當傳感器放在一種顏色上,按用戶鍵,設置此顏色為標準顏色,然后對顏色依次掃描,當掃到標準顏色界面會顯示“識別一”,“識別二”,“識別三”;當掃到其它顏色界面會顯示“未識別”。
主界面
識別一:紅色
識別二:綠色
識別三:藍色
未識別:黑色
5.1.2. 測試評價可以調節按鍵來分別識別三種顏色,還可以進行深度擴展。
6. 總結6.1. 任務完成情況基本完成老師所布置的要求,能夠很好掃描顯示顏色并顯示顏色的RGB值,并且在彩色顯示屏上顯示出來。
6.2. 總結報告進行了為期一周的實訓,我們對RAM開發板有了初步的了解,對TCS3200顏色傳感器進行了深入研究。進行調試時,一定要白平衡。在我們的共同努力下,不斷地進行調試,終于解決問題。在解決困難的過程中,讓我們深刻的體會到,在工作的時候,我們一定要細心、耐心才能最終解決問題以達到實訓的最終目的。
這次實訓讓我們得到了很多的鍛煉,也讓我們發現了自身的不足與缺陷。最后也很感謝丁老師對于我們實訓中幫助和指導。