348|7

2157

帖子

3

资源

版主

【国民技术N32G430】6、STK33B62光传感器检测 [复制链接]

最近做了一个光传感测检测的工程,在这里跟大家分享一下。

STK33B62集成了环境和红外内置940nm VCSEL的光数字转换器(垂直腔面发射激光器)二极管和I2C接口。此设备不仅提供环境光线感应,实现强健的背光/显示亮度控制和红外感应具有中断功能的邻近估计。对于环境光感应,STK33B62包括一个光电二极管、定时控制器和ADC炸薯条出色的光谱响应设计用于靠近人眼。STK33B62适用于检测宽范围的光强度环境对于接近感测,STK33B62也集成了光电二极管、定时控制器和ADC在同一芯片中。光谱响应STK33B62针对波长940nm进行了优化红外线。STK33B62提供可编程功能驱动VCSEL并使用噪声的电流设置高度拒绝不需要的取消方案环境红外噪声。STK33B62具有强大的片上刷新率设置没有外部组件。软件关闭提供模式控制以节省电力应用STK33B62工作电压范围为1.7伏至2.0伏。

驱动程序:

#include "stk33b62.h"
#include "i2c.h"
#include "stdio.h"
#include "oled.h"

u8 stk33b62_init(void)
{
  u8 res = 1;
  res = stk33b62_write_reg(SOFT_RESET,0x00);
  if(res == 0)
  {
    printf("init STK33B62 OK!");
  }
  else
    return 1;
  res = ap3216c_read_one_reg(PDT_ID);
  if(res == 1)
  {
    printf("read PID ERROR!\n");
    return 1;
  }
  else
  {
    printf("ID: %x\n",res);
    
  }
  //写入可测量参数
  res = stk33b62_write_reg(STK_STATE,EN_ALSK | EN_WAIT | EN_ALS | EN_PS);
  if(res ==1)
  {
    printf("EN STK ERROR!\n");
    return 1;
  }
  
  //写入PSS累计时间采样 384Us b100, 次数 b001 2  0x41
  res = stk33b62_write_reg(PSCTRL,0x41);
  //写入ALS累计时间采样 100ms b101, 次数 b001 1  0x50  默认值,可以不写
  return 0;
}

//往reg寄存器中写入dat数据
u8 stk33b62_write_reg(u8 reg,u8 dat)
{
	I2C_Start();
	I2C_Send_Byte(STK33B62_ADDR|OLED_CMD);
	if(I2C_WaitAck())
  {
    printf("waitack err1");
		return 1;
  }
	I2C_Send_Byte(reg);
	if(I2C_WaitAck())
  {
    printf("waitack err2");
		return 2;
  }
	I2C_Send_Byte(dat);
	if(I2C_WaitAck())
  {
    printf("waitack err3");
		return 3;	
  }
	I2C_Stop();
	
	return 0;//代表成功
}


//返回值:读到的数据
u8 ap3216c_read_one_reg(u8 reg)
{
	u8 dat;
	
	I2C_Start();
	I2C_Send_Byte(STK33B62_ADDR|OLED_CMD);
	if(I2C_WaitAck())
		return 1;
	I2C_Send_Byte(reg);
	if(I2C_WaitAck())
		return 2;		
  I2C_Stop();
	I2C_Start();
	I2C_Send_Byte(STK33B62_ADDR|OLED_DATA);
	if(I2C_WaitAck())
		return 3;		
	dat = I2C_Read_Byte(0);
	I2C_Stop();
	
	return dat;
}



u16 ap3216c_read_two_reg(u8 reg)
{
  u16 data;
  I2C_Start();
	I2C_Send_Byte(STK33B62_ADDR|OLED_CMD);
	if(I2C_WaitAck())
		return 1;
	I2C_Send_Byte(reg);
	if(I2C_WaitAck())
		return 2;		
  I2C_Stop();
	I2C_Start();
	I2C_Send_Byte(STK33B62_ADDR|OLED_DATA);
	if(I2C_WaitAck())
		return 3;		
	data = (u16) I2C_Read_Byte(1);
  data = (u16)((data<<8) | I2C_Read_Byte(0));
	I2C_Stop();
  return data;
}
// 读取ALS值 
#define START_X 30
#define END_X 80

void READ_ALS(void)
{
  u16 als, ps;
  u8 string_als[4];
  u8 string_ps[4];
  u8 n,midde;
  als = ap3216c_read_two_reg(DATA1_ALS);
  sprintf(string_als,"%4d",als);
  if(als <1)
  {
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,7+n,END_X,7+n,0);
    }
  }
  else if(als<10)
  {
    midde=START_X + 10;
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,7+n,midde,7+n,1);
      OLED_DrawLine(midde,7+n,END_X,7+n,0);
    }
    
  }
  else if(als<100)
  {
    midde=START_X + 20;
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,7+n,midde,7+n,1);
      OLED_DrawLine(midde,7+n,END_X,7+n,0);
    }
  }
  else if(als<1000)
  {
    midde=START_X + 40;
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,7+n,midde,7+n,1);
      OLED_DrawLine(midde,7+n,END_X,7+n,0);
    }
  }
  else{
     midde=START_X + 50;
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,7+n,midde,7+n,1);
      OLED_DrawLine(midde,7+n,END_X,7+n,0);
    }
  }
  OLED_ShowString(90,0,string_als,16,1);
  ps = ap3216c_read_two_reg(DATA1_PS);
  sprintf(string_ps,"%4d",ps);
  if(ps <1)
  {
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,22+n,END_X,22+n,0);
    }
  }
  else if(ps<10)
  {
    midde=START_X + 10;
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,22+n,midde,22+n,1);
      OLED_DrawLine(midde,22+n,END_X,22+n,0);
    }
  }
  else if(ps<100)
  {
    midde=START_X + 30;
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,22+n,midde,22+n,1);
      OLED_DrawLine(midde,22+n,END_X,22+n,0);
    }
  }
  else if(ps<1000)
  {
    midde=START_X + 40;
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,22+n,midde,22+n,1);
      OLED_DrawLine(midde,22+n,END_X,22+n,0);
    }
  }
  else{
    midde=START_X + 50;
    for(n=0;n<6;n++)
    {
      OLED_DrawLine(START_X,22+n,midde,22+n,1);
      OLED_DrawLine(midde,22+n,END_X,22+n,0);
    }
  }
  
  OLED_ShowString(90,16,string_ps,16,1);
  
}

57b12ce5742337ee8db1d6fa55a4618.png  

光传感

 


回复

775

帖子

0

资源

版主

光传感器的通信接口是什么?

点评

I2C接口,这个传感器资料很少,说明书是外文的,学了好久。。。  详情 回复 发表于 6 天前

回复

2157

帖子

3

资源

版主

秦天qintian0303 发表于 2022-9-22 10:35 光传感器的通信接口是什么?

I2C接口,这个传感器资料很少,说明书是外文的,学了好久。。。


回复

1905

帖子

0

资源

版主

这个是可以检测多种波长的光吗?


回复

656

帖子

1

资源

一粒金砂(高级)

我们用的手机上就有这个sensor。。。。

接听电话时脸部挨近手机屏时屏幕会暗。。。。

点评

对头,顾客是用来检测专感器好坏用的。  详情 回复 发表于 6 天前

回复

2157

帖子

3

资源

版主

Orima 发表于 2022-9-22 20:09 我们用的手机上就有这个sensor。。。。 接听电话时脸部挨近手机屏时屏幕会暗。。。。

对头,顾客是用来检测专感器好坏用的。


回复

95

帖子

0

资源

一粒金砂(中级)

高产哥啊,确实挺好玩的。有没有做其他传感器的连接调试工程玩?

点评

最近刚好做一个测试架,顺便拿出来完成作业 。。。手头上的sht30什么的  详情 回复 发表于 3 天前

回复

2157

帖子

3

资源

版主

Honghuzaitian 发表于 2022-9-25 00:49 高产哥啊,确实挺好玩的。有没有做其他传感器的连接调试工程玩?

最近刚好做一个测试架,顺便拿出来完成作业 。。。手头上的sht30什么的


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表