diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/tempmodule/main.ino | 39 |
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 */ |