@@ -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