Stap 6: programmeren
Utility Functions
De enige tool die ik heb is het nemen van de 5 beat keer gelezen en gemiddeld hen dan ze te converteren naar een beats per minuut.
Twitter
Dit is waar de twitter-bericht wordt verwerkt en verzonden. U bent gewaarschuwd als er iets misgaat en het foutbericht gegeven van twitter in de seriële monitor. Dit is belangrijk omdat netwerken altijd een pijn zijn. Ook wordt niet twitter verstoord wanneer u duplicaten verzendt. Dus als je hart is hetzelfde voor twee tweets in een rij en u zijn of niet bewegen. Het zal niet tweet tenzij er iets veranderd.
Sensoren
In de check verkeer functie kunt u zien dat de vroegere en huidige waarden worden vergeleken om te zien als er een wijziging is geweest. De wijziging wordt een beweging van een soort. Ik heb als verklaringen ingesteld zodat beweging wordt gedetecteerd in alle drie dimensies en ik heb een gevoeligheid instellen zodat kunt u precies hoeveel beweging zet de functie van de beweging. Het aantal keren verplaatst wordt vervolgens vergeleken met het totale aantal verkeer leest en vervolgens een eindoordeel wordt doorgegeven of er sprake is of was niet beweging tijdens de geselecteerde periode. Deze termijnen zijn als windows. Dus als ik in het tweede venster van 30 verplaatst, zal de Arduino tweet die ik binnen 30 seconden verplaatst heb. Als ik nog steeds ben, zal het zeggen dat ik blijf nog steeds tot het volgende venster. Het ook gefilterd zodat gonna jeuken uw neus of dingen als dat zal niet worden geteld als totale beweging.
De hartslagsensor telt de hoeveelheid tijd tussen elke hartslag voor 5 beats en vervolgens het gemiddelde van hen. De tijd tussen beats zal niet worden opgenomen als het buiten het bereik van een menselijk hart. Anders zou elke kramp of aanraking van de sensor Registreer als een wilde beat per minuut waarde. Tenzij je Lance Armstrong of een zoemende vogel moet uw BPM tussen 30 en 220. In studies gedaan onder 30BPM is uiterst onwaarschijnlijk en over 250BPM betekent meestal dat een arts wil je schokken met een defibrillator. Dit bereik kan gemakkelijk worden gewijzigd in het programma, als je toevallig net zo Dhr. Armstrong. Of een zoemende vogel squirrle man ding.
Uitgang
Dit is waar u zal besteden veel tijd als er fouten zijn gemaakt. Ik heb een paar uur wezenloos staren naar dit venster voor vele uren tijdens dit project. Ik hoop jij ook, want als het de eerste keer werkt niet je het goed doet.
De output gewoon neemt alle opgenomen gegevens en het naar de seriële console in de printStatus functie-uitgangen. Dit is voor probleemoplossing of onderzoek.
De tweetStatus neemt de verzamelde informatie uit de sensoren en tweets een bericht naar gelang van welke staat dat je bent tijdens uw slaap.
Functies van de Arduino
Gewoon de setup en de hoofdlus. Vrij zelf verklarend.
Hier is de Code:
#if defined(ARDUINO) & & ARDUINO > 18 / / Arduino 0019 of hoger
#include
#endif
#include
#include
#include
#include
#include
Versnellingsmeter staat
int x, y, z;
Versnellingsmeter lezingen
Booleaanse movementHistory [5] = {onwaar, false, false, false, onwaar};
Het tijdstip van de laatste hartslag
unsigned long lastMovementReadingTime = 0;
Het aantal leest genomen
int movementReads = 0;
Het aantal keren verplaatsen wanneer lezen
int movementCount = 0;
Hartslag sensor status
int irSensorState = 0;
Hartslag lezingen
int pulseTime [5] = {0,0,0,0,0};
Het tijdstip van de laatste hartslag
unsigned long currentTime = 0;
Hartslag pinnen
int SensorPin = 8;
int LEDpin = 9;
nodig voor twitter
unsigned long lastPrint = 0;
unsigned long lastTweet = 0;
Ethernet Shield instellingen
byte mac [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
vervangen van een adres op uw eigen netwerk hier
byte ip [] = {192, 168, 0, 250};
Uw Token om Tweet (het krijgen van http://arduino-tweet.appspot.com/)
Twitter twitter ("zet uw token hier.");
//=============================
Utility Functions
//=============================
/ * Duurt gemiddeld van de tijd tussen hartslagen * /
int calcPulseRate()
{
int pulseRate;
pulseRate = pulseTime [0] + pulseTime [1] + pulseTime [2] + [3] pulseTime, pulseTime [4]; Vervolgens neemt 60/gemiddelde te krijgen van de BPM
pulseRate = 60000 / (pulseRate/5);
Return pulseRate;
}
//=============================
Twitter
//=============================
/ * tweets van het ingevoerde bericht aan twitter * /
VOID tweet (char * msg)
{
Serial.println ("verbinden...");
Als (twitter.post(msg)) {}
Geef & seriële uitgang ontvangen reactie op Serial.
Als geen uitvoer vereist is, kunt u het argument, bijvoorbeeld gewoon weglaten
int status = twitter.wait();
int status = twitter.wait (& Serial);
Als (status == 200) {}
Serial.println("OK.");
} else {}
Serial.Print ("mislukt: code");
Serial.println(status);
}
} else {}
Serial.println ("verbinding mislukt.");
}
}
//=============================
Sensoren
//=============================
/ * Controleert als er een wijziging aangebracht in versnellingsmeter positie is * /
Booleaanse checkMovement() //function oude waarden naar nieuwe ones vergelijkt en detecteert alleen als een bepaalde ammount verkeer gebeurt
{
Boolean ret = false;
int gevoeligheid = 3;
int newX, newY, newZ;
/ * Lees de nieuwe waarden * /
newX = analogRead(0); lezen van analoge invoer pin 0
newY = analogRead(1); analoge invoer pin 1 lezen
newZ = analogRead(2); analoge invoer pin 2 lezen
/ * Gecontroleerd op wijzigingen * /
Als (x-newX > gevoeligheid || x-newX <-gevoeligheid)
{
RET = true;
}
anders als (y-newY > gevoeligheid || y-newY <-gevoeligheid)
{
RET = true;
}
anders als (z-newZ > gevoeligheid || z-newZ <-gevoeligheid)
{
RET = true;
}
Als (millis() - lastMovementReadingTime > 30000)
{
for (int i = 4; ik > 0; ik--)
{
movementHistory [i] = movementHistory [i-1]; De matrix automatisch bijgewerkt, zodat de eerste waarde kan worden gewijzigd
}
movementHistory [0] = false;
Taakcyclus = 10%
Als (10 < = ((movementReads/movementCount) * 100))
{
movementHistory [0] = true;
}
movementReads = 0;
movementCount = 0;
lastMovementReadingTime = millis();
}
Als (ret)
{
movementCount ++;
}
movementReads ++;
Nieuwe waarden opslaan
x = newX;
y = newY;
z = newZ;
/ * Serial.print(newX);
Serial.Print("");
Serial.Print(newY);
Serial.Print("");
Serial.println(newZ); * /
retourneren of er beweging is
keren movementHistory [0];
}
/ * Leest de IR-sensor en wordt de tijd tussen hartslagen * /
int getHeartRate()
{
De status van de foto transistor aan stor gewend
int newState = digitalRead(SensorPin);
Is er een verandering
Als (newState! = irSensorState)
{
if(newState == 1)
{//beat is 1 of 0 dit als verklaring wordt alleen worden ingevoerd wanneer een 1 op een 0 of een 0 naar een 1 draait
for (int i = 4; ik > 0; ik--)
{
pulseTime [i] = pulseTime [i-1]; De matrix automatisch bijgewerkt, zodat de eerste waarde kan worden gewijzigd
}
/*
* Dit is het filter voor het systeem. De hartslag is niet toegestaan om te gaan boven 250BPM of onder 30BPM
* Andere filteren statistiek. Controleer of de waarde tussen beats groter dan een bepaald niveau is. Een grote verandering werkt niet, gewogen gemiddelde. vertraging spul.
*/
if(Millis() - currentTime > 240 & & millis() - currentTime < 2000 / * & & isMoving() == false * /)
{
pulseTime [0] = millis() - currentTime; houdt de tijd tussen beats tot een redelijk bereik om verwarring te voorkomen
}
}
if(newState == 0)
{
currentTime = millis();
}
Opslaan van de nieuwe staat
irSensorState = newState;
}
Berekent de hartslag aan het einde
Return calcPulseRate();
}
//=============================
Uitgang
//=============================
/ * Alle gegevens naar de seriële monitor worden afgedrukt * /
VOID printStatus (boolean isMoving, int pulseRate)
{
Als (millis() - lastPrint > = 1000)
{
Verkeer status afdrukken
Serial.Print ("verkeer:");
Als (isMoving)
{
Serial.println("True");
}
anders
{
Serial.println("false");
}
Pulse status afdrukken
Als (pulseTime [4] == 0)
{
Serial.println("Calibrating"); als 5 lezingen zijn niet genomen is nog steeds het apparaat kalibreren
} else
{
Serial.Print(pulseTime[0]); De gegevens worden afgedrukt
Serial.Print (",");
Serial.Print(pulseTime[1]);
Serial.Print (",");
Serial.Print(pulseTime[2]);
Serial.Print (",");
Serial.Print(pulseTime[3]);
Serial.Print (",");
Serial.Print(pulseTime[4]);
Serial.Print (",");
Serial.Print ("BPM:");
Serial.println(pulseRate);
}
lastPrint = millis();
}
}
/ * Vindt het bericht van de apprpriate volgens bewegingen en polsslag en verzendt het bericht naar de tweet functie * /
VOID tweetStatus (boolean isMoving, int pulseRate)
{
char msg [140];
Is de lengte van de tijd tussen tweets en andere filters om te beslissen welk bericht moet worden verzonden naar twitter
Als (millis() - lastTweet > = 300000) //5 minuten
{
Als (pulseRate > 120 & & isMoving)
{
sprintf (msg, "Awake met een polsslag van: %d", pulseRate);
}
anders als (pulseRate > 120 & &! isMoving)
{
sprintf (msg, "spannende droom met een polsslag van: %d", pulseRate);
}
anders
{
sprintf (msg, "slapen met een polsslag van: %d", pulseRate);
}
Tweet(msg);
de laatste keer bijgewerkt aangezien een tweet is gemaakt
lastTweet = millis();
}
}
//=============================
Functies van de Arduino
//=============================
/ * De Arduino setup functie * /
VOID Setup
{
delay(1000);
Ethernet.begin (mac, ip);
Serial.begin(9600);
pinMode(LEDpin,OUTPUT);
pinMode(SensorPin,INPUT);
digitalWrite(LEDpin,HIGH); Besturing weer de IR LED is in- of uitschakelen
}
/ * De Arduino uitvoeren lus dat de controles van de sensoren en stuurt vervolgens een tweet afhankelijk van de status van de sensoren * /
void loop
{
Boole isMoving = false;
int tekeer = 0;
/ * de versnellingsmeter controles voor veranderingen te zien of het apparaat verplaatsen of niet * /
isMoving = checkMovement();
/ * Berekent de gemiddelde hartslag in slagen per minuut volgens verschillen gedetecteerd door de IR-tranistor * /
Hartslag = getHeartRate();
/ * stuurt een bericht naar de seriële console * /
printStatus (isMoving, tekeer);
/ * stuurt een bericht naar twitter afhankelijk van de hartslag van de gebruikers en verkeer * /
tweetStatus (isMoving, tekeer);
}