summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Gediminas Jakutis <gediminas@varciai.lt> 2018-04-27 11:08:03 +0300
committerGravatar Gediminas Jakutis <gediminas@varciai.lt> 2018-04-27 11:08:03 +0300
commitcdc1d09d60025803fa283c9b4260e4c5f2c812fb (patch)
tree148de24528635aa13c7f6552af51258f89189a9a /src
parent23d06a17f8a4033be57ca46079e5c3e65fa9e845 (diff)
downloadcoffeetemp-cdc1d09d60025803fa283c9b4260e4c5f2c812fb.tar.gz
coffeetemp-cdc1d09d60025803fa283c9b4260e4c5f2c812fb.tar.bz2
coffeetemp-cdc1d09d60025803fa283c9b4260e4c5f2c812fb.zip
tempmodule: add smoothing of temp readings.
Diffstat (limited to 'src')
-rw-r--r--src/tempmodule/main.ino39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/tempmodule/main.ino b/src/tempmodule/main.ino
index 58e3dfc..4bb3ad9 100644
--- a/src/tempmodule/main.ino
+++ b/src/tempmodule/main.ino
@@ -26,6 +26,8 @@
#include "indicator.h"
#include "temperature.h"
+#define arrsize(a) (sizeof(a)/sizeof(*a))
+
static const unsigned int iled = 2; /* D4 */
static const unsigned int wifiled = 12; /* D6 */
static const unsigned int wifibutton = 15; /* D8 */
@@ -49,6 +51,7 @@ static void wifi_disconnect(void);
static void blink_led(const int pin, const int ontime, const int offtime);
static void discover_client(void);
static void get_data(short int * const data);
+static short int smooth_temp(short int temp);
void toggle_wifi(void);
void wifiled_toggle(void);
@@ -110,6 +113,8 @@ void loop(void)
get_data(data);
+ data[0] = smooth_temp(data[0]);
+
if (wifistate) {
udp_push(data, sizeof(data));
/* if flushing fails, disconnect WiFi */
@@ -226,6 +231,40 @@ static void get_data(short int * const data)
data[0] = get_temperature(data[1]);
}
+static short int smooth_temp(short int temp)
+{
+ static short int rb[16]; /*ring buffer for smoothing over 16 entries */
+ static size_t offset;
+ short int ret;
+ int sum;
+ size_t i;
+ static unsigned int notfresh;
+
+ /* push value to the ring buffer */
+ if (offset < arrsize(rb)) {
+ rb[offset] = temp;
+ ++offset;
+ } else {
+ offset = 0;
+ notfresh = 1;
+ rb[offset] = temp;
+ }
+
+ if (notfresh) {
+ for (i = 0, sum = 0; i < arrsize(rb); ++i) {
+ sum += rb[i];
+ }
+ ret = sum / arrsize(rb);
+ } else {
+ for (i = 0, sum = 0; i < offset; ++i) {
+ sum += rb[i];
+ }
+ ret = sum / offset;
+ }
+
+ return ret;
+}
+
void toggle_wifi(void)
{
static const unsigned int timeout = 2 * 1000 * 1000; /* 2 seconds */