Verunchikc / proyecto-Buikuan

0 stars 0 forks source link

Pulsometro #12

Open juandamonsalve opened 7 months ago

juandamonsalve commented 7 months ago

El programa utiliza las bibliotecas machine, utime, max 30102, time, ssd1306, y framebuf. Comienza definiendo un objeto Pulso que tiene atributos para almacenar datos relacionados con la frecuencia cardíaca (BPM), la saturación de oxígeno en sangre (SpO2), y la temperatura del sensor. La función muestra inicia la comunicación con el sensor MAX 30102 a través de I2C y configura sus parámetros. Luego, realiza una lectura continua de los datos de los sensores de luz roja e infrarroja, convierte estas lecturas en BPM y SpO2 utilizando factores de conversión predefinidos, y almacena estos datos en los atributos correspondientes del objeto Pulso. Además, calcula la frecuencia cardíaca y muestra los resultados por consola. La función pantalla configura y controla una pantalla OLED SSD1306. Muestra un icono inicial y luego alterna entre la visualización de un mensaje de bienvenida y la lectura en tiempo real del voltaje del sensor. Es importante mencionar que el código incluye un bucle infinito en la función pantalla, que permite la actualización continua de la pantalla con información en tiempo real. Además, utiliza una paleta de iconos almacenados en archivos PBM (Portable Bitmap).

juandamonsalve commented 7 months ago

from machine import sleep, SoftI2C, Pin, I2C, ADC # Importamos el módulo machine from utime import ticks_diff, ticks_us from max30102 import MAX30102, MAX30105_PULSE_AMP_MEDIUM import utime import time #Importamos el módulo de tiempo time https://docs.python.org/es/3/library/time.html from ssd1306 import SSD1306_I2C # Importamos el módulo de funcionamiento de la OLED import framebuf # Módulo para visualizar imagenes en pbm

led = Pin(2,Pin.OUT) class Pulso(): def init (self): self.datos=0 self.datos2=0 self.datos3=0

def muestra (self):

    i2c = SoftI2C(sda=Pin(19),  
                  scl=Pin(23),  
                  freq=400000)  
    sensor = MAX30102(i2c=i2c)

    if sensor.i2c_address not in i2c.scan():
        print("Sensor no encontrado.")
        return

    elif not (sensor.check_part_id()):
        print("ID de dispositivo I2C no correspondiente a MAX30102 o MAX30105.")
        return

    else:
        print("Sensor conectado y reconocido.")

    print("Configurando el sensor con la configuración predeterminada.", '\n')
    sensor.setup_sensor()
    sensor.set_sample_rate(400)
    sensor.set_fifo_average(8)
    sensor.set_active_leds_amplitude(MAX30105_PULSE_AMP_MEDIUM)
    sleep(1)
    dato3 =(sensor.read_temperature()) # ("Leyendo temperatura en °C.", '\n')
    self.datos3 = dato3
    compute_frequency = True
    print("Iniciando la adquisición de datos de los registros RED e IR...", '\n')
    sleep(1)
    t_start = ticks_us()
    samples_n = 0

    while True:

        sensor.check()
        if sensor.available():
            red_reading = sensor.pop_red_from_storage()
            ir_reading = sensor.pop_ir_from_storage() #("Sensor_R",red_reading, "Sensor_IR", ir_reading)
            f_conversion=60/17500
            dato = red_reading*f_conversion
            self.datos=dato #("BPM",dato)
            utime.sleep(8)    

            dato2 = ir_reading*f_conversion
            self.datos2=dato2 #("SpO2",dato2)
            utime.sleep(8)                

            if compute_frequency:
                if ticks_diff(ticks_us(), t_start) >= 999999:
                    f_HZ = samples_n
                    samples_n = 0 #("Adquiriendo frecuencia = ", f_HZ)
                    t_start = ticks_us()
                else:
                    samples_n = samples_n + 1

def pantalla (self):

    ancho = 128  # Definimos el ancho de la OLED
    alto = 64    # Definimos el alto de la OLED

    i2c = I2C(0, scl=Pin(22), sda=Pin(21))  #Definimos los pines de la OLED SCL y SDA para ssd1306 y sh1106(otra)
    oled = SSD1306_I2C(ancho, alto, i2c)

    def buscar_icono(ruta):

        dibujo = open(ruta, "rb")  # Abrir en modo lectura de bits https://python-intermedio.readthedocs.io/es/latest/open_function.html
        dibujo.readline() # metodo para ubicarse en la primera linea de los bist
        xy = dibujo.readline() # ubicarnos en la segunda linea
        x = int(xy.split()[0])  # split  devuelve una lista de los elementos de la variable solo 2 elemetos
        y = int(xy.split()[1])
        icono = bytearray(dibujo.read())  # guardar en matriz de bites
        dibujo.close()
        return framebuf.FrameBuffer(icono, x, y, framebuf.MONO_HLSB)  #Utilizamos el metodo MONO_HLSB
    print(i2c.scan())

    oled.blit(buscar_icono("areandina/cisco.pbm"), 0, 0) # ruta y sitio de ubicación del directorio
    oled.show()  #mostrar en la oled
    time.sleep(3) # Espera de 3 segundos
    oled.fill(0)
    oled.show()

    oled.text('Welcome to the', 0, 10)
    oled.text('Areandina', 0, 30)
    oled.text('Wilson Perez', 0, 50)
    oled.show()
    time.sleep(4)

    oled.fill(1)
    oled.show()
    time.sleep(2)
    oled.fill(0)
    oled.show()

    while True:
        oled.fill(0)
        conversion_factor = 3.3 / (65535)
        val= int(sensor.read_u16())
        voltaje = float (sensor.read_u16()*conversion_factor)
        oled.text("************",0,0)    
        oled.text("Lectura",10,10)
        oled.text(str(val),10,20)
        oled.text("Voltaje",10,30)                
        oled.text(str(voltaje),0,40)
        oled.text("************",0,50)
        oled.show()

        print("Voltaje =", voltaje)
        time.sleep(0.25)