Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
co2ampel
ampel-firmware
Commits
6b079f75
Commit
6b079f75
authored
Feb 08, 2022
by
Eric Duminil
Browse files
SCD30 lib -> 1.0.17
parent
8e15b6a8
Pipeline
#5752
canceled with stage
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
ampel-firmware/src/lib/SparkFun_SCD30_Arduino_Library/keywords.txt
View file @
6b079f75
...
...
@@ -14,25 +14,34 @@ SCD30 KEYWORD1
SCD30 KEYWORD2
begin KEYWORD2
isConnected KEYWORD2
enableDebugging KEYWORD2
beginMeasuring KEYWORD2
StopMeasurement KEYWORD2
setAmbientPressure KEYWORD2
getSettingValue KEYWORD2
getForcedRecalibration KEYWORD2
getMeasurementInterval KEYWORD2
getTemperatureOffset KEYWORD2
getAltitudeCompensation KEYWORD2
getFirmwareVersion KEYWORD2
getCO2 KEYWORD2
getHumidity KEYWORD2
getTemperature KEYWORD2
getMeasurementInterval KEYWORD2
setMeasurementInterval KEYWORD2
setAmbientPressure KEYWORD2
getAltitudeCompensation KEYWORD2
setAltitudeCompensation KEYWORD2
getAutoSelfCalibration KEYWORD2
setAutoSelfCalibration KEYWORD2
getForcedRecalibration KEYWORD2
setForcedRecalibrationFactor KEYWORD2
getTemperatureOffset KEYWORD2
setTemperatureOffset KEYWORD2
getAutoSelfCalibration KEYWORD2
dataAvailable KEYWORD2
readMeasurement KEYWORD2
reset KEYWORD2
...
...
ampel-firmware/src/lib/SparkFun_SCD30_Arduino_Library/library.properties
View file @
6b079f75
name
=
SparkFun SCD30 Arduino Library
version
=
1.0.1
3
version
=
1.0.1
7
author
=
SparkFun Electronics
maintainer
=
SparkFun Electronics <sparkfun.com>
sentence
=
Library for the Sensirion SCD30 CO2 Sensor
...
...
ampel-firmware/src/lib/SparkFun_SCD30_Arduino_Library/src/SparkFun_SCD30_Arduino_Library.cpp
View file @
6b079f75
...
...
@@ -7,9 +7,9 @@
Written by Nathan Seidle @ SparkFun Electronics, May 22nd, 2018
Updated February 1st 2021 to include some of the features of paulvha's version of the library
(while maintaining backward-compatibility):
https://github.com/paulvha/scd30
Thank you Paul!
(while maintaining backward-compatibility):
https://github.com/paulvha/scd30
Thank you Paul!
The SCD30 measures CO2 with accuracy of +/- 30ppm.
...
...
@@ -32,14 +32,14 @@ SCD30::SCD30(void)
// Constructor
}
//Initialize the Serial port
//
Initialize the Serial port
#ifdef USE_TEENSY3_I2C_LIB
bool
SCD30
::
begin
(
i2c_t3
&
wirePort
,
bool
autoCalibrate
,
bool
measBegin
)
#else
bool
SCD30
::
begin
(
TwoWire
&
wirePort
,
bool
autoCalibrate
,
bool
measBegin
)
#endif
{
_i2cPort
=
&
wirePort
;
//Grab which port the user wants us to use
_i2cPort
=
&
wirePort
;
//
Grab which port the user wants us to use
/* Especially during obtaining the ACK BIT after a byte sent the SCD30 is using clock stretching (but NOT only there)!
* The need for clock stretching is described in the Sensirion_CO2_Sensors_SCD30_Interface_Description.pdf
...
...
@@ -58,128 +58,153 @@ bool SCD30::begin(TwoWire &wirePort, bool autoCalibrate, bool measBegin)
_i2cPort
->
setClockStretchLimit
(
200000
);
#endif
uint16_t
fwVer
;
if
(
getFirmwareVersion
(
&
fwVer
)
==
false
)
// Read the firmware version. Return false if the CRC check fails.
if
(
isConnected
()
==
false
)
return
(
false
);
if
(
_printDebug
==
true
)
{
_debugPort
->
print
(
F
(
"SCD30 begin: got firmware version 0x"
));
_debugPort
->
println
(
fwVer
,
HEX
);
}
if
(
measBegin
==
false
)
// Exit now if measBegin is false
return
(
true
);
//Check for device to respond correctly
if
(
beginMeasuring
()
==
true
)
//Start continuous measurements
//
Check for device to respond correctly
if
(
beginMeasuring
()
==
true
)
//
Start continuous measurements
{
setMeasurementInterval
(
2
);
//2 seconds between measurements
setAutoSelfCalibration
(
autoCalibrate
);
//Enable auto-self-calibration
setMeasurementInterval
(
2
);
//
2 seconds between measurements
setAutoSelfCalibration
(
autoCalibrate
);
//
Enable auto-self-calibration
return
(
true
);
}
return
(
false
);
//Something went wrong
return
(
false
);
// Something went wrong
}
// Returns true if device responds to a firmware request
bool
SCD30
::
isConnected
()
{
uint16_t
fwVer
;
if
(
getFirmwareVersion
(
&
fwVer
)
==
false
)
// Read the firmware version. Return false if the CRC check fails.
return
(
false
);
if
(
_printDebug
==
true
)
{
_debugPort
->
print
(
F
(
"Firmware version 0x"
));
_debugPort
->
println
(
fwVer
,
HEX
);
}
return
(
true
);
}
//Calling this function with nothing sets the debug port to Serial
//You can also call it with other streams like Serial1, SerialUSB, etc.
//
Calling this function with nothing sets the debug port to Serial
//
You can also call it with other streams like Serial1, SerialUSB, etc.
void
SCD30
::
enableDebugging
(
Stream
&
debugPort
)
{
_debugPort
=
&
debugPort
;
_printDebug
=
true
;
_debugPort
=
&
debugPort
;
_printDebug
=
true
;
}
//Returns the latest available CO2 level
//If the current level has already been reported, trigger a new read
//
Returns the latest available CO2 level
//
If the current level has already been reported, trigger a new read
uint16_t
SCD30
::
getCO2
(
void
)
{
if
(
co2HasBeenReported
==
true
)
//Trigger a new read
readMeasurement
();
//Pull in new co2, humidity, and temp into global vars
if
(
co2HasBeenReported
==
true
)
// Trigger a new read
{
if
(
readMeasurement
()
==
false
)
// Pull in new co2, humidity, and temp into global vars
co2
=
0
;
// Failed to read sensor
}
co2HasBeenReported
=
true
;
return
(
uint16_t
)
co2
;
//Cut off decimal as co2 is 0 to 10,000
return
(
uint16_t
)
co2
;
//
Cut off decimal as co2 is 0 to 10,000
}
//Returns the latest available humidity
//If the current level has already been reported, trigger a new read
//
Returns the latest available humidity
//
If the current level has already been reported, trigger a new read
float
SCD30
::
getHumidity
(
void
)
{
if
(
humidityHasBeenReported
==
true
)
//Trigger a new read
readMeasurement
();
//Pull in new co2, humidity, and temp into global vars
if
(
humidityHasBeenReported
==
true
)
// Trigger a new read
if
(
readMeasurement
()
==
false
)
// Pull in new co2, humidity, and temp into global vars
humidity
=
0
;
// Failed to read sensor
humidityHasBeenReported
=
true
;
return
humidity
;
}
//Returns the latest available temperature
//If the current level has already been reported, trigger a new read
//
Returns the latest available temperature
//
If the current level has already been reported, trigger a new read
float
SCD30
::
getTemperature
(
void
)
{
if
(
temperatureHasBeenReported
==
true
)
//Trigger a new read
readMeasurement
();
//Pull in new co2, humidity, and temp into global vars
if
(
temperatureHasBeenReported
==
true
)
// Trigger a new read
if
(
readMeasurement
()
==
false
)
// Pull in new co2, humidity, and temp into global vars
temperature
=
0
;
// Failed to read sensor
temperatureHasBeenReported
=
true
;
return
temperature
;
}
//Enables or disables the ASC
//
Enables or disables the ASC
bool
SCD30
::
setAutoSelfCalibration
(
bool
enable
)
{
if
(
enable
)
return
sendCommand
(
COMMAND_AUTOMATIC_SELF_CALIBRATION
,
1
);
//Activate continuous ASC
return
sendCommand
(
COMMAND_AUTOMATIC_SELF_CALIBRATION
,
1
);
//
Activate continuous ASC
else
return
sendCommand
(
COMMAND_AUTOMATIC_SELF_CALIBRATION
,
0
);
//Deactivate continuous ASC
return
sendCommand
(
COMMAND_AUTOMATIC_SELF_CALIBRATION
,
0
);
//
Deactivate continuous ASC
}
//Set the forced recalibration factor. See 1.3.7.
//The reference CO2 concentration has to be within the range 400 ppm ≤ cref(CO2) ≤ 2000 ppm.
//
Set the forced recalibration factor. See 1.3.7.
//
The reference CO2 concentration has to be within the range 400 ppm ≤ cref(CO2) ≤ 2000 ppm.
bool
SCD30
::
setForcedRecalibrationFactor
(
uint16_t
concentration
)
{
if
(
concentration
<
400
||
concentration
>
2000
)
{
return
false
;
//Error check.
return
false
;
//
Error check.
}
return
sendCommand
(
COMMAND_SET_FORCED_RECALIBRATION_FACTOR
,
concentration
);
}
//Get the temperature offset. See 1.3.8.
//
Get the temperature offset. See 1.3.8.
float
SCD30
::
getTemperatureOffset
(
void
)
{
uint16_t
response
=
readRegister
(
COMMAND_SET_TEMPERATURE_OFFSET
);
return
(((
float
)
response
)
/
100.0
);
}
//Set the temperature offset. See 1.3.8.
bool
SCD30
::
setTemperatureOffset
(
float
tempOffset
)
{
union
{
int16_t
signed16
;
uint16_t
unsigned16
;
}
signedUnsigned
;
// Avoid any ambiguity casting int16_t to uint16_t
signedUnsigned
.
signed16
=
tempOffset
*
100
;
return
sendCommand
(
COMMAND_SET_TEMPERATURE_OFFSET
,
signedUnsigned
.
unsigned16
);
signedUnsigned
.
signed16
=
response
;
return
(((
float
)
signedUnsigned
.
signed16
)
/
100.0
);
}
//Get the altitude compenstation. See 1.3.9.
// Set the temperature offset to remove module heating from temp reading
bool
SCD30
::
setTemperatureOffset
(
float
tempOffset
)
{
// Temp offset is only positive. See: https://github.com/sparkfun/SparkFun_SCD30_Arduino_Library/issues/27#issuecomment-971986826
//"The SCD30 offset temperature is obtained by subtracting the reference temperature from the SCD30 output temperature"
// https://www.sensirion.com/fileadmin/user_upload/customers/sensirion/Dokumente/9.5_CO2/Sensirion_CO2_Sensors_SCD30_Low_Power_Mode.pdf
if
(
tempOffset
<
0.0
)
return
(
false
);
uint16_t
value
=
tempOffset
*
100
;
return
sendCommand
(
COMMAND_SET_TEMPERATURE_OFFSET
,
value
);
}
// Get the altitude compenstation. See 1.3.9.
uint16_t
SCD30
::
getAltitudeCompensation
(
void
)
{
return
readRegister
(
COMMAND_SET_ALTITUDE_COMPENSATION
);
}
//Set the altitude compenstation. See 1.3.9.
//
Set the altitude compenstation. See 1.3.9.
bool
SCD30
::
setAltitudeCompensation
(
uint16_t
altitude
)
{
return
sendCommand
(
COMMAND_SET_ALTITUDE_COMPENSATION
,
altitude
);
}
//Set the pressure compenstation. This is passed during measurement startup.
//mbar can be 700 to 1200
//
Set the pressure compenstation. This is passed during measurement startup.
//
mbar can be 700 to 1200
bool
SCD30
::
setAmbientPressure
(
uint16_t
pressure_mbar
)
{
if
(
pressure_mbar
<
700
||
pressure_mbar
>
1200
)
...
...
@@ -192,33 +217,34 @@ bool SCD30::setAmbientPressure(uint16_t pressure_mbar)
// SCD30 soft reset
void
SCD30
::
reset
()
{
sendCommand
(
COMMAND_RESET
);
sendCommand
(
COMMAND_RESET
);
}
// Get the current ASC setting
bool
SCD30
::
getAutoSelfCalibration
()
{
uint16_t
response
=
readRegister
(
COMMAND_AUTOMATIC_SELF_CALIBRATION
);
if
(
response
==
1
)
{
if
(
response
==
1
)
{
return
true
;
}
else
{
return
false
;
else
{
return
false
;
}
}
//Begins continuous measurements
//Continuous measurement status is saved in non-volatile memory. When the sensor
//is powered down while continuous measurement mode is active SCD30 will measure
//continuously after repowering without sending the measurement command.
//Returns true if successful
//
Begins continuous measurements
//
Continuous measurement status is saved in non-volatile memory. When the sensor
//
is powered down while continuous measurement mode is active SCD30 will measure
//
continuously after repowering without sending the measurement command.
//
Returns true if successful
bool
SCD30
::
beginMeasuring
(
uint16_t
pressureOffset
)
{
return
(
sendCommand
(
COMMAND_CONTINUOUS_MEASUREMENT
,
pressureOffset
));
}
//Overload - no pressureOffset
//
Overload - no pressureOffset
bool
SCD30
::
beginMeasuring
(
void
)
{
return
(
beginMeasuring
(
0
));
...
...
@@ -227,17 +253,26 @@ bool SCD30::beginMeasuring(void)
// Stop continuous measurement
bool
SCD30
::
StopMeasurement
(
void
)
{
return
(
sendCommand
(
COMMAND_STOP_MEAS
));
return
(
sendCommand
(
COMMAND_STOP_MEAS
));
}
//Sets interval between measurements
//2 seconds to 1800 seconds (30 minutes)
//
Sets interval between measurements
//
2 seconds to 1800 seconds (30 minutes)
bool
SCD30
::
setMeasurementInterval
(
uint16_t
interval
)
{
return
sendCommand
(
COMMAND_SET_MEASUREMENT_INTERVAL
,
interval
);
}
//Returns true when data is available
// Gets interval between measurements
// 2 seconds to 1800 seconds (30 minutes)
uint16_t
SCD30
::
getMeasurementInterval
(
void
)
{
uint16_t
interval
=
0
;
getSettingValue
(
COMMAND_SET_MEASUREMENT_INTERVAL
,
&
interval
);
return
(
interval
);
}
// Returns true when data is available
bool
SCD30
::
dataAvailable
()
{
uint16_t
response
=
readRegister
(
COMMAND_GET_DATA_READY
);
...
...
@@ -247,24 +282,27 @@ bool SCD30::dataAvailable()
return
(
false
);
}
//Get 18 bytes from SCD30
//Updates global variables with floats
//Returns true if success
//
Get 18 bytes from SCD30
//
Updates global variables with floats
//
Returns true if success
bool
SCD30
::
readMeasurement
()
{
//Verify we have data from the sensor
//
Verify we have data from the sensor
if
(
dataAvailable
()
==
false
)
return
(
false
);
ByteToFl
tempCO2
;
tempCO2
.
value
=
0
;
ByteToFl
tempHumidity
;
tempHumidity
.
value
=
0
;
ByteToFl
tempTemperature
;
tempTemperature
.
value
=
0
;
ByteToFl
tempCO2
;
tempCO2
.
value
=
0
;
ByteToFl
tempHumidity
;
tempHumidity
.
value
=
0
;
ByteToFl
tempTemperature
;
tempTemperature
.
value
=
0
;
_i2cPort
->
beginTransmission
(
SCD30_ADDRESS
);
_i2cPort
->
write
(
COMMAND_READ_MEASUREMENT
>>
8
);
//MSB
_i2cPort
->
write
(
COMMAND_READ_MEASUREMENT
&
0xFF
);
//LSB
_i2cPort
->
write
(
COMMAND_READ_MEASUREMENT
>>
8
);
//
MSB
_i2cPort
->
write
(
COMMAND_READ_MEASUREMENT
&
0xFF
);
//
LSB
if
(
_i2cPort
->
endTransmission
()
!=
0
)
return
(
0
);
//Sensor did not ACK
return
(
0
);
//
Sensor did not ACK
delay
(
3
);
...
...
@@ -283,25 +321,25 @@ bool SCD30::readMeasurement()
case
1
:
case
3
:
case
4
:
tempCO2
.
array
[
x
<
3
?
3
-
x
:
4
-
x
]
=
incoming
;
tempCO2
.
array
[
x
<
3
?
3
-
x
:
4
-
x
]
=
incoming
;
bytesToCrc
[
x
%
3
]
=
incoming
;
break
;
case
6
:
case
7
:
case
9
:
case
10
:
tempTemperature
.
array
[
x
<
9
?
9
-
x
:
10
-
x
]
=
incoming
;
tempTemperature
.
array
[
x
<
9
?
9
-
x
:
10
-
x
]
=
incoming
;
bytesToCrc
[
x
%
3
]
=
incoming
;
break
;
case
12
:
case
13
:
case
15
:
case
16
:
tempHumidity
.
array
[
x
<
15
?
15
-
x
:
16
-
x
]
=
incoming
;
tempHumidity
.
array
[
x
<
15
?
15
-
x
:
16
-
x
]
=
incoming
;
bytesToCrc
[
x
%
3
]
=
incoming
;
break
;
default:
//Validate CRC
//
Validate CRC
uint8_t
foundCrc
=
computeCRC8
(
bytesToCrc
,
2
);
if
(
foundCrc
!=
incoming
)
{
...
...
@@ -337,28 +375,28 @@ bool SCD30::readMeasurement()
_debugPort
->
println
(
F
(
"readMeasurement: encountered error reading SCD30 data."
));
return
false
;
}
//Now copy the uint32s into their associated floats
//
Now copy the uint32s into their associated floats
co2
=
tempCO2
.
value
;
temperature
=
tempTemperature
.
value
;
humidity
=
tempHumidity
.
value
;
//Mark our global variables as fresh
//
Mark our global variables as fresh
co2HasBeenReported
=
false
;
humidityHasBeenReported
=
false
;
temperatureHasBeenReported
=
false
;
return
(
true
);
//Success! New data available in globals.
return
(
true
);
//
Success! New data available in globals.
}
//Gets a setting by reading the appropriate register.
//Returns true if the CRC is valid.
//
Gets a setting by reading the appropriate register.
//
Returns true if the CRC is valid.
bool
SCD30
::
getSettingValue
(
uint16_t
registerAddress
,
uint16_t
*
val
)
{
_i2cPort
->
beginTransmission
(
SCD30_ADDRESS
);
_i2cPort
->
write
(
registerAddress
>>
8
);
//MSB
_i2cPort
->
write
(
registerAddress
&
0xFF
);
//LSB
_i2cPort
->
write
(
registerAddress
>>
8
);
//
MSB
_i2cPort
->
write
(
registerAddress
&
0xFF
);
//
LSB
if
(
_i2cPort
->
endTransmission
()
!=
0
)
return
(
false
);
//Sensor did not ACK
return
(
false
);
//
Sensor did not ACK
delay
(
3
);
...
...
@@ -384,14 +422,14 @@ bool SCD30::getSettingValue(uint16_t registerAddress, uint16_t *val)
return
(
false
);
}
//Gets two bytes from SCD30
//
Gets two bytes from SCD30
uint16_t
SCD30
::
readRegister
(
uint16_t
registerAddress
)
{
_i2cPort
->
beginTransmission
(
SCD30_ADDRESS
);
_i2cPort
->
write
(
registerAddress
>>
8
);
//MSB
_i2cPort
->
write
(
registerAddress
&
0xFF
);
//LSB
_i2cPort
->
write
(
registerAddress
>>
8
);
//
MSB
_i2cPort
->
write
(
registerAddress
&
0xFF
);
//
LSB
if
(
_i2cPort
->
endTransmission
()
!=
0
)
return
(
0
);
//Sensor did not ACK
return
(
0
);
//
Sensor did not ACK
delay
(
3
);
...
...
@@ -402,49 +440,49 @@ uint16_t SCD30::readRegister(uint16_t registerAddress)
uint8_t
lsb
=
_i2cPort
->
read
();
return
((
uint16_t
)
msb
<<
8
|
lsb
);
}
return
(
0
);
//Sensor did not respond
return
(
0
);
//
Sensor did not respond
}
//Sends a command along with arguments and CRC
//
Sends a command along with arguments and CRC
bool
SCD30
::
sendCommand
(
uint16_t
command
,
uint16_t
arguments
)
{
uint8_t
data
[
2
];
data
[
0
]
=
arguments
>>
8
;
data
[
1
]
=
arguments
&
0xFF
;
uint8_t
crc
=
computeCRC8
(
data
,
2
);
//Calc CRC on the arguments only, not the command
uint8_t
crc
=
computeCRC8
(
data
,
2
);
//
Calc CRC on the arguments only, not the command
_i2cPort
->
beginTransmission
(
SCD30_ADDRESS
);
_i2cPort
->
write
(
command
>>
8
);
//MSB
_i2cPort
->
write
(
command
&
0xFF
);
//LSB
_i2cPort
->
write
(
arguments
>>
8
);
//MSB
_i2cPort
->
write
(
arguments
&
0xFF
);
//LSB
_i2cPort
->
write
(
command
>>
8
);
//
MSB
_i2cPort
->
write
(
command
&
0xFF
);
//
LSB
_i2cPort
->
write
(
arguments
>>
8
);
//
MSB
_i2cPort
->
write
(
arguments
&
0xFF
);
//
LSB
_i2cPort
->
write
(
crc
);
if
(
_i2cPort
->
endTransmission
()
!=
0
)
return
(
false
);
//Sensor did not ACK
return
(
false
);
//
Sensor did not ACK
return
(
true
);
}
//Sends just a command, no arguments, no CRC
//
Sends just a command, no arguments, no CRC
bool
SCD30
::
sendCommand
(
uint16_t
command
)
{
_i2cPort
->
beginTransmission
(
SCD30_ADDRESS
);
_i2cPort
->
write
(
command
>>
8
);
//MSB
_i2cPort
->
write
(
command
&
0xFF
);
//LSB
_i2cPort
->
write
(
command
>>
8
);
//
MSB
_i2cPort
->
write
(
command
&
0xFF
);
//
LSB
if
(
_i2cPort
->
endTransmission
()
!=
0
)
return
(
false
);
//Sensor did not ACK
return
(
false
);
//
Sensor did not ACK
return
(
true
);
}
//Given an array and a number of bytes, this calculate CRC8 for those bytes
//CRC is only calc'd on the data portion (two bytes) of the four bytes being sent
//From: http://www.sunshine2k.de/articles/coding/crc/understanding_crc.html
//Tested with: http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
//x^8+x^5+x^4+1 = 0x31
//
Given an array and a number of bytes, this calculate CRC8 for those bytes
//
CRC is only calc'd on the data portion (two bytes) of the four bytes being sent
//
From: http://www.sunshine2k.de/articles/coding/crc/understanding_crc.html
//
Tested with: http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
//
x^8+x^5+x^4+1 = 0x31
uint8_t
SCD30
::
computeCRC8
(
uint8_t
data
[],
uint8_t
len
)
{
uint8_t
crc
=
0xFF
;
//Init with 0xFF
uint8_t
crc
=
0xFF
;
//
Init with 0xFF
for
(
uint8_t
x
=
0
;
x
<
len
;
x
++
)
{
...
...
@@ -459,5 +497,5 @@ uint8_t SCD30::computeCRC8(uint8_t data[], uint8_t len)
}
}
return
crc
;
//No output reflection
return
crc
;
//
No output reflection
}
ampel-firmware/src/lib/SparkFun_SCD30_Arduino_Library/src/SparkFun_SCD30_Arduino_Library.h
View file @
6b079f75
...
...
@@ -40,10 +40,10 @@
#include <Wire.h>
#endif
//The default I2C address for the SCD30 is 0x61.
//
The default I2C address for the SCD30 is 0x61.
#define SCD30_ADDRESS 0x61
//Available commands
//
Available commands
#define COMMAND_CONTINUOUS_MEASUREMENT 0x0010
#define COMMAND_SET_MEASUREMENT_INTERVAL 0x4600
...
...
@@ -70,38 +70,43 @@ public:
bool
begin
(
bool
autoCalibrate
)
{
return
begin
(
Wire
,
autoCalibrate
);
}
#ifdef USE_TEENSY3_I2C_LIB
bool
begin
(
i2c_t3
&
wirePort
=
Wire
,
bool
autoCalibrate
=
false
,
bool
measBegin
=
true
);
//By default use Wire port
bool
begin
(
i2c_t3
&
wirePort
=
Wire
,
bool
autoCalibrate
=
false
,
bool
measBegin
=
true
);
//
By default use Wire port
#else
bool
begin
(
TwoWire
&
wirePort
=
Wire
,
bool
autoCalibrate
=
false
,
bool
measBegin
=
true
);
//By default use Wire port
bool
begin
(
TwoWire
&
wirePort
=
Wire
,
bool
autoCalibrate
=
false
,
bool
measBegin
=
true
);
//
By default use Wire port
#endif
void
enableDebugging
(
Stream
&
debugPort
=
Serial
);
//Turn on debug printing. If user doesn't specify then Serial will be used.
bool
isConnected
();
void
enableDebugging
(
Stream
&
debugPort
=
Serial
);
// Turn on debug printing. If user doesn't specify then Serial will be used.
bool
beginMeasuring
(
uint16_t
pressureOffset
);
bool
beginMeasuring
(
void
);
bool
StopMeasurement
(
void
);
// paulvha
// based on paulvha
bool
setAmbientPressure
(
uint16_t
pressure_mbar
);
bool
getSettingValue
(
uint16_t
registerAddress
,
uint16_t
*
val
);
bool
getForcedRecalibration
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_SET_FORCED_RECALIBRATION_FACTOR
,
val
));
}
bool
getMeasurementInterval
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_SET_MEASUREMENT_INTERVAL
,
val
));
}
bool
getTemperatureOffset
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_SET_TEMPERATURE_OFFSET
,
val
));
}
bool
getAltitudeCompensation
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_SET_ALTITUDE_COMPENSATION
,
val
));
}
bool
getFirmwareVersion
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_READ_FW_VER
,
val
));
}
uint16_t
getCO2
(
void
);
float
getHumidity
(
void
);
float
getTemperature
(
void
);
float
getTemperatureOffset
(
void
);
uint16_t
getAltitudeCompensation
(
void
);
uint16_t
getMeasurementInterval
(
void
);
bool
getMeasurementInterval
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_SET_MEASUREMENT_INTERVAL
,
val
));
}
bool
setMeasurementInterval
(
uint16_t
interval
);
bool
setAmbientPressure
(
uint16_t
pressure_mbar
);
uint16_t
getAltitudeCompensation
(
void
);
bool
getAltitudeCompensation
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_SET_ALTITUDE_COMPENSATION
,
val
));
}
bool
setAltitudeCompensation
(
uint16_t
altitude
);
bool
getAutoSelfCalibration
(
void
);
bool
setAutoSelfCalibration
(
bool
enable
);
bool
getForcedRecalibration
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_SET_FORCED_RECALIBRATION_FACTOR
,
val
));
}
bool
setForcedRecalibrationFactor
(
uint16_t
concentration
);
float
getTemperatureOffset
(
void
);
bool
getTemperatureOffset
(
uint16_t
*
val
)
{
return
(
getSettingValue
(
COMMAND_SET_TEMPERATURE_OFFSET
,
val
));
}
bool
setTemperatureOffset
(
float
tempOffset
);
bool
getAutoSelfCalibration
(
void
);
bool
dataAvailable
();
bool
readMeasurement
();
...
...
@@ -116,25 +121,25 @@ public:
uint8_t
computeCRC8
(
uint8_t
data
[],
uint8_t
len
);
private:
//Variables
//
Variables
#ifdef USE_TEENSY3_I2C_LIB
i2c_t3
*
_i2cPort
;
//The generic connection to user's chosen I2C hardware
i2c_t3
*
_i2cPort
;
//
The generic connection to user's chosen I2C hardware
#else
TwoWire
*
_i2cPort
;
//The generic connection to user's chosen I2C hardware
TwoWire
*
_i2cPort
;
//
The generic connection to user's chosen I2C hardware
#endif
//Global main datums
//
Global main datums
float
co2
=
0
;
float
temperature
=
0
;
float
humidity
=
0
;
//These track the staleness of the current data
//This allows us to avoid calling readMeasurement() every time individual datums are requested
//
These track the staleness of the current data
//
This allows us to avoid calling readMeasurement() every time individual datums are requested
bool
co2HasBeenReported
=
true
;
bool
humidityHasBeenReported
=
true
;
bool
temperatureHasBeenReported
=
true
;
//Debug
Stream
*
_debugPort
;
//The stream to send debug messages to if enabled. Usually Serial.
boolean
_printDebug
=
false
;
//Flag to print debugging variables
//
Debug
Stream
*
_debugPort
;
//
The stream to send debug messages to if enabled. Usually Serial.
boolean
_printDebug
=
false
;
//
Flag to print debugging variables
};
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment