Stripped deprecated code from DataController. Next stop: fully deprecate that class and introduce a configuration class as replacement for the config handling.
This commit is contained in:
parent
a6e7609d66
commit
e0bd4b64b8
|
@ -15,20 +15,20 @@ namespace Dough
|
||||||
DataController::DataController() : _temperatureMeasurements(
|
DataController::DataController() : _temperatureMeasurements(
|
||||||
"temperature",
|
"temperature",
|
||||||
TemperatureSensor::Instance(),
|
TemperatureSensor::Instance(),
|
||||||
TEMPERATURE_AVG_LOOKBACK,
|
TEMPERATURE_AVERAGE_STORAGE,
|
||||||
30,
|
TEMPERATURE_MEASURE_INTERVAL,
|
||||||
PUBLISH_INTERVAL),
|
PUBLISH_INTERVAL),
|
||||||
_humidityMeasurements(
|
_humidityMeasurements(
|
||||||
"humidity",
|
"humidity",
|
||||||
HumiditySensor::Instance(),
|
HumiditySensor::Instance(),
|
||||||
HUMIDITY_AVG_LOOKBACK,
|
HUMIDITY_AVERAGE_STORAGE,
|
||||||
30,
|
HUMIDITY_MEASURE_INTERVAL,
|
||||||
PUBLISH_INTERVAL),
|
PUBLISH_INTERVAL),
|
||||||
_distanceMeasurements(
|
_distanceMeasurements(
|
||||||
"distance",
|
"distance",
|
||||||
DistanceSensor::Instance(),
|
DistanceSensor::Instance(),
|
||||||
DISTANCE_AVG_LOOKBACK,
|
DISTANCE_AVERAGE_STORAGE,
|
||||||
1,
|
DISTANCE_MEASURE_INTERVAL,
|
||||||
PUBLISH_INTERVAL),
|
PUBLISH_INTERVAL),
|
||||||
_logger("DATA")
|
_logger("DATA")
|
||||||
{
|
{
|
||||||
|
@ -57,6 +57,7 @@ namespace Dough
|
||||||
void DataController::handleMqttConnect(MQTT *mqtt)
|
void DataController::handleMqttConnect(MQTT *mqtt)
|
||||||
{
|
{
|
||||||
mqtt->subscribe("container_height");
|
mqtt->subscribe("container_height");
|
||||||
|
mqtt->subscribe("temperature_offset");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataController::handleMqttMessage(String &key, String &payload)
|
void DataController::handleMqttMessage(String &key, String &payload)
|
||||||
|
@ -65,6 +66,10 @@ namespace Dough
|
||||||
{
|
{
|
||||||
DataController::Instance()->setContainerHeight(payload.toInt());
|
DataController::Instance()->setContainerHeight(payload.toInt());
|
||||||
}
|
}
|
||||||
|
if (key.equals("temperature_offset"))
|
||||||
|
{
|
||||||
|
DataController::Instance()->setTemperatureOffset(payload.toInt());
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DataController::Instance()->_logger.log("sS", "ERROR - Unhandled MQTT message, key = ", key);
|
DataController::Instance()->_logger.log("sS", "ERROR - Unhandled MQTT message, key = ", key);
|
||||||
|
@ -101,6 +106,25 @@ namespace Dough
|
||||||
_containerHeightSet = true;
|
_containerHeightSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the temperature offset in °C, to calibrate the temperature
|
||||||
|
// as measured by the device. On my device, the temperature raises about
|
||||||
|
// 5 degrees in the first few minutes, due to the circuitry warming up.
|
||||||
|
// I will have to fix that in the hardware as well, because 5 degrees is
|
||||||
|
// just redicoulous, but there might always be a diff that needs to be
|
||||||
|
// compensated for.
|
||||||
|
void DataController::setTemperatureOffset(int offset)
|
||||||
|
{
|
||||||
|
// Just a little safety measure. Devices should never need more than
|
||||||
|
// 10 degrees correction, right?
|
||||||
|
if (offset < -10 || offset > 10) {
|
||||||
|
_logger.log("sisis", "ERROR - Temperature offset ", offset,
|
||||||
|
"°C is too large (allowed range: -10°C up to +10°C)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_logger.log("sis", "Set temperature offset to ", offset, "°C");
|
||||||
|
_temperatureOffset = offset;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
// Loop
|
// Loop
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
@ -112,8 +136,6 @@ namespace Dough
|
||||||
_temperatureMeasurements.loop();
|
_temperatureMeasurements.loop();
|
||||||
_humidityMeasurements.loop();
|
_humidityMeasurements.loop();
|
||||||
_distanceMeasurements.loop();
|
_distanceMeasurements.loop();
|
||||||
// Moved logic into sensor controller code.
|
|
||||||
//_sample();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,55 +144,5 @@ namespace Dough
|
||||||
_temperatureMeasurements.clearHistory();
|
_temperatureMeasurements.clearHistory();
|
||||||
_humidityMeasurements.clearHistory();
|
_humidityMeasurements.clearHistory();
|
||||||
_distanceMeasurements.clearHistory();
|
_distanceMeasurements.clearHistory();
|
||||||
_sampleType = SAMPLE_TEMPERATURE;
|
|
||||||
_sampleCounter = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DataController::_sample()
|
|
||||||
{
|
|
||||||
auto now = millis();
|
|
||||||
auto delta = now - _lastSample;
|
|
||||||
auto tick = _lastSample == 0 || delta >= SAMPLE_INTERVAL;
|
|
||||||
|
|
||||||
if (tick)
|
|
||||||
{
|
|
||||||
_lastSample = now;
|
|
||||||
|
|
||||||
// Quickly dip the LED to indicate that a measurement has started.
|
|
||||||
// This is done synchroneously, because we suspend the timer interrupts
|
|
||||||
// in the upcoming code.
|
|
||||||
_ui->led3.off();
|
|
||||||
delay(50);
|
|
||||||
_ui->led3.on();
|
|
||||||
|
|
||||||
// Suspend the UI timer interrupts, to not let these interfere
|
|
||||||
// with the sensor measurements.
|
|
||||||
_ui->suspend();
|
|
||||||
|
|
||||||
// Take a sample.
|
|
||||||
switch (_sampleType)
|
|
||||||
{
|
|
||||||
case SAMPLE_TEMPERATURE:
|
|
||||||
_temperatureMeasurements.loop();
|
|
||||||
_sampleType = SAMPLE_HUMIDITY;
|
|
||||||
break;
|
|
||||||
case SAMPLE_HUMIDITY:
|
|
||||||
_humidityMeasurements.loop();
|
|
||||||
_sampleType = SAMPLE_DISTANCE;
|
|
||||||
break;
|
|
||||||
case SAMPLE_DISTANCE:
|
|
||||||
_distanceMeasurements.loop();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
_ui->resume();
|
|
||||||
|
|
||||||
_sampleCounter++;
|
|
||||||
if (_sampleCounter == SAMPLE_CYCLE_LENGTH)
|
|
||||||
{
|
|
||||||
_sampleCounter = 0;
|
|
||||||
_sampleType = SAMPLE_TEMPERATURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,21 +1,6 @@
|
||||||
#ifndef DOUGH_DATA_DATACONTROLLER_H
|
#ifndef DOUGH_DATA_DATACONTROLLER_H
|
||||||
#define DOUGH_DATA_DATACONTROLLER_H
|
#define DOUGH_DATA_DATACONTROLLER_H
|
||||||
|
|
||||||
// These definitions describes what measurements are performed in sequence.
|
|
||||||
// One measurement is done every SAMPLE_INTERVAL microseconds.
|
|
||||||
// We always start with a temperature measurement, then a humidity measurement,
|
|
||||||
// and finally a number of distance measurements.
|
|
||||||
// The SAMPLE_CYCLE_LENGTH defines the total number of samples in this sequence.
|
|
||||||
#define SAMPLE_INTERVAL 1000
|
|
||||||
#define SAMPLE_CYCLE_LENGTH 30 // 1 temperature + 1 humidity + 28 distance samples
|
|
||||||
|
|
||||||
// Two different values are published per sensor: a recent value and an average
|
|
||||||
// value. These definition define the number of recent measurements to include
|
|
||||||
// in the average computation.
|
|
||||||
#define TEMPERATURE_AVG_LOOKBACK 6 // making this a 3 minute average
|
|
||||||
#define HUMIDITY_AVG_LOOKBACK 6 // making this a 3 minute average
|
|
||||||
#define DISTANCE_AVG_LOOKBACK 28 * 2 * 3 // making this a 3 minute average
|
|
||||||
|
|
||||||
// The minimal interval in seconds at which to forcibly publish measurements to the
|
// The minimal interval in seconds at which to forcibly publish measurements to the
|
||||||
// MQTT broker. When significant changes occur in the measurements, then these will
|
// MQTT broker. When significant changes occur in the measurements, then these will
|
||||||
// be published to the MQTT broker at all times, independent from this interval.
|
// be published to the MQTT broker at all times, independent from this interval.
|
||||||
|
@ -51,6 +36,7 @@ namespace Dough
|
||||||
void loop();
|
void loop();
|
||||||
void clearHistory();
|
void clearHistory();
|
||||||
void setContainerHeight(int height);
|
void setContainerHeight(int height);
|
||||||
|
void setTemperatureOffset(int offset);
|
||||||
bool isConfigured();
|
bool isConfigured();
|
||||||
static void handleMqttConnect(MQTT *mqtt);
|
static void handleMqttConnect(MQTT *mqtt);
|
||||||
static void handleMqttMessage(String &key, String &value);
|
static void handleMqttMessage(String &key, String &value);
|
||||||
|
@ -63,11 +49,9 @@ namespace Dough
|
||||||
SensorController _humidityMeasurements;
|
SensorController _humidityMeasurements;
|
||||||
SensorController _distanceMeasurements;
|
SensorController _distanceMeasurements;
|
||||||
Logger _logger;
|
Logger _logger;
|
||||||
unsigned long _lastSample = 0;
|
unsigned int _containerHeight;
|
||||||
DoughSampleType _sampleType = SAMPLE_TEMPERATURE;
|
|
||||||
int _sampleCounter = 0;
|
|
||||||
int _containerHeight;
|
|
||||||
bool _containerHeightSet;
|
bool _containerHeightSet;
|
||||||
|
int _temperatureOffset = 0;
|
||||||
void _sample();
|
void _sample();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,6 +136,14 @@ namespace Dough
|
||||||
|
|
||||||
void SensorController::_publish()
|
void SensorController::_publish()
|
||||||
{
|
{
|
||||||
|
// Quickly dip the LED to indicate that a publish has started.
|
||||||
|
// This is done synchroneously, because the upcoming code is too
|
||||||
|
// fast normally to register a LED going off and on again during
|
||||||
|
// the operation.
|
||||||
|
_ui->led1.off();
|
||||||
|
delay(50);
|
||||||
|
_ui->led1.on();
|
||||||
|
|
||||||
auto average = getAverage();
|
auto average = getAverage();
|
||||||
auto last = getLast();
|
auto last = getLast();
|
||||||
|
|
||||||
|
@ -201,4 +209,4 @@ namespace Dough
|
||||||
_storage[i]->clear();
|
_storage[i]->clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace Dough
|
}
|
|
@ -69,6 +69,6 @@ namespace Dough
|
||||||
void _store(Measurement measurement);
|
void _store(Measurement measurement);
|
||||||
unsigned int _next();
|
unsigned int _next();
|
||||||
};
|
};
|
||||||
} // namespace Dough
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -47,4 +47,4 @@ namespace Dough
|
||||||
{
|
{
|
||||||
return 2; // prevent flapping when transitioning from value A to value B
|
return 2; // prevent flapping when transitioning from value A to value B
|
||||||
}
|
}
|
||||||
} // namespace Dough
|
}
|
24
src/config.h
24
src/config.h
|
@ -1,20 +1,30 @@
|
||||||
// The digital pin to which the DATA pin of the DHT11
|
// The digital pins to which the push buttons are connected.
|
||||||
// temperature/humidity sensor is connected.
|
#define ONOFF_BUTTON_PIN 2
|
||||||
#define DHT11_DATA_PIN 10
|
#define SETUP_BUTTON_PIN 3
|
||||||
|
|
||||||
// The digital pins to which the TRIG and ECHO pins of
|
// The digital pins to which the TRIG and ECHO pins of
|
||||||
// the HCSR04 distance sensor are connected.
|
// the HCSR04 distance sensor are connected.
|
||||||
#define HCSR04_TRIG_PIN 4
|
#define HCSR04_TRIG_PIN 4
|
||||||
#define HCSR04_ECHO_PIN 5
|
#define HCSR04_ECHO_PIN 5
|
||||||
|
|
||||||
|
// The digital pin to which the DATA pin of the DHT11
|
||||||
|
// temperature/humidity sensor is connected.
|
||||||
|
#define DHT11_DATA_PIN 10
|
||||||
|
|
||||||
// The digital pins to which the three LEDs are connected.
|
// The digital pins to which the three LEDs are connected.
|
||||||
#define LED1_PIN 8
|
#define LED1_PIN 8
|
||||||
#define LED2_PIN 7
|
#define LED2_PIN 7
|
||||||
#define LED3_PIN 6
|
#define LED3_PIN 6 // PWM pin, so pulsing during "device paused" is possible
|
||||||
|
|
||||||
// The digital pins to which the push buttons are connected.
|
// Two different values are published per sensor: a recent value and an average
|
||||||
#define ONOFF_BUTTON_PIN 2
|
// value. These definitions define how often measurements must be taken and
|
||||||
#define SETUP_BUTTON_PIN 3
|
// how many values must be stored to compute an average.
|
||||||
|
#define TEMPERATURE_MEASURE_INTERVAL 30 // measure twice per minute
|
||||||
|
#define TEMPERATURE_AVERAGE_STORAGE 6 // making this a 3 minute average
|
||||||
|
#define HUMIDITY_MEASURE_INTERVAL 30 // measure twice per minute
|
||||||
|
#define HUMIDITY_AVERAGE_STORAGE 6 // making this a 3 minute average
|
||||||
|
#define DISTANCE_MEASURE_INTERVAL 1 // measure every second
|
||||||
|
#define DISTANCE_AVERAGE_STORAGE 180 // making this a 3 minute average
|
||||||
|
|
||||||
// The network configuration and possibly overrides for the above
|
// The network configuration and possibly overrides for the above
|
||||||
// definitions are stored in a separate header file, which is
|
// definitions are stored in a separate header file, which is
|
||||||
|
|
Loading…
Reference in New Issue