Stap 4: Arduino Software
Aan de slag te gaan moet u de GFX en ST7735 Arduino bibliotheken van Adafruit. U vindt ze hier (Bedankt Nils).
GFX bibliotheek
https://github.com/adafruit/Adafruit-GFX-Library
ST7735 bibliotheek
https://github.com/adafruit/Adafruit-ST7735-Library
Niet zeker hoe installeer ik een Arduino-bibliotheek? Ga hier voor volledige instructies;
https://www.Arduino.CC/en/Guide/libraries
Hoe het werkt
Op opstarten, de software draait op de IR Led en geeft aan dat de gebruiker variërend van het apparaat nodig is en zal beginnen in 10 seconden. Dit geeft de gebruikerstijd te plaatsen hun vinger in de sensor.
Tijdens het variërend van de software leest de output van de ADC voor 10000 keer, onderbreken kort voor 1mS per lezen. Dit wordt gebruikt voor het opnemen van de maximale en minimale grenzen van het ruwe bemonsterde signaal.
Deze maximale en minimale waarden worden gebruikt voor het bepalen van de dynamische triggerpoints te detecteren een sterk stijgende rand in de hartslag inschakelen timing van de periode tussen peulvruchten en vandaar de BPM berekenen.
De lage trigger introduceert hysteresis en is noodzakelijk om te voorkomen dat opnieuw triggering vanwege hoge samplefrequentie als Ga naar boven.
Het hoge niveau trigger punt iPulseTriggerLevelHigh is 90% van de piek (groene sterren in diagrammen hierboven) en het lage niveau trekkerpunt is iPulseTiggerLevelLow is 70% van de piek (blauwe sterren in diagrammen hierboven).
De software invoert dan een oneindige lus signaal monsterneming na een verstreken tijd ingegeven door ulElapsedTime, ongeveer 1mS of 1000Hz. Dit kan worden aangepast door het variëren van de #define SAMPLE_PERIOD_uS.
De verstreken tijdvertraging is niet een blokkerende oproep, zodat andere achtergrondtaken kunnen worden uitgevoerd indien nodig.
Zodra een monster van het hart slaan wordt afgelezen uit de ADC de waarde wordt aangepast aan de golfvorm venster. Deze schalen is gewoon een directe 0-5v = > 0-1023 = > 0-100.
Ik opzettelijk weggelaten automatisch schalen voor de golfvorm venster zoals ik vond toen ik, de golfvorm vrij opgenomen dat veel voorzien het venster elke keer, zoals je zou verwachten. Daarbij dus je een heleboel belangrijke informatie verloren, zoals wanneer mijn vingers werden koud of slecht gepositioneerd in de sensor en dientengevolge de pols uitgangsniveau was laag. Ik voelde het meer nuttig om te houden van deze informatie aanwezig. Wel ik een variabele fAmplificationFactor (lijn 171, ingesteld op 2.1) die kan worden gebruikt voor het schalen van uw signaal indien uw elektronica en bouw vaardigheden opleveren die een minder gevoelige signaal dan ik was in staat om te bereiken bieden.
De code bepaalt vervolgens of dit een stijgende rand (zie diagrammen boven voor logica). Als het is en geen dalende rand is geconstateerd, dat wordt de tijd opgeslagen in ulPulseCurrentTime. Maar als het is en een dalende rand is geconstateerd dat betekent de verstreken tijd is de periode tussen pulsen.
De software berekent de BPM (zoals in de bovenstaande diagrammen) en past zich aan een omslag in de millis() functie-aanroep, indien nodig.
Deze nieuwe polsslag is opeenvolgend opgeslagen in de [rollende venster buffer array lBPMArray] en het gemiddelde berekend over alle monsters. De nieuwe berekende BPM wordt vergeleken met de oude BPM. Als er een verschil wordt de weergave bijgewerkt met de nieuwe waarde. Waardoor TFT update overhead.
Tijdens de ontwikkeling van de code die ik heb gemerkt dat het niet mogelijk om een enkele scanfrequentie van de TFT optimaliseren voor BPMs variërend van 50... 200. ISampleCountMax is zo dynamisch als de hartslag hoger is dan 100BPM zodat het scherm niet te druk geworden en de vorm van de pols nog steeds duidelijk is veranderd.
De software dan clips de golfvorm als om wat voor reden het nam Groot voor het display en het scherm bijwerkt met de nieuwste ADC monster en plots het in de golfvorm venster.
Eerder uitgezette waarden zijn eerst verwijderd door het schrijven van een verticale zwarte lijn vóór de plot positie 'on the fly'.
Lus herhaalt.
Voortschrijdend gemiddelde
Hartslag wordt berekend door het nemen van een voortdurend bijgewerkte voortschrijdend gemiddelde van de periodes tussen pulsen. De lengte van het voortschrijdend gemiddelde kan worden aangepast door het wijzigen van de waarde van #define MAX_BPM_ARRAY_SIZE. Hoe langer er je hoe langzamer de updates, maar hoe beter de onderlinge aanpassing (ervan uitgaande dat de vinger blijft stabiel in de sensor).
Om het zaad van het gemiddelde met een aanvankelijke waarde is de matrix lBPMArray [] vooraf geladen met een hartslag van 60BPM tijdens het opstarten.
.
Een kopie van de code is hieronder opgenomen.