Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Käppler
ampel-firmware
Compare Revisions
8d49d71c3d3fd2b81c8ea17e678abd16d86daa06...dc7169596de210521651a303520b44cc7da04439
Commits (5)
co2_sensor: Drop unused state 'CALIBRATION'
· 437ea45f
Käppler
authored
Apr 29, 2021
437ea45f
s/_timestep_accl/_timestep_bootup/
· 100a9b31
Käppler
authored
Apr 29, 2021
100a9b31
Remove superfluous recursive call
· 7872da54
Käppler
authored
Apr 29, 2021
7872da54
Remove unneccessary `if` condition
· 1bc03c7c
Käppler
authored
Apr 29, 2021
1bc03c7c
Cast `co2` to uint32_t to avoid overflow
· dc716959
Käppler
authored
Apr 29, 2021
dc716959
Hide whitespace changes
Inline
Side-by-side
ampel-firmware/co2_sensor.cpp
View file @
dc716959
...
...
@@ -3,12 +3,12 @@
namespace
config
{
// Values should be defined in config.h
uint16_t
measurement_timestep
=
MEASUREMENT_TIMESTEP
;
// [s] Value between 2 and 1800 (range for SCD30 sensor)
const
uint16_t
measurement_timestep_
accl
=
2
;
// [s] Measurement timestep during acclimatization
const
uint16_t
measurement_timestep_
bootup
=
2
;
// [s] Measurement timestep during acclimatization
const
uint16_t
altitude_above_sea_level
=
ALTITUDE_ABOVE_SEA_LEVEL
;
// [m]
uint16_t
co2_calibration_level
=
ATMOSPHERIC_CO2_CONCENTRATION
;
// [ppm]
int8_t
max_deviation_during_calibration
=
30
;
// [ppm]
int8_t
enough_stable_measurements
=
60
;
const
uint8_t
max_deviation_during_
accl
=
20
;
// [%]
const
uint8_t
max_deviation_during_
bootup
=
20
;
// [%]
#ifdef TEMPERATURE_OFFSET
// Residual heat from CO2 sensor seems to be high enough to change the temperature reading. How much should it be offset?
// NOTE: Sign isn't relevant. The returned temperature will always be shifted down.
...
...
@@ -36,7 +36,6 @@ namespace sensor {
* INVALID -> sensor does output invalid CO2 measurements (== 0 ppm)
* NEEDS_CALIBRATION -> sensor measurements are too low (< 250 ppm)
* PREPARE_CALIBRATION -> forced calibration was initiated, waiting for stable measurements
* CALIBRATION -> the sensor does calibrate itself
*/
enum
state
{
INITIAL
,
...
...
@@ -45,8 +44,7 @@ namespace sensor {
INVALID
,
NEEDS_CALIBRATION
,
PREPARE_CALIBRATION_UNSTABLE
,
PREPARE_CALIBRATION_STABLE
,
CALIBRATION
PREPARE_CALIBRATION_STABLE
};
const
char
*
state_names
[]
=
{
"INITIAL"
,
...
...
@@ -55,8 +53,7 @@ namespace sensor {
"INVALID"
,
"NEEDS_CALIBRATION"
,
"PREPARE_CALIBRATION_UNSTABLE"
,
"PREPARE_CALIBRATION_STABLE"
,
"CALIBRATION"
};
"PREPARE_CALIBRATION_STABLE"
};
state
current_state
=
INITIAL
;
void
switchState
(
state
);
...
...
@@ -106,9 +103,9 @@ namespace sensor {
//NOTE: The timer seems to be inaccurate, though, possibly depending on voltage. Should it be offset?
Serial
.
println
();
Serial
.
print
(
F
(
"Setting SCD30 timestep to "
));
Serial
.
print
(
config
::
measurement_timestep_
accl
);
Serial
.
print
(
config
::
measurement_timestep_
bootup
);
Serial
.
println
(
" s during acclimatization."
);
scd30
.
setMeasurementInterval
(
config
::
measurement_timestep_
accl
);
// [s]
scd30
.
setMeasurementInterval
(
config
::
measurement_timestep_
bootup
);
// [s]
sensor_console
::
defineIntCommand
(
"co2"
,
setCO2forDebugging
,
F
(
" 1500 (Sets co2 level, for debugging purposes)"
));
sensor_console
::
defineIntCommand
(
"timer"
,
setTimer
,
F
(
" 30 (Sets measurement interval, in s)"
));
...
...
@@ -138,9 +135,7 @@ namespace sensor {
last_co2
=
co2
;
// We assume the sensor has acclimated to the environment if measurements
// change less than a specified percentage of the current value.
if
(
co2
>
0
&&
(
100
*
delta
/
config
::
max_deviation_during_accl
)
<
co2
)
{
return
true
;
}
else
return
false
;
return
(
co2
>
0
&&
delta
<
((
uint32_t
)
co2
*
config
::
max_deviation_during_bootup
/
100
));
}
bool
countStableMeasurements
()
{
...
...
@@ -173,7 +168,6 @@ namespace sensor {
}
void
calibrateAndRestart
()
{
switchState
(
CALIBRATION
);
Serial
.
print
(
F
(
"Calibrating SCD30 now..."
));
scd30
.
setAltitudeCompensation
(
config
::
altitude_above_sea_level
);
scd30
.
setForcedRecalibrationFactor
(
config
::
co2_calibration_level
);
...
...
@@ -215,7 +209,6 @@ namespace sensor {
Serial
.
print
(
config
::
measurement_timestep
);
Serial
.
println
(
" s."
);
scd30
.
setMeasurementInterval
(
config
::
measurement_timestep
);
// [s]
switchStateForCurrentPPM
();
// Check all other conditions again
}
// These 'else if' constructs are, strictly speaking, unnecessary,
// because they are not reached if the previous condition was fulfilled.
...
...
@@ -280,8 +273,6 @@ namespace sensor {
case
PREPARE_CALIBRATION_STABLE
:
led_effects
::
showWaitingLED
(
color
::
green
);
break
;
case
CALIBRATION
:
// Nothing to do, will restart soon.
break
;
default:
Serial
.
println
(
F
(
"Encountered unknown sensor state"
));
// This should not happen.
}
...
...