Skip to content

Commit 98cddba

Browse files
Update piper_heartrate_sensor.py
1 parent c9d8d4a commit 98cddba

File tree

1 file changed

+33
-32
lines changed

1 file changed

+33
-32
lines changed

piper_heartrate_sensor.py

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -822,40 +822,41 @@ def read_fifo(self):
822822

823823
# get smoothed values
824824
def read_sensor(self):
825-
_sensor_output = self.read_fifo()
826-
827-
self.last_reading[0].append(_sensor_output[0][0])
828-
self.last_reading[0].pop(0)
825+
for _z in range(2): # take 2 samples - helps with smoothing/averaging
826+
_sensor_output = self.read_fifo()
827+
828+
self.last_reading[0].append(_sensor_output[0][0])
829+
self.last_reading[0].pop(0)
829830

830-
self.reading_average = (self.reading_average * self.smoothing * 10 + _sensor_output[0][0]) / (self.smoothing * 10 + 1)
831-
832-
self.std_dev_readings.append(_sensor_output[0][0] - self.reading_average)
833-
self.std_dev_readings.pop(0)
831+
self.reading_average = (self.reading_average * self.smoothing * 10 + _sensor_output[0][0]) / (self.smoothing * 10 + 1)
832+
833+
self.std_dev_readings.append(_sensor_output[0][0] - self.reading_average)
834+
self.std_dev_readings.pop(0)
834835

835-
_current_reading = ulab.numpy.mean(self.last_reading[0]) - self.reading_average
836-
837-
if (_current_reading > ulab.numpy.max(self.std_dev_readings) * 0.1):
838-
self.peak_detect = 1
839-
elif (_current_reading < ulab.numpy.min(self.std_dev_readings) * 0.1):
840-
self.peak_detect = -1
841-
else:
842-
self.peak_detect = 0
836+
_current_reading = ulab.numpy.mean(self.last_reading[0]) - self.reading_average
843837

844-
if (self.peak_detect == 1 and self.last_peak_state == -1):
845-
# rising
846-
self.last_peak_state = 1
847-
elif (self.peak_detect == -1 and self.last_peak_state == 1):
848-
# falling
849-
self.last_peak_state = -1
850-
_mark = time.monotonic()
851-
if (self.last_peak_mark is not None):
852-
_tmp_hr = _mark - self.last_peak_mark
853-
_tmp_hr = 60 * (1 / _tmp_hr)
854-
if (_tmp_hr <= 220 and _tmp_hr >= 35):
855-
self.heart_rate_measurement = _tmp_hr
856-
self.last_peak_mark = _mark
857-
858-
return _current_reading
838+
if (_current_reading > ulab.numpy.max(self.std_dev_readings) * 0.1):
839+
self.peak_detect = 1
840+
elif (_current_reading < ulab.numpy.min(self.std_dev_readings) * 0.1):
841+
self.peak_detect = -1
842+
else:
843+
self.peak_detect = 0
844+
845+
if (self.peak_detect == 1 and self.last_peak_state == -1):
846+
# rising
847+
self.last_peak_state = 1
848+
elif (self.peak_detect == -1 and self.last_peak_state == 1):
849+
# falling
850+
self.last_peak_state = -1
851+
_mark = time.monotonic()
852+
if (self.last_peak_mark is not None):
853+
_tmp_hr = _mark - self.last_peak_mark
854+
_tmp_hr = 60 * (1 / _tmp_hr)
855+
if (_tmp_hr <= 220 and _tmp_hr >= 35):
856+
self.heart_rate_measurement = _tmp_hr
857+
self.last_peak_mark = _mark
858+
859+
return int(_current_reading / 10)
859860

860861
# Return the measured heart rate
861862
@property
@@ -877,7 +878,7 @@ def start(self):
877878

878879
# Build some FIFO arrays for averaging/smoothing the data from the sensor
879880
self.last_reading = [[0] * self.smoothing,[0] * self.smoothing]
880-
self.std_dev_readings = [0] * (self.smoothing * 6)
881+
self.std_dev_readings = [0] * (self.smoothing * 10)
881882
self.reading_average = 0
882883

883884
# start the timer to begin operation

0 commit comments

Comments
 (0)