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颜色传感器进行了深入研究。进行调试时,一定要白平衡。在我们的共同努力下,不断地进行调试,终于解决问题。在解决困难的过程中,让我们深刻的体会到,在工作的时候,我们一定要细心、耐心才能最终解决问题以达到实训的最终目的。
这次实训让我们得到了很多的锻炼,也让我们发现了自身的不足与缺陷。最后也很感谢丁老师对于我们实训中帮助和指导。