Offline
Newbie
Karma: 0
Posts: 18
|
 |
« on: October 07, 2012, 09:47:49 pm » |
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.pdfI 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); }
|
|
|
|
|
Logged
|
|
|
|
|
0
Offline
Tesla Member
Karma: 71
Posts: 6625
Arduino rocks
|
 |
« Reply #1 on: October 08, 2012, 06:57:14 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #2 on: October 10, 2012, 08:24:35 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #3 on: January 02, 2013, 03:29:52 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #4 on: January 03, 2013, 01:33:55 pm » |
Anyone, some help would really be appreciated  Pete
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 1
|
 |
« Reply #5 on: January 04, 2013, 10:20:11 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 90
Posts: 9414
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #6 on: January 05, 2013, 06:05:34 am » |
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!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #7 on: January 05, 2013, 10:29:29 pm » |
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
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 90
Posts: 9414
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #8 on: January 06, 2013, 10:39:09 am » |
#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!
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #9 on: January 06, 2013, 03:34:27 pm » |
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 !!
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 90
Posts: 9414
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #10 on: January 06, 2013, 04:40:16 pm » |
broken device? do you have other I2C devices working?
|
|
|
|
|
Logged
|
|
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 90
Posts: 9414
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #12 on: January 07, 2013, 01:06:52 pm » |
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); }
|
|
|
|
« Last Edit: January 07, 2013, 01:10:05 pm by robtillaart »
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #13 on: January 07, 2013, 11:45:26 pm » |
I ran the sketch you posted Rob and i get all Zeros on the serial monitor.. 0
0
0
|
|
|
|
|
Logged
|
|
|
|
|
Netherlands
Offline
Tesla Member
Karma: 90
Posts: 9414
In theory there is no difference between theory and practice, however in practice there are many...
|
 |
« Reply #14 on: January 08, 2013, 01:13:14 pm » |
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); }
|
|
|
|
|
Logged
|
|
|
|
|
|