Paso 4: Software de Arduino
Para ponerse en marcha que necesita las librerías GFX y ST7735 Arduino de Adafruit. Usted puede encontrar aquí (gracias Limor).
Biblioteca GFX
https://github.com/Adafruit/Adafruit-GFX-Library
ST7735 biblioteca
https://github.com/Adafruit/Adafruit-ST7735-Library
¿No está seguro de cómo instalar una librería de Arduino? Vaya aquí para las instrucciones completas;
https://www.Arduino.CC/en/Guide/Libraries
Cómo funciona
En empiece para arriba, el software se enciende el Led IR e indica al usuario que van del aparato es necesario y comenzará en 10 segundos. Esto da el tiempo de usuario colocar su dedo en el sensor.
Durante desde el software lee la salida de la ADC para 10000 veces, deteniéndose brevemente para 1mS por Lee. Esto se utiliza para registrar los límites máximos y mínimos de la señal muestreada crudo.
Estos valores máximos y mínimos se utilizan para determinar los puntos del disparador dinámico para detectar un borde agudamente de levantamiento en los latidos del corazón para permitir la sincronización del período entre pulsos y por lo tanto, calcular el valor de BPM.
El gatillo bajo nivel presenta histéresis y es necesario para evitar que vuelva a accionar debido a la frecuencia de muestreo alta como se muestra arriba.
El iPulseTriggerLevelHigh de punto de disparo de nivel alto es del 90% del pico (verdes estrellas en diagramas anteriores) y el punto de activación de nivel bajo es iPulseTiggerLevelLow es del 70% del pico (estrellas azules en diagramas anteriores).
El software entonces entra en un bucle infinito tomando muestras de la señal después de un tiempo transcurrido de ulElapsedTime, aproximadamente 1mS o 1000Hz. Esto se puede ajustar variando el #define SAMPLE_PERIOD_uS.
El retraso de tiempo transcurrido no es una llamada de bloqueo para otras tareas de fondo pueden llevarse a cabo si es necesario.
Una vez que una muestra del corazón batir se lee de la ADC que el valor se ajusta para adaptarse a la ventana de forma de onda. Esta escala es sólo directa 0-5v = > 0-1023 = > 0-100.
Omití deliberadamente auto escalado de la ventana de forma de onda que encontré cuando yo incluido, la forma de onda bastante mucho montar la ventana cada vez que, como era de esperar. En hacer así que perdiste un montón de información importante, como cuando mis dedos estaban fríos o mal posicionados en el sensor y como consecuencia el pulso a nivel de la salida era baja. Me sentí más útil para mantener esta información actual. Aunque presentó un fAmplificationFactor variable (línea 171, a 2.1) que puede utilizarse para ampliar la señal si tus habilidades de construcción y la electrónica producen una señal menos sensible que era capaz de lograr.
El código determina si se trata de un flanco ascendente (consulte los diagramas anteriormente para la lógica). Si es y no se ha detectado ningún flanco descendente que almacena el tiempo en ulPulseCurrentTime. Sin embargo si lo es y se ha detectado un flanco descendente que esto significa el tiempo transcurrido es el período entre pulsos.
El software calcula los BPM (como en los diagramas anteriores) y una envoltura en la llamada a la función millis() ajusta si es necesario.
Este nuevo pulso es almacenada secuencialmente en el balanceo ventana buffer matriz lBPMArray [] y calcula el promedio a través de todas las muestras. El nuevo valor de BPM calculado se compara con la antigua BPM. Si la diferencia es la pantalla se actualiza con el nuevo valor. Por lo tanto reduce el overhead de la actualización TFT.
Durante el desarrollo del código me di cuenta que no era posible optimizar una tarifa de exploración individual de la TFT de BPMs que van 50... 200. Tan iSampleCountMax cambia dinámicamente cuando el pulso supera 100BPM tal que la pantalla no se llena demasiado de gente y la forma del pulso es todavía clara.
El software entonces clips la forma de onda si por alguna razón es tomó grande para la pantalla y la pantalla actualiza con la última muestra de ADC y parcelas en la ventana de forma de onda.
Primero se eliminan antes trazados valores escribiendo una línea negra vertical delante de la posición de la trama sobre la marcha'.
Bucle se repite.
Media del balanceo
Frecuencia cardíaca se calcula tomando continuamente actualizada del balanceo promedio de los períodos entre pulsos. La longitud de la media acumulada puede ajustarse modificando el valor de #define MAX_BPM_ARRAY_SIZE. Cuanto más haces más lenta las actualizaciones, pero mejor la aproximación (suponiendo que el dedo se mantiene constante en el sensor).
Para la media con un valor inicial de la semilla la matriz lBPMArray [] es cargado con un ritmo de 60BPM en el arranque.
.
Una copia del código se ha incluido a continuación.