diff --git a/bme280.ino b/bme280.ino index a04becf..93271c8 100644 --- a/bme280.ino +++ b/bme280.ino @@ -1,12 +1,23 @@ #include "Seeed_BME280.h" BME280 sensor; +float highTemp = 0.0, lowTemp = 0.0; +const float blindZone = 0.03; void initBME280() { sensor.init(); } void readTemperature() { - // TODO: add hysteresis - temperature = sensor.getTemperature(); + float newTemperature = sensor.getTemperature(); + + if (newTemperature > highTemp) { + temperature = newTemperature; + highTemp = newTemperature; + lowTemp = highTemp - blindZone; + } else if (newTemperature < lowTemp) { + temperature = newTemperature; + lowTemp = newTemperature; + highTemp = lowTemp + blindZone; + }; } diff --git a/metronom.ino b/metronom.ino index 501be2c..f6a369b 100644 --- a/metronom.ino +++ b/metronom.ino @@ -32,6 +32,7 @@ void setup() { TaskTimer.attachInterruptInterval_MS(20, TasksHandler); TasksISRs.setInterval(PERIOD_MS, runMetronome); TasksISRs.setInterval(PERIOD_MS, readTemperature); + // TODO: move display from ISR to loop() TasksISRs.setInterval(200, updateTube); } diff --git a/tube.ino b/tube.ino index 0eaa44f..9d998d7 100644 --- a/tube.ino +++ b/tube.ino @@ -1,22 +1,30 @@ #include "grove_alphanumeric_display.h" Seeed_Digital_Tube tube; +char tubeText[5] = ""; void initTube() { // Wire initialized by BME280 sensor tube.setTubeType(TYPE_4, TYPE_4_DEFAULT_I2C_ADDR); tube.setBrightness(15); tube.setBlinkRate(BLINK_OFF); - tube.setPoint(true,true); } void updateTube() { - char tube_str[5]; + char newText[5]; + bool highPoint = false, lowPoint = false; - if (countdown <= 0) - sprintf(tube_str, "%4u", (unsigned int) (temperature * 100.0)); - else - sprintf(tube_str, "%4u", countdown); + if (countdown <= 0) { + sprintf(newText, "%4u", (unsigned int) (temperature * 100.0)); + lowPoint = true; + } else { + sprintf(newText, "%4u", countdown); + } - tube.displayString(tube_str); + if (strcmp(tubeText, newText)) { + strcpy(tubeText, newText); + tube.displayString(tubeText); + tube.setPoint(highPoint, lowPoint); + tube.display(); + } }