Compare commits

..
3 Commits
Author SHA1 Message Date
jlehmann cfaccfb14a plausibility checks, eliminiate NOT_ATTACHED 2020-07-01 13:11:56 +02:00
jlehmann 90782229d5 fix bug 2020-07-01 11:11:16 +02:00
jlehmann 363e8ecc23 read sensors a second time if values do not seem plausible 2020-07-01 11:05:25 +02:00
2 changed files with 55 additions and 50 deletions
+51 -47
View File
@@ -527,9 +527,15 @@ void DoDeepSleep(uint32_t sleep_time)
} }
} }
void ReadSensors(SENSOR_data &sensor_data) { // Returns true if measurements are plausible, otherwise false
bool ReadSensors(SENSOR_data &sensor_data) {
bool plausible;
bool plausible_a;
bool plausible_b;
SENSOR_data res; SENSOR_data res;
int32_t weight_current32; int32_t weight_current32;
int32_t weight_current32_a;
int32_t weight_current32_b;
long w1_0_real; long w1_0_real;
long w2_0_real; long w2_0_real;
@@ -547,29 +553,13 @@ void ReadSensors(SENSOR_data &sensor_data) {
if (config_data.debug_level > 0) { if (config_data.debug_level > 0) {
gCatena.SafePrintf("LoadCell is ready.\n"); gCatena.SafePrintf("LoadCell is ready.\n");
} }
if (config_data.cal_w1_0 != NOT_ATTACHED) { res.weight1 = (int32_t)ReadScale('A');
res.weight1 = (int32_t)ReadScale('A'); if (config_data.debug_level > 0) {
if (config_data.debug_level > 0) { gCatena.SafePrintf("Load_cell 1 weight1_current: %ld\n", res.weight1);
gCatena.SafePrintf("Load_cell 1 weight1_current: %ld\n", res.weight1);
}
} else {
res.weight1 = 0;
w1_0_real = 0;
if (config_data.debug_level > 0) {
gCatena.SafePrintf("Load_cell 1 is disabled\n");
}
} }
if (config_data.cal_w2_0 != NOT_ATTACHED) { res.weight2 = (int32_t)ReadScale('B');
res.weight2 = (int32_t)ReadScale('B'); if (config_data.debug_level > 0) {
if (config_data.debug_level > 0) { gCatena.SafePrintf("Load_cell 2 weight2_current: %ld\n", res.weight2);
gCatena.SafePrintf("Load_cell 2 weight2_current: %ld\n", res.weight2);
}
} else {
res.weight2 = 0;
w2_0_real = 0;
if (config_data.debug_level > 0) {
gCatena.SafePrintf("Load_cell 2 is disabled\n");
}
} }
} }
else { else {
@@ -582,18 +572,32 @@ void ReadSensors(SENSOR_data &sensor_data) {
PowerdownScale(); PowerdownScale();
// Gewicht berechnen // Gewicht berechnen
weight_current32 = (int32_t)((((res.weight1 - w1_0_real) / config_data.cal_w1_factor) + ((res.weight2 - w2_0_real) / config_data.cal_w2_factor)) / 5.0); weight_current32_a = (int32_t)((res.weight1 - w1_0_real) / config_data.cal_w1_factor);
weight_current32_b = (int32_t)((res.weight2 - w2_0_real) / config_data.cal_w2_factor);
weight_current32 = (int32_t)((weight_current32_a + weight_current32_b) / 5.0);
// we check if weights are plausible
plausible_a = (weight_current32_a > -10000) && (weight_current32_a < 150000);
plausible_b = (weight_current32_b > -10000) && (weight_current32_b < 150000);
plausible = (plausible_a && plausible_b);
if (weight_current32 < 0) { if (weight_current32 < 0) {
weight_current32 = 0; if (plausible) {
weight_current32 = 0;
}
} else if (weight_current32 > UINT16_MAX) { } else if (weight_current32 > UINT16_MAX) {
//weight_current32 = UINT16_MAX; //weight_current32 = UINT16_MAX;
// we set the weight to 0, as such high values are not realistic and probably a sign for bad calibration... // we set the weight to 0, as such high values are not realistic and probably a sign for bad calibration...
weight_current32 = 0; weight_current32 = 0;
} }
if (config_data.cal_w1_0 == NOT_ATTACHED || config_data.cal_w2_0 == NOT_ATTACHED) { if (!plausible) {
// when at least one load cell is disabled, we multiply the measured weight by 2 weight_current32 = NOT_PLAUSIBLE_16;
weight_current32 = weight_current32 * 2; if (!plausible_a) {
res.weight1 = NOT_PLAUSIBLE_32;
}
if (!plausible_b) {
res.weight2 = NOT_PLAUSIBLE_32;
}
} }
res.weight = (uint16_t)weight_current32; res.weight = (uint16_t)weight_current32;
@@ -621,6 +625,7 @@ void ReadSensors(SENSOR_data &sensor_data) {
} }
sensor_data = res; sensor_data = res;
return plausible;
} }
void StartNewIteration() { void StartNewIteration() {
@@ -632,7 +637,18 @@ void StartNewIteration() {
iteration++; iteration++;
SENSOR_data current_sensor_reading; SENSOR_data current_sensor_reading;
ReadSensors(current_sensor_reading); if (!ReadSensors(current_sensor_reading)) {
// we try a second time if Readings do not seem plausible
if (config_data.debug_level > 0) {
gCatena.SafePrintf("Readings do not seem plausible, try a second time\n");
}
delay(500);
if (!ReadSensors(current_sensor_reading)) {
if (config_data.debug_level > 0) {
gCatena.SafePrintf("Readings do not seem plausible for a second time, we give up!\n");
}
}
}
int16_t temp_change; int16_t temp_change;
// vBus // vBus
@@ -1215,15 +1231,9 @@ cCommandStream::CommandStatus cmdCalibrateScaleA(cCommandStream * pThis, void *p
String w1_gramm(argv[1]); String w1_gramm(argv[1]);
long weight1; long weight1;
if (w1_gramm == "NA") { setup_scales();
// scale a is not connected weight1 = ReadScale('A');
config_data.cal_w1_factor = 1.0; config_data.cal_w1_factor = (float)((weight1 - config_data.cal_w1_0) / w1_gramm.toFloat());
config_data.cal_w1_0 = NOT_ATTACHED;
} else {
setup_scales();
weight1 = ReadScale('A');
config_data.cal_w1_factor = (float)((weight1 - config_data.cal_w1_0) / w1_gramm.toFloat());
}
gCatena.getFram()->saveField(cFramStorage::kAppConf, (const uint8_t *)&config_data, sizeof(config_data)); gCatena.getFram()->saveField(cFramStorage::kAppConf, (const uint8_t *)&config_data, sizeof(config_data));
@@ -1237,15 +1247,9 @@ cCommandStream::CommandStatus cmdCalibrateScaleB(cCommandStream * pThis, void *p
String w2_gramm(argv[1]); String w2_gramm(argv[1]);
long weight2; long weight2;
if (w2_gramm == "NA") { setup_scales();
// scale b is not connected weight2 = ReadScale('B');
config_data.cal_w2_factor = 1.0; config_data.cal_w2_factor = (float)((weight2 - config_data.cal_w2_0) / w2_gramm.toFloat());
config_data.cal_w2_0 = NOT_ATTACHED;
} else {
setup_scales();
weight2 = ReadScale('B');
config_data.cal_w2_factor = (float)((weight2 - config_data.cal_w2_0) / w2_gramm.toFloat());
}
gCatena.getFram()->saveField(cFramStorage::kAppConf, (const uint8_t *)&config_data, sizeof(config_data)); gCatena.getFram()->saveField(cFramStorage::kAppConf, (const uint8_t *)&config_data, sizeof(config_data));
+3 -2
View File
@@ -56,7 +56,7 @@ enum {
| |
\****************************************************************************/ \****************************************************************************/
static const int32_t fwVersion = 20200630; static const int32_t fwVersion = 20200701;
static const byte INIT_PACKAGE_INTERVAL = 100; // send an init package every 100 packages; static const byte INIT_PACKAGE_INTERVAL = 100; // send an init package every 100 packages;
static const byte MAX_VALUES_TO_SEND = 8; static const byte MAX_VALUES_TO_SEND = 8;
@@ -65,7 +65,8 @@ static const uint8_t LORA_DATA_VERSION = 1;
static const uint8_t LORA_DATA_VERSION_FIRST_PACKAGE = 128; static const uint8_t LORA_DATA_VERSION_FIRST_PACKAGE = 128;
static const uint32_t PRESSURE_OFFSET = 825; static const uint32_t PRESSURE_OFFSET = 825;
static const uint16_t SEND_DIFF_THRESHOLD_5GRAMS = 20; // when weight changes by 100g, then send data static const uint16_t SEND_DIFF_THRESHOLD_5GRAMS = 20; // when weight changes by 100g, then send data
static const long NOT_ATTACHED = -2147483648; static const long NOT_PLAUSIBLE_16 = 65535;
static const long NOT_PLAUSIBLE_32 = 2147483647;
static const byte INIT_PACKETS = 5; static const byte INIT_PACKETS = 5;
// must be 64 bytes long (size of kAppConf) // must be 64 bytes long (size of kAppConf)