IOIO Android I2C Light Levels using TSL2561 Logging Code

Published on Tuesday 26 June 2012
Categories: Android | Projects | Solar Power |

As part of the home solar PV and hot water project we are now using an IOIO board with an android tablet to process the sensor data and upload to our online reporting website. The code below is used to get the sensor data from the TSL2561 digital luminosity / lux / light sensor sensor via the I2C interface. The sensor was sourced from http://www.adafruit.com/products/439

In the main class define the TwiMaster interface.

private TwiMaster twi;

In the setup() code inside the Looper class add

twi = ioio_.openTwiMaster(0, TwiMaster.Rate.RATE_100KHz, false);

The 0 is the port which you are using for the TwiMaster

Next initialise the sensor with

InitTSL2561(0x39, twi);

0x39 is the address of the sensor. The initialisation code is shown in the functions below.

Inside the loop() you can use this code to obtain the sensor value

int lightsensors[] = ReadTSL2561(0x39);
int visible = lightsensors[0];
int irlight = lightsensors[1];

The code below are the functions which initialise the sensor and also get the sensor values

// light sensor
	    
	    public boolean InitTSL2561(int address, TwiMaster port) {
	    	byte[] request_on = new byte[] { 0x0A };
	        byte[] response = new byte[4];
	    	try{
	            try {
					if( port.writeRead(address, false, request_on,request_on.length,response,response.length)) {
					  
					    //(TSL2561_COMMAND_BIT | TSL2561_REGISTER_TIMING, _integration | _gain)
						
					    byte[] request_setGain = new byte[] { (byte) 0x80, 0x01, 0x00 };
					    
					    try {
							if(port.writeRead(address, false, request_setGain,request_setGain.length,response,response.length))
							{
							    return true;
							}
						} catch (ConnectionLostException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					    
					} 
					else {
					    return false;  
					}
				} catch (ConnectionLostException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} 
	        }
	        catch(InterruptedException e)
	        {
	        	return false;  
	        }
	    	return false;  
	    }
	    public int[] ReadTSL2561(int address) {
			int channel0 = 99;
			int channel1 = 99;
			
        	byte[] DataHigh = new byte[1];
        	byte[] DataLow = new byte[1];
        	byte[] DataHigh2 = new byte[1];
        	byte[] DataLow2 = new byte[1];
        	 byte[] response = new byte[4];
        	int[] returnval = new int[2];
       	
           	try {
           		// init sensor
           		byte[] request_on = new byte[] { 0x03 };
                twi.writeRead(address, false, request_on,request_on.length,response,response.length);

				// get low channel
				byte[] request_2a = new byte[] { (byte)0x8C };
				twi.writeRead(address, false, request_2a,request_2a.length,DataLow,DataLow.length);
				
				byte[] request_2b = new byte[] {(byte) 0x8D };
				twi.writeRead(address, false, request_2b,request_2b.length,DataHigh,DataHigh.length);
				
				// get high channel
				byte[] request_higha = new byte[] { (byte)0x8E };
				twi.writeRead(address, false, request_higha,request_higha.length,DataLow2,DataLow2.length);
				
				byte[] request_highb = new byte[] {(byte) 0x8F };
				twi.writeRead(address, false, request_highb,request_highb.length,DataHigh2,DataHigh2.length);
				
				channel0 = ((0xFF & (int) DataHigh[0]) * 256) + ((0xFF & (int) DataLow[0]));
				channel1 = ((0xFF & (int) DataHigh2[0]) * 256) + ((0xFF & (int) DataLow2[0]));
				returnval[0] = channel0;
				returnval[1] = channel1;
				// close request
				byte[] request_off = new byte[] { 0x00 };
				twi.writeRead(address, false, request_off,request_off.length,response,response.length);
           	return returnval;
			} catch (ConnectionLostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {}
    	   
    	   return returnval;
    }
	    
	   
	    public int[] bytearray2intarray(byte[] barray)
	    {
	      int[] iarray = new int[barray.length];
	      int i = 0;
	      for (byte b : barray)
	          iarray[i++] = b & 0xff;
	      // "and" with 0xff since bytes are signed in java
	      return iarray;
	    }

Permalink


0 Comments



Leave a comment

About Me

Brian Dorey

Welcome to my blog, here you will find my projects and other things.
I make websites and manufacturer and sell expansion boards for the Raspberry Pi range of computers.

AB Electronics Raspberry Pi shop

Social Media

Popular Posts

Small image for Raspberry Pi Zero W external antenna mod

Raspberry Pi Zero W external antenna mod
04 MARCH 2017
94,246 views

Small image for Ford Sync 3 USB Drive Music Playlists

Ford Sync 3 USB Drive Music Playlists
22 OCTOBER 2016
64,562 views

Small image for Echo Dot 3rd Gen Smart speaker Teardown

Echo Dot 3rd Gen Smart speaker Teardown
21 JULY 2019
61,842 views

Small image for DIY Pick and Place V2 Project Complete

DIY Pick and Place V2 Project Complete
23 NOVEMBER 2013
37,191 views