Aplicacion de escritorio para capturar, analizar y documentar senales PPG con sensor MAX3010x, lectura de temperatura NTC, firmware Arduino y una interfaz PyQt6 pensada para trabajo de campo.
El proyecto combina adquisicion en tiempo real, configuracion del sensor, analisis de pulso y generacion de informes. Esta preparado para publicarse como portfolio sin incluir resultados experimentales ni datos de medicion.
- Captura senales RED/IR desde un MAX3010x conectado por Arduino.
- Registra temperatura NTC junto a cada medicion con termometros A0-A3.
- Permite seleccionar especie/animal: oveja, cabra o vaca.
- En oveja/cabra usa sensores izquierda/derecha; en vaca usa FLT, FRT, RLT y RRT.
- La temperatura final se guarda como el maximo del primer golpe de calor, no como media.
- Permite modos de medicion rapida, test de campo, reajustes, solo temperatura y bloques de configuracion.
- Calcula metricas de calidad, BPM, SpO2 estimada, perfusion, artefactos y saturacion.
- Incluye analisis experimental con Fourier, autocorrelacion e Hilbert para comparar configuraciones.
- Genera CSV, JSON, graficas, capturas y PDFs de informe.
- Estadisticas permite revisar sesiones, marcar raws de varias sesiones y preparar un ZIP en el Escritorio para correo.
- Python
- PyQt6
- pyqtgraph
- NumPy
- pyserial
- bleak para conexion BLE con Arduino Nano 33 IoT
- sounddevice
- Arduino / C++
main.py # punto de entrada
controller.py # controlador de ventanas
requirements.txt # dependencias Python
ARRANCAR_PPG.cmd # lanzador principal en Windows
instalarmtestv2.cmd # instalacion inicial
actualizaciones/ # notas visibles desde la interfaz
arduino/
ppg_max3010x_firmware/
ppg_max3010x_firmware.ino # firmware para Arduino
ppg_suite/
paths.py # rutas, resultados y logging
utils.py # utilidades generales
models.py # dataclasses de configuracion y metricas
processing.py # BPM, FFT, autocorrelacion, SpO2 y artefactos
widgets.py # widgets reutilizables
menu.py # menu inicial
windows/
measurement_window.py # base de campo/test
real_window.py # medicion de campo
test_window.py # test de campo
temperature_window.py # solo temperatura
reajustes_window.py # medicion larga y diagnostico
scheduled_window.py # configuraciones y experimento 3M
relations_window.py # estadisticas y explorador de sesiones
fourier_window.py # analisis Fourier + HilbertRequisitos:
- Windows
- Python 3
- Git, opcional para actualizacion automatica
- Arduino con el firmware del proyecto cargado
Desde la raiz del repositorio:
instalarmtestv2.cmdEl instalador crea el entorno virtual, instala dependencias y prepara un archivo .env local si no existe.
Ejemplo de .env:
PROJECT_DIR=C:\ruta\a\mtestv2
PYTHON_REL=.venv\Scripts\python.exe
MAIN_FILE=main.py
AUTO_UPDATE_GIT=1
AUTO_UPDATE_TIMEOUT_SEC=15La forma recomendada en Windows es:
ARRANCAR_PPG.cmdEl lanzador:
- Lee la configuracion local desde
.env. - Entra en
PROJECT_DIR. - Intenta actualizar con
git pull --ff-onlysiAUTO_UPDATE_GIT=1. Si no hay internet o Git tarda demasiado, omite la actualizacion y abre la version local. - Comprueba dependencias.
- Ejecuta
main.py.
Tambien se puede lanzar manualmente:
.venv\Scripts\python.exe main.pyEl empaquetado actual no usa una carpeta espejo del proyecto. El instalador se construye desde el codigo real del repositorio y copia solo el resultado generado por PyInstaller.
Primero instala las dependencias de desarrollo en tu entorno:
.venv\Scripts\python.exe -m pip install -r requirements-dev.txtPara crear la aplicacion empaquetada:
CREAR_INSTALADOR_WINDOWS.cmdEl comando genera:
dist\MedicionPPG\MedicionPPG.exe: carpeta de aplicacion lista para probar.release\MEE_VERSION.zip: copia portable de nombre corto para equipos que bloqueen instaladores o fallen por rutas largas.release\MedicionPPG_Setup_VERSION.exe: instalador si Inno Setup 6 esta instalado.
Para publicar una actualizacion:
- Sube la version en
ppg_suite\__init__.py. - Ejecuta otra vez
CREAR_INSTALADOR_WINDOWS.cmd. - Entrega el nuevo
release\MedicionPPG_Setup_VERSION.exe. - En el ordenador del usuario, abre ese instalador nuevo. Como mantiene el mismo
AppId, actualiza el ejecutable instalado y conserva los datos.
El instalador usa siempre el mismo AppId, asi que una version nueva sustituye a la anterior. Los resultados del usuario no se guardan dentro de la carpeta del programa, por lo que una actualizacion normal no borra mediciones ni fichas.
Si al abrir el instalador aparece Error 4551 o un aviso de Control de aplicaciones indicando que no se pudo ejecutar un archivo en la carpeta temporal, el bloqueo lo esta aplicando Windows o una politica del ordenador destino. En ese caso prueba primero release\MEE_VERSION.zip: se descomprime en una carpeta corta, por ejemplo C:\MEE, y se abre MedicionPPG.exe. Si tambien bloquea ese exe, hace falta que el departamento de informatica permita la aplicacion o que se firme el ejecutable/instalador con un certificado de confianza.
En modo instalado, la aplicacion escribe por defecto en:
%LOCALAPPDATA%\TripleM\PPGSuite\resultadosSi hace falta forzar otra carpeta de datos, se puede crear un .env junto al exe instalado, o en %LOCALAPPDATA%\TripleM\PPGSuite\.env, con:
PROJECT_DIR=C:\ruta\a\carpeta_de_datosEl menu inicial incluye IMPORTAR DATOS. Ese boton solo acepta una carpeta llamada exactamente resultados y mezcla su contenido en la carpeta de datos actual. Los archivos ya existentes se omiten para evitar sobrescribir mediciones nuevas.
- Medicion de campo: toma rapida con la interfaz minima.
- Test de campo: captura con notas, parametros y graficas diagnosticas.
- Solo temperatura: registro NTC sin PPG.
- Reajustes: medicion larga con controles completos, diagnostico Arduino y snapshots.
- Configuraciones: ejecucion de bloques de parametros del sensor.
- Experimento 3M: busqueda adaptativa de una configuracion util del sensor con ranking final.
- Estadisticas: explorador de sesiones, raws, procesados, informes, graficas, capturas y preparacion de ZIP para correo.
- Analisis Fourier + Hilbert: comparacion de raws para estudiar que configuracion separa mejor el pulso.
Durante el uso normal desde el repositorio, la aplicacion escribe resultados en:
resultados/En la version instalada, los resultados se escriben en la carpeta de datos del usuario:
%LOCALAPPDATA%\TripleM\PPGSuite\resultadosEsa carpeta esta ignorada por Git porque puede contener datos experimentales, capturas, informes y archivos pesados. Si se clona el proyecto desde cero, la carpeta se crea durante la ejecucion cuando sea necesaria.
Subcarpetas habituales:
raw/: datos crudos.processed/: datos procesados.sessions/: resumenes de sesiones.reports/: JSON y tablas derivadas.documentos_generados/: informes PDF.figures/: graficas.screenshots/: capturas.configs/: configuraciones aplicadas yanimal_profiles.jsoncon configuraciones MAX3010x predefinidas por especie.logs/: logs de ejecucion.
Las pantallas de recogida permiten elegir Oveja, Cabra o Vaca.
- Oveja y cabra usan posiciones
RTyLT. - Vaca usa posiciones
FLT,FRT,RLTyRRT. - Los canales fisicos son siempre
A0,A1,A2yA3. - Por defecto, oveja/cabra usan
A0 derecha / A1 izquierda. - Por defecto, vaca usa
A0 FRT / A1 FLT / A2 RRT / A3 RLT. - La asignacion puede cambiarse desde la app antes de capturar.
- Oveja, cabra y vaca pueden guardar una configuracion MAX3010x predefinida por especie. El boton aparece bajo el bloque del sensor en las pantallas de toma normal, temperatura y reajustes; en Configuraciones/3M el bloque MAX3010x es solo orientativo porque cambia por fila.
- Si ya existe una configuracion previa para esa especie, la app muestra la configuracion antigua y pide confirmacion antes de sustituirla.
- El boton
Mostrar resultadosde las pantallas de recogida cierra la ventana actual y abreEstadisticas. - Las recogidas guardan anotaciones de inicio y anotaciones finales. En Configuraciones/3M, cada cambio de configuracion permite anotar lo ocurrido en el tramo que acaba de terminar.
La temperatura final de sesiones y Estadisticas es el maximo independiente de cada termometro/posicion durante el primer golpe de calor. La app ignora el primer segundo de estabilizacion y busca el maximo en los 5 segundos siguientes; las medias antiguas se mantienen solo como referencia tecnica.
El firmware esta en:
arduino/ppg_max3010x_firmware/ppg_max3010x_firmware.inoDesde el menu inicial, ACTUALIZAR FIRMWARE usa el firmware incluido en la version actual de la app:
- Si el ordenador tiene
arduino-cli, la app detecta puertos USB, permite elegir el Arduino conectado y ejecutacompile+uploadparaarduino:samd:nano_33_iot. - Si no encuentra
arduino-cli, abre el archivo.inopara cargarlo manualmente desde Arduino IDE.
Para la subida automatica con arduino-cli, el ordenador debe tener instalado el core arduino:samd y las librerias ArduinoBLE y SparkFun MAX3010x Pulse and Proximity Sensor Library.
Configuracion recomendada para Arduino Nano 33 IoT:
- Placa en Arduino IDE:
Arduino SAMD Boards->Arduino Nano 33 IoT. - Librerias Arduino desde
Sketch->Include Library->Manage Libraries...:ArduinoBLEby Arduino, necesaria paraArduinoBLE.hy Bluetooth BLE.SparkFun MAX3010x Pulse and Proximity Sensor Library, necesaria paraMAX30105.h.
- Conexiones: MAX3010x por I2C en
SDA/A4ySCL/A5. - Termometros NTC:
A0,A1,A2,A3. Cada entrada debe tener divisor3.3V -> NTC -> Ax -> resistencia fija 10k -> GND. - Para oveja/cabra basta usar A0/A1. Para vaca se pueden usar los cuatro termometros y asignarlos a
FLT/FRT/RLT/RRT. - ADC de temperatura:
12 bits, ya configurado por defecto en placas SAMD como Nano 33 IoT. - Bluetooth: el Nano 33 IoT tiene BLE mediante el modulo u-blox NINA-W102. Este firmware activa un servicio BLE
mtestv2 Nano33IoTcuando compila como Nano 33 IoT. La app puede conectarse desde el selector de puertos conBLE Nano 33 IoT mtestv2. - BLE no aparece como puerto COM clasico. La app usa
bleaky caracteristicas GATT propias para enviar comandos y recibir lineas. Por limite de ancho de banda BLE, USB Serial sigue siendo la opcion con mas muestras por segundo; por BLE se notifican datos a ritmo limitado para mantener estabilidad.
Formato de datos actual del firmware:
micros,red,ir,tempA0C,tempA0Raw,tempA1C,tempA1Raw,tempA2C,tempA2Raw,tempA3C,tempA3RawLa app sigue aceptando raws y firmware antiguos con solo A0/A1.
La aplicacion se comunica por serie mediante comandos de texto como:
STATUSREINIT_SENSORCONFIG RED=... IR=... AVG=... RATE=... WIDTH=... ADC=... SKIP=... DEBUG=...CONFIG_TEMP VCC=... RFIX=... RN=... BETA=... OFFSET=... ADCBITS=...START_CONTINUOUSSTART_TEMPSTOPDIAGNOSTICO
Antes de iniciar una toma, el software verifica que la configuracion confirmada por Arduino coincide con la solicitada.
.env, entornos virtuales yresultados/no se versionan.- El repositorio contiene el codigo, scripts de arranque, firmware y documentacion tecnica.
- Los datos reales de medicion deben mantenerse fuera del historial publico.