Open juandamonsalve opened 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)
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).