hodlemil
Posts: 2
Joined: Tue Mar 28, 2017 2:27 pm

[Solved] VEML-7700 I2c

Tue Mar 28, 2017 2:35 pm

I would like use VEML-7700 light ambient sensor with raspberryPI. I wrote the code above, but i can only read the 03h register. I use the i2cset and i2cget command with a same result.
What could be the problem?

Code: Select all

#include <iostream>
#include <errno.h>
#include <wiringPiI2C.h>

using namespace std;

int main(int argc, char **argv)
{
	unsigned int command = ALSSM_x18|ALSIT_200|ALSPERS_1|ALSINT_DI|ALSSD_ON; //0x1040
	int fd, result;
	
	fd = wiringPiI2CSetup(address);
	
	result = wiringPiI2CWriteReg16(fd,0x00,command);
	std::cout<<result<<std::endl;
	usleep(25000);
	if(result == -1)
	{
		cout << "Error.  Errno is: " << errno << endl;
	}
	else
	{
		command = ALSPSM_1|ALSPSM_DI; //0x0000
		result = wiringPiI2CWriteReg16(fd,0x03,command);
		usleep(200000);
		if(result == -1)
		{
			cout << "Error.  Errno is: " << errno << endl;
		}
		else
		{
				result = wiringPiI2CReadReg16 (fd, 0x04);
				std::cout<<result<<std::endl;
		}
		
	}
}
Last edited by hodlemil on Sat Apr 22, 2017 1:52 pm, edited 1 time in total.

hodlemil
Posts: 2
Joined: Tue Mar 28, 2017 2:27 pm

Re: VEML-7700 I2c

Tue Apr 18, 2017 9:07 pm

I solved the problem. I enabled the repeated start with this command:

Code: Select all

/
sudo sh -c 'echo -n 1 > /sys/module/i2c_bcm2708/parameters/combined'
It works after reboot, with the aboved code:

Code: Select all

sudo sh -c 'echo options i2c_bcm2708 combined=1 > /etc/modprobe.d/i2c_repeated_start.conf'

robidouxj
Posts: 2
Joined: Thu Mar 22, 2018 5:05 pm

Re: [Solved] VEML-7700 I2c

Thu Mar 22, 2018 5:13 pm

I'm posting a reply here because I ran into similar problems trying to write python script for this component. This one of only two results I got google searching veml7700 and raspberry pi. I contacted Vishay and they were very helpful in working with this component.

Here is the sample python script I wrote for the VEML7700:

Code: Select all

import smbus
import time

bus = smbus.SMBus(1)

addr = 0x10

#Write registers
als_conf_0 = 0x00
als_WH = 0x01
als_WL = 0x02
pow_sav = 0x03

#Read registers
als = 0x04
white = 0x05
interrupt = 0x06


# These settings will provide the max range for the sensor (0-120Klx)
# but at the lowest precision:
#              LSB   MSB
confValues = [0x00, 0x13] # 1/8 gain, 25ms IT (Integration Time)
#Reference data sheet Table 1 for configuration settings

interrupt_high = [0x00, 0x00] # Clear values
#Reference data sheet Table 2 for High Threshold

interrupt_low = [0x00, 0x00] # Clear values
#Reference data sheet Table 3 for Low Threshold

power_save_mode = [0x00, 0x00] # Clear values
#Reference data sheet Table 4 for Power Saving Modes

bus.write_i2c_block_data(addr, als_conf_0, confValues)
bus.write_i2c_block_data(addr, als_WH, interrupt_high)
bus.write_i2c_block_data(addr, als_WL, interrupt_low)
bus.write_i2c_block_data(addr, pow_sav, power_save_mode)

while True:
	#The frequency to read the sensor should be set greater than
	# the integration time (and the power saving delay if set).
	# Reading at a faster frequency will not cause an error, but
	# will result in reading the previous data
	time.sleep(.04) # 40ms 

	word = bus.read_word_data(addr,als)
	
	gain = 1.8432 #Gain for 1/8 gain & 25ms IT
	#Reference www.vishay.com/docs/84323/designingveml7700.pdf
	# 'Calculating the LUX Level'
	
	val = word * gain
	val = round(val,1) #Round value for presentation
		
	print "Lux: " + str(val) + " lx"
I hope this helps the next pi user with trying to interface with this component. good luck.

Joe Robidoux

Return to “Interfacing (DSI, CSI, I2C, etc.)”

Who is online

Users browsing this forum: henryhunt and 6 guests