@@ -27,8 +27,8 @@ | |||
<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/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/PubSubClient/src}""/> | |||
</option> | |||
<inputType id="io.sloeber.compiler.cpp.sketch.input.1213930982" name="CPP source files" superClass="io.sloeber.compiler.cpp.sketch.input"/> | |||
</tool> | |||
@@ -42,8 +42,8 @@ | |||
<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/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/PubSubClient/src}""/> | |||
</option> | |||
<inputType id="io.sloeber.compiler.c.sketch.input.1564829864" name="C Source Files" superClass="io.sloeber.compiler.c.sketch.input"/> | |||
</tool> | |||
@@ -57,8 +57,8 @@ | |||
<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/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/PubSubClient/src}""/> | |||
</option> | |||
<inputType id="io.sloeber.compiler.S.sketch.input.1340516571" name="Assembly source files" superClass="io.sloeber.compiler.S.sketch.input"/> | |||
</tool> | |||
@@ -84,4 +84,5 @@ | |||
</storageModule> | |||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> | |||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> | |||
<storageModule moduleId="refreshScope"/> | |||
</cproject> |
@@ -66,6 +66,11 @@ | |||
<type>2</type> | |||
<locationURI>ECLIPSE_HOME/arduinoPlugin/libraries/Ethernet/2.0.0</locationURI> | |||
</link> | |||
<link> | |||
<name>libraries/PubSubClient</name> | |||
<type>2</type> | |||
<locationURI>ECLIPSE_HOME/arduinoPlugin/libraries/PubSubClient/2.7.0</locationURI> | |||
</link> | |||
<link> | |||
<name>libraries/SPI</name> | |||
<type>2</type> | |||
@@ -4,7 +4,7 @@ | |||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> | |||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> | |||
<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.g++"/> | |||
</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.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/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/operation=replace | |||
environment/project/io.sloeber.core.toolChain.release.662097424/JANTJE.UPLOAD/value=Default | |||
@@ -20,35 +20,35 @@ | |||
// 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" | |||
#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 Arduino IDE v1.6.5+ with I2Cdev Fastwire implementation is recommended. | |||
#warning This I2Cdev implementation does not support: | |||
@@ -61,12 +61,12 @@ THE SOFTWARE. | |||
#warning - Repeated starts conditions | |||
#warning - Timeout detection (some Wire requests block forever) | |||
#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 | |||
@@ -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) | |||
* @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. | |||
@@ -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) | |||
* @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. | |||
@@ -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) | |||
* @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. | |||
@@ -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) | |||
* @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. | |||
@@ -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) | |||
* @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. | |||
@@ -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) | |||
* @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. | |||
@@ -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) | |||
* @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(devAddr, HEX); | |||
Serial.print(") reading "); | |||
@@ -219,12 +226,12 @@ int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8 | |||
Serial.print("..."); | |||
#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 | |||
// 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(); | |||
} | |||
#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); | |||
if (count + 1 < length) Serial.print(" "); | |||
#endif | |||
} | |||
} | |||
#endif | |||
} | |||
} | |||
#endif | |||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE) | |||
// Fastwire library | |||
// no loop required for fastwire | |||
@@ -308,16 +316,17 @@ int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8 | |||
#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(count, DEC); | |||
Serial.println(" read)."); | |||
#endif | |||
return count; | |||
return count; | |||
} | |||
/** 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) | |||
* @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(devAddr, HEX); | |||
Serial.print(") reading "); | |||
@@ -339,12 +349,12 @@ int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint1 | |||
Serial.print("..."); | |||
#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 (ARDUINO < 100) | |||
#if (ARDUINO < 100) | |||
// Arduino v00xx (before v1.0), Wire library | |||
// 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(); | |||
} | |||
#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); | |||
if (count + 1 < length) Serial.print(" "); | |||
#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 | |||
// no loop required for fastwire | |||
@@ -461,15 +473,16 @@ int8_t I2Cdev::readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint1 | |||
#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(count, DEC); | |||
Serial.println(" read)."); | |||
#endif | |||
return count; | |||
return count; | |||
} | |||
/** 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 | |||
* @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. | |||
@@ -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 | |||
* @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. | |||
@@ -508,25 +523,26 @@ bool I2Cdev::writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_ | |||
* @param data Right-aligned value to write | |||
* @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. | |||
@@ -537,25 +553,26 @@ bool I2Cdev::writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8 | |||
* @param data Right-aligned value to write | |||
* @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. | |||
@@ -565,7 +582,7 @@ bool I2Cdev::writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint | |||
* @return Status of operation (true = success) | |||
*/ | |||
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. | |||
@@ -575,7 +592,7 @@ bool I2Cdev::writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) { | |||
* @return Status of operation (true = success) | |||
*/ | |||
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. | |||
@@ -585,8 +602,9 @@ bool I2Cdev::writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data) { | |||
* @param data Buffer to copy new data from | |||
* @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(devAddr, HEX); | |||
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("..."); | |||
#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.send((uint8_t) regAddr); // send address | |||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | |||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | |||
|| 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::write(regAddr); | |||
#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); | |||
if (i + 1 < length) Serial.print(" "); | |||
#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]); | |||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | |||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | |||
|| 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]); | |||
#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(); | |||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | |||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | |||
|| 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(); | |||
//status = Fastwire::endTransmission(); | |||
#endif | |||
#ifdef I2CDEV_SERIAL_DEBUG | |||
#ifdef I2CDEV_SERIAL_DEBUG | |||
Serial.println(". Done."); | |||
#endif | |||
return status == 0; | |||
return status == 0; | |||
} | |||
/** 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 | |||
* @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(devAddr, HEX); | |||
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("..."); | |||
#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.send(regAddr); // send address | |||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | |||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | |||
|| 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::write(regAddr); | |||
#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); | |||
if (i + 1 < length) Serial.print(" "); | |||
#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]); // send LSB | |||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | |||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | |||
|| 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 | |||
status = Fastwire::write((uint8_t)data[i]); // send LSB | |||
if (status != 0) break; | |||
#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(); | |||
#elif ((I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) \ | |||
|| (I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE && ARDUINO >= 100) \ | |||
|| 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(); | |||
//status = Fastwire::endTransmission(); | |||
#endif | |||
#ifdef I2CDEV_SERIAL_DEBUG | |||
#ifdef I2CDEV_SERIAL_DEBUG | |||
Serial.println(". Done."); | |||
#endif | |||
return status == 0; | |||
return status == 0; | |||
} | |||
/** Default timeout value for read operations. | |||
@@ -22,28 +22,28 @@ | |||
// 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_ | |||
#define _I2CDEV_H_ | |||
@@ -67,7 +67,7 @@ THE SOFTWARE. | |||
// ----------------------------------------------------------------------------- | |||
#define I2CDEV_ARDUINO_WIRE 1 // Wire object from Arduino | |||
#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_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 | |||
@@ -79,21 +79,21 @@ THE SOFTWARE. | |||
//#define I2CDEV_SERIAL_DEBUG | |||
#ifdef ARDUINO | |||
#if ARDUINO < 100 | |||
#if ARDUINO < 100 | |||
#include "WProgram.h" | |||
#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> | |||
#endif | |||
#if I2CDEV_IMPLEMENTATION == I2CDEV_I2CMASTER_LIBRARY | |||
#if I2CDEV_IMPLEMENTATION == I2CDEV_I2CMASTER_LIBRARY | |||
#include <I2C.h> | |||
#endif | |||
#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE | |||
#if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_SBWIRE | |||
#include "SBWire.h" | |||
#endif | |||
#endif | |||
@@ -103,33 +103,48 @@ THE SOFTWARE. | |||
#define ARDUINO 101 | |||
#endif | |||
// 1000ms default read timeout (modify with "I2Cdev::readTimeout = [ms];") | |||
#define I2CDEV_DEFAULT_READ_TIMEOUT 1000 | |||
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 | |||
@@ -4,9 +4,9 @@ | |||
#include <Wire.h> | |||
#include "I2Cdev.h" | |||
#include "IAQ2000.h" | |||
#include <PubSubClient.h> | |||
#include <dht.h> | |||
#include <Dns.h> | |||
#define dht_apin 5 | |||
@@ -14,6 +14,8 @@ IAQ2000 iaq; | |||
DHT dht(dht_apin, DHT11); | |||
// DNS | |||
DNSClient dnClient; | |||
uint16_t airQuality; | |||
int val = 0; | |||
@@ -40,6 +42,11 @@ char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; | |||
// Start der UDP-Instanz | |||
EthernetUDP Udp; | |||
//MQTT | |||
const char *MQTT_BROKER = "loxberry"; | |||
IPAddress mqttbroker(192, 168, 1, 127); | |||
EthernetClient ethClient; | |||
PubSubClient MQTTclient(ethClient); | |||
// Initialize the Ethernet server library | |||
// with the IP address and port you want to use | |||
@@ -48,182 +55,222 @@ EthernetServer server(80); | |||
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() { | |||
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 //// | |||
// Serial-Speicher loeschen | |||
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 | |||
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 | |||
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 | |||
/* ============================================ | |||
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 | |||
@@ -39,7 +39,7 @@ Copyright (c) 2012 Peteris Skorovs, Jeff Rowberg | |||
* @see IAQ2000_DEFAULT_ADDRESS | |||
*/ | |||
IAQ2000::IAQ2000() { | |||
devAddr = IAQ2000_DEFAULT_ADDRESS; | |||
devAddr = IAQ2000_DEFAULT_ADDRESS; | |||
} | |||
/** Specific address constructor. | |||
@@ -48,14 +48,14 @@ IAQ2000::IAQ2000() { | |||
* @see IAQ2000_ADDRESS | |||
*/ | |||
IAQ2000::IAQ2000(uint8_t address) { | |||
devAddr = address; | |||
devAddr = address; | |||
} | |||
/** Power on and prepare for general usage. | |||
*/ | |||
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. | |||
@@ -63,37 +63,34 @@ void IAQ2000::initialize() { | |||
* @return True if connection is valid, false otherwise | |||
*/ | |||
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. | |||
* @return Predicted CO2 concentration based on human induced volatile organic compounds (VOC) detection (in ppm VOC + CO2 equivalents) | |||
*/ | |||
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() { | |||
// 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() { | |||
// 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. | |||
* This is a "stripped-down" version of the standard Jeff Rowberg's I2Cdev::readBytes method | |||
* 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) | |||
* @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 | |||
Serial.print("I2C (0x"); | |||
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(" bytes..."); | |||
#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) | |||
data[count] = Wire.receive(); | |||
#elif (I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE && ARDUINO >= 100) | |||
data[count] = Wire.read(); | |||
data[count] = Wire.read(); | |||
#endif | |||
#ifdef I2CDEV_SERIAL_DEBUG | |||
Serial.print(data[count], HEX); | |||
if (count + 1 < length) Serial.print(" "); | |||
#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 | |||
Serial.print(". Done ("); | |||
Serial.print(count, DEC); | |||
Serial.println(" read)."); | |||
#endif | |||
return count; | |||
return count; | |||
} |
@@ -10,28 +10,28 @@ | |||
// 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_ | |||
#define _IAQ2000_H_ | |||
@@ -45,20 +45,21 @@ THE SOFTWARE. | |||
#define IAQ2000_RA_DATA2 0x01 | |||
class IAQ2000 { | |||
public: | |||
IAQ2000(); | |||
IAQ2000(uint8_t address); | |||
void initialize(); | |||
public: | |||
IAQ2000(); | |||
IAQ2000(uint8_t address); | |||
void initialize(); | |||
bool testConnection(); | |||
uint16_t getIaqtvoc(); | |||
uint16_t getIaqpred(); | |||
uint16_t getIaqpred(); | |||
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_ */ |
@@ -8,28 +8,28 @@ | |||
// 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 | |||
// is used in I2Cdev.h | |||
@@ -40,7 +40,6 @@ | |||
#include "I2Cdev.h" | |||
#include "IAQ2000.h" | |||
// class default I2C address is 0x5A | |||
// specific I2C addresses may be passed as a parameter here | |||
// but this device only supports one I2C address (0x5A) | |||
@@ -56,107 +55,100 @@ uint8_t oldiAQstatus = 0; | |||
uint16_t oldairTvoc = 0; | |||
uint8_t result = 0; | |||
#define LED_PIN 13 | |||
bool blinkState = false; | |||
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() { | |||
// 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: \ | |||
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 |