你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【年中粉丝节】 STM32G491 Nucleo-64开发板+TCS34725颜色传感器,实现识别颜色应用并在OLED上显示

[复制链接]
xudongqiang 发布时间:2021-6-29 11:45
继续来来分享一波自己做过的,凑个热闹,搞点积分!!!
开发板用的依然是是STM32G491 Nucleo-64开发板:
173536r0byscs4c8ykqc84.png
这次的传感器换成了TCS34725颜色传感器,依然是IIC接口通讯:
QQ截图20210629114425.png
QQ截图20210629114111.png
显示用的是12864OLED,也是IIC接口。
下面进入程序配置,打开CUBEMX。选择IIC1跟IIC2还有串口跟LED。
QQ截图20210629113052.png
生成程序后用keil打开,修改逻辑部分:
OLED部分跟上一帖一样就不多说了,主要来说下TCS34725:
#include "TCS34725.h"
extern I2C_HandleTypeDef hi2c1;

1 G1 a$ X! G* p" @. m' c- l
COLOR_RGBC rgb;
COLOR_HSL  hsl;
/*******************************************************************************
* @brief TCS34725设置积分时间
*
* @return None
*******************************************************************************/
void TCS34725_SetIntegrationTime(uint8_t time)
{
        HAL_I2C_Mem_Write(&hi2c1,TCS34725_ADDRESS|TCS34725_I2C_WR,TCS34725_ATIME|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT,&time,1,0x100);
}
/*******************************************************************************
* @brief TCS34725设置增益
*
* @return None
*******************************************************************************/
void TCS34725_SetGain(uint8_t gain)
{
        HAL_I2C_Mem_Write(&hi2c1,TCS34725_ADDRESS|TCS34725_I2C_WR,TCS34725_CONTROL|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT,&gain,1,0x100);
        
}
/*******************************************************************************
* @brief TCS34725使能
*
* @return None
*******************************************************************************/
void TCS34725_Enable(void)
{
        uint8_t cmd = TCS34725_ENABLE_PON;
        HAL_I2C_Mem_Write(&hi2c1,TCS34725_ADDRESS|TCS34725_I2C_WR,TCS34725_ENABLE|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);
0 p8 D( x3 _, l4 ]
        cmd = TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN;

  ]8 R& i, B! _, I" ~
        HAL_I2C_Mem_Write(&hi2c1,TCS34725_ADDRESS|TCS34725_I2C_WR,TCS34725_ENABLE|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);
        //delay_s(600000);//delay_ms(3);//延时应该放在设置AEN之后
}
/*******************************************************************************
* @brief TCS34725失能
*
* @return None
*******************************************************************************/
void TCS34725_Disable(void)
{
        uint8_t cmd = 0;
        
        HAL_I2C_Mem_Read(&hi2c1, TCS34725_ADDRESS|TCS34725_I2C_RD, TCS34725_ENABLE|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT, &cmd,sizeof(cmd) , 0x100);
        cmd = cmd & ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN);
        HAL_I2C_Mem_Write(&hi2c1,TCS34725_ADDRESS|TCS34725_I2C_WR,TCS34725_ENABLE|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);
}
/*******************************************************************************
* @brief TCS34725初始化
*
* @return ID - ID寄存器中的值
*******************************************************************************/
uint8_t TCS34725_Init(void)
{
        uint8_t id=0;
//         //TCS34725 的 ID 是 0x44 可以根据这个来判断是否成功连接,0x4D是TCS34727;
        HAL_I2C_Mem_Read(&hi2c1, TCS34725_ADDRESS|TCS34725_I2C_RD, TCS34725_ID|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT, &id,sizeof(id) , 0x100);
//        printf("id=%x\n",id);
        if(id==0x4D | id==0x44)
                {
                        TCS34725_SetIntegrationTime(TCS34725_INTEGRATIONTIME_50MS);
                        TCS34725_SetGain(TCS34725_GAIN_1X);
                        TCS34725_Enable();
                        return 1;
                }
        return 0;
}
/*******************************************************************************
* @brief TCS34725获取单个通道数据
*
* @return data - 该通道的转换值
*******************************************************************************/
uint16_t TCS34725_GetChannelData(uint8_t reg)
{
        uint8_t tmp[2] = {0,0};
        uint16_t data;
        HAL_I2C_Mem_Read(&hi2c1, TCS34725_ADDRESS|TCS34725_I2C_RD, reg|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT, tmp,sizeof(tmp) , 0x100);
        data = (tmp[1] << 8) | tmp[0];
        
        return data;
}
/*******************************************************************************
* @brief TCS34725获取各个通道数据
*
* @return 1 - 转换完成,数据可用
*              0 - 转换未完成,数据不可用
*******************************************************************************/
uint8_t TCS34725_GetRawData(COLOR_RGBC *rgbc)
{
        uint8_t status = TCS34725_STATUS_AVALID;

  p8 s% G6 l  {& \1 o
        HAL_I2C_Mem_Read(&hi2c1, TCS34725_ADDRESS|TCS34725_I2C_RD, TCS34725_STATUS|TCS34725_COMMAND_BIT,I2C_MEMADD_SIZE_8BIT, &status,sizeof(status) , 0x100);        
        if(status & TCS34725_STATUS_AVALID)
        {
                rgbc->c = TCS34725_GetChannelData(TCS34725_CDATAL);        
                rgbc->r = TCS34725_GetChannelData(TCS34725_RDATAL);        
                rgbc->g = TCS34725_GetChannelData(TCS34725_GDATAL);        
                rgbc->b = TCS34725_GetChannelData(TCS34725_BDATAL);
                return 1;
        }
        return 0;
}
/******************************************************************************/
//RGB转HSL
void RGBtoHSL(COLOR_RGBC *Rgb, COLOR_HSL *Hsl)
{
        uint8_t maxVal,minVal,difVal;
        uint8_t r = Rgb->r*100/Rgb->c;   //[0-100]
        uint8_t g = Rgb->g*100/Rgb->c;
        uint8_t b = Rgb->b*100/Rgb->c;
        
        maxVal = max3v(r,g,b);
        minVal = min3v(r,g,b);
        difVal = maxVal-minVal;
        
        //计算亮度
        Hsl->l = (maxVal+minVal)/2;   //[0-100]
        
        if(maxVal == minVal)//若r=g=b,灰度
        {
                Hsl->h = 0;
                Hsl->s = 0;
        }
        else
        {
                //计算色调
                if(maxVal==r)
                {
                        if(g>=b)
                                Hsl->h = 60*(g-b)/difVal;
                        else
                                Hsl->h = 60*(g-b)/difVal+360;
                }
                else
                        {
                                if(maxVal==g)Hsl->h = 60*(b-r)/difVal+120;
                                else
                                        if(maxVal==b)Hsl->h = 60*(r-g)/difVal+240;
                        }
               
                //计算饱和度
                if(Hsl->l<=50)Hsl->s=difVal*100/(maxVal+minVal);  //[0-100]
                else
                        Hsl->s=difVal*100/(200-(maxVal+minVal));
        }
}
: u1 R. I3 N1 q2 E* D) C9 s
主要就几个函数,TCS34725设置积分时间、使能、增益、 初始化函数,通道数据读取、以及转换函数。
然后在主函数中调用并显示
QQ截图20210629114148.png
最后是实际效果图,可以用不同的颜色来测试:
QQ截图20210629113813.png
QQ截图20210629114000.png
不得不说CUBEMX真的让效率提升太多了,很方便!!
% c) D/ f  w0 l1 [6 d
收藏 评论0 发布时间:2021-6-29 11:45

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版