继续来来分享一波自己做过的,凑个热闹,搞点积分!!! 开发板用的依然是是STM32G491 Nucleo-64开发板: 这次的传感器换成了TCS34725颜色传感器,依然是IIC接口通讯: 显示用的是12864OLED,也是IIC接口。 下面进入程序配置,打开CUBEMX。选择IIC1跟IIC2还有串口跟LED。 生成程序后用keil打开,修改逻辑部分: OLED部分跟上一帖一样就不多说了,主要来说下TCS34725: #include "TCS34725.h" extern I2C_HandleTypeDef hi2c1; / h7 L% x6 Z/ X 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); 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); //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; 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)); } } 主要就几个函数,TCS34725设置积分时间、使能、增益、 初始化函数,通道数据读取、以及转换函数。 然后在主函数中调用并显示 最后是实际效果图,可以用不同的颜色来测试: 不得不说CUBEMX真的让效率提升太多了,很方便!! |