Naresh Krish
/
itracker-mbed-os-example-opt3001
Sample program on how to use the OPT3001 sensor on the RAKWirelss iTracker module
mbed-OPT3001/OPT3001.cpp@0:33cb2fa095df, 2018-02-12 (annotated)
- Committer:
- knaresh89
- Date:
- Mon Feb 12 05:06:24 2018 +0000
- Revision:
- 0:33cb2fa095df
Sample program on how to use the OPT3001 sensor on the RAKWireless iTracker module
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
knaresh89 | 0:33cb2fa095df | 1 | #include "OPT3001.h" |
knaresh89 | 0:33cb2fa095df | 2 | #include "SEGGER_RTT.h" |
knaresh89 | 0:33cb2fa095df | 3 | |
knaresh89 | 0:33cb2fa095df | 4 | uint16_t deviceID = 0; |
knaresh89 | 0:33cb2fa095df | 5 | uint16_t sensor_data = 0; |
knaresh89 | 0:33cb2fa095df | 6 | float sensor_data1 = 0.0; |
knaresh89 | 0:33cb2fa095df | 7 | char temp_write[3] = {0,0,0}; |
knaresh89 | 0:33cb2fa095df | 8 | float lux_multiplier = 10.24; //Range set to RN[3:0] = 1010 in config register. Refer datasheet for lux_multiplier options. |
knaresh89 | 0:33cb2fa095df | 9 | |
knaresh89 | 0:33cb2fa095df | 10 | //I2C peripheral pins on the STM32F7-DISCOVERY & NUCLEO_F429ZI board. |
knaresh89 | 0:33cb2fa095df | 11 | I2C i2c(p21, p23); |
knaresh89 | 0:33cb2fa095df | 12 | |
knaresh89 | 0:33cb2fa095df | 13 | //Read Device ID |
knaresh89 | 0:33cb2fa095df | 14 | void read_DeviceID() { |
knaresh89 | 0:33cb2fa095df | 15 | temp_write[0] = 0x7F; //device ID register address from datasheet |
knaresh89 | 0:33cb2fa095df | 16 | char data[2] = {0,0}; |
knaresh89 | 0:33cb2fa095df | 17 | i2c.write(address, temp_write, 1, false); |
knaresh89 | 0:33cb2fa095df | 18 | int b = i2c.read(address, data, 2, 0); |
knaresh89 | 0:33cb2fa095df | 19 | SEGGER_RTT_printf(0, "b ======= = == == %d", b); |
knaresh89 | 0:33cb2fa095df | 20 | deviceID = (((uint16_t)data[0]) << 8) | data[1]; |
knaresh89 | 0:33cb2fa095df | 21 | SEGGER_RTT_printf(0, "Device ID= %d\n", deviceID); |
knaresh89 | 0:33cb2fa095df | 22 | if(deviceID == 0x3001) { //12289d (3001h) = device ID from datasheet. Factory programmed. |
knaresh89 | 0:33cb2fa095df | 23 | SEGGER_RTT_printf(0, "I2C Device ID OK....."); |
knaresh89 | 0:33cb2fa095df | 24 | } |
knaresh89 | 0:33cb2fa095df | 25 | } |
knaresh89 | 0:33cb2fa095df | 26 | |
knaresh89 | 0:33cb2fa095df | 27 | |
knaresh89 | 0:33cb2fa095df | 28 | float read_sensor() { |
knaresh89 | 0:33cb2fa095df | 29 | |
knaresh89 | 0:33cb2fa095df | 30 | SEGGER_RTT_printf(0, "Inside read sensor.."); |
knaresh89 | 0:33cb2fa095df | 31 | i2c.frequency(400000); |
knaresh89 | 0:33cb2fa095df | 32 | //Configure light sensor |
knaresh89 | 0:33cb2fa095df | 33 | temp_write[0]=0x01; |
knaresh89 | 0:33cb2fa095df | 34 | temp_write[1]=0xAE; //C810h is the default content for configuration register (address=01h) (Current cofig = AE0C) |
knaresh89 | 0:33cb2fa095df | 35 | temp_write[2]=0x0C; |
knaresh89 | 0:33cb2fa095df | 36 | |
knaresh89 | 0:33cb2fa095df | 37 | int a = i2c.write(address, temp_write, 3, 0); |
knaresh89 | 0:33cb2fa095df | 38 | SEGGER_RTT_printf(0, "a ====== %d",a); |
knaresh89 | 0:33cb2fa095df | 39 | |
knaresh89 | 0:33cb2fa095df | 40 | //From datasheet: Read result register (mask bits 15:13 - AND with suitable mask) & Multiply contents by |
knaresh89 | 0:33cb2fa095df | 41 | //lux_multiply factor to get reading. This configuration of the sensor is achieved because of the exponent in the configuration |
knaresh89 | 0:33cb2fa095df | 42 | //register being set to 0's. |
knaresh89 | 0:33cb2fa095df | 43 | // while(1) { |
knaresh89 | 0:33cb2fa095df | 44 | temp_write[0] = 0x00; //result register address |
knaresh89 | 0:33cb2fa095df | 45 | char opt_data[2] = {0,0}; |
knaresh89 | 0:33cb2fa095df | 46 | i2c.write(address, temp_write, 1, false); |
knaresh89 | 0:33cb2fa095df | 47 | int c = i2c.read(address, opt_data, 2, 0); |
knaresh89 | 0:33cb2fa095df | 48 | SEGGER_RTT_printf(0, "opt_data[1] ==== %d\t", opt_data[1]); |
knaresh89 | 0:33cb2fa095df | 49 | SEGGER_RTT_printf(0, "opt_data[0] ==== %d\t", opt_data[0]); |
knaresh89 | 0:33cb2fa095df | 50 | sensor_data1 = ((((uint16_t)opt_data[0]) << 8) | opt_data[1]) & 0x1FFF; |
knaresh89 | 0:33cb2fa095df | 51 | SEGGER_RTT_printf(0, "Sensor data = %0.2f\n", sensor_data1); |
knaresh89 | 0:33cb2fa095df | 52 | sensor_data1 = sensor_data1 * lux_multiplier; |
knaresh89 | 0:33cb2fa095df | 53 | SEGGER_RTT_printf(0, "Lux data = %f\n", sensor_data1); |
knaresh89 | 0:33cb2fa095df | 54 | // } |
knaresh89 | 0:33cb2fa095df | 55 | return sensor_data1; |
knaresh89 | 0:33cb2fa095df | 56 | } |