Sample program on how to use the OPT3001 sensor on the RAKWirelss iTracker module

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?

UserRevisionLine numberNew 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 }