system
October 8, 2012, 2:47am
1
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
#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
October 8, 2012, 11:57am
2
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
system
October 11, 2012, 1:24am
3
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
system
January 2, 2013, 8:29pm
4
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
system
January 3, 2013, 6:33pm
5
Anyone, some help would really be appreciated
Pete
system
January 5, 2013, 3:20am
6
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!
system
January 6, 2013, 3:29am
8
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!
system
January 6, 2013, 8:34pm
10
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?
system
January 7, 2013, 2:01am
12
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);
}
system
January 8, 2013, 4:45am
14
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);
}
system
January 9, 2013, 7:55am
16
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
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
system
January 10, 2013, 7:43am
18
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...
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);
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
At this point i need to incorporate this sensor as well,
http://www.smartec-sensors.com/assets/files/pdf/manuals/SMTH08INv2.2.pdf
D&D Engineering is closing. The Sensor Guys are officially retiring after over 30 years in business. Click below to learn more about where to get support for existing products and applications. Learn More
Est. reading time: 1 minute
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