Puls sensing facetterade hjärtat lampa (5 / 9 steg)
Steg 5: programmering
Om du ger kritik och alternativa lösningar när det gäller min koden, behaga gör så! Programmering är lite mer begriplig än allmänna elektronik till mig, men jag känner fortfarande förlorade mer ofta än inte.
Kommentarerna är i kod - jag har lagt det i en textruta och som en bifogad .ino fil, biblioteket kan hittas här. Om du har problem med att konfigurera upp kapacitiv avkänning kod & anslutningar, kolla denna video, räddade det mig. LED-fader bibliotek kan hittas här. GÖR tidningens processing skiss användes för visualisering, det kan hittas här.
Innan du skriver koden hade jag att förstå några grundläggande saker inblandade i hjärtat och den krets som jag gjorde för puls mätning som jag kommer att kortfattat förklara här.
Sensorn jag gjorde används en LDR en avkänning. En LDR har ett motstånd där motståndet beror på mängden ljus som når det. Mer ljus det är - ju mindre motstånd och vice versa. I detta fall vad vi känner som en puls är vad som händer efter aortaklaffen öppnas och blodet rinner genom våra cirkulationssystemet. I ögonblicket då pulsen mängden blod i du finger är därför olika ger dig förändringen i behandlingen. Om blodet var sköt genom kroppen av hjärtat, innebär det att hjärtat tömmer sig för tillfället av beat - det är därför jag har skrivit en kod som tonas ned hjärtat till 0 när det slår och strax efter startar ljusreglering det till ett högre värde som representerar hjärtat fylla med blod. Som ni kan se i Wiggers diagram - den största volymen av hjärtat är inte gradvis fylla med blod tills nästa beat, men det finns en snabb tillströmning där de flesta av hjärtat fyller upp och sedan lite mer under diastasis, tills den förmaksflimmer systole fasen börjar. Var och en av dessa tre faser verkar ta omkring en tredjedel av tiden mellan beats, men ett annat diagram över en hjärt cykel som avses här har det delade inklusive en tidsaxel. Så jag skrev koden enligt det: en paus på ca 100ms efter slå, då snabb toningen i till 90% under nästa 150ms och ett långsammare resterande blekna över nästa 200ms. Detta ger oss mer än en halv sekund tills nästa slå för en normal 60BPM, en full blekna i tills nästa slå tills 130BPM och även större delen av vissna i fram till 230BPM som är knappt fysiskt möjligt i en människa, kanske kan vara ett problem om du valt att mäta en puls av vissa mindre djur , men jag tror inte din Yorkshire Terrier skulle vara alltför väl med en puls som det heller. Det är viktiga att det löste problemet med att i genomsnitt och förutsäga tiden mellan beats i koden för att ändra fade perioder.
Koden v1.1 för facetterade hjärtat lampa av Raitis. Besök http://snipegift.com för mina andra projekt. int flt = 5; finger ljus void setup() { void loop() {
Fullständig handledning för lampan på instructables:
#include
#include
#define LED_PIN 3
#define DIR_UP 1
#define DIR_DOWN -1
LEDFader ledde;
int riktning = DIR_UP;
CapacitiveSensor lampon = CapacitiveSensor(4,2); huvudströmbrytaren
CapacitiveSensor hrson = CapacitiveSensor(4,6); HRS switch
int timmar = 0; pulssensor
pinMode (flt, produktionen);
LED = LEDFader(LED_PIN);
LED.Fade(0,1);
}
digitalWrite(flt,LOW);
LED.Update();
långa total1 = lampon.capacitiveSensor(30);
lång total2 = hrson.capacitiveSensor(30);
om (total1 > 1600 & & led.get_value() > 0 & & led.is_fading() == false) {//turns lampa off, capsense värdet är olika samtidigt på USB och av det, så testa din
LED.Fade(0,1000);
riktning = DIR_DOWN;
}
om (total1 > 1600 & & led.get_value() == 0 & & led.is_fading() == false) {//turns lampa på blekning == false skick undviker det stänga av igen från en enda knapptryckning
LED.Fade(179,1000);
riktning = DIR_UP;
}
samtidigt (total2 > 700) {//a loop aktiv när fingret placeras på stålplåt i finger gropen
LED.Update();
långa total1 = lampon.capacitiveSensor(30);
lång total2 = hrson.capacitiveSensor(30);
timmar = analogRead(0); börjar läsa sensorn
digitalWrite (flt, hög); tänds lampan finger
Delay(1); att undvika nervositet
om (timmar > 150) {//when läsning av timmar är över 150 det är troligen puls, inte buller i mitt fall. Beror på transistorn används antar jag.
LED.Fade(0,10); fading enligt hur hjärtat fungerar
riktning = DIR_DOWN;
LED.Fade(0,100);
riktning = DIR_DOWN;
LED.Fade (225, 150);
riktning = DIR_UP;
LED.Fade (255, 200);
riktning = DIR_UP;
Delay(260); att undvika panik tills fade till 225
}
om (total2 < 150) {//why gör jag behöver detta om samtidigt bör avsluta under 700 ändå?
LED.Fade (179, 1000); tonas tillbaka till standard 70% ljusstyrka när stålplåt inte vidrörs längre
riktning = DIR_DOWN;
bryta;
}
}
}
Som ni ser, använder jag inte någon utjämning för analog ingång. Jag gjorde testa en version med det emellertid och fick reda på att när du använder en löpande genomsnittlig för ett lågt antal läsningar, som 10, det finns ingen verklig nytta av att ha det. I genomsnitt ett större antal behandlingar slätar sakerna ganska bra, men sedan finns det en enorm försening fråga. Jag har en idé till en workaround för den försening som skulle troligen ta bort nervositet när du placerar fingret (se gif) och kommer att testa den och lägga till alternativ kod här om det fungerar, men som för nu, denna kod som jag använder fungerar och jag har ingen fråga lämnar det som det är.
Uppdatering: Jag försökte en alternativ kod med utjämning som reagerar på en trendförändring i genomsnittliga avläsningar till identifiera beat, men medan konceptet fungerar bra ensam, det bara inte fungerar som tänkt när han försökte tona. Den reagerar på beat, men nervositet hela tiden när den inte borde. Om någon verkligen gör detta och vill ge det ett försök, kan jag skicka dig en skiss av alternativa koden. Kommer inte att ladda upp här för att undvika förvirring.