We have an Imp001 Electric Imp connecting to a VOC sensor.
board:
sensor manual:
http://www.mouser.com/ds/2/588/iAQ-core_Datasheet_EN_v1-775852.pdf
I tried to read from the sensor using one of the following addresses. I either get -2, -6, -10 error.
Please help out.
Description of the wiring.
Ground → Ground
3v3 → 3v3
SCL - > SCL
SDA → SDA
Here is the picture of the devices.
const BASE_I2C_ADDRESS = 0x5A;
local local_addr = BASE_I2C_ADDRESS << 1;
const SUB_I2C_ADDRESS = 0xB5;
local local_subaddr = SUB_I2C_ADDRESS << 1;
local i2c = hardware.i2c12;
i2c.configure(CLOCK_SPEED_100_KHZ);
local cmd=0x05;
server.log(i2c.read(local_subaddr,"", 2));
server.log(hardware.voltage());
local error=i2c.readerror();
if (error!=0) {
server.log("Error= "+error)
}
You probably want
server.log(i2c.read(local_addr, "\xB5", 2));
Also, you should probably set a timer to take the readings after five minutes
imp.wakeup(300, function() {
server.log(i2c.read(local_addr, "\xB5", 2));
}
I tried that and it’s returning -2 as an error.
Have you soldered the wires instead of leaving them just resting in the pin holes?
No, do you think it would make a difference?
Yes… I think it will make a huge difference in reliability.
We just tried it and it is still the same.
Check out https://electricimp.com/docs/resources/i2cerrors/
A -2 suggests you have the wrong device address.That said, you seem to have correctly converted the 7-bit 0x5A address to the 8-bit value (stored in local_addr ), but you don’t need to convert the sub-address (ie. the register address), which is why I used the literal \xB5
in my code above). I also missed a comma, which I have corrected.
However, the data sheet says “Bus master clock stretching support is required”, and I don’t think the imp supports this mode. That right, @hugo ?
hugo
June 6, 2017, 6:22pm
9
I would try using pins 8/9 for I2C in case you have a socket with a flaky pin1 (we saw this a few years back with some april/imp combinations).
I checked the “air quality 2” click schematic and it has pull-up resistors on it, which was going to be my other suggestion for things to check.
@smittytone ’s suggestions aren’t correct here; the device is read only, you should not specify any subaddress as it has none.
server.log(i2c.read(0xb4, "", 2)); // the address on the bus, as it's a read transaction, will be 0xb5
…should return 2 bytes, which the IDE would probably show as hex. If it returns null then yes there has been an error and you should print the error.
Re. read-only device and sub-addresses, good spot and thanks for putting me right.