Stap 5: programmering
Als je kan kritiek en alternatieve oplossingen met betrekking tot mijn code, kunt u dit doen! Programmeren is een beetje meer begrijpelijk dan algemene elektronica voor mij, maar ik voel me nog steeds verloren vaker wel dan niet.
De opmerkingen in de code - ik heb het toegevoegd in een textbox en als een bijgevoegd Ino bestand, de bibliotheek vindt u hier. Hebt u moeite opzetten voor de capacitieve Sensing code & aansluitingen, check deze video, gered het me. LED fader bibliotheek kan worden gevonden hier. MAKE magazine's processing schets werd gebruikt voor visualisatie, het kan worden gevonden hier.
Voordat u de code schrijft moest ik begrijp een paar fundamentele dingen die betrokken zijn bij de werking van het hart en het circuit die ik heb gemaakt voor polsmeting die ik hier kort zal toelichten.
De sensor die ik heb gebruikt een LDR als een sensing deel. Een LDR heeft een bereik van de weerstand waarin de weerstand is afhankelijk van de hoeveelheid licht die het bereikt. Hoe meer licht er is - hoe kleiner de weerstand en vice versa. In dit geval wat we voelen als een puls is wat er gebeurt nadat de aortaklep opent en het bloed via onze bloedsomloop stroomt. Op het moment van de pols de hoeveelheid bloed in je vinger daarom verschillende waardoor u de wijziging in de lezing. Als bloed werd geduwd door je lichaam door het hart, betekent dit dat het hart zich op het moment van de beat leegt-dit is de reden waarom ik een code die het hart aan 0 geschreven heb dimt wanneer het beats en daarna begint het dimmen op een hogere waarde vertegenwoordigen van het hart met bloed te vullen. Zoals u in het diagram Wiggers zien kunt - het hoofdvolume van het hart is niet geleidelijk vullen omhoog met bloed tot de volgende beat, maar er is een snelle instroom waar allermeest naar de hart vult en vervolgens wat meer tijdens de rectus, totdat de atriale systole-fase begint. Elke één van deze drie fasen lijken te nemen ongeveer een derde van de tijd tussen de beats, maar een ander diagram van een cardiale cyclus die hier heeft het verdeeld met inbegrip van een tijdas. Dus ik schreef de code volgens het: een pauze voor approx 100ms na de beat, dan snelle fade-in tot 90% tijdens de volgende 150ms en een tragere resterende vervagen in de volgende 200ms. Dit laat ons meer dan een halve seconde totdat de volgende verslaan voor de prijs van een normale 60BPM krijgt een volledige fade in totdat de volgende klop tot 130BPM en zelfs het grootste deel van het fade-in tot 230BPM die nauwelijks fysiek mogelijk is in een mens, misschien een probleem zou kunnen worden als je besloten om een puls van sommige kleinere dier meten , maar ik denk niet dat uw Yorkshire Terriër zou ook goed met een puls als dat ofwel. Belangrijk is dat dit het probleem lost hebben om gemiddelde en voorspellen van de tijd tussen de beats in programmacode voor het wijzigen van de fade perioden.
Code v1.1 voor Gefacetteerd hart lamp door Raitis. Bezoek http://snipegift.com voor mijn andere projecten. int flt = 5; vinger licht VOID Setup {} void loop {}
Volledige tutorial voor de lamp op instructables:
#include
#include
#define LED_PIN 3
#define DIR_UP 1
#define DIR_DOWN -1
LEDFader geleid;
int richting = DIR_UP;
CapacitiveSensor lampon = CapacitiveSensor(4,2); hoofdschakelaar
CapacitiveSensor hrson = CapacitiveSensor(4,6); HRS schakelaar
int uur = 0; hartslagsensor
pinMode (flt, OUTPUT);
geleid = LEDFader(LED_PIN);
LED.Fade(0,1);
}
digitalWrite(flt,LOW);
LED.update();
lange total1 = lampon.capacitiveSensor(30);
lange total2 = hrson.capacitiveSensor(30);
Als (total1 > 1600 & & led.get_value() > 0 & & led.is_fading() == false) {//turns lamp uit, de capsense-waarde verschilt terwijl op USB en af, dus test jouwe
LED.Fade(0,1000);
richting = DIR_DOWN;
}
Als (total1 > 1600 & & led.get_value() == 0 & & led.is_fading() == false) {//turns licht op, de langzaam verdwijnende == false voorwaarde vermijdt het opnieuw uitzetten van een enkele aanraking
LED.Fade(179,1000);
richting = DIR_UP;
}
terwijl (total2 > 700) {//a lus actief als de vinger wordt gelegd op de stalen plaat in de vinger-pit
LED.update();
lange total1 = lampon.capacitiveSensor(30);
lange total2 = hrson.capacitiveSensor(30);
uur = analogRead(0); begint het lezen van de sensor
digitalWrite (flt, hoge); Hiermee schakelt u het licht van de vinger
delay(1); om te voorkomen dat de kriebels
Als (hrs > 150) {//when de lezing hrs 150 bedraagt is het meest waarschijnlijk pulse, geen lawaai in mijn geval. Hangt op de transistor gebruikt denk ik.
LED.Fade(0,10); Fading volgens de werking van hart
richting = DIR_DOWN;
LED.Fade(0,100);
richting = DIR_DOWN;
LED.Fade (225, 150);
richting = DIR_UP;
LED.Fade (255, 200);
richting = DIR_UP;
delay(260); om te voorkomen dat kriebels tot vervagen tot 225
}
Als (total2 < 150) {//why doen ik moet dit als terwijl onder 700 toch moet afsluiten?
LED.Fade (179, 1000); terug naar standaard 70% helderheid verdwijnt wanneer de stalen plaat niet meer is aangeraakt
richting = DIR_DOWN;
breken;
}
}
}
Zoals u zien kunt, gladmaken ik niet elke voor de analoge ingang. Ik heb echter een versie met het testen en ontdekten dat bij het gebruik van een lopend gemiddelde voor een laag aantal lezingen, zoals 10, geen echte voordelen biedt van het hebben van het. Gemiddeld een groter aantal lezingen glad de dingen vrij goed, maar dan is er nog de kwestie van een enorme vertraging. Ik heb een idee voor een oplossing voor die vertraging die waarschijnlijk de kriebels wegnemen zou bij het plaatsen van de vinger (Zie gif) en test het en voeg alternatieve code hier als het werkt, maar als nu, werkt deze code die ik gebruik en ik heb geen probleem, laat het zoals het is.
Update: Ik heb geprobeerd een alternatief code met vloeiend maken die reageert op een trend verandering in gemiddelde lezingen te identificeren beat, maar terwijl het concept werkt prima alleen, het werkt gewoon niet zoals hoort terwijl het proberen te vervagen. Het reageert op de beat, maar kriebels hele tijd wanneer het niet zou moeten. Als iemand maakt dit echt wil het eens proberen, kan ik sturen u een schets van de alternatieve code. Hier zal niet uploaden om verwarring te voorkomen.