I2C Pressure Sensor

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 :slight_smile:

Thanks for your help !!
Pete

#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);
}

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.

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

Mark i appreciate the info..

I went ahead and modified the code as you suggested to read,

  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

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 :slight_smile: Happy New Years to Everyone !!

Pete

Anyone, some help would really be appreciated :slight_smile:

Pete

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.

   Wire.beginTransmission(addrs);
   Wire.write(0);        // move your register pointer back to 0
   Wire.endTransmission();

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

what you made of it

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

is not what MarkT porposed

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

read carefully!

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

#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 ?

   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

#define addrs 0x78 // I2C bus address

is this right?

check it with :

// 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!

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..

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

Ideas ?

Thanks Much !!

broken device?
do you have other I2C devices working?

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

Can you try this sketch? and post its output?

#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);
}

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

0

0

0

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

#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);
}

Thanks for help so much Rob !!

The following was the result of the serial monitor after running the sketch..

endTransmission: 2
byte 1: 101
byte 2: 188

endTransmission: 0

Much appreicated :slight_smile:
Pete

pdf page 4

                    Output (dec) – 1,638  
  Pressure (mbar) = ------------------------- +600 
                             30.84
float toPressure(byte hi, byte lo)
{
  int t = (hi * 256 + lo) & 0x3FFF;  // see pdf, mask 14 bit
  
  float rv = (t - 1638.0) / 30.84 + 600.0;  // (t - 1638.0) * 0.032425422 + 600.0 // faster 
  return rv;
}

byte 1: 101 (low?)
byte 2: 188 (high?)
fill in => 1048 seems a reasonable value

Again Rob, I really appreciate your time and help !!

I appended and modified the code to the following complete sketch:

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


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

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

   Serial.print("endTransmission: ");
   Serial.println(x, DEC);
     
   Wire.requestFrom(addrs, 2); // contents of your first two registers
   while(Wire.available() < 2 );          // Check for data from slave
   {   
      delay(1000);
      lobyte = Wire.read();       // Read press high byte
      Serial.println(lobyte, DEC);
      hibyte = Wire.read();      // Read press low byte
      Serial.println(hibyte, DEC);
      
      Press = toPressure(hibyte, lobyte);
      Serial.print("Pressure: ");
      Serial.println(Press);
      
      delay(1000);
   } 
   
}
   
   
float toPressure(byte hi, byte lo)
{
  int t = (hi * 256 + lo) & 0x3FFF;  // see pdf, mask 14 bit
  
  float rv = (t - 1638.0) / 30.84 + 600.0;  // (t - 1638.0) * 0.032425422 + 600.0 // faster 
  return rv;
  
}

When the sketch Runs as is, i get the following out on the serial monitor:

endTransmission: 2
103
177
Pressure: 956
endTransmission: 0

I have two questions...

  1. Why is it when i remove the following lines of code, the serial monitor shows nothing, it seems to me it should have no affect ?
Serial.print("endTransmission: ");
Serial.println(x, DEC);
  1. How do i get it to constantly update and report the Pressure instead of only running once ?

Thanks,
Pete

check - Tutorial: Arduino and the I2C bus – Part One | tronixstuff.com -

try move the first delay(1000); outside the if and place it instead of the 2 print statements.

Thanks a lot for your Help Rob, everything worked well and i am learning a lot :slight_smile:

At this point i need to incorporate this sensor as well,
http://www.smartec-sensors.com/assets/files/pdf/manuals/SMTH08INv2.2.pdf

How do i incorporate both sensors considering they use 3.3V & 5V I2C Systems ?

The datasheet is rather confusing to me, how do i read this sensor, do i need to initiate a "conversion" first ?

Some general help and or skeleton code would be appreciated.

Pete