Arduino Forum

Using Arduino => Sensors => Topic started by: sufyan785 on Apr 25, 2013, 04:22 pm

Title: DUE and pressure sensor with I2C
Post by: sufyan785 on Apr 25, 2013, 04:22 pm
i have arduino due board and i want to integrate pressure sensor MPL3115A2 from sparkfun with my board.the interface is I2C.i burned the following code given on the sparkfun website but it doesnt work on my me out.

  MPL3115A2 Altitude Sensor Example
  SparkFun Electronics, A.Weiss, 7/17/2012
  Beerware License - whatever
  Hardware Connections:
  -VCC = 3.3V
  -SDA = A4, SCL = A5
  -INT pins can be left unconnected for this demo
  -Serial terminal at 9600bps
  -Prints altitude in meters, temperature in degrees C, with 1/16
  -software enabled interrupt on new data, ~1Hz with full resolution
  -the IIC_support file contains the IIC read and write functions
  -IIC_support.ino is just another .ion sketch that holds functions
   that do not need to be modified.

#include <Wire.h> // for IIC communication

const int SENSORADDRESS = 0x60; // address specific to the MPL3115A1,
                                // value found in datasheet
void setup()
  Wire.begin();        // join i2c bus
  Serial.begin(9600);  // start serial for output
  // This is a basic II2 communication check. If the sensor doesn't
  // return decicmal number 196 (see 0x0C register in datasheet),
  // "IIC bad" is printed, otherwise nothing happens.
  if(IIC_Read(0x0C) == 196); //checks who_am_i bit for basic I2C handshake test
  else Serial.println("i2c bad");
  // Enable and configure the sensor.

void loop()
  // your code here

boolean check_new()
  // This function check to see if there is new data.
  // You can call this function and it will return TRUE if there is
  // new data and FALSE if there is no new data.
  // If INT_SOURCE (0x12) register's DRDY flag is enabled, return
  if(IIC_Read(0x12) == 0x80) // check INT_SOURCE register on
                             // new data ready (SRC_DRDY)
      return true;
  else return false;

void sensor_config()
  // To configure the sensor, find the register hex value and
  // enter it into the first field of IIC_Write (see below). Then
  // fingure out the hex value of the data you want to send.
  // For example:
  // For CTRL_REG1, the address is 0x26 and the data is 0xB9
  // 0xB9 corresponds to binary 1011 1001. Each place holder
  // represents a data field in CTRL_REG1.
  // CTRL_REG1 (0x26): enable sensor, oversampling, altimeter mode
  IIC_Write(0x26, 0xB9);
  // CTRL_REG4 (0x29): Data ready interrupt enbabled
  IIC_Write(0x29, 0x80);
  // PT_DATA_CFG (0x13): enable both pressure and temp event flags
  IIC_Write(0x13, 0x07);
  // This configuration option calibrates the sensor according to
  // the sea level pressure for the measurement location
  // BAR_IN_MSB (0x14):
  IIC_Write(0x14, 0xC6);
  // BAR_IN_LSB (0x15):
  IIC_Write(0x15, 0x5B);

void sensor_read_data()
  // This function reads the altitude and temperature registers, then
  // concatenates the data together, and prints in values of
  // meters for altitude and degrees C for temperature.
  // variables for the calculations
  int m_altitude, m_temp, c_altitude;
  // these must be floats since there is a fractional calculation
  float l_altitude, l_temp; 
  float altitude, temperature;
  // read registers 0x01 through 0x05
  m_altitude = IIC_Read(0x01);
  c_altitude = IIC_Read(0x02);
  // the least significant bytes l_altitude and l_temp are 4-bit,
  // fractional values, so you must cast the calulation in (float),
  // shift the value over 4 spots to the right and divide by 16 (since
  // there are 16 values in 4-bits).
  l_altitude = (float)(IIC_Read(0x03)>>4)/16.0;
  m_temp = IIC_Read(0x04); //temp, degrees
  l_temp = (float)(IIC_Read(0x05)>>4)/16.0; //temp, fraction of a degree
  // here is where we calculate the altitude and temperature
  altitude = (float)((m_altitude << 8)|c_altitude) + l_altitude;
  temperature = (float)(m_temp + l_temp);
  // wait here for new data
  while(check_new() == false);
  // once there is new data, it is printed
  Serial.print(altitude); // in meters
  Serial.println(temperature); // in degrees C

// These are the two I2C functions in this sketch.
byte IIC_Read(byte regAddr)
  // This function reads one byte over IIC
  Wire.write(regAddr);  // Address of CTRL_REG1
  Wire.endTransmission(false); // Send data to I2C dev with option
                               //  for a repeated start. THIS IS
                               //  NECESSARY and not supported before
                               //  Arduino V1.0.1!!!!!!!!!
  Wire.requestFrom(SENSORADDRESS, 1); // Request the data...

void IIC_Write(byte regAddr, byte value)
  // This function writes one byto over IIC
Title: Re: DUE and pressure sensor with I2C
Post by: Erdin on Apr 25, 2013, 07:47 pm
Which pins are you using for the I2C ?

What does not work ? Do you see the message "i2c bad" ?
Title: Re: DUE and pressure sensor with I2C
Post by: sufyan785 on Apr 26, 2013, 07:32 am
i used SDA(20) and SCL (21). yes the serial monitor shows only "i2c bad".
the sensor is not working ,there is nothing on serial monitor except "i2c bad"
Title: Re: DUE and pressure sensor with I2C
Post by: Erdin on Apr 26, 2013, 08:05 am
Did you connect the GND ?

This is the sensor with the example code,

If the GNDs are connected, try the i2c scanner,
If the i2c scanner does not detect the sensor, check your wiring. If you use a breadboard, some connections might be bad.
Title: Re: DUE and pressure sensor with I2C
Post by: sufyan785 on Apr 26, 2013, 08:21 pm
i have connected the grnd too.
The connections are
DUE SDA(20) pin   to   Sensor SDA pin
DUE SCL(21) pin   to   Sensor SCL pin
VCC of sensor is connected to 3.3Vpin of DUE
GRND of sensor is connected to GRND of DUE.

The I2C scanner is showing "NO I2C Device found".and all connections are there problem with DUE board or what i dont understand.
Title: Re: DUE and pressure sensor with I2C
Post by: Erdin on Apr 26, 2013, 08:53 pm
It seems that I2C is not always working well on the Due.
Do you use the newest 1.5.2 ?
The i2c scanner seems to be not working on the Due.
I don't know if it is fixed in 1.5.2.

I don't have a Due myself, and I don't know how to fix this.