bei diesem Post viewtopic.php?t=56975 habe ich von euch schon super Hilfe bekommen und konnte dann die Sensordaten erfassen und filtern. Ich habe sie in eine Text - Datei geschrieben und dann mit Matplotlib dargestellt.

Nun bin ich dabei das Programm in separate Klassen zu überführen. Leider bin ich mir bei den Klassen auch noch nicht sicher, wann etwas in der __init__ als self. deklariert werden muss und wann man etwas vor der __init__ schon definieren kann.
Kurze Info ich habe ein Raspberry Pi Pico mit einem Oled-Display und einem MX30102-Sensor.
Das Display und den Sensor hätte ich gerne in separaten Dateien und rufe diese dann aus dem Hauptprogramm auf.
Code: Alles auswählen
from machine import Pin
from display import Display
from sensor import Sensor
import time
#Hauptprogramm
def main():
try:
print('Start')
oled = Display()
iR_Daten = Sensor()
iR_Daten.sensor_lesen()
finally:
print('Fertig')
if __name__ == "__main__":
while True:
main()
time.sleep_ms(5000)
Code: Alles auswählen
"""Es wir der MAX30102 verwendet zum Messen der SpO2 und HR"""
from MAX30102 import MAX30102
from machine import Pin, I2C
from time import sleep_ms, ticks_ms, ticks_diff
from collections import deque
class Sensor:
def __init__(self):
#Konfiguration des Sensors
self.i2c_kanal_0 = I2C(0, sda=Pin(16), scl=Pin(17))
self.sensor = MAX30102(self.i2c_kanal_0)
self.sensor.setup_sensor() # Es werden Standardmäßig beide LEDs angesprochen.
#Speicherliste für die Messdaten
self.ir_werte = []
self.ir_gefiltert = []
#Liste für Herzratenberechnung
self.fallende_w = []
self.zeiten = deque((self.fallende_w), 5)
def sensor_lesen(self):
start_zeit = ticks_ms()
vergangene_zeit = 0
while vergangene_zeit < 5000: #Zeitdauer der Messung in Millisekunden
self.sensor.check()# muss in einer While-Schleife bleiben
# Im Slot 0 werden die Daten des IR_self.sensors abgefragt.
# Im Slot 1 werden die LED_Daten hinterlegt
if self.sensor.slot_data_available(0) == 1:
self.ir_werte.append(self.sensor.get_slot_data(0))
vergangene_zeit = ticks_diff(ticks_ms(), start_zeit)
self.sensor.shutdown(True)
herz_rate_erkennen()
def iir_filter(self, ir_werte_uebergabe):
alpha = 0.95
aktuelles_w = ir_werte_uebergabe[0] / (1 - alpha)
for signal in ir_werte_uebergabe[1:]:
vorheriges_w = aktuelles_w
#Entfernen des Offsets der Werte mithilfe des Filters IIR
aktuelles_w = signal + alpha * vorheriges_w
gefiltertes_signal = aktuelles_w - vorheriges_w
self.ir_gefiltert.append(float(gefiltertes_signal))
print('in Funktion gefiltert - ' + str(self.ir_gefiltert))
return gefiltertes_signal # Ersten 50 Werte werden für das Einschwingen der Funktion benötigt, und daher gelöscht
def herz_rate_erkennen(self):
#IIR-Filter auf Daten anwenden
gefiltertes_signal = self.iir_filter(self.ir_werte)
if (len(self.fallende_w) == 0):
self.fallende_w.append(gefiltertes_signal)
else:
# Zum finden von den fallenden Werte mit Nulldurchgang
if self.fallende_w[0] > 0 and \
self.fallende_w[-1] < 0.0 and \
self.fallende_w[0] - self.fallende_w[-1] > 200:
self.herz_rate_rechner()
self.fallende_w.clear()
def herz_rate_rechner(self):
self.zeiten.append(ticks_ms())
if len(self.zeiten) < 2:
return
bpm = 60000 / self.zeiten[-1] - self.zeiten[0] * (len(self.zeiten) - 1)
bpm = int(bpm)
Hier ist ein gespeicherter Datensatz von meinem Sensor:
https://www.gronloh.net/wp-content/uplo ... _Daten.txt
Nun zu meinem Problem.

Ich bekomme einen Value Error bei der deque Funktion.
self.zeiten = deque((self.fallende_w), 5)
Folgende Internet Seiten habe ich mir angeguckt:
https://docs.micropython.org/en/latest/ ... tions.html
https://realpython.com/python-deque/
Egal wie ich die Funktion oder auch die Parameter deklariere immer bekomme ich einen Fehler.
Zweite Frage, habe ich bei den Klassen so erstmal alles richtig umgesetzt?
Die bpm Werte würde ich dann gerne abgreifen und als Text auf dem OLED darstellen.
Vielen Dank