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
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
check the datasheet for timing (5 seconds), humidity readers need multiple seconds between readings. (DHT series have 2 seconds, but seem not as accurate)
system
June 21, 2013, 7:13am
24
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?
system
June 21, 2013, 8:47pm
26
The output was these four values over and over...
87
232
103
29
Hope that helps..
Pete