基于CW32系列MCU的GY-33颜色识别模块设计

一、简介
1.gy-33是一种基于tcs34725颜色传感器的颜色识别模块。tcs34725是一种高精度光学传感器,能够检测红、绿、蓝三个基本色的光谱信息,从而实现对物体颜色的准确识别,该模块的具体应用场景包括以下几个方面:
(1)电子设备颜色校准:在电子设备制造过程中,颜色一致性非常重要。使用gy-33模块可以帮助制造商检测和校准电子设备的颜色,确保不同设备之间的颜色表现一致。
(2)色彩分析和精确匹配:gy-33模块在颜色分析和匹配方面有广泛应用。例如,在印刷行业中,可以使用该模块来检测和匹配颜色样本,从而确保印刷品的准确颜色表现。
(3)机器人视觉系统:gy-33模块可以用于机器人视觉系统,帮助机器人在环境中对不同颜色的物体进行识别和分类。这在物流、仓储和自动导航系统中非常有用,机器人可以根据物体的颜色属性执行相应的任务。
    二、所需物料
本实验使用到了cw32f030c8小蓝板、gy-33颜色识别模块、0.96寸oled显示屏,rgb全彩led模块、轻触开关模块及keil5开发环境。
cw32f030c8小蓝板
gy-33颜色识别模块
rgb全彩led模块
实物展示
【gy-33与单片机连线】:vcc+3.3v
   gndgnd
   drpa5
   ctpa4
【led与单片机连线】:v+3.3v
        rpa0
    gpa1
    bpa2
【轻触开关与单片机连线】:vcc+3.3v
gndgnd
outpb9
此模块有两种方式读取数据,即串口uart或者 mcu_iic,本次实验采用mcu_iic的方式。
有简单的7种颜色识别,单片机不参与数据处理工作,不需要计算rgb值,直接读取吧 数据即可。需要特别注意的是:
三、核心代码
main.c:#include main.h#include rgb.h#include gtim.h#include delay.h#include gy_33.h#include oled.h#include key.h#include btim.h#define length 3 //读取数据的长度uint8_t press_flag=0; //按键按下标识uint8_t data[length]={0}; //存放读取到的rgb数据uint8_t color[1]={0}; //存放模块识别到的颜色数据char *str[]={blue,dblue,green,black,white,pink,yellow,red};//模块可以识别到的颜色int main(){ uint8_t i; oled_init(); //oled显示 rgb_gpio_init(); //rgb灯gpio初始化 gtim2_init(); //gtim2初始化配置为pwm输出模式 i2c_gpio_init(); //gy-33模块gpio初始化 key_gpio_init(); //按键gpio初始化 btim_init(); //btim定时器初始化,定时控制按键扫描周期// writedata(gy33_addr,config,0x51); //启动白平衡,等级亮度为5 while(1) { if(press_flag==1) //若按键标识已打开,代表有按键按下,执行按键功能 { oled_clear(); //清屏 if(readdata(gy33_addr,r,data,length)) //读取模块检测颜色并进行处理后返回的rgb值 { oled_showstring(1,1,rgb:); oled_shownum(1,5,data[0],3); //r值 oled_shownum(2,5,data[1],3); //g值 oled_shownum(3,5,data[2],3); //b值 } rgb_running(data); //rgb全彩led灯根据读取到的rgb进行显示 delay_ms(100); //数据读取间隔应不小于100ms if(readdata(gy33_addr,color,color,1))//读取模块检测颜色并进行处理后的颜色信息返回值 { for(i=0;i>i)==1) //判断哪一位为1 { oled_showstring(4,1,color:); oled_showstring(4,7,str[7-i]); //显示对应颜色 break; } } } press_flag=0; //执行完关闭按键标识 } }}void btim1_irqhandler(void) //btim1中断服务函数{ static unsigned int cnt = 0; if(btim_getitstatus(cw_btim1,btim_it_ov)) { if(++cnt>=20) //20ms定时,执行一次按键扫描 { cnt = 0; if(key_scan()==1) //返回值不为0时 press_flag=1; //打开按键标识 } btim_clearitpendingbit(cw_btim1,btim_it_ov); //清除标志位 }}gy-33.c:#include main.h#include delay.h#include gy_33.hvoid i2c_gpio_init(void) //gy-33颜色识别模块gpio初始化{ __rcc_gpioa_clk_enable(); gpio_inittypedef gpio_initstruct; gpio_initstruct.it=gpio_it_none; gpio_initstruct.mode=gpio_mode_output_od; //开漏输出 gpio_initstruct.pins=gpio_pin_4|gpio_pin_5; gpio_initstruct.speed=gpio_speed_high; gpio_init(cw_gpioa, &gpio_initstruct); scl(1); sda(1);}void i2c_delay() //i2c延时函数{ delay_us(time);}uint8_t i2c_start(void) //发送起始信号{ sda(1); scl(1); i2c_delay(); if(readsda==0) return 0; sda(0); i2c_delay(); if(readsda==1) return 0; scl(0); i2c_delay(); return 1;}void i2c_stop(void) //发送停止信号{ sda(0); scl(0); i2c_delay(); scl(1); i2c_delay(); sda(1);}void i2c_sendack(uint8_t ackbit) //发送应答{ sda(ackbit); scl(1); i2c_delay(); scl(0); i2c_delay();}void i2c_sendbyte(uint8_t byte) //发送1字节(8-bit)的数据{ uint8_t i; scl(0); for (i = 0; i < 8; i++) { if(byte&0x80) sda(1); else sda(0); scl(1); i2c_delay(); scl(0); byte<<=1; i2c_delay(); }}uint8_t i2c_receivebyte(void) //接收1字节(8-bit)的数据{ uint8_t data,i; sda(1); delay_us(1); for(i=0;i<8;i++) { scl(1); data<<=1; if(readsda==1) data|=0x01; i2c_delay(); scl(0); i2c_delay(); } return data;}uint8_t i2c_waitack(void) //等待应答{ uint16_t i; sda(1); scl(1); while(readsda==1) { if(++i==500) break; } if(readsda==1) { scl(0); return 0; } i2c_delay(); scl(0); i2c_delay(); return 1; }uint8_t writedata(uint8_t slave_addr,uint8_t reg_addr,uint8_t data) //写操作{ if(i2c_start()==0) return i2c_sendbyte(slave_addr); if(i2c_waitack()==0) return i2c_sendbyte(reg_addr); if(i2c_waitack()==0) return i2c_sendbyte(data); if(i2c_waitack()==0) return i2c_stop(); //发送停止信号 return 1;}uint8_t readdata(uint8_t slave_addr,uint8_t reg_addr,uint8_t *data,uint8_t length) //读操作{ if(i2c_start()==0) return i2c_sendbyte(slave_addr); if(i2c_waitack()==0) return i2c_sendbyte(reg_addr); if(i2c_waitack()==0) return if(i2c_start()==0) return i2c_sendbyte(slave_addr+1); if(i2c_waitack()==0) return while(--length){ *data++=i2c_receivebyte(); i2c_sendack(0); delay_ms(110); } *data=i2c_receivebyte(); i2c_sendack(1); i2c_stop(); //发送停止信号 return 1; }  
  四、实物展示+效果演示


运算放大器的三个电路讲解
新思科技3DIC Compiler通过三星多裸晶芯片集成流程认证,助力2.5D和3D IC设计
异步电动机变频调速的基本原理
浅析2021年各行业芯片供应情况
苹果Apple Watch扩大显示心肺功能
基于CW32系列MCU的GY-33颜色识别模块设计
2012年度亚洲市场最具价值品牌 三星居首
病毒检测仪的仪器特点是怎样的
板上芯片封装(COB),板上芯片封装(COB)是什么意思
RFID什么意思
低压配电柜出线要求和安装规范
华为Mate10什么时候上市?华为Mate10最新消息:华为Mate10将要发布了,华为Mate9如今已跳水降价进入2711元
东莞成立新一代人工智能产业技术创新联盟 拓展人工智能的发展
%100%出售/收购 R3754A R3762AH HP87
2018西部成都名贵中药材暨养生滋补品博览会
云丁科技鹿客智能门锁安全简介
触摸开关电路的工作原理分析
中国普天TD-SCDMA室内覆盖解决方案
压力开关的使用方法与注意事项
卡尔曼滤波算法c语言实现方法