@@ -27,8 +27,8 @@ | |||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/I2Cdev}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/I2Cdev}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/IAQ2000}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/IAQ2000}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/DHT_sensor_library}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/DHT_sensor_library}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Sensor_Lab}""/> | |||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Unified_Sensor}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Unified_Sensor}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/PubSubClient/src}""/> | |||||
</option> | </option> | ||||
<inputType id="io.sloeber.compiler.cpp.sketch.input.1213930982" name="CPP source files" superClass="io.sloeber.compiler.cpp.sketch.input"/> | <inputType id="io.sloeber.compiler.cpp.sketch.input.1213930982" name="CPP source files" superClass="io.sloeber.compiler.cpp.sketch.input"/> | ||||
</tool> | </tool> | ||||
@@ -42,8 +42,8 @@ | |||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/I2Cdev}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/I2Cdev}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/IAQ2000}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/IAQ2000}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/DHT_sensor_library}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/DHT_sensor_library}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Sensor_Lab}""/> | |||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Unified_Sensor}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Unified_Sensor}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/PubSubClient/src}""/> | |||||
</option> | </option> | ||||
<inputType id="io.sloeber.compiler.c.sketch.input.1564829864" name="C Source Files" superClass="io.sloeber.compiler.c.sketch.input"/> | <inputType id="io.sloeber.compiler.c.sketch.input.1564829864" name="C Source Files" superClass="io.sloeber.compiler.c.sketch.input"/> | ||||
</tool> | </tool> | ||||
@@ -57,8 +57,8 @@ | |||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/I2Cdev}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/I2Cdev}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/IAQ2000}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/IAQ2000}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/DHT_sensor_library}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/DHT_sensor_library}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Sensor_Lab}""/> | |||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Unified_Sensor}""/> | <listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/Adafruit_Unified_Sensor}""/> | ||||
<listOptionValue builtIn="false" value=""${workspace_loc:/IAQ2000+DHT11/libraries/PubSubClient/src}""/> | |||||
</option> | </option> | ||||
<inputType id="io.sloeber.compiler.S.sketch.input.1340516571" name="Assembly source files" superClass="io.sloeber.compiler.S.sketch.input"/> | <inputType id="io.sloeber.compiler.S.sketch.input.1340516571" name="Assembly source files" superClass="io.sloeber.compiler.S.sketch.input"/> | ||||
</tool> | </tool> | ||||
@@ -84,4 +84,5 @@ | |||||
</storageModule> | </storageModule> | ||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | ||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> | <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> | ||||
<storageModule moduleId="refreshScope"/> | |||||
</cproject> | </cproject> |
@@ -66,6 +66,11 @@ | |||||
<type>2</type> | <type>2</type> | ||||
<locationURI>ECLIPSE_HOME/arduinoPlugin/libraries/Ethernet/2.0.0</locationURI> | <locationURI>ECLIPSE_HOME/arduinoPlugin/libraries/Ethernet/2.0.0</locationURI> | ||||
</link> | </link> | ||||
<link> | |||||
<name>libraries/PubSubClient</name> | |||||
<type>2</type> | |||||
<locationURI>ECLIPSE_HOME/arduinoPlugin/libraries/PubSubClient/2.7.0</locationURI> | |||||
</link> | |||||
<link> | <link> | ||||
<name>libraries/SPI</name> | <name>libraries/SPI</name> | ||||
<type>2</type> | <type>2</type> | ||||
@@ -4,7 +4,7 @@ | |||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> | <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> | ||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> | <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> | ||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> | <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> | ||||
<provider class="io.sloeber.core.toolchain.ArduinoLanguageProvider" console="false" env-hash="1043980802443853318" id="io.sloeber.languageSettingsProvider" keep-relative-paths="false" name="Arduino Compiler Settings" parameter="${COMMAND} -E -P -v -dD -D__IN_ECLIPSE__ "${INPUTS}"" prefer-non-shared="true"> | |||||
<provider class="io.sloeber.core.toolchain.ArduinoLanguageProvider" console="false" env-hash="950558152315445550" id="io.sloeber.languageSettingsProvider" keep-relative-paths="false" name="Arduino Compiler Settings" parameter="${COMMAND} -E -P -v -dD -D__IN_ECLIPSE__ "${INPUTS}"" prefer-non-shared="true"> | |||||
<language-scope id="org.eclipse.cdt.core.gcc"/> | <language-scope id="org.eclipse.cdt.core.gcc"/> | ||||
<language-scope id="org.eclipse.cdt.core.g++"/> | <language-scope id="org.eclipse.cdt.core.g++"/> | ||||
</provider> | </provider> | ||||
@@ -487,7 +487,7 @@ environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SELECTED. | |||||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SELECTED.PLATFORM/value=${eclipse_home}/arduinoPlugin/packages/arduino/hardware/avr/1.8.2 | environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SELECTED.PLATFORM/value=${eclipse_home}/arduinoPlugin/packages/arduino/hardware/avr/1.8.2 | ||||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SIZE.SWITCH/delimiter=; | environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SIZE.SWITCH/delimiter=; | ||||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SIZE.SWITCH/operation=replace | environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SIZE.SWITCH/operation=replace | ||||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SIZE.SWITCH/value=${A.RECIPE.SIZE.PATTERN} | |||||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.SIZE.SWITCH/value=${A.ALT_SIZE_COMMAND} | |||||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.UPLOAD/delimiter=; | environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.UPLOAD/delimiter=; | ||||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.UPLOAD/operation=replace | environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.UPLOAD/operation=replace | ||||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.UPLOAD/value=Default | environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.UPLOAD/value=Default | ||||
@@ -20,35 +20,35 @@ | |||||
// 2011-07-28 - initial release | // 2011-07-28 - initial release | ||||
/* ============================================ | /* ============================================ | ||||
I2Cdev device library code is placed under the MIT license | |||||
Copyright (c) 2013 Jeff Rowberg | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. | |||||
=============================================== | |||||
*/ | |||||
I2Cdev device library code is placed under the MIT license | |||||
Copyright (c) 2013 Jeff Rowberg | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. | |||||
=============================================== | |||||
*/ | |||||
#include "I2Cdev.h" | #include "I2Cdev.h" | ||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE | #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE | ||||
#ifdef I2CDEV_IMPLEMENTATION_WARNINGS | |||||
#if ARDUINO < 100 | |||||
#ifdef I2CDEV_IMPLEMENTATION_WARNINGS | |||||
#if ARDUINO < 100 | |||||
#warning Using outdated Arduino IDE with Wire library is functionally limiting. | #warning Using outdated Arduino IDE with Wire library is functionally limiting. | ||||
#warning Arduino IDE v1.6.5+ with I2Cdev Fastwire implementation is recommended. | #warning Arduino IDE v1.6.5+ with I2Cdev Fastwire implementation is recommended. | ||||
#warning This I2Cdev implementation does not support: | #warning This I2Cdev implementation does not support: | ||||
@@ -61,12 +61,12 @@ THE SOFTWARE. | |||||
#warning - Repeated starts conditions | #warning - Repeated starts conditions | ||||
#warning - Timeout detection (some Wire requests block forever) | #warning - Timeout detection (some Wire requests block forever) | ||||
#elif ARDUINO > 100 | #elif ARDUINO > 100 | ||||
/*#warning Using current Arduino IDE with Wire library is functionally limiting. | |||||
#warning Arduino IDE v1.6.5+ with I2CDEV_BUILTIN_FASTWIRE implementation is recommended. | |||||
#warning This I2Cdev implementation does not support: | |||||
#warning - Timeout detection (some Wire requests block forever)*/ | |||||
#endif | |||||
#endif | |||||
/*#warning Using current Arduino IDE with Wire library is functionally limiting. | |||||
#warning Arduino IDE v1.6.5+ with I2CDEV_BUILTIN_FASTWIRE implementation is recommended. | |||||
#warning This I2Cdev implementation does not support: | |||||
#warning - Timeout detection (some Wire requests block forever)*/ | |||||
#endif | |||||
#endif | |||||
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE | #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE | ||||
@@ -105,11 +105,12 @@ I2Cdev::I2Cdev() { | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Status of read operation (true = success) | * @return Status of read operation (true = success) | ||||
*/ | */ | ||||
int8_t I2Cdev::readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout) { | |||||
uint8_t b; | |||||
uint8_t count = readByte(devAddr, regAddr, &b, timeout); | |||||
*data = b & (1 << bitNum); | |||||
return count; | |||||
int8_t I2Cdev::readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, | |||||
uint8_t *data, uint16_t timeout) { | |||||
uint8_t b; | |||||
uint8_t count = readByte(devAddr, regAddr, &b, timeout); | |||||
*data = b & (1 << bitNum); | |||||
return count; | |||||
} | } | ||||
/** Read a single bit from a 16-bit device register. | /** Read a single bit from a 16-bit device register. | ||||
@@ -120,11 +121,12 @@ int8_t I2Cdev::readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Status of read operation (true = success) | * @return Status of read operation (true = success) | ||||
*/ | */ | ||||
int8_t I2Cdev::readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout) { | |||||
uint16_t b; | |||||
uint8_t count = readWord(devAddr, regAddr, &b, timeout); | |||||
*data = b & (1 << bitNum); | |||||
return count; | |||||
int8_t I2Cdev::readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, | |||||
uint16_t *data, uint16_t timeout) { | |||||
uint16_t b; | |||||
uint8_t count = readWord(devAddr, regAddr, &b, timeout); | |||||
*data = b & (1 << bitNum); | |||||
return count; | |||||
} | } | ||||
/** Read multiple bits from an 8-bit device register. | /** Read multiple bits from an 8-bit device register. | ||||
@@ -136,20 +138,21 @@ int8_t I2Cdev::readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16 | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Status of read operation (true = success) | * @return Status of read operation (true = success) | ||||
*/ | */ | ||||
int8_t I2Cdev::readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout) { | |||||
// 01101001 read byte | |||||
// 76543210 bit numbers | |||||
// xxx args: bitStart=4, length=3 | |||||
// 010 masked | |||||
// -> 010 shifted | |||||
uint8_t count, b; | |||||
if ((count = readByte(devAddr, regAddr, &b, timeout)) != 0) { | |||||
uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |||||
b &= mask; | |||||
b >>= (bitStart - length + 1); | |||||
*data = b; | |||||
} | |||||
return count; | |||||
int8_t I2Cdev::readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, | |||||
uint8_t length, uint8_t *data, uint16_t timeout) { | |||||
// 01101001 read byte | |||||
// 76543210 bit numbers | |||||
// xxx args: bitStart=4, length=3 | |||||
// 010 masked | |||||
// -> 010 shifted | |||||
uint8_t count, b; | |||||
if ((count = readByte(devAddr, regAddr, &b, timeout)) != 0) { | |||||
uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |||||
b &= mask; | |||||
b >>= (bitStart - length + 1); | |||||
*data = b; | |||||
} | |||||
return count; | |||||
} | } | ||||
/** Read multiple bits from a 16-bit device register. | /** Read multiple bits from a 16-bit device register. | ||||
@@ -161,21 +164,22 @@ int8_t I2Cdev::readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Status of read operation (1 = success, 0 = failure, -1 = timeout) | * @return Status of read operation (1 = success, 0 = failure, -1 = timeout) | ||||
*/ | */ | ||||
int8_t I2Cdev::readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout) { | |||||
// 1101011001101001 read byte | |||||
// fedcba9876543210 bit numbers | |||||
// xxx args: bitStart=12, length=3 | |||||
// 010 masked | |||||
// -> 010 shifted | |||||
uint8_t count; | |||||
uint16_t w; | |||||
if ((count = readWord(devAddr, regAddr, &w, timeout)) != 0) { | |||||
uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |||||
w &= mask; | |||||
w >>= (bitStart - length + 1); | |||||
*data = w; | |||||
} | |||||
return count; | |||||
int8_t I2Cdev::readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, | |||||
uint8_t length, uint16_t *data, uint16_t timeout) { | |||||
// 1101011001101001 read byte | |||||
// fedcba9876543210 bit numbers | |||||
// xxx args: bitStart=12, length=3 | |||||
// 010 masked | |||||
// -> 010 shifted | |||||
uint8_t count; | |||||
uint16_t w; | |||||
if ((count = readWord(devAddr, regAddr, &w, timeout)) != 0) { | |||||
uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |||||
w &= mask; | |||||
w >>= (bitStart - length + 1); | |||||
*data = w; | |||||
} | |||||
return count; | |||||
} | } | ||||
/** Read single byte from an 8-bit device register. | /** Read single byte from an 8-bit device register. | ||||
@@ -185,8 +189,9 @@ int8_t I2Cdev::readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uin | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Status of read operation (true = success) | * @return Status of read operation (true = success) | ||||
*/ | */ | ||||
int8_t I2Cdev::readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_t timeout) { | |||||
return readBytes(devAddr, regAddr, 1, data, timeout); | |||||
int8_t I2Cdev::readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, | |||||
uint16_t timeout) { | |||||
return readBytes(devAddr, regAddr, 1, data, timeout); | |||||
} | } | ||||
/** Read single word from a 16-bit device register. | /** Read single word from a 16-bit device register. | ||||
@@ -196,8 +201,9 @@ int8_t I2Cdev::readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_ | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Status of read operation (true = success) | * @return Status of read operation (true = success) | ||||
*/ | */ | ||||
int8_t I2Cdev::readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout) { | |||||
return readWords(devAddr, regAddr, 1, data, timeout); | |||||
int8_t I2Cdev::readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, | |||||
uint16_t timeout) { | |||||
return readWords(devAddr, regAddr, 1, data, timeout); | |||||
} | } | ||||
/** Read multiple bytes from an 8-bit device register. | /** Read multiple bytes from an 8-bit device register. | ||||
@@ -208,8 +214,9 @@ int8_t I2Cdev::readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16 | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Number of bytes read (-1 indicates failure) | * @return Number of bytes read (-1 indicates failure) | ||||
*/ | */ | ||||
int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, | |||||
uint8_t *data, uint16_t timeout) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print("I2C (0x"); | Serial.print("I2C (0x"); | ||||
Serial.print(devAddr, HEX); | Serial.print(devAddr, HEX); | ||||
Serial.print(") reading "); | Serial.print(") reading "); | ||||
@@ -219,12 +226,12 @@ int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8 | |||||
Serial.print("..."); | Serial.print("..."); | ||||
#endif | #endif | ||||
int8_t count = 0; | |||||
uint32_t t1 = millis(); | |||||
int8_t count = 0; | |||||
uint32_t t1 = millis(); | |||||
#if (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | |||||
#if (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | |||||
#if (ARDUINO < 100) | |||||
#if (ARDUINO < 100) | |||||
// Arduino v00xx (before v1.0), Wire library | // Arduino v00xx (before v1.0), Wire library | ||||
// I2C/TWI subsystem uses internal buffer that breaks with large data requests | // I2C/TWI subsystem uses internal buffer that breaks with large data requests | ||||
@@ -272,30 +279,31 @@ int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8 | |||||
Wire.endTransmission(); | Wire.endTransmission(); | ||||
} | } | ||||
#elif (ARDUINO > 100) | #elif (ARDUINO > 100) | ||||
// Arduino v1.0.1+, Wire library | |||||
// Adds official support for repeated start condition, yay! | |||||
// I2C/TWI subsystem uses internal buffer that breaks with large data requests | |||||
// so if user requests more than BUFFER_LENGTH bytes, we have to do it in | |||||
// smaller chunks instead of all at once | |||||
for (uint8_t k = 0; k < length; k += min((int)length, BUFFER_LENGTH)) { | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.write(regAddr); | |||||
Wire.endTransmission(); | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.requestFrom(devAddr, (uint8_t)min(length - k, BUFFER_LENGTH)); | |||||
for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { | |||||
data[count] = Wire.read(); | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
// Arduino v1.0.1+, Wire library | |||||
// Adds official support for repeated start condition, yay! | |||||
// I2C/TWI subsystem uses internal buffer that breaks with large data requests | |||||
// so if user requests more than BUFFER_LENGTH bytes, we have to do it in | |||||
// smaller chunks instead of all at once | |||||
for (uint8_t k = 0; k < length; k += min((int )length, BUFFER_LENGTH)) { | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.write(regAddr); | |||||
Wire.endTransmission(); | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.requestFrom(devAddr, (uint8_t) min(length - k, BUFFER_LENGTH)); | |||||
for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); | |||||
count++) { | |||||
data[count] = Wire.read(); | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print(data[count], HEX); | Serial.print(data[count], HEX); | ||||
if (count + 1 < length) Serial.print(" "); | if (count + 1 < length) Serial.print(" "); | ||||
#endif | #endif | ||||
} | |||||
} | |||||
#endif | |||||
} | |||||
} | |||||
#endif | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
// Fastwire library | // Fastwire library | ||||
// no loop required for fastwire | // no loop required for fastwire | ||||
@@ -308,16 +316,17 @@ int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8 | |||||
#endif | #endif | ||||
// check for timeout | |||||
if (timeout > 0 && millis() - t1 >= timeout && count < length) count = -1; // timeout | |||||
// check for timeout | |||||
if (timeout > 0 && millis() - t1 >= timeout && count < length) | |||||
count = -1; // timeout | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print(". Done ("); | Serial.print(". Done ("); | ||||
Serial.print(count, DEC); | Serial.print(count, DEC); | ||||
Serial.println(" read)."); | Serial.println(" read)."); | ||||
#endif | #endif | ||||
return count; | |||||
return count; | |||||
} | } | ||||
/** Read multiple words from a 16-bit device register. | /** Read multiple words from a 16-bit device register. | ||||
@@ -328,8 +337,9 @@ int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8 | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Number of words read (-1 indicates failure) | * @return Number of words read (-1 indicates failure) | ||||
*/ | */ | ||||
int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, | |||||
uint16_t *data, uint16_t timeout) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print("I2C (0x"); | Serial.print("I2C (0x"); | ||||
Serial.print(devAddr, HEX); | Serial.print(devAddr, HEX); | ||||
Serial.print(") reading "); | Serial.print(") reading "); | ||||
@@ -339,12 +349,12 @@ int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint1 | |||||
Serial.print("..."); | Serial.print("..."); | ||||
#endif | #endif | ||||
int8_t count = 0; | |||||
uint32_t t1 = millis(); | |||||
int8_t count = 0; | |||||
uint32_t t1 = millis(); | |||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE | #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE | ||||
#if (ARDUINO < 100) | |||||
#if (ARDUINO < 100) | |||||
// Arduino v00xx (before v1.0), Wire library | // Arduino v00xx (before v1.0), Wire library | ||||
// I2C/TWI subsystem uses internal buffer that breaks with large data requests | // I2C/TWI subsystem uses internal buffer that breaks with large data requests | ||||
@@ -410,41 +420,43 @@ int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint1 | |||||
Wire.endTransmission(); | Wire.endTransmission(); | ||||
} | } | ||||
#elif (ARDUINO > 100) | #elif (ARDUINO > 100) | ||||
// Arduino v1.0.1+, Wire library | |||||
// Adds official support for repeated start condition, yay! | |||||
// I2C/TWI subsystem uses internal buffer that breaks with large data requests | |||||
// so if user requests more than BUFFER_LENGTH bytes, we have to do it in | |||||
// smaller chunks instead of all at once | |||||
for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.write(regAddr); | |||||
Wire.endTransmission(); | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes | |||||
bool msb = true; // starts with MSB, then LSB | |||||
for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { | |||||
if (msb) { | |||||
// first byte is bits 15-8 (MSb=15) | |||||
data[count] = Wire.read() << 8; | |||||
} else { | |||||
// second byte is bits 7-0 (LSb=0) | |||||
data[count] |= Wire.read(); | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
// Arduino v1.0.1+, Wire library | |||||
// Adds official support for repeated start condition, yay! | |||||
// I2C/TWI subsystem uses internal buffer that breaks with large data requests | |||||
// so if user requests more than BUFFER_LENGTH bytes, we have to do it in | |||||
// smaller chunks instead of all at once | |||||
for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.write(regAddr); | |||||
Wire.endTransmission(); | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.requestFrom(devAddr, (uint8_t) (length * 2)); // length=words, this wants bytes | |||||
bool msb = true; // starts with MSB, then LSB | |||||
for (; | |||||
Wire.available() && count < length | |||||
&& (timeout == 0 || millis() - t1 < timeout);) { | |||||
if (msb) { | |||||
// first byte is bits 15-8 (MSb=15) | |||||
data[count] = Wire.read() << 8; | |||||
} else { | |||||
// second byte is bits 7-0 (LSb=0) | |||||
data[count] |= Wire.read(); | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print(data[count], HEX); | Serial.print(data[count], HEX); | ||||
if (count + 1 < length) Serial.print(" "); | if (count + 1 < length) Serial.print(" "); | ||||
#endif | #endif | ||||
count++; | |||||
} | |||||
msb = !msb; | |||||
} | |||||
Wire.endTransmission(); | |||||
} | |||||
#endif | |||||
count++; | |||||
} | |||||
msb = !msb; | |||||
} | |||||
Wire.endTransmission(); | |||||
} | |||||
#endif | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
// Fastwire library | // Fastwire library | ||||
// no loop required for fastwire | // no loop required for fastwire | ||||
@@ -461,15 +473,16 @@ int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint1 | |||||
#endif | #endif | ||||
if (timeout > 0 && millis() - t1 >= timeout && count < length) count = -1; // timeout | |||||
if (timeout > 0 && millis() - t1 >= timeout && count < length) | |||||
count = -1; // timeout | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print(". Done ("); | Serial.print(". Done ("); | ||||
Serial.print(count, DEC); | Serial.print(count, DEC); | ||||
Serial.println(" read)."); | Serial.println(" read)."); | ||||
#endif | #endif | ||||
return count; | |||||
return count; | |||||
} | } | ||||
/** write a single bit in an 8-bit device register. | /** write a single bit in an 8-bit device register. | ||||
@@ -479,11 +492,12 @@ int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint1 | |||||
* @param value New bit value to write | * @param value New bit value to write | ||||
* @return Status of operation (true = success) | * @return Status of operation (true = success) | ||||
*/ | */ | ||||
bool I2Cdev::writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data) { | |||||
uint8_t b; | |||||
readByte(devAddr, regAddr, &b); | |||||
b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum)); | |||||
return writeByte(devAddr, regAddr, b); | |||||
bool I2Cdev::writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, | |||||
uint8_t data) { | |||||
uint8_t b; | |||||
readByte(devAddr, regAddr, &b); | |||||
b = (data != 0) ? (b | (1 << bitNum)) : (b & ~(1 << bitNum)); | |||||
return writeByte(devAddr, regAddr, b); | |||||
} | } | ||||
/** write a single bit in a 16-bit device register. | /** write a single bit in a 16-bit device register. | ||||
@@ -493,11 +507,12 @@ bool I2Cdev::writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t | |||||
* @param value New bit value to write | * @param value New bit value to write | ||||
* @return Status of operation (true = success) | * @return Status of operation (true = success) | ||||
*/ | */ | ||||
bool I2Cdev::writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data) { | |||||
uint16_t w; | |||||
readWord(devAddr, regAddr, &w); | |||||
w = (data != 0) ? (w | (1 << bitNum)) : (w & ~(1 << bitNum)); | |||||
return writeWord(devAddr, regAddr, w); | |||||
bool I2Cdev::writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, | |||||
uint16_t data) { | |||||
uint16_t w; | |||||
readWord(devAddr, regAddr, &w); | |||||
w = (data != 0) ? (w | (1 << bitNum)) : (w & ~(1 << bitNum)); | |||||
return writeWord(devAddr, regAddr, w); | |||||
} | } | ||||
/** Write multiple bits in an 8-bit device register. | /** Write multiple bits in an 8-bit device register. | ||||
@@ -508,25 +523,26 @@ bool I2Cdev::writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_ | |||||
* @param data Right-aligned value to write | * @param data Right-aligned value to write | ||||
* @return Status of operation (true = success) | * @return Status of operation (true = success) | ||||
*/ | */ | ||||
bool I2Cdev::writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data) { | |||||
// 010 value to write | |||||
// 76543210 bit numbers | |||||
// xxx args: bitStart=4, length=3 | |||||
// 00011100 mask byte | |||||
// 10101111 original value (sample) | |||||
// 10100011 original & ~mask | |||||
// 10101011 masked | value | |||||
uint8_t b; | |||||
if (readByte(devAddr, regAddr, &b) != 0) { | |||||
uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |||||
data <<= (bitStart - length + 1); // shift data into correct position | |||||
data &= mask; // zero all non-important bits in data | |||||
b &= ~(mask); // zero all important bits in existing byte | |||||
b |= data; // combine data with existing byte | |||||
return writeByte(devAddr, regAddr, b); | |||||
} else { | |||||
return false; | |||||
} | |||||
bool I2Cdev::writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, | |||||
uint8_t length, uint8_t data) { | |||||
// 010 value to write | |||||
// 76543210 bit numbers | |||||
// xxx args: bitStart=4, length=3 | |||||
// 00011100 mask byte | |||||
// 10101111 original value (sample) | |||||
// 10100011 original & ~mask | |||||
// 10101011 masked | value | |||||
uint8_t b; | |||||
if (readByte(devAddr, regAddr, &b) != 0) { | |||||
uint8_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |||||
data <<= (bitStart - length + 1); // shift data into correct position | |||||
data &= mask; // zero all non-important bits in data | |||||
b &= ~(mask); // zero all important bits in existing byte | |||||
b |= data; // combine data with existing byte | |||||
return writeByte(devAddr, regAddr, b); | |||||
} else { | |||||
return false; | |||||
} | |||||
} | } | ||||
/** Write multiple bits in a 16-bit device register. | /** Write multiple bits in a 16-bit device register. | ||||
@@ -537,25 +553,26 @@ bool I2Cdev::writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8 | |||||
* @param data Right-aligned value to write | * @param data Right-aligned value to write | ||||
* @return Status of operation (true = success) | * @return Status of operation (true = success) | ||||
*/ | */ | ||||
bool I2Cdev::writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data) { | |||||
// 010 value to write | |||||
// fedcba9876543210 bit numbers | |||||
// xxx args: bitStart=12, length=3 | |||||
// 0001110000000000 mask word | |||||
// 1010111110010110 original value (sample) | |||||
// 1010001110010110 original & ~mask | |||||
// 1010101110010110 masked | value | |||||
uint16_t w; | |||||
if (readWord(devAddr, regAddr, &w) != 0) { | |||||
uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |||||
data <<= (bitStart - length + 1); // shift data into correct position | |||||
data &= mask; // zero all non-important bits in data | |||||
w &= ~(mask); // zero all important bits in existing word | |||||
w |= data; // combine data with existing word | |||||
return writeWord(devAddr, regAddr, w); | |||||
} else { | |||||
return false; | |||||
} | |||||
bool I2Cdev::writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, | |||||
uint8_t length, uint16_t data) { | |||||
// 010 value to write | |||||
// fedcba9876543210 bit numbers | |||||
// xxx args: bitStart=12, length=3 | |||||
// 0001110000000000 mask word | |||||
// 1010111110010110 original value (sample) | |||||
// 1010001110010110 original & ~mask | |||||
// 1010101110010110 masked | value | |||||
uint16_t w; | |||||
if (readWord(devAddr, regAddr, &w) != 0) { | |||||
uint16_t mask = ((1 << length) - 1) << (bitStart - length + 1); | |||||
data <<= (bitStart - length + 1); // shift data into correct position | |||||
data &= mask; // zero all non-important bits in data | |||||
w &= ~(mask); // zero all important bits in existing word | |||||
w |= data; // combine data with existing word | |||||
return writeWord(devAddr, regAddr, w); | |||||
} else { | |||||
return false; | |||||
} | |||||
} | } | ||||
/** Write single byte to an 8-bit device register. | /** Write single byte to an 8-bit device register. | ||||
@@ -565,7 +582,7 @@ bool I2Cdev::writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint | |||||
* @return Status of operation (true = success) | * @return Status of operation (true = success) | ||||
*/ | */ | ||||
bool I2Cdev::writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { | bool I2Cdev::writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { | ||||
return writeBytes(devAddr, regAddr, 1, &data); | |||||
return writeBytes(devAddr, regAddr, 1, &data); | |||||
} | } | ||||
/** Write single word to a 16-bit device register. | /** Write single word to a 16-bit device register. | ||||
@@ -575,7 +592,7 @@ bool I2Cdev::writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { | |||||
* @return Status of operation (true = success) | * @return Status of operation (true = success) | ||||
*/ | */ | ||||
bool I2Cdev::writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data) { | bool I2Cdev::writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data) { | ||||
return writeWords(devAddr, regAddr, 1, &data); | |||||
return writeWords(devAddr, regAddr, 1, &data); | |||||
} | } | ||||
/** Write multiple bytes to an 8-bit device register. | /** Write multiple bytes to an 8-bit device register. | ||||
@@ -585,8 +602,9 @@ bool I2Cdev::writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data) { | |||||
* @param data Buffer to copy new data from | * @param data Buffer to copy new data from | ||||
* @return Status of operation (true = success) | * @return Status of operation (true = success) | ||||
*/ | */ | ||||
bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, | |||||
uint8_t *data) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print("I2C (0x"); | Serial.print("I2C (0x"); | ||||
Serial.print(devAddr, HEX); | Serial.print(devAddr, HEX); | ||||
Serial.print(") writing "); | Serial.print(") writing "); | ||||
@@ -595,48 +613,48 @@ bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_ | |||||
Serial.print(regAddr, HEX); | Serial.print(regAddr, HEX); | ||||
Serial.print("..."); | Serial.print("..."); | ||||
#endif | #endif | ||||
uint8_t status = 0; | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
uint8_t status = 0; | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
Wire.beginTransmission(devAddr); | Wire.beginTransmission(devAddr); | ||||
Wire.send((uint8_t) regAddr); // send address | Wire.send((uint8_t) regAddr); // send address | ||||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | #elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | ||||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | || (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | ||||
|| I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | ||||
Wire.beginTransmission(devAddr); | |||||
Wire.write((uint8_t) regAddr); // send address | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.write((uint8_t) regAddr); // send address | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Fastwire::beginTransmission(devAddr); | Fastwire::beginTransmission(devAddr); | ||||
Fastwire::write(regAddr); | Fastwire::write(regAddr); | ||||
#endif | #endif | ||||
for (uint8_t i = 0; i < length; i++) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
for (uint8_t i = 0; i < length; i++) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print(data[i], HEX); | Serial.print(data[i], HEX); | ||||
if (i + 1 < length) Serial.print(" "); | if (i + 1 < length) Serial.print(" "); | ||||
#endif | #endif | ||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
Wire.send((uint8_t) data[i]); | Wire.send((uint8_t) data[i]); | ||||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | #elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | ||||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | || (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | ||||
|| I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | ||||
Wire.write((uint8_t) data[i]); | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Wire.write((uint8_t) data[i]); | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Fastwire::write((uint8_t) data[i]); | Fastwire::write((uint8_t) data[i]); | ||||
#endif | #endif | ||||
} | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
} | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
Wire.endTransmission(); | Wire.endTransmission(); | ||||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | #elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | ||||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | || (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | ||||
|| I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | ||||
status = Wire.endTransmission(); | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
status = Wire.endTransmission(); | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Fastwire::stop(); | Fastwire::stop(); | ||||
//status = Fastwire::endTransmission(); | //status = Fastwire::endTransmission(); | ||||
#endif | #endif | ||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.println(". Done."); | Serial.println(". Done."); | ||||
#endif | #endif | ||||
return status == 0; | |||||
return status == 0; | |||||
} | } | ||||
/** Write multiple words to a 16-bit device register. | /** Write multiple words to a 16-bit device register. | ||||
@@ -646,8 +664,9 @@ bool I2Cdev::writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_ | |||||
* @param data Buffer to copy new data from | * @param data Buffer to copy new data from | ||||
* @return Status of operation (true = success) | * @return Status of operation (true = success) | ||||
*/ | */ | ||||
bool I2Cdev::writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
bool I2Cdev::writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, | |||||
uint16_t *data) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print("I2C (0x"); | Serial.print("I2C (0x"); | ||||
Serial.print(devAddr, HEX); | Serial.print(devAddr, HEX); | ||||
Serial.print(") writing "); | Serial.print(") writing "); | ||||
@@ -656,52 +675,52 @@ bool I2Cdev::writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16 | |||||
Serial.print(regAddr, HEX); | Serial.print(regAddr, HEX); | ||||
Serial.print("..."); | Serial.print("..."); | ||||
#endif | #endif | ||||
uint8_t status = 0; | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
uint8_t status = 0; | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
Wire.beginTransmission(devAddr); | Wire.beginTransmission(devAddr); | ||||
Wire.send(regAddr); // send address | Wire.send(regAddr); // send address | ||||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | #elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | ||||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | || (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | ||||
|| I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | ||||
Wire.beginTransmission(devAddr); | |||||
Wire.write(regAddr); // send address | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Wire.beginTransmission(devAddr); | |||||
Wire.write(regAddr); // send address | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Fastwire::beginTransmission(devAddr); | Fastwire::beginTransmission(devAddr); | ||||
Fastwire::write(regAddr); | Fastwire::write(regAddr); | ||||
#endif | #endif | ||||
for (uint8_t i = 0; i < length; i++) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
for (uint8_t i = 0; i < length; i++) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.print(data[i], HEX); | Serial.print(data[i], HEX); | ||||
if (i + 1 < length) Serial.print(" "); | if (i + 1 < length) Serial.print(" "); | ||||
#endif | #endif | ||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
Wire.send((uint8_t)(data[i] >> 8)); // send MSB | Wire.send((uint8_t)(data[i] >> 8)); // send MSB | ||||
Wire.send((uint8_t)data[i]); // send LSB | Wire.send((uint8_t)data[i]); // send LSB | ||||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | #elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | ||||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | || (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | ||||
|| I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | ||||
Wire.write((uint8_t)(data[i] >> 8)); // send MSB | |||||
Wire.write((uint8_t)data[i]); // send LSB | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Wire.write((uint8_t) (data[i] >> 8)); // send MSB | |||||
Wire.write((uint8_t) data[i]); // send LSB | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Fastwire::write((uint8_t)(data[i] >> 8)); // send MSB | Fastwire::write((uint8_t)(data[i] >> 8)); // send MSB | ||||
status = Fastwire::write((uint8_t)data[i]); // send LSB | status = Fastwire::write((uint8_t)data[i]); // send LSB | ||||
if (status != 0) break; | if (status != 0) break; | ||||
#endif | #endif | ||||
} | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
} | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | |||||
Wire.endTransmission(); | Wire.endTransmission(); | ||||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | #elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | ||||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | || (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | ||||
|| I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | || I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE) | ||||
status = Wire.endTransmission(); | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
status = Wire.endTransmission(); | |||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||||
Fastwire::stop(); | Fastwire::stop(); | ||||
//status = Fastwire::endTransmission(); | //status = Fastwire::endTransmission(); | ||||
#endif | #endif | ||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
#ifdef I2CDEV_SERIAL_DEBUG | |||||
Serial.println(". Done."); | Serial.println(". Done."); | ||||
#endif | #endif | ||||
return status == 0; | |||||
return status == 0; | |||||
} | } | ||||
/** Default timeout value for read operations. | /** Default timeout value for read operations. | ||||
@@ -22,28 +22,28 @@ | |||||
// 2011-07-28 - initial release | // 2011-07-28 - initial release | ||||
/* ============================================ | /* ============================================ | ||||
I2Cdev device library code is placed under the MIT license | |||||
Copyright (c) 2013 Jeff Rowberg | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. | |||||
=============================================== | |||||
*/ | |||||
I2Cdev device library code is placed under the MIT license | |||||
Copyright (c) 2013 Jeff Rowberg | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. | |||||
=============================================== | |||||
*/ | |||||
#ifndef _I2CDEV_H_ | #ifndef _I2CDEV_H_ | ||||
#define _I2CDEV_H_ | #define _I2CDEV_H_ | ||||
@@ -67,7 +67,7 @@ THE SOFTWARE. | |||||
// ----------------------------------------------------------------------------- | // ----------------------------------------------------------------------------- | ||||
#define I2CDEV_ARDUINO_WIRE 1 // Wire object from Arduino | #define I2CDEV_ARDUINO_WIRE 1 // Wire object from Arduino | ||||
#define I2CDEV_BUILTIN_NBWIRE 2 // Tweaked Wire object from Gene Knight's NBWire project | #define I2CDEV_BUILTIN_NBWIRE 2 // Tweaked Wire object from Gene Knight's NBWire project | ||||
// ^^^ NBWire implementation is still buggy w/some interrupts! | |||||
// ^^^ NBWire implementation is still buggy w/some interrupts! | |||||
#define I2CDEV_BUILTIN_FASTWIRE 3 // FastWire object from Francesco Ferrara's project | #define I2CDEV_BUILTIN_FASTWIRE 3 // FastWire object from Francesco Ferrara's project | ||||
#define I2CDEV_I2CMASTER_LIBRARY 4 // I2C object from DSSCircuits I2C-Master Library at https://github.com/DSSCircuits/I2C-Master-Library | #define I2CDEV_I2CMASTER_LIBRARY 4 // I2C object from DSSCircuits I2C-Master Library at https://github.com/DSSCircuits/I2C-Master-Library | ||||
#define I2CDEV_BUILTIN_SBWIRE 5 // I2C object from Shuning (Steve) Bian's SBWire Library at https://github.com/freespace/SBWire | #define I2CDEV_BUILTIN_SBWIRE 5 // I2C object from Shuning (Steve) Bian's SBWire Library at https://github.com/freespace/SBWire | ||||
@@ -79,21 +79,21 @@ THE SOFTWARE. | |||||
//#define I2CDEV_SERIAL_DEBUG | //#define I2CDEV_SERIAL_DEBUG | ||||
#ifdef ARDUINO | #ifdef ARDUINO | ||||
#if ARDUINO < 100 | |||||
#if ARDUINO < 100 | |||||
#include "WProgram.h" | #include "WProgram.h" | ||||
#else | #else | ||||
#include "Arduino.h" | |||||
#endif | |||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE | |||||
#include <Wire.h> | |||||
#endif | |||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE | |||||
#include "Arduino.h" | |||||
#endif | |||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE | |||||
#include <Wire.h> | |||||
#endif | |||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_TEENSY_3X_WIRE | |||||
#include <i2c_t3.h> | #include <i2c_t3.h> | ||||
#endif | #endif | ||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_I2CMASTER_LIBRARY | |||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_I2CMASTER_LIBRARY | |||||
#include <I2C.h> | #include <I2C.h> | ||||
#endif | #endif | ||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE | |||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE | |||||
#include "SBWire.h" | #include "SBWire.h" | ||||
#endif | #endif | ||||
#endif | #endif | ||||
@@ -103,33 +103,48 @@ THE SOFTWARE. | |||||
#define ARDUINO 101 | #define ARDUINO 101 | ||||
#endif | #endif | ||||
// 1000ms default read timeout (modify with "I2Cdev::readTimeout = [ms];") | // 1000ms default read timeout (modify with "I2Cdev::readTimeout = [ms];") | ||||
#define I2CDEV_DEFAULT_READ_TIMEOUT 1000 | #define I2CDEV_DEFAULT_READ_TIMEOUT 1000 | ||||
class I2Cdev { | class I2Cdev { | ||||
public: | |||||
I2Cdev(); | |||||
static int8_t readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
static int8_t readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
static int8_t readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
static int8_t readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
static int8_t readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
static int8_t readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
static int8_t readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
static int8_t readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
static bool writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data); | |||||
static bool writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data); | |||||
static bool writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data); | |||||
static bool writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data); | |||||
static bool writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data); | |||||
static bool writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data); | |||||
static bool writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data); | |||||
static bool writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data); | |||||
static uint16_t readTimeout; | |||||
public: | |||||
I2Cdev(); | |||||
static int8_t readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, | |||||
uint8_t *data, uint16_t timeout = I2Cdev::readTimeout); | |||||
static int8_t readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, | |||||
uint16_t *data, uint16_t timeout = I2Cdev::readTimeout); | |||||
static int8_t readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, | |||||
uint8_t length, uint8_t *data, uint16_t timeout = | |||||
I2Cdev::readTimeout); | |||||
static int8_t readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, | |||||
uint8_t length, uint16_t *data, uint16_t timeout = | |||||
I2Cdev::readTimeout); | |||||
static int8_t readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, | |||||
uint16_t timeout = I2Cdev::readTimeout); | |||||
static int8_t readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, | |||||
uint16_t timeout = I2Cdev::readTimeout); | |||||
static int8_t readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, | |||||
uint8_t *data, uint16_t timeout = I2Cdev::readTimeout); | |||||
static int8_t readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, | |||||
uint16_t *data, uint16_t timeout = I2Cdev::readTimeout); | |||||
static bool writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, | |||||
uint8_t data); | |||||
static bool writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, | |||||
uint16_t data); | |||||
static bool writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, | |||||
uint8_t length, uint8_t data); | |||||
static bool writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, | |||||
uint8_t length, uint16_t data); | |||||
static bool writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data); | |||||
static bool writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data); | |||||
static bool writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, | |||||
uint8_t *data); | |||||
static bool writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, | |||||
uint16_t *data); | |||||
static uint16_t readTimeout; | |||||
}; | }; | ||||
#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE | #if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE | ||||
@@ -4,9 +4,9 @@ | |||||
#include <Wire.h> | #include <Wire.h> | ||||
#include "I2Cdev.h" | #include "I2Cdev.h" | ||||
#include "IAQ2000.h" | #include "IAQ2000.h" | ||||
#include <PubSubClient.h> | |||||
#include <dht.h> | #include <dht.h> | ||||
#include <Dns.h> | |||||
#define dht_apin 5 | #define dht_apin 5 | ||||
@@ -14,6 +14,8 @@ IAQ2000 iaq; | |||||
DHT dht(dht_apin, DHT11); | DHT dht(dht_apin, DHT11); | ||||
// DNS | |||||
DNSClient dnClient; | |||||
uint16_t airQuality; | uint16_t airQuality; | ||||
int val = 0; | int val = 0; | ||||
@@ -40,6 +42,11 @@ char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; | |||||
// Start der UDP-Instanz | // Start der UDP-Instanz | ||||
EthernetUDP Udp; | EthernetUDP Udp; | ||||
//MQTT | |||||
const char *MQTT_BROKER = "loxberry"; | |||||
IPAddress mqttbroker(192, 168, 1, 127); | |||||
EthernetClient ethClient; | |||||
PubSubClient MQTTclient(ethClient); | |||||
// Initialize the Ethernet server library | // Initialize the Ethernet server library | ||||
// with the IP address and port you want to use | // with the IP address and port you want to use | ||||
@@ -48,182 +55,222 @@ EthernetServer server(80); | |||||
void setup() { | void setup() { | ||||
Wire.begin(); | |||||
Serial.begin(9600); | |||||
//serset w5100 | |||||
Ethernet.begin(mac); | |||||
if (!Ethernet.localIP()) { | |||||
Serial.println("dhcp failed"); | |||||
Serial.println(Ethernet.linkStatus()); | |||||
} | |||||
else { | |||||
Serial.print("IP is "); | |||||
Serial.println(Ethernet.localIP()); | |||||
} | |||||
Udp.begin(localPort); // Start UDP | |||||
SPI.begin(); | |||||
sendUDP("Raumluft - aktiv"); // send UDP Ready | |||||
// start the Ethernet connection and the server: | |||||
server.begin(); | |||||
Serial.print("server is at "); | |||||
Serial.println(Ethernet.localIP()); | |||||
// initialize device | |||||
Serial.println("Initialisierung des Sensor..."); | |||||
iaq.initialize(); | |||||
// verify connection | |||||
Serial.println("Verbindung zum Sensor testen..."); | |||||
Serial.println(iaq.testConnection() ? "iAQ-2000 erfolgreich verbunden" : "iAQ-2000 Fehler bei der Verbindung"); | |||||
dht.begin(); //DHT11 Sensor starten | |||||
//Serial leeren | |||||
clearAll(); | |||||
Serial.println("Warte auf UDP-Befehl"); | |||||
Wire.begin(); | |||||
Serial.begin(9600); | |||||
//serset w5100 | |||||
Ethernet.begin(mac); | |||||
if (!Ethernet.localIP()) { | |||||
Serial.println("dhcp failed"); | |||||
Serial.println(Ethernet.linkStatus()); | |||||
} else { | |||||
Serial.print("IP is "); | |||||
Serial.println(Ethernet.localIP()); | |||||
} | |||||
Udp.begin(localPort); // Start UDP | |||||
SPI.begin(); | |||||
sendUDP("Raumluft - aktiv"); // send UDP Ready | |||||
// start the Ethernet connection and the server: | |||||
server.begin(); | |||||
Serial.print("server is at "); | |||||
Serial.println(Ethernet.localIP()); | |||||
// initialize device | |||||
Serial.println("Initialisierung des Sensor..."); | |||||
iaq.initialize(); | |||||
Serial.println( | |||||
iaq.testConnection() ? | |||||
"iAQ-2000 erfolgreich" : | |||||
"iAQ-2000 Fehler"); | |||||
dht.begin(); //DHT11 Sensor starten | |||||
//Serial leeren | |||||
clearAll(); | |||||
// //DNS Client starten | |||||
// dnClient.begin(Ethernet.dnsServerIP()); | |||||
// Serial.print("dns server is at "); | |||||
// Serial.println(Ethernet.dnsServerIP()); | |||||
// if (dnClient.getHostByName(MQTT_BROKER, mqttbroker, 10) == 1) { | |||||
// Serial.print(F("loxberry = ")); | |||||
// Serial.println(mqttbroker); | |||||
// } else { | |||||
// Serial.println("dns failed "); | |||||
// Serial.println(dnClient.getHostByName(MQTT_BROKER, mqttbroker, 10)); | |||||
// mqttbroker.fromString("192.168.1.127"); | |||||
// Serial.println(mqttbroker); | |||||
// } | |||||
// MQTT | |||||
MQTTclient.setServer(mqttbroker, 1883); | |||||
//MQTTclient.setCallback(MQTTcallback); | |||||
//Serial.println("setup done"); | |||||
} | } | ||||
void loop() { | void loop() { | ||||
String aq = String (airQuality); | |||||
String temp = String (Temperatur, 2); | |||||
String hum = String (Humidity, 2); | |||||
dht.read(); //read data from pin 5 (DHT11) | |||||
airQuality = iaq.getIaqpred(); | |||||
Temperatur = dht.readTemperature(); | |||||
Humidity = dht.readHumidity(); | |||||
// schaut on ein UDP Befehl empfangen wurde | |||||
checkUDP(); | |||||
if (!strcmp(packetBuffer, "000")) | |||||
{ | |||||
Serial.print("CO2 = "); | |||||
Serial.print(airQuality); | |||||
Serial.print(" "); | |||||
Serial.println("[ppm]"); | |||||
// Wert wird auf 3000ppm begrnezt | |||||
if (airQuality > 3000) | |||||
{ | |||||
aq = "3000"; | |||||
} | |||||
else | |||||
{ | |||||
aq = airQuality; | |||||
} | |||||
sendUDP(aq); | |||||
} | |||||
if (!strcmp(packetBuffer, "001")) | |||||
{ | |||||
sendUDP (temp); | |||||
} | |||||
if (!strcmp(packetBuffer, "002")) | |||||
{ | |||||
sendUDP (hum); | |||||
} | |||||
clearAll(); | |||||
// listen for incoming clients | |||||
EthernetClient client = server.available(); | |||||
if (client) | |||||
{ | |||||
Serial.println("new client"); | |||||
// an http request ends with a blank line | |||||
boolean currentLineIsBlank = true; | |||||
while (client.connected()) { | |||||
if (client.available()) { | |||||
char c = client.read(); | |||||
//Serial.write(c); | |||||
// if you've gotten to the end of the line (received a newline | |||||
// character) and the line is blank, the http request has ended, | |||||
// so you can send a reply | |||||
if (c == '\n' && currentLineIsBlank) { | |||||
// send a standard http response header | |||||
client.println("HTTP/1.1 200 OK"); | |||||
client.println("Content-Type: text/html"); | |||||
client.println("Connection: close"); | |||||
client.println(); | |||||
client.println("<!DOCTYPE HTML>"); | |||||
client.println("<html>"); | |||||
// add a meta refresh tag, so the browser pulls again every 5 seconds: | |||||
client.println("<meta http-equiv=\"refresh\" content=\"10\">"); | |||||
// output the value of each analog input pin | |||||
client.println("Current Humidity = "); //Prints information within qoutation | |||||
client.println(hum); //Prints the Humidity read from the DHT11 on PIN 5 | |||||
client.println("% "); | |||||
client.println("Temperature = "); | |||||
client.println(temp); //Prints the temperature read from the DHT11 on PIN 5 | |||||
client.println("C "); | |||||
client.println("CO2 = "); | |||||
client.println(aq); | |||||
client.println(" "); | |||||
client.println("[ppm]"); | |||||
client.println("</html>"); | |||||
break; | |||||
} | |||||
if (c == '\n') { | |||||
// you're starting a new line | |||||
currentLineIsBlank = true; | |||||
} | |||||
else if (c != '\r') { | |||||
// you've gotten a character on the current line | |||||
currentLineIsBlank = false; | |||||
} | |||||
} | |||||
} | |||||
// give the web browser time to receive the data | |||||
delay(1); | |||||
// close the connection: | |||||
client.stop(); | |||||
Serial.println("client disonnected"); | |||||
} | |||||
String aq = String(airQuality); | |||||
String temp = String(Temperatur, 2); | |||||
String hum = String(Humidity, 2); | |||||
char buff[20]; | |||||
Serial.println("LOOP10"); | |||||
dht.read(); //read data from pin 5 (DHT11) | |||||
Serial.println("LOOP20"); | |||||
airQuality = iaq.getIaqpred(); | |||||
Temperatur = dht.readTemperature(); | |||||
Humidity = dht.readHumidity(); | |||||
Serial.println("LOOP30"); | |||||
//MQTT | |||||
if (!MQTTclient.connected()) { | |||||
MQTTclient.connect("Arduino", "loxberry", "OSVL0AMqISFXgr5g"); | |||||
Serial.print("MQTT Client state:"); | |||||
Serial.println(MQTTclient.state()); | |||||
// Abonieren von Nachrichten mit dem angegebenen Topic | |||||
//MQTTclient.subscribe("/Stall/arduino1/#"); | |||||
Serial.println("connected to MQTT"); | |||||
} | |||||
temp.toCharArray(buff, temp.length()); | |||||
MQTTclient.publish("Arduino/Stall/Temperatur", buff); | |||||
aq.toCharArray(buff, aq.length()+1); | |||||
MQTTclient.publish("Arduino/Stall/CO2", buff); | |||||
Serial.println("CO2 buff"); | |||||
Serial.println(buff); | |||||
Serial.println(aq); | |||||
hum.toCharArray(buff, hum.length()); | |||||
MQTTclient.publish("Arduino/Stall/Humidity", buff); | |||||
snprintf(buff, 19, "%ld", millis()); | |||||
Serial.println("Publish message: "); | |||||
Serial.println(buff); | |||||
MQTTclient.publish("Arduino/Stall/data/Alive", buff); | |||||
Serial.println("MQTT done"); | |||||
// MQTTclient.loop(); // Schleife für MQTT | |||||
// schaut on ein UDP Befehl empfangen wurde | |||||
checkUDP(); | |||||
if (!strcmp(packetBuffer, "000")) { | |||||
Serial.print("CO2 = "); | |||||
Serial.print(airQuality); | |||||
Serial.print(" "); | |||||
Serial.println("[ppm]"); | |||||
// Wert wird auf 3000ppm begrnezt | |||||
if (airQuality > 3000) { | |||||
aq = "3000"; | |||||
} else { | |||||
aq = airQuality; | |||||
} | |||||
sendUDP(aq); | |||||
} | |||||
if (!strcmp(packetBuffer, "001")) { | |||||
sendUDP(temp); | |||||
} | |||||
if (!strcmp(packetBuffer, "002")) { | |||||
sendUDP(hum); | |||||
} | |||||
clearAll(); | |||||
Serial.println("UDP done"); | |||||
// listen for incoming clients | |||||
EthernetClient client = server.available(); | |||||
if (client) { | |||||
Serial.println("new client"); | |||||
// an http request ends with a blank line | |||||
boolean currentLineIsBlank = true; | |||||
while (client.connected()) { | |||||
if (client.available()) { | |||||
char c = client.read(); | |||||
//Serial.write(c); | |||||
// if you've gotten to the end of the line (received a newline | |||||
// character) and the line is blank, the http request has ended, | |||||
// so you can send a reply | |||||
if (c == '\n' && currentLineIsBlank) { | |||||
// send a standard http response header | |||||
client.println("Current Humidity = "); //Prints information within qoutation | |||||
client.println(hum); //Prints the Humidity read from the DHT11 on PIN 5 | |||||
client.println("% "); | |||||
client.println("Temperature = "); | |||||
client.println(temp); //Prints the temperature read from the DHT11 on PIN 5 | |||||
client.println("C "); | |||||
client.println("CO2 = "); | |||||
client.println(aq); | |||||
client.println(" "); | |||||
client.println("[ppm]"); | |||||
break; | |||||
} | |||||
if (c == '\n') { | |||||
// you're starting a new line | |||||
currentLineIsBlank = true; | |||||
} else if (c != '\r') { | |||||
// you've gotten a character on the current line | |||||
currentLineIsBlank = false; | |||||
} | |||||
} | |||||
} | |||||
// give the web browser time to receive the data | |||||
delay(1); | |||||
// close the connection: | |||||
client.stop(); | |||||
Serial.println("client disonnected"); | |||||
} | |||||
Serial.println("HTTP done"); | |||||
} | } | ||||
//// Module //// | //// Module //// | ||||
// Serial-Speicher loeschen | // Serial-Speicher loeschen | ||||
void clearAll() { | void clearAll() { | ||||
// Paket-Buffer leeren | |||||
for (int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) packetBuffer[i] = (char)0; | |||||
// Paket-Buffer leeren | |||||
for (int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) | |||||
packetBuffer[i] = (char) 0; | |||||
} | } | ||||
// empfangene UDP-Befehle auswerten | // empfangene UDP-Befehle auswerten | ||||
void checkUDP() | |||||
{ | |||||
// pruefen ob Daten vorhanden sind | |||||
int packetSize = Udp.parsePacket(); | |||||
if (packetSize) | |||||
{ | |||||
Udp.read(packetBuffer, packetSize); | |||||
Serial.print("Packet Content: "); | |||||
Serial.println(packetBuffer); | |||||
RecipientIP=Udp.remoteIP(); | |||||
Serial.print("Remote IP: "); | |||||
Serial.println(RecipientIP); | |||||
} | |||||
delay(10); | |||||
void checkUDP() { | |||||
// pruefen ob Daten vorhanden sind | |||||
int packetSize = Udp.parsePacket(); | |||||
if (packetSize) { | |||||
Udp.read(packetBuffer, packetSize); | |||||
Serial.print("Packet Content: "); | |||||
Serial.println(packetBuffer); | |||||
RecipientIP = Udp.remoteIP(); | |||||
Serial.print("Remote IP: "); | |||||
Serial.println(RecipientIP); | |||||
} | |||||
delay(10); | |||||
} | } | ||||
// UDP-Befehl senden | // UDP-Befehl senden | ||||
void sendUDP(String text) | |||||
{ | |||||
Udp.beginPacket(RecipientIP, RecipientPort); | |||||
Udp.print(text); | |||||
Udp.endPacket(); | |||||
delay(10); | |||||
void sendUDP(String text) { | |||||
Udp.beginPacket(RecipientIP, RecipientPort); | |||||
Udp.print(text); | |||||
Udp.endPacket(); | |||||
delay(10); | |||||
} | } | ||||
//void MQTTcallback(char *topic, byte *payload, unsigned int length) { | |||||
// Serial.print("Received message ["); | |||||
// Serial.print(topic); | |||||
// Serial.print("] "); | |||||
// char msg[length + 1]; | |||||
// for (unsigned int i = 0; i < length; i++) { | |||||
// Serial.print((char) payload[i]); | |||||
// msg[i] = (char) payload[i]; | |||||
// } | |||||
// Serial.println("keine Ahnung"); | |||||
// | |||||
// msg[length] = '\0'; | |||||
// Serial.println(msg); | |||||
// | |||||
// if (strcmp(msg, "on") == 0) { | |||||
// digitalWrite(13, HIGH); | |||||
// } else if (strcmp(msg, "off") == 0) { | |||||
// digitalWrite(13, LOW); | |||||
// } | |||||
//} |
@@ -10,8 +10,8 @@ | |||||
// 2012-11-08 - added TVoc and Status | // 2012-11-08 - added TVoc and Status | ||||
/* ============================================ | /* ============================================ | ||||
I2Cdev device library code is placed under the MIT license | |||||
Copyright (c) 2012 Peteris Skorovs, Jeff Rowberg | |||||
I2Cdev device library code is placed under the MIT license | |||||
Copyright (c) 2012 Peteris Skorovs, Jeff Rowberg | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
of this software and associated documentation files (the "Software"), to deal | of this software and associated documentation files (the "Software"), to deal | ||||
@@ -39,7 +39,7 @@ Copyright (c) 2012 Peteris Skorovs, Jeff Rowberg | |||||
* @see IAQ2000_DEFAULT_ADDRESS | * @see IAQ2000_DEFAULT_ADDRESS | ||||
*/ | */ | ||||
IAQ2000::IAQ2000() { | IAQ2000::IAQ2000() { | ||||
devAddr = IAQ2000_DEFAULT_ADDRESS; | |||||
devAddr = IAQ2000_DEFAULT_ADDRESS; | |||||
} | } | ||||
/** Specific address constructor. | /** Specific address constructor. | ||||
@@ -48,14 +48,14 @@ IAQ2000::IAQ2000() { | |||||
* @see IAQ2000_ADDRESS | * @see IAQ2000_ADDRESS | ||||
*/ | */ | ||||
IAQ2000::IAQ2000(uint8_t address) { | IAQ2000::IAQ2000(uint8_t address) { | ||||
devAddr = address; | |||||
devAddr = address; | |||||
} | } | ||||
/** Power on and prepare for general usage. | /** Power on and prepare for general usage. | ||||
*/ | */ | ||||
void IAQ2000::initialize() { | void IAQ2000::initialize() { | ||||
// Nothing is required, but | |||||
// the method should exist anyway. | |||||
// Nothing is required, but | |||||
// the method should exist anyway. | |||||
} | } | ||||
/** Very primitive method o verify the I2C connection. | /** Very primitive method o verify the I2C connection. | ||||
@@ -63,37 +63,34 @@ void IAQ2000::initialize() { | |||||
* @return True if connection is valid, false otherwise | * @return True if connection is valid, false otherwise | ||||
*/ | */ | ||||
bool IAQ2000::testConnection() { | bool IAQ2000::testConnection() { | ||||
if (getIaqpred() >= 450) { | |||||
return true; | |||||
} | |||||
else { | |||||
return false; | |||||
} | |||||
if (getIaqpred() >= 450) { | |||||
return true; | |||||
} else { | |||||
return false; | |||||
} | |||||
} | } | ||||
/** Read iAQ-2000 indoor air quality sensor. | /** Read iAQ-2000 indoor air quality sensor. | ||||
* @return Predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | * @return Predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | ||||
*/ | */ | ||||
uint16_t IAQ2000::getIaqpred() { | uint16_t IAQ2000::getIaqpred() { | ||||
// read bytes from the DATA0 AND DATA1 registers and bit-shifting them into a 16-bit value | |||||
readAllBytes(devAddr, 2, buffer); | |||||
return ((buffer[0] << 8) | buffer[1]); | |||||
// read bytes from the DATA0 AND DATA1 registers and bit-shifting them into a 16-bit value | |||||
readAllBytes(devAddr, 2, buffer); | |||||
return ((buffer[0] << 8) | buffer[1]); | |||||
} | } | ||||
uint8_t IAQ2000::getIaqstatus() { | uint8_t IAQ2000::getIaqstatus() { | ||||
// read bytes from the DATA2 register | |||||
readAllBytes(devAddr, 3, buffer); | |||||
return (buffer[2]); | |||||
// read bytes from the DATA2 register | |||||
readAllBytes(devAddr, 3, buffer); | |||||
return (buffer[2]); | |||||
} | } | ||||
uint16_t IAQ2000::getIaqtvoc() { | uint16_t IAQ2000::getIaqtvoc() { | ||||
// read bytes from the DATA7 AND DATA8 registers and bit-shifting them into a 16-bit value | |||||
readAllBytes(devAddr, 9, buffer); | |||||
return ((buffer[7] << 8) | buffer[8]); | |||||
// read bytes from the DATA7 AND DATA8 registers and bit-shifting them into a 16-bit value | |||||
readAllBytes(devAddr, 9, buffer); | |||||
return ((buffer[7] << 8) | buffer[8]); | |||||
} | } | ||||
/** Read bytes from a slave device. | /** Read bytes from a slave device. | ||||
* This is a "stripped-down" version of the standard Jeff Rowberg's I2Cdev::readBytes method | * This is a "stripped-down" version of the standard Jeff Rowberg's I2Cdev::readBytes method | ||||
* intended to provide compatibility with iAQ-2000, | * intended to provide compatibility with iAQ-2000, | ||||
@@ -104,7 +101,8 @@ uint16_t IAQ2000::getIaqtvoc() { | |||||
* @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) | ||||
* @return Number of bytes read (0 indicates failure) | * @return Number of bytes read (0 indicates failure) | ||||
*/ | */ | ||||
int8_t IAQ2000::readAllBytes(uint8_t devAddr, uint8_t length, uint8_t *data, uint16_t timeout) { | |||||
int8_t IAQ2000::readAllBytes(uint8_t devAddr, uint8_t length, uint8_t *data, | |||||
uint16_t timeout) { | |||||
#ifdef I2CDEV_SERIAL_DEBUG | #ifdef I2CDEV_SERIAL_DEBUG | ||||
Serial.print("I2C (0x"); | Serial.print("I2C (0x"); | ||||
Serial.print(devAddr, HEX); | Serial.print(devAddr, HEX); | ||||
@@ -112,30 +110,32 @@ int8_t IAQ2000::readAllBytes(uint8_t devAddr, uint8_t length, uint8_t *data, uin | |||||
Serial.print(length, DEC); | Serial.print(length, DEC); | ||||
Serial.print(" bytes..."); | Serial.print(" bytes..."); | ||||
#endif | #endif | ||||
int8_t count = 0; | |||||
Wire.requestFrom(devAddr, length); | |||||
uint32_t t1 = millis(); | |||||
for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { | |||||
int8_t count = 0; | |||||
Wire.requestFrom(devAddr, length); | |||||
uint32_t t1 = millis(); | |||||
for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); | |||||
count++) { | |||||
#if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | #if ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO < 100) || I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE) | ||||
data[count] = Wire.receive(); | data[count] = Wire.receive(); | ||||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) | #elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) | ||||
data[count] = Wire.read(); | |||||
data[count] = Wire.read(); | |||||
#endif | #endif | ||||
#ifdef I2CDEV_SERIAL_DEBUG | #ifdef I2CDEV_SERIAL_DEBUG | ||||
Serial.print(data[count], HEX); | Serial.print(data[count], HEX); | ||||
if (count + 1 < length) Serial.print(" "); | if (count + 1 < length) Serial.print(" "); | ||||
#endif | #endif | ||||
} | |||||
if (timeout > 0 && millis() - t1 >= timeout && count < length) count = -1; // timeout | |||||
} | |||||
if (timeout > 0 && millis() - t1 >= timeout && count < length) | |||||
count = -1; // timeout | |||||
#ifdef I2CDEV_SERIAL_DEBUG | #ifdef I2CDEV_SERIAL_DEBUG | ||||
Serial.print(". Done ("); | Serial.print(". Done ("); | ||||
Serial.print(count, DEC); | Serial.print(count, DEC); | ||||
Serial.println(" read)."); | Serial.println(" read)."); | ||||
#endif | #endif | ||||
return count; | |||||
return count; | |||||
} | } |
@@ -10,28 +10,28 @@ | |||||
// 2015-11-08 - added TVoc and Status | // 2015-11-08 - added TVoc and Status | ||||
/* ============================================ | /* ============================================ | ||||
I2Cdev device library code is placed under the MIT license | |||||
Copyright (c) 2012 Peteris Skorovs, Jeff Rowberg | |||||
I2Cdev device library code is placed under the MIT license | |||||
Copyright (c) 2012 Peteris Skorovs, Jeff Rowberg | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. | |||||
=============================================== | |||||
*/ | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. | |||||
=============================================== | |||||
*/ | |||||
#ifndef _IAQ2000_H_ | #ifndef _IAQ2000_H_ | ||||
#define _IAQ2000_H_ | #define _IAQ2000_H_ | ||||
@@ -45,20 +45,21 @@ THE SOFTWARE. | |||||
#define IAQ2000_RA_DATA2 0x01 | #define IAQ2000_RA_DATA2 0x01 | ||||
class IAQ2000 { | class IAQ2000 { | ||||
public: | |||||
IAQ2000(); | |||||
IAQ2000(uint8_t address); | |||||
void initialize(); | |||||
public: | |||||
IAQ2000(); | |||||
IAQ2000(uint8_t address); | |||||
void initialize(); | |||||
bool testConnection(); | bool testConnection(); | ||||
uint16_t getIaqtvoc(); | uint16_t getIaqtvoc(); | ||||
uint16_t getIaqpred(); | |||||
uint16_t getIaqpred(); | |||||
uint8_t getIaqstatus(); | uint8_t getIaqstatus(); | ||||
private: | |||||
uint8_t devAddr; | |||||
uint8_t buffer[8]; | |||||
int8_t readAllBytes(uint8_t devAddr, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); | |||||
private: | |||||
uint8_t devAddr; | |||||
uint8_t buffer[8]; | |||||
int8_t readAllBytes(uint8_t devAddr, uint8_t length, uint8_t *data, | |||||
uint16_t timeout = I2Cdev::readTimeout); | |||||
}; | }; | ||||
#endif /* _IAQ200_H_ */ | #endif /* _IAQ200_H_ */ |
@@ -8,28 +8,28 @@ | |||||
// 2015-11-08 - added TVoc and Status | // 2015-11-08 - added TVoc and Status | ||||
/* ============================================ | /* ============================================ | ||||
IAQ2000 device library code is placed under the MIT license | |||||
Copyright (c) 2012 Peteris Skorovs, Jeff Rowberg | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. | |||||
=============================================== | |||||
*/ | |||||
IAQ2000 device library code is placed under the MIT license | |||||
Copyright (c) 2012 Peteris Skorovs, Jeff Rowberg | |||||
Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
of this software and associated documentation files (the "Software"), to deal | |||||
in the Software without restriction, including without limitation the rights | |||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
copies of the Software, and to permit persons to whom the Software is | |||||
furnished to do so, subject to the following conditions: | |||||
The above copyright notice and this permission notice shall be included in | |||||
all copies or substantial portions of the Software. | |||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
THE SOFTWARE. | |||||
=============================================== | |||||
*/ | |||||
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation | // Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation | ||||
// is used in I2Cdev.h | // is used in I2Cdev.h | ||||
@@ -40,7 +40,6 @@ | |||||
#include "I2Cdev.h" | #include "I2Cdev.h" | ||||
#include "IAQ2000.h" | #include "IAQ2000.h" | ||||
// class default I2C address is 0x5A | // class default I2C address is 0x5A | ||||
// specific I2C addresses may be passed as a parameter here | // specific I2C addresses may be passed as a parameter here | ||||
// but this device only supports one I2C address (0x5A) | // but this device only supports one I2C address (0x5A) | ||||
@@ -56,107 +55,100 @@ uint8_t oldiAQstatus = 0; | |||||
uint16_t oldairTvoc = 0; | uint16_t oldairTvoc = 0; | ||||
uint8_t result = 0; | uint8_t result = 0; | ||||
#define LED_PIN 13 | #define LED_PIN 13 | ||||
bool blinkState = false; | bool blinkState = false; | ||||
void setup() { | void setup() { | ||||
// configure LED pin for output | |||||
pinMode(LED_PIN, OUTPUT); | |||||
// join I2C bus (I2Cdev library doesn't do this automatically) | |||||
Wire.begin(); | |||||
// initialize serial communication | |||||
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but | |||||
// it's really up to you depending on your project) | |||||
Serial.begin(38400); | |||||
delay(1000); | |||||
Serial.println("Initializing Serial..."); | |||||
delay(1000); | |||||
while (!Serial) { | |||||
; // wait for serial port to connect | |||||
} | |||||
startTime = millis(); | |||||
// initialize device | |||||
// Serial.println("Initializing I2C devices..."); | |||||
iaq.initialize(); | |||||
if (!iaq.testConnection()) { | |||||
blinkState = !blinkState; | |||||
digitalWrite(LED_PIN, blinkState); | |||||
delay(500); | |||||
} | |||||
// configure LED pin for output | |||||
pinMode(LED_PIN, OUTPUT); | |||||
// join I2C bus (I2Cdev library doesn't do this automatically) | |||||
Wire.begin(); | |||||
// initialize serial communication | |||||
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but | |||||
// it's really up to you depending on your project) | |||||
Serial.begin(38400); | |||||
delay(1000); | |||||
Serial.println("Initializing Serial..."); | |||||
delay(1000); | |||||
while (!Serial) { | |||||
; // wait for serial port to connect | |||||
} | |||||
startTime = millis(); | |||||
// initialize device | |||||
// Serial.println("Initializing I2C devices..."); | |||||
iaq.initialize(); | |||||
if (!iaq.testConnection()) { | |||||
blinkState = !blinkState; | |||||
digitalWrite(LED_PIN, blinkState); | |||||
delay(500); | |||||
} | |||||
} | } | ||||
void loop() { | void loop() { | ||||
// display predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | |||||
// during the first 6 hours of continuous operation (burn-in) the module will display 450ppm | |||||
// the successful burn-in is saved to the EEPROM, the run-in time after restart is 15min | |||||
Serial.print("CO2 = "); | |||||
Serial.print(airQuality); | |||||
Serial.print(" "); | |||||
Serial.print("[ppm] 450-2000"); | |||||
// blink LED to indicate activity | |||||
blinkState = !blinkState; | |||||
digitalWrite(LED_PIN, blinkState); | |||||
// wait five seconds | |||||
delay(5000); | |||||
// read seansor | |||||
iAQstatus = iaq.getIaqstatus(); | |||||
// display predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | |||||
// during the first 6 hours of continuous operation (burn-in) the module will display 450ppm | |||||
// the successful burn-in is saved to the EEPROM, the run-in time after restart is 15min | |||||
Serial.print(" -- Status = "); | |||||
if (iAQstatus == 0) | |||||
{ | |||||
Serial.print("OK"); | |||||
} | |||||
if (iAQstatus == 1) | |||||
{ | |||||
Serial.print("BUSY"); | |||||
} | |||||
if (iAQstatus == 16) | |||||
{ | |||||
Serial.print("WARUMUP"); | |||||
} | |||||
if (iAQstatus == 128) | |||||
{ | |||||
Serial.print("ERROR"); | |||||
} | |||||
// blink LED to indicate activity | |||||
blinkState = !blinkState; | |||||
digitalWrite(LED_PIN, blinkState); | |||||
// wait five seconds | |||||
delay(5000); | |||||
// read seansor | |||||
airTvoc = iaq.getIaqtvoc(); | |||||
// display predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | |||||
// during the first 6 hours of continuous operation (burn-in) the module will display 450ppm | |||||
// the successful burn-in is saved to the EEPROM, the run-in time after restart is 15min | |||||
Serial.print(" -- TVoc = "); | |||||
Serial.print(airTvoc); | |||||
Serial.print(" "); | |||||
Serial.println("[ppb] 125-600"); | |||||
// blink LED to indicate activity | |||||
blinkState = !blinkState; | |||||
digitalWrite(LED_PIN, blinkState); | |||||
// wait five seconds | |||||
delay(5000); | |||||
// display predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | |||||
// during the first 6 hours of continuous operation (burn-in) the module will display 450ppm | |||||
// the successful burn-in is saved to the EEPROM, the run-in time after restart is 15min | |||||
Serial.print("CO2 = "); | |||||
Serial.print(airQuality); | |||||
Serial.print(" "); | |||||
Serial.print("[ppm] 450-2000"); | |||||
// blink LED to indicate activity | |||||
blinkState = !blinkState; | |||||
digitalWrite(LED_PIN, blinkState); | |||||
// wait five seconds | |||||
delay(5000); | |||||
// read seansor | |||||
iAQstatus = iaq.getIaqstatus(); | |||||
// display predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | |||||
// during the first 6 hours of continuous operation (burn-in) the module will display 450ppm | |||||
// the successful burn-in is saved to the EEPROM, the run-in time after restart is 15min | |||||
Serial.print(" -- Status = "); | |||||
if (iAQstatus == 0) { | |||||
Serial.print("OK"); | |||||
} | |||||
if (iAQstatus == 1) { | |||||
Serial.print("BUSY"); | |||||
} | |||||
if (iAQstatus == 16) { | |||||
Serial.print("WARUMUP"); | |||||
} | |||||
if (iAQstatus == 128) { | |||||
Serial.print("ERROR"); | |||||
} | |||||
// blink LED to indicate activity | |||||
blinkState = !blinkState; | |||||
digitalWrite(LED_PIN, blinkState); | |||||
// wait five seconds | |||||
delay(5000); | |||||
// read seansor | |||||
airTvoc = iaq.getIaqtvoc(); | |||||
// display predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | |||||
// during the first 6 hours of continuous operation (burn-in) the module will display 450ppm | |||||
// the successful burn-in is saved to the EEPROM, the run-in time after restart is 15min | |||||
Serial.print(" -- TVoc = "); | |||||
Serial.print(airTvoc); | |||||
Serial.print(" "); | |||||
Serial.println("[ppb] 125-600"); | |||||
// blink LED to indicate activity | |||||
blinkState = !blinkState; | |||||
digitalWrite(LED_PIN, blinkState); | |||||
// wait five seconds | |||||
delay(5000); | |||||
} | } |
@@ -1,2 +1,2 @@ | |||||
spec.o: \ | spec.o: \ | ||||
C:/Users/andy/Documents/sloeber-workspace/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.C | |||||
C:/Users/agr/Documents/sloeber-workspace/.metadata/.plugins/org.eclipse.cdt.managedbuilder.core/spec.C |