I2C Pressure Sensor

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

sparkfun or farnell sell 5V - 3.3V convertors for I2C. That should be the first step.
Then you can see if the I2C scanner on the playground sees it address.
Third step is checking if you can read the config registers.
(I have no time to dive into the datasheet now, sorry)

OK a quick look than,
the protocol looks not too difficult, If I am correct you need to request 4 bytes and do some math on them.

It can be done quite similar as the other sensor, something like below.

(partial concept code)

Wire.requestFrom(addrs, 4); // contents of your first two registers
   while(Wire.available() < 4 );          // 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);
      
      Temp= toTemperature(hibyte, lobyte);
      Serial.print("Temperature: ");
      Serial.println(Temp);

      lobyte = Wire.read();       // Read press high byte
      Serial.println(lobyte, DEC);
      hibyte = Wire.read();      // Read press low byte
      Serial.println(hibyte, DEC);
      
      Hum = toHumidity(hibyte, lobyte);
      Serial.print("Humidity: ");
      Serial.println(Hum);      
      delay(1000);
   }

Now it is your turn :wink:

check the datasheet for timing (5 seconds), humidity readers need multiple seconds between readings. (DHT series have 2 seconds, but seem not as accurate)

Thanks for the advice Robert, I purchased the logic level converter and finally got it connected earlier today. I ran the I2C scanner tool on the sensor and got a hit at 0X10 address.

When i run the below code, i get the values 87,232,103,29 on the serial monitor. What i find strange is blowing gently on the sensor does not cause any data value variation, which leads me to believe its bogus data, is that a correct assumption ?

Is this just a timing issue, advice ?

Thanks,
Pete

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


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

void loop()
{
  
   byte lobyte;
   byte hibyte;
  
   

Wire.requestFrom(addrs, 4); // contents of your first four registers
   while(Wire.available() < 4 );          // Check for data from slave
   {   
      delay(5000);
      
      lobyte = Wire.read();       // Read hum high byte
      Serial.println(lobyte, DEC);
      hibyte = Wire.read();      // Read hum low byte
      Serial.println(hibyte, DEC);

//      Hum = toHumidity(hibyte, lobyte);
//      Serial.print("Humidity: ");
//      Serial.println(Hum); 
      

      lobyte = Wire.read();       // Read temp high byte
      Serial.println(lobyte, DEC);
      hibyte = Wire.read();      // Read temp low byte
      Serial.println(hibyte, DEC);
      
//     Temp= toTemperature(hibyte, lobyte);
//     Serial.print("Temperature: ");
//     Serial.println(Temp);
   
      delay(1000);
      
   }
}

can you post some more output?