12774浏览
查看: 12774|回复: 5

[进阶] 针对CM32181数字光线传感芯片开发的Arduino驱动库

[复制链接]
【背景】
        因工作需要单片机测试Capella Micro公司的CM32181数字环境光线传感器, 一块小PCBA。
此芯片为3.3V供电和3.3V I2C总线,支持polling和interrupt双模式操作。
此芯片在Arduino圈较少见,调试OK后顺便整成了一个Arduino驱动库上传到github上
方便大家使用。很希望以后能有更多的人为Arduino兼容丰富芯片做努力!

【驱动库github地址】
        
https://github.com/ShineHua2017/CM32181_arduino
【芯片Data Sheet地址】
        http://www.ibselectronics.com/ibsstore/datasheet/CM32181A3OP.pdf
针对CM32181数字光线传感芯片开发的Arduino驱动库图1针对CM32181数字光线传感芯片开发的Arduino驱动库图2
【调试环境】
        UNO x 1
        5V-3.3V IO电平转换板(需要SCL,SDA两路) x 1
        4.7K电阻(SCL,SDA上拉用) x 2
        芯片传感器PCBA的FFC接口转排针小板 x 1

针对CM32181数字光线传感芯片开发的Arduino驱动库图3
【示例代码】
[mw_shl_code=c,true]/* Arduino demo code for control Light Sensor chip -- CM32181  
* Setup chip on polling mode and read Lux value
*
* The circuit:
*    Ardunio           CM32181
*      SDA    <--->      SDA
*      SCL    <--->      SCL
*      
* library coding based on TWI library
*
* Written by Shine Hua
* Email Address: 20497409@qq.com huashine2013@gmail.com
*  
*/

#include <CM32181_arduino.h>
//CM32181 ADDR pin pull high to select address 0x48
//or low to select address 0x10

CM32181 cm(0x10);  //when  ADDR pin connect GND

void setup() {
  
  boolean error = false;
  uint16_t chip_id = 0;
  //uint16_t chip_status = 0;
  
  Serial.begin(9600);
  
  error = cm.init_chip();
  if(error == false){
    Serial.println("Not found chip device or init error!");
    while(true)
    {}
  }
  
  chip_id = cm.get_chip_ID();
  if(chip_id != 0x81){                         //chip ID must be 0x81
    Serial.println("unknown chip!");
    while(true)
    {}
  }
  
  //chip_status = cm.get_chip_status();  
  //error = cm.powerdown_chip();
  //error = cm.powerup_chip();
     
}

void loop() {
  
  uint16_t get_data = cm.read_sensor_raw();       //This is sensor raw data, not lux value. you need trans.
  String desc = "LUX raw data:";
  desc += get_data;
  Serial.println(desc);
  delay(5);
  
}[/mw_shl_code]

【细节部分】
针对CM32181数字光线传感芯片开发的Arduino驱动库图4

Rockets  NPC

发表于 2017-1-12 14:18:57

是lux值吗?准确吗?校准过吗?还是就是普通的数值。
回复

使用道具 举报

ShineHua2017  初级技师
 楼主|

发表于 2017-1-12 20:07:26

本帖最后由 ShineHua2017 于 2017-1-12 20:28 编辑
Rockets 发表于 2017-1-12 14:18
是lux值吗?准确吗?校准过吗?还是就是普通的数值。

输出的值 x 0.042就可以得到真实的光照度Lux ~! :)

datasheet里有讲CM3218输出是raw data值 0~65535并不是Lux值
换算公式如下: Lux = 分辨率 × step   
这个step就是CM3218输出的raw data,而分辨率根据设定寄存器的不同ALS_SM灵敏度,ALS_IT 积分时间,PSM省电模式,对应不同值,datasheet里有对应表格可查

我的library里初寄存器初始化状态为ALS_SM = 01    ALS_IT = 0000   PSM = 00    则分辨率为0.042
抱歉ALS_IT设成1100datasheet里查不到,我github刚有更新了库文件设为为0000
回复

使用道具 举报

Rockets  NPC

发表于 2017-1-13 00:05:36

ShineHua2017 发表于 2017-1-12 20:07
输出的值 x 0.042就可以得到真实的光照度Lux ~!

datasheet里有讲CM3218输出是raw data值 0~65535并不 ...

有点厉害的。了解了。
感谢你的详细的回复。
也就是说如果用这个传感器,我可以做一个测光计。配合提供的iso、光圈、快门,就可以做一个了。
回复

使用道具 举报

iooops  中级技匠

发表于 2017-1-13 03:29:28

哇测光 = =
回复

使用道具 举报

gavin yang  学徒

发表于 2022-11-28 14:36:42


thank you very much for sharing
original electronic componentsTI
STMicroelectronicsST
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail