diff --git a/mini-beieli-node.ino b/mini-beieli-node.ino index 0773207..5a6c5e1 100644 --- a/mini-beieli-node.ino +++ b/mini-beieli-node.ino @@ -99,6 +99,7 @@ long package_counter = 0; // sent package counter bool send_in_progress = false; bool stop_iterations = false; bool next_package_is_init_package = true; +uint32_t gRebootMs; // generic timer long t_cur; @@ -350,12 +351,11 @@ void setup_uplink(void) gCatena.SafePrintf("%010d - setup_uplink\n", millis()); } -#if defined(_mcci_arduino_version) && _mcci_arduino_version >= _mcci_arduino_version_calc(2,4,0,90) && \ - defined(CATENA_ARDUINO_PLATFORM_VERSION_CALC) && CATENA_ARDUINO_PLATFORM_VERSION >= CATENA_ARDUINO_PLATFORM_VERSION_CALC(0,17,0,10) - LMIC_setClockError(5 * 65536 / 100); -#else - LMIC_setClockError(10 * 65536 / 100); -#endif + LMIC_setClockError(1*65536/100); + + /* figure out when to reboot */ + gRebootMs = (CATCFG_T_REBOOT + os_getRndU2() - 32768) * 1000; + // Do an unjoin, so every reboot will trigger a join if (config_data.debug_level > 0) { @@ -576,12 +576,11 @@ void bubbleSort(long A[], int len) { long my_read_average(byte gain, byte times) { long res; - int const num_scale_readings = 100; //number of instantaneous scale readings to calculate the median + int const num_scale_readings = 25; // number of instantaneous scale readings to calculate the median // we use the median, not the average, see https://community.particle.io/t/boron-gpio-provides-less-current-than-electrons-gpio/46647/13 long readings[num_scale_readings]; // create arry to hold readings - // highest and lowest value will be ignored if (config_data.debug_level > 0) { gCatena.SafePrintf("%010d - my_read_average, measurements: ", millis()); } @@ -594,7 +593,7 @@ long my_read_average(byte gain, byte times) { readings[i] = LoadCell.read(); // fill the array with instantaneous readings from the scale } - res = median(readings, num_scale_readings); //calculate median + res = median(readings, num_scale_readings); // calculate median if (config_data.debug_level > 0) { gCatena.SafePrintf("; median of %d samples: %d\n", num_scale_readings, res); @@ -646,7 +645,9 @@ void ReadSensors(SENSOR_data &sensor_data) { if (weight_current32 < 0) { weight_current32 = 0; } 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... + weight_current32 = 0; } res.weight = (uint16_t)weight_current32; @@ -920,6 +921,11 @@ static void settleDoneCb( // Terry ^^ } + if (uint32_t(millis()) > gRebootMs) { + // time to reboot + NVIC_SystemReset(); + } + sleepDoneCb(pSendJob); } diff --git a/mini_beieli_node.h b/mini_beieli_node.h index 1b09912..f4028ea 100644 --- a/mini_beieli_node.h +++ b/mini_beieli_node.h @@ -19,6 +19,7 @@ enum { CATCFG_T_CYCLE_TEST = 30, // every 10 seconds CATCFG_T_CYCLE_INITIAL = 30, // every 30 seconds initially CATCFG_INTERVAL_COUNT_INITIAL = 30, // repeat for 15 minutes + CATCFG_T_REBOOT = 30 * 24 * 60 * 60, // reboot every 30 days }; /* additional timing parameters; ususually you don't change these. */ @@ -55,7 +56,7 @@ enum { | \****************************************************************************/ -static const int32_t fwVersion = 20200113; +static const int32_t fwVersion = 20200116; static const byte INIT_PACKAGE_INTERVAL = 100; // send an init package every 100 packages; static const byte MAX_VALUES_TO_SEND = 8;