From 9a7e710a2c7d4ba01b303e242edb56fdf1715c4f Mon Sep 17 00:00:00 2001 From: dakkar Date: Sun, 27 Mar 2022 13:20:10 +0100 Subject: low power pm --- pm.h | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/pm.h b/pm.h index 634c1b4..9c8a508 100644 --- a/pm.h +++ b/pm.h @@ -4,11 +4,27 @@ #include "data.h" +/* +start measuring + +read once, stop, sleep + +ready? + if (now-last measurements) < read_interval, no + else: start measuring, return ready status + */ + class PM { private: uint8_t auto_clean_days; + unsigned long last_measurment_millis; + unsigned long read_interval_millis; public: - PM(uint8_t acd=4) :auto_clean_days(acd) {} + PM(uint8_t acd=4, unsigned long ri=30000) : + auto_clean_days(acd), + last_measurment_millis(0), + read_interval_millis(ri) + {} void start() { // this will try to re-init Wire, emit a warning, and carry on @@ -37,6 +53,16 @@ public: uint16_t data_ready; int16_t ret; + // have we read recently? + unsigned long now=millis(); + // that first check is in case of overflow & rollover + if (now > last_measurment_millis && (now - last_measurment_millis) < read_interval_millis) { + return false; + } + + sps30_wake_up(); + sps30_start_measurement(); + ret = sps30_read_data_ready(&data_ready); if (ret < 0) { Serial.print("PM reading data-ready flag error: "); @@ -58,6 +84,11 @@ public: if (ret <0) { Serial.print("PM reading measurement error: "); Serial.println(ret); + return; } + + last_measurment_millis = millis(); + sps30_stop_measurement(); + sps30_sleep(); } }; -- cgit v1.2.3