Go Down

Topic: I2C Pressure Sensor (Read 5069 times) previous topic - next topic

pasta1234

Hello,

I have a Smartec Pressure sensor that i am trying to get values from and eventually display to a small LCD screen.
http://www.smartec-sensors.com/assets/files/pdf/Datasheets_pressure_sensors/SPD006LIhybN.pdf

I figured the first step would be to get proper data out to the serial monitor.

So far i have the following, but i believe i need some guidance on how to interpret/convert the data to something meaningful :)

Thanks for your help !!
Pete


Code: [Select]

#include "Wire.h"
#define addrs 0x78 // I2C bus address


void setup()
{
Wire.begin();
Serial.begin(9600);
}

void loop()
{
 
   byte firstbyte;
   byte secbyte;
 
   Wire.beginTransmission(addrs);
   Wire.write(0);        // move your register pointer back to 0
   Wire.endTransmission();
   
   
   Wire.requestFrom(addrs, 2); // contents of your first two registers
   while(Wire.available())          // Check for data from slave
    {                               
      firstbyte = Wire.read();       // Read press high byte
      secbyte = Wire.read();      // Read press low byte
    }
 
  Serial.print("first byte  ");
  Serial.print(firstbyte, DEC);
 
  Serial.print("sec byte  ");
  Serial.println(secbyte, DEC);

  delay(500);
}

MarkT

The while loop is dodgy - you need to wait for each byte in turn, if data isn't available you'll skip the loop entirely and not wait.
Code: [Select]

  while (Wire.available() < 2)
  {}
  firstbyte = Wire.read();       // Read press high byte
  secbyte = Wire.read();      // Read press low byte

[ I won't respond to messages, use the forum please ]

pasta1234

Mark i appreciate the info..

I went ahead and modified the code as you suggested to read,
Code: [Select]

  while (Wire.available() <2 )
   {
    firstbyte = Wire.read();       // Read press high byte
    secbyte = Wire.read();      // Read press low byte
   }
 


It seems to me that it hangs around the While loop since the Serial Monitor doesn't show anything.

If i remove the "<2" i get data being spat out, although i don't think its correct since regardless of the pressure it shows the same numerical values ?

Ideas, Suggestions ?

Pete


pasta1234

I am still getting gibberish on the serial monitor, i think it has something to do with how i am declaring the stored data value/type and how long it is ?

Can someone look at the above sensor data sheet and offer some insight ?

I would really appreciate it :) Happy New Years to Everyone !!

Pete

pasta1234

Anyone, some help would really be appreciated  :)

Pete

TrainMan186

The way I read that datasheet is that to get the pressure byte back from the sensor, you need to send a READ request, which is a 1 after the address. You're sending 0.

Code: [Select]
   Wire.beginTransmission(addrs);
   Wire.write(0);        // move your register pointer back to 0
   Wire.endTransmission();

Change the second line to
Code: [Select]
   Wire.write(1); and see what happens.
Found that in the Addressing section on page 3.
Hope this helps.

robtillaart

what you made of it
Code: [Select]
while (Wire.available() <2 )
   {
    firstbyte = Wire.read();       // Read press high byte
    secbyte = Wire.read();      // Read press low byte
   }


is not what MarkT porposed
Code: [Select]
while (Wire.available() < 2)
  {}
  firstbyte = Wire.read();       // Read press high byte
  secbyte = Wire.read();      // Read press low byte


read carefully!


Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

pasta1234

I appreciate everyone's responses !!
I have modified the code as follows and getting nothing on the Serial Monitor..

Code: [Select]

#include "Wire.h"
#define addrs 0x78 // I2C bus address


void setup()
{
Wire.begin();
Serial.begin(9600);
}

void loop()
{
 
   byte firstbyte;
   byte secbyte;
     
   Wire.beginTransmission(addrs);
   Wire.write(1);        // move your register pointer back to 0
   Wire.endTransmission();
   
   
   Wire.requestFrom(addrs, 2); // contents of your first two registers
   while (Wire.available() < 2)
   {}
   firstbyte = Wire.read();       // Read press high byte
   secbyte = Wire.read();      // Read press low byte
 
  Serial.print("first byte ");
  Serial.print(firstbyte, BIN);
 
  Serial.print("  sec byte ");
  Serial.println(secbyte, BIN);
 
  delay(500);
}


If i change the while loop to the following below, i get this on the serial monitor " first byte 11111111  sec byte 11111111", which still isn't right  ?

Code: [Select]

   Wire.requestFrom(addrs, 2); // contents of your first two registers
   while (Wire.available() )
   {}
   firstbyte = Wire.read();       // Read press high byte
   secbyte = Wire.read();      // Read press low byte


I appreciate the help guys a lot..

Pete



robtillaart

Code: [Select]
#define addrs 0x78 // I2C bus address
is this right?

check it with :
Code: [Select]
// I2C Scanner
// Written by Nick Gammon
// Date: 20th April 2011

#include <Wire.h>

void setup() {
  Serial.begin (115200);

  // Leonardo: wait for serial port to connect
  while (!Serial)
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
 
  Wire.begin();
  for (byte i = 1; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}

from - http://www.gammon.com.au/forum/?id=10896 - a well documented resource!
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

pasta1234

I ran the below sketch Rob and  it gave me nothing on the serial monitor, but i ran a newer version of the scanner dated June2012 i found on the Arduino resource page and it gave me this..

Quote

I2C Scanner
Scanning...
I2C device found at address 0x78 !
done


Ideas ?

Thanks Much !!

robtillaart

broken device?
do you have other I2C devices working?
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

pasta1234

Well i have access to their sensor acquisition board (see link below) and when i connect the same sensor i get meaningful data ?

http://www.smartec-sensors.com/assets/files/pdf/manuals/SMTAS02I2CN.PDF

Pete

robtillaart

#12
Jan 07, 2013, 07:06 pm Last Edit: Jan 07, 2013, 07:10 pm by robtillaart Reason: 1
Can you try this sketch? and post its output?

Code: [Select]

#include "Wire.h"
#define addrs 0x78 // I2C bus address

void setup()
{
 Wire.begin();
 Serial.begin(9600);
}

void loop()
{
 byte b;
 
 Wire.beginTransmission(addrs);
 Wire.write(1);
 int x = Wire.endTransmission();

  Serial.println();
 Serial.println(x, DEC);

 while(Wire.available())
 {                                
   b = Wire.read();
   Serial.println(b, dec);
 }

 delay(1000);
}
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

pasta1234

I ran the sketch you posted Rob and i get all Zeros on the serial monitor..

Quote

0

0

0

robtillaart


The first 0  means success:   // int x = Wire.endTransmission(); so that part seems to work, however it does not give the 2 bytes.

new sketch, added some comments and missing request form

Code: [Select]

#include "Wire.h"
#define addrs 0x78 // I2C bus address

void setup()
{
  Wire.begin();
  Serial.begin(9600);
}

void loop()
{
  byte b;
 
  Wire.beginTransmission(addrs);
  Wire.write(1);
  int x = Wire.endTransmission();

  Serial.print("endTransmission: ");
  Serial.println(x, DEC);

  Wire.requestFrom(addrs, 2); // might be useful to request some bytes..
  while (Wire.available() < 2);

  Serial.print("byte 1: ");
  b = Wire.read();
  Serial.println(b, DEC);
  Serial.print("byte 2: ");
  b = Wire.read();
  Serial.println(b, DEC);
  Serial.println();

  delay(1000);
}
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy