Talar Arduino pulsmätare (4 / 5 steg)
Steg 4: kodning
Detta är verkligen mitt i detta projekt (heh). För steg 3, du har fysiska pulsmätaren, men nu du bestämmer vad du ska göra med enheten. RGB LCD-Shield levereras med 5 programmerbara knappar. För vårt projekt beslutat vi om följande:
- UPP: Tar en läsning av din puls.
- NER: Visar medelvärdet av sista 4 puls avläsningar.
- VÄNSTER: Visar de 4 sista avläsningarna.
- HÖGER: Ger lite motivation.
- Välj: Förklarar varje knapp.
Det finns tre delar till kodning:
- Puls sensordata
- Wave sköld ljudutgång
- RGB LCD sköld display & knapp pressar
Nu släpper över själva koden. Vi maskor i princip fritt tillgängliga kod tillsammans från RGB LCD sköld, Wave sköld och puls Sensor webbplatser. Vi kommer också bifoga filerna behöver du i TXT-format. Observera att du behöver en fil som tillhandahållits av puls Sensor hemsida kallas Interrupt.ino (ändrar inte denna fil på något sätt). Denna fil körs i bakgrunden och gör det hårda arbete som går in i beräkningen av din BPM från puls sensormätningar. Observera att filen måste vara i samma katalog som den som visar vi nedan för koden för att arbeta. Det är också viktigt att komma ihåg ljud filnamnen för att kalla de specifika filerna. Du kommer att märka playcomplete ("file_name.wav") innehåller ett specifikt filnamn. När du laddar upp följande fil (med avbrott filen i samma katalog) är du bra att gå!
< p > / / project: interaktiv pulsmätare med ljud < /p >< p > / / LCD sköld bibliotek
#include < Wire.h >< wire.h >
#include < < /wire.h > MCP23017.h Adafruit_ >< /p >< p >< wire.h >< adafruit_mcp23017.h > #include << adafruit_rgblcdshield.h >< /adafruit_rgblcdshield.h >< /adafruit_mcp23017.h >< /wire.h > Adafruit_RGBLCDShield.h >< /p >< p > #include < Average.h >< average.h >< /average.h >< /p >< p > / / waveshield bibliotek
#include < FatReader.h >< /p >< p >< fatreader.h > #include < SdReader.h >< sdreader.h >
#include < avr/pgmspace.h >< avr pgmspace.h= "" >
#include "WaveUtil.h"
#include "WaveHC.h" < / avr >< /sdreader.h >< /fatreader.h >< /p >< p > / / föremål för ljud
SdReader kort; Detta objekt innehåller information för kortet
FatVolume vol; Detta innehåller information för partitionen på kortet
FatReader rot. Detta innehåller information för filsystemet på kortet
FatReader f; Detta innehåller information för filen vi är spelar
WaveHC våg; Detta är enda våg (ljud)-objektet, eftersom vi bara kommer att spela en i taget < /p >< p > #define DÄMPNINGSTID 100 / / knappen debouncer, kanske inte behövs < /p >< p > / / ===
Anpassad från Adafruit Waveshield hemsida
metoder för felsökning
void sdErrorCheck(void) / / kontrollerar SD-kortet
{
om (! card.errorCode()) återvända;
putstring ("\n\rSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
While(1);
} < /p >< p > / / Anpassad från Adafruit rgb lcd sköld hemsida
Rgb LCD-skärmen använder I2C SCL och SDA stiften. På klassiska Arduinos
Detta är Analog 4 och 5 så du inte kan använda de för analogRead() längre
Men kan du ansluta andra I2C sensorer till I2C bussen och andel
I2C bussen.
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield(); < /p >< p > / / dessa #defines gör det enkelt att ställa in bakgrundsljus färg
#define röd 0x1
#define gul 0x3
#define grön 0x2
#define kricka 0x6
#define blå 0x4
#define VIOLET 0x5
#define vit 0x7 < /p >< p > / / ===
PULS SENSOR kod: anpassad från puls Sensor hemsida för detta projekt
/ * < /P >< p >>> puls Sensor Amped 1,2 <<
Denna kod är för puls Sensor Amped av Joel Murphy och Yury Gitman
< en href = "http://www.pulsesensor.com" > www.pulsesensor.com < /a >
>>> Puls Sensor lila tråd går till analoga stift 0 <<<
Puls Sensor provtagning och behandling sker i bakgrunden via Timer 2 avbrott. 2mS samplingsfrekvens.
PWM på stift 3 och 11 fungerar inte när du använder denna kod, eftersom vi använder Timer 2!
Följande variabler uppdateras automatiskt:
Signal: int som håller den analoga signalen datan direkt från sensorn. uppdateras varje 2mS.
IBI: int som håller tidsintervallet mellan slår. 2mS resolution.
BPM: int som håller pulsen, kommer varje beat, från tidigare 10 IBI värden i genomsnitt.
QS: boolean som görs true puls är försumbart och BPM är uppdaterad. Användaren måste återställa.
Puls: booleskt värde som är sant när ett hjärtslag är kände sedan false i tid med pin13 LED går ut.
* / < /p >< p > / / variabler
int pulsePin = 2; Puls Sensor lila tråd ansluten till analoga stift 2 (rgb LCD-sköld)
int blinkPin = 6; PIN blinka ledde på varje slå < /p >< p > int fadeRate = 0; < /p >< p > int heartvals [4].
int h = 0; < /p >< p > / / dessa variabler är flyktiga eftersom de används under avbrottstjänstens rutin!
flyktiga int BPM; används för att hålla pulsen
flyktiga int Signal; innehar inkommande rådata
flyktiga int IBI = 600; har tiden mellan slår, måste vara seedad!
flyktiga booleska puls = false; sant när pulse wave är hög, falskt när det är lågt
flyktiga booleska QS = false; blir sant när Arduoino finner en beat. < /p >< p > / / === < /p >< p > void setup() {< /p >< p > pinMode (blinkPin, produktionen); / / PIN-kod som kommer att blinka till ditt hjärta! < /p >< p > / / Set utgångsstift för DAC kontroll. Detta stift definieras i biblioteket
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT); < /p >< p > / / Aktivera pull-up motstånd på switch stift (analoga ingångar)
digitalWrite (14, hög).
digitalWrite (15, hög).
digitalWrite (16, hög).
digitalWrite (17, hög),
digitalWrite (18, hög).
digitalWrite (19, hög); < /p >< p > Serial.begin (9600); < /p >< p > / / felsökning metoder från waveshield hemsida
om (! card.init(true)) {//play med 4 MHz spi om 8MHz inte fungerar för dig
om (! card.init()) {//play med 8 MHz spi (standard snabbare!)
putstring_nl ("kort init. misslyckades!"); Något gick fel, kan skriva ut varför
sdErrorCheck();
While(1); sedan 'stoppa' - gör ingenting!
} < /p >< p > / / Aktivera optimera Läs - vissa kort kan timeout. Inaktivera om du har problem
card.partialBlockRead(true); < /p >< p > / / nu kommer vi söker en FAT-partition!
uint8_t del;
för (del = 0; del < 5; del ++) {/ / vi har upp till 5 platser att titta i
om (vol.init (kort, del))
bryta; Vi hittade en, låter borgen
} < /p >< p > om (del == 5) {/ / om vi slutade inte att hitta en :(
putstring_nl ("ingen giltig FAT-partition!");
sdErrorCheck(); Något gick fel, kan skriva ut varför
While(1); sedan 'stoppa' - gör ingenting!
} < /P >< p > / / kan tala om för användaren om vad vi hittade
putstring ("använda partition");
Serial.Print (del, DEC);
putstring (", typ är FAT");
Serial.println(Vol.fatType(),dec); FAT16 eller FAT32? < /p >< p > / / försöka öppna rotkatalogen
om (! root.openRoot(vol)) {
putstring_nl kan inte ("öppna rotfästa dir!"); Något gick fel,
While(1); sedan 'stoppa' - gör ingenting!
} < /p >< p > / / sekundär fil med kod för puls Sensor
interruptSetup(); ställer in för att läsa puls Sensor signal varje 2mS
O-kommentera nästa rad om du driver puls Sensor vid låg spänning,
OCH TILLÄMPA DEN SPÄNNINGEN TILL A-REF STIFT
analogReference(EXTERNAL); < /p >< p > / / in för LCD
LCD.BEGIN (16, 2);
lcd.setBacklight (röd); < /p >< p > lcd.setCursor (0, 0);
LCD.Print ("Välkommen till din");
lcd.setCursor (0, 1);
LCD.Print ("Arduino HRM!");
playcomplete("Intro.wav"); < /p >< p > / / lcd.clear(); < /p >< p >} / / END void SETUP < /p >< p > uint8_t jag = 0; < /p >< p > / / === < /p >< p > void loop() {
uint8_t knappar = lcd.readButtons();
om (knappar) {
LCD.Clear();
lcd.setCursor (0, 0); < /p >< p > om (knappar & BUTTON_UP) {
heartRate();
}
om (knappar & BUTTON_LEFT) {
playcomplete ("readings.wav");
lcd.setCursor (0, 0);
LCD.Print ("senaste 4 avläsningar:");
lcd.setCursor (0, 1);
int i;
för (jag = 0; jag < 4; i ++) {
LCD.println (heartvals [i]);
}
}
om (knappar & BUTTON_RIGHT) {
int randNumber = 0;
randNumber = random (1, 10);
om (randNumber == 1) {
playcomplete("1.wav");
}
om (randNumber == 2) {
playcomplete("2.wav");
}
om (randNumber == 3) {
playcomplete("3.wav");
}
om (randNumber == 4) {
playcomplete("4.wav");
}
om (randNumber == 5) {
playcomplete("5.wav");
}
om (randNumber == 6) {
playcomplete("6.wav");
}
om (randNumber == 7) {
playcomplete("7.wav");
}
om (randNumber == 8) {
playcomplete("8.wav");
}
om (randNumber == 9) {
playcomplete("9.wav");
}
om (randNumber == 10) {
playcomplete("10.wav");
}
}
om (knappar & BUTTON_DOWN) {
averageH();
}
om (knappar & BUTTON_SELECT) {
LCD.Print ("Markera");
playcomplete ("select.wav");
}
}
} / / END void LOOP < /p >< p > / / === < /p >< p > / / metoder behövs för att spela WAV-filer
Anpassad från waveshield webbplats < /p >< p > / / spelar en full fil från början till slut med ingen paus.
void playcomplete(char *name) {
Ring vår hjälpare för att hitta och spela detta namn
playfile(Name);
samtidigt (wave.isplaying) {
göra ingenting samtidigt dess spelar
}
dess gjort spelar nu
} < /p >< p > void playfile(char *name) {
se om objektet våg för närvarande gör något
om (wave.isplaying) {/ / redan spelar något, så sluta det!
Wave.stop(); Sluta
}
titta i rotkatalogen och öppna filen
om (! f.open (rot, namn)) {
putstring kunde inte ("öppna filen");
Serial.Print(Name);
hemkomst.
}
OK läsa filen och förvandla det till en våg objekt
om (! wave.create(f)) {
putstring_nl ("inte en giltig WAV");
hemkomst.
} < /p >< p > / / ok tid att spela! starta uppspelningen
Wave.Play();
}
=== < /p >< p > / / en metod kallad att läsa och visa BPM på lcd på upp tryck på knapp
void heartRate() {
int x = 10. < /p >< p > medan (x! = 0) {
om (QS == true) {/ / kvantifierade Self flagga är sant när arduino finner ett hjärtslag
fadeRate = 255; Ange "fadeRate" variabel till 255 blekna LED med puls
lcd.setCursor (0, 0);
LCD.Print ("puls:");
lcd.setCursor (12, 0);
LCD.println (BPM);
lcd.setCursor (0, 1);
LCD.Print ("du är vid liv!");
fördröjning (500).
QS = false; återställa flaggan kvantifierade Self till nästa gång
x--;
}
}
heartvals [h] = BPM;
om (h < 4) {
h ++;
}
annars om (h == 4) {
h = 0;
heartvals [h] = BPM;
} < /p >< p > int i;
för (jag = 0; jag < 4; i ++) {
Serial.println (heartvals[i]);
}
playcomplete ("finished.wav");
} < /p >< p > / / metod för att beräkna medelvärdet av de 4 värdena i heartvals
void averageH() {
int medelvärde = 0;
om (heartvals [3] == 0) {
lcd.setCursor (4, 0);
LCD.Print ("fel...");
lcd.setCursor (0, 1);
LCD.Print ("4 värden behövs");
}
annat {
playcomplete ("average.wav");
genomsnittliga = medelvärdet (heartvals, 4);
lcd.setCursor (0, 0);
LCD.Print ("genomsnittliga:");
lcd.setCursor (9, 0);
LCD.Print (genomsnitt);
}</p><p>}</p><p>//===============================================================================</p>