*以下文章资源均来自互联网,文章内容仅供参考,如果侵犯了您的权益,请留言或通过邮箱与我联系。
The following article resources are all from the Internet, the content of the article is for reference only. If you violate your rights and interests, please leave a message or contact me through email.
E-mail:chaoliang.hou@cn-depulong.com

/****************************************************************************************

在我学习STM32的时候使用的是正点原子的开发板,所以里面的有些代码可能使用了例程中的代码,如果这里会涉及利益上的问题,请与我取得联系。

/*****************************************************************************************

1 VEML6040颜色传感器

1.1 芯片简介

关于VEML6040颜色传感器的详细介绍可以到这个网址去看
https://atta.szlcsc.com/upload/public/pdf/source/20180511/C78465_1ECCD5CBB0DFD90660DF8047804D95FA.pdf

简单点来说,VEML6040是一款颜色传感器,可以获取当前颜色的RGBW值(W值有什么用我也不知道),然后通过计算得到色坐标,最终得到采集的颜色。
VEML6040适用于3.3V的单片机系统,采用I2C总线传输数据,使用OPLG封装(这种封装手焊很难的,因为引脚在芯片正下面)

芯片长这样的,手册里面也给出了推荐的焊盘尺寸:

手册里面得到4个焊盘的大小是不一样的,在立创商城里面也给出了推荐的尺寸:

这里面给出的是4个一样的,我实际用的这种封装焊接过,大小正好,但是还是差点,我推荐用手册中给出的,但是可以画成一样的4个焊盘。

1.2 芯片外围电路

手册中给出了芯片的推荐电路:

外围电路非常简单,
1.GND接地就可以
2.VDD接电源,但是要接0.1UF的电容滤波,所以在给芯片供电的时候,电源线要先经过电容再接入芯片
3.I2C的2根数据线分别接入单片机的I2C总线的引脚。当然你也可以使用I/O口软件模拟I2C的时序,这样的话就直接接2个普通的I/O口就可以了。
4.2跟数据线要通过2个上啦电阻拉高至3.3V(电源电压)

2 I2C总线

至于什么是I2C总线,百度比我解释的更加清楚,大家可以自己去查,VEML6040采用的是I2C总线进行数据传输,我们得首先知道I2C中的几个命令:

还有VEML6040在进行数据传输的时候的方式,手册里面给出了在进行获取颜色数据时候的时序:

3 基于STM32的程序

3.1 I2C驱动

首先我们应该写出I2C的驱动程序,就是上面说的那几个信号,开始、结束、应答信号。我这里采用的是是使用软件模拟的方式来驱动。

3.1.1 I/O口设置

使用软件模拟的话,就随便使用2个I/O就可以了,I/O口设置为输出模式就可以

 __HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

3.1.2 开始信号

这里的SDA1和SCL1是我之前久宏定义好的,就是对应相应的I/O口

void IIC1_Start(void)
{SDA1_OUT();     //sda线输出SDA1=1;         SCL1=1;delay_us(4);SDA1=0;//START:when CLK is high,DATA change form high to low delay_us(4);SCL1=0;//钳住I2C总线,准备发送或接收数据
}

3.1.3 停止信号

void IIC1_Stop(void)
{SDA1_OUT();//sda线输出SCL1=0;SDA1=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);SCL1=1; SDA1=1;//发送I2C总线结束信号delay_us(4);
}

3.1.4 等待应答信号

这里的SDA1_IN()是把这个I/O口设置为输入模式
我这里使操作寄存器实现的,就是把相应的寄存器置位就可以。

//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
#define SDA7_IN() {GPIOB->CRH&=0XF0FFFFFF;GPIOB->CRH|=(u32)8<<24;}
u8 IIC1_Wait_Ack(void)
{u8 ucErrTime=0;SDA1_IN();      //SDA设置为输入  SDA1=1;delay_us(1);      SCL1=1;delay_us(1);  while(Read_SDA1){ucErrTime++;if(ucErrTime>250){IIC1_Stop();return 1;}}SCL1=0;//时钟输出0        return 0;
}

3.1.5 应答信号

这里的SDA1_OUT()是把这个I/O口设置为输出模式
我这里使操作寄存器实现的,就是把相应的寄存器置位就可以。

#define SDA7_OUT() {GPIOB->CRH&=0XF0FFFFFF;GPIOB->CRH|=(u32)3<<24;}
//产生ACK应答
void IIC1_Ack(void)
{SCL1=0;SDA1_OUT();SDA1=0;delay_us(2);SCL1=1;delay_us(2);SCL1=0;
}

3.1.6 不应答信号

//不产生ACK应答
void IIC1_NAck(void)
{SCL1=0;SDA1_OUT();SDA1=1;delay_us(2);SCL1=1;delay_us(2);SCL1=0;
}

3.1.7 给指定地址发送信号

void IIC1_Send_Byte(u8 txd)
{                        u8 t;   SDA1_OUT();        SCL1=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              SDA1=(txd&0x80)>>7;if(txd==1) SDA1=1;if(txd==0) SDA1=0;   txd<<=1;       delay_us(2);   SCL1=1;delay_us(2); SCL1=0;  delay_us(2);}
}

经过以上几个步骤,I2C的驱动代码基本上就完成了。

3.2 VEML6040驱动

3.2.1 读取数据

这个函数可以在制定的地址读取数据

#define VEML6040_ADDR 0x20
u16 VEML6040_1_ReadByte(u16 ReadAddr)                   //指定地址读取一个字节
{u16 data=0;u8 msb=0;u8 lsb=1;IIC1_Start(); IIC1_Send_Byte(VEML6040_ADDR);      //发送写命令if(IIC1_Wait_Ack()==1)  return 1; IIC1_Send_Byte(ReadAddr);if(IIC1_Wait_Ack()==1)  return 1;  IIC1_Start();IIC1_Send_Byte((VEML6040_ADDR)+1);  //if(IIC1_Wait_Ack()==1)  return 1;lsb=IIC1_Read_Byte(0);           msb=IIC1_Read_Byte(0);  IIC1_Stop();data=((uint16_t)msb << 8)|lsb;return data;
}

3.2.2 写入数据

这个函数可以在制定的地址写入制定的数据或者命令,用来设置颜色传感器里面的一些参数

uint8_t VEML6040_1_Write_Bytes(uint8_t res,uint8_t cmd)
{uint8_t msb,lsb;msb=0x00;lsb=cmd;IIC1_Start();IIC1_Send_Byte(VEML6040_ADDR);if(IIC1_Wait_Ack()==1)  return 1;IIC1_Send_Byte(res);if(IIC1_Wait_Ack()==1)  return 1;  IIC1_Send_Byte(lsb);if(IIC1_Wait_Ack()==1)  return 1;IIC1_Send_Byte(msb);if(IIC1_Wait_Ack()==1)  return 1;IIC1_Stop();return 0;
}

3.3 设置参数

这里的意思是向0X10这个地址里面写入了0X00这个命令,是用来设置传感器的相应参数,

     veml_1_Ack = VEML6040_1_Write_Bytes(0x10,0x00);


如果你想设置别的参数,只需要按照手册里面的表格设置相应的参数就可以了

3.4 读取数据

分别从不同的地址读取不同的颜色数据

      if(veml_1_Ack==0){VEML6040_No_Read(1,0x08);VEML6040_1_R = VEML6040_1_ReadByte(0x08);//红 VEML6040_1_G = VEML6040_1_ReadByte(0x09);//绿VEML6040_1_B = VEML6040_1_ReadByte(0x0A);//蓝  VEML6040_1_W = VEML6040_1_ReadByte(0x0B);//白}

基于STM32的VEML6040颜色传感器应用相关推荐

  1. 9、★♥★基于STM32单片机的颜色检测仪设计♥☆

    9.★♥★基于STM32单片机的颜色检测仪设计♥☆ 文章目录 9.★♥★基于STM32单片机的颜色检测仪设计♥☆ 引言 1.系统概述 1.1.设计任务 1.2.设计要求 2.方案设计与论证 2.1.芯 ...

  2. 基于STM32和超声波测距传感器的测距功能设计

    基于STM32和超声波测距传感器的测距功能设计(使用陌生传感器的流程介绍) 引言 项目设计 项目简介 开发工具 硬件设计 软件设计 开发流程 阅读手册 配置并测试传感器相关设置 软件开发 总结 后续 ...

  3. 基于STM32F103的TCS3200颜色传感器的使用

    基于STM32F103的TCS3200颜色传感器的使用 团队布置的任务内容是2019年中国机器人大赛的题目,小车运行过程中需要对不同物料进行颜色上的识别.因此我最近就学了TCS3200颜色传感器的基本 ...

  4. Ardunio开发实例-VEML6040颜色传感器

    VEML6040颜色传感器 VEML6040颜色传感器可感测红,绿,蓝和白光,并使用CMOS工艺将光电二极管,放大器和模拟/数字电路整合到单个芯片中. 应用颜色传感器后,可以根据环境光源调整背光的亮度 ...

  5. 基于STM32的485通讯传感器采集程序

    基于STM32的485通讯传感器采集程序 先来看看硬件连接,大致就这样连接! 一般来说,RS485是硬件,而他软件方面是modbus协议,用到最多的是RTU方式. 工作方式:主机(STM32)通过串口 ...

  6. 71、基于STM32单片机的颜色识别感应传感器检测系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.PCB图 六.硬件框图 七.程序源码 八.资料包括 摘要 随着现代工业生产向高速化.自 ...

  7. arduino i2c 如何写16位寄存器_基于STM32使用I2C读取传感器数据

    撑腰会儿:I2C通信协议介绍​zhuanlan.zhihu.com 上文介绍了I2C协议的基本结构,今天,使用STM32和LM75A温度传感器来实现I2C读取信息. 首先,为了使用I2C读取传感器测量 ...

  8. 基于STM32的DHT11温湿度传感器设计

    文章目录 前言 一.DHT11温湿度传感器是什么? 二.DHT11驱动程序详解 1.相关宏定义 2.输入输出GPIO配置 2.GPIO初始化设计 3.检测DHT11是否正常工作 4.读取DHT11数据 ...

  9. 基于STM32的人体体温传感器MAX30205的应用

    目前现有的max30205的驱动代码大多是基于Arduino单片机的,之前用了一个模块,看了一下数据手册,通信用的是IIC通信,读写数据地址都按照数据手册中来就行,和我用过的其他IIC通信的传感器相比 ...

最新文章

  1. tp3.2 连接两个数据库
  2. 微信二次开发SDK使用教程--手机检测到有人点赞/取消点赞通知服务端
  3. CF1041F Ray in the tube构造_思维
  4. wptx64能卸载吗_电脑可以卸载bonjour软件吗?详细介绍bonjour软件
  5. List集合之LinkedList
  6. 微信查好友单删检测方法,无打扰,快来学
  7. day18 - 正则表达式
  8. 高校邦python网课答案_高校邦编程之美——python网课答案公众号
  9. Qt摄像头热插拔实现
  10. android生成透明图片格式,Android编程实现图片透明的方法
  11. Java+Springmvc+velement实现高校学科竞赛项目系统+Lw
  12. 小学计算机社团活动安排,小学计算机社团活动计划
  13. Word2vec And Doc2vec - 文本向量化
  14. 【金猿技术展】同盾科技知识联邦技术——3.0人工智能的坚强基石
  15. pip 添加trusted host 一劳永逸
  16. 计算机系统大作业 程序人生-Hello’s P2P
  17. 千川数据返回值解析(AES)解密
  18. Chrome浏览器内置翻译功能突然失效(自动翻译失败)解决方案
  19. XJTU-SY数据集轴承故障诊断
  20. 两栈共享存储空间(线性结构栈)

热门文章

  1. OpenMP使用详解
  2. logistic回归模型—基于R
  3. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
  4. Marathon Oil 通过使用 Liquid UI 简化 SAP PM,将生产力提高了 90%
  5. GIT+ Coding使用方法
  6. HDU 4311 - Meeting point-1(前缀和优化曼哈顿距离)
  7. CompositeDisposable
  8. 济南国家高新技术企业认定评审要点
  9. java科技论文20000字_科学素养论文范文 科学素养方面有关论文参考文献范文2万字...
  10. Java开发必看!拼多多+携程+蚂蚁金服技术面集合