Sova n' Tweet (6 / 8 steg)
Steg 6: programmering
Utility funktioner
Den enda nytta jag har tar 5 beat läst gånger och i genomsnitt dem sedan konvertera dem till ett slag per minut.
Twitter
Detta är där twitter meddelandet bearbetas och skickas. Du är varnad om något går fel och ges felmeddelandet från twitter i följetong monitor. Detta är en viktig eftersom nätverk är alltid en smärta. Också blir inte twitter upprörd när du skickar kopior. Så när du är hjärtat är densamma för två tweets i rad och du är eller inte är rörliga. Det kommer inte tweet om något har förändrats.
Sensorer
I funktionen kontrollera rörelsen kan du se att tidigare och nuvarande värden jämförs för att se om det har skett en förändring. Ändringen är en rörelse av något slag. Jag har om uttalanden så rörelse detekteras i alla tre dimensioner och jag har en känslighet ställa in så att du kan ändra exakt hur mycket rörelse sätter igång funktionen rörelse. Antalet gånger som flyttat är sedan jämfört med det totala antalet rörelsen läser och sedan en slutlig dom skickas om det var eller inte var rörelse under tidsperioden. Dessa tidsperioder är som windows. Så om jag flyttar i det andra fönstret i 30, twittrar Arduino som jag har flyttat inom 30 sekunder. Om jag fortfarande är, kommer det att säga jag förblir fortfarande till nästa fönster. Det är också filtrerats så kommer klia din näsa eller saker som det inte kommer att räknas som totala rörelse.
På dig pulssensorn räknar tid mellan varje hjärtslag för 5 beats och sedan i genomsnitt dem. Tiden mellan slag registreras inte om det är utanför intervallet för ett mänskligt hjärta. Annars varje twitch eller touch sensor skulle registrera sig som en vilda slag per minut värde. Om du inte är Lance Armstrong eller en surrande fågel bör din puls mellan 30 och 220. I studier som har gjorts under 30BPM är ytterst osannolikt och över 250BPM innebär oftast en läkare vill chockera dig med en defibrillator. Detta intervall kan enkelt ändras i programmet om du bara så råkar vara Mr Armstrong. Eller en surrande fågel squirrle man sak.
Utgång
Det är där du kommer att tillbringa mycket tid om det sker några misstag. Jag tillbringade ett par timmar stirrade uttryckslöst på fönstret i många timmar under detta projekt. Jag hoppas du gör också, eftersom om det fungerar första gången du inte gör det rätt.
Resultatet helt enkelt tar alla registrerade information och utgångar till seriekonsoll i funktionen printStatus. Detta är för felsökning eller utredning.
TweetStatus tar den information som samlats in från sensorerna och tweets ett meddelande beroende på vilket skick du är under sömnen.
Arduino funktioner
Bara setup och den viktigaste loopen. Söt jag förklarande.
Här är koden:
#if defined(ARDUINO) & & ARDUINO > 18 / / Arduino 0019 eller senare
#include
#endif
#include
#include
#include
#include
#include
Accelerometer staten
int x, y, z;
Accelerometer avläsningar
booleska movementHistory [5] = {falskt, false, false, false, false};
Tiden för sista hjärtrytm
osignerade långa lastMovementReadingTime = 0;
Antal läsningar tagit
int movementReads = 0;
Hur många gånger flytta när läser
int movementCount = 0;
Puls sensor status
int irSensorState = 0;
Puls avläsningar
int pulseTime [5] = {0,0,0,0,0}.
Tiden för sista hjärtrytm
osignerade långa currentTime = 0;
Puls pins
int SensorPin = 8;
int LEDpin = 9;
behövs för twitter
osignerade långa lastPrint = 0;
osignerade långa lastTweet = 0;
Ethernet-Shield inställningar
byte [mac] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
ersätta en adress på ditt eget nätverk här
byte ip [] = {192, 168, 0, 250};
Din Token tweet (få den från http://arduino-tweet.appspot.com/)
Twitter twitter ("lägga din token i här");
//=============================
Utility funktioner
//=============================
/ * Tar i genomsnitt av tiden mellan hjärtat slår * /
int calcPulseRate()
{
int pulseRate;
pulseRate = pulseTime [0] + pulseTime [1] + pulseTime [2] + [3] pulseTime pulseTime [4]. sedan tar 60/genomsnittligt att få BPM
pulseRate = 60000 / (pulseRate/5).
återvända pulseRate;
}
//=============================
Twitter
//=============================
/ * tweets matas in budskapet till twitter * /
void tweet (char * msg)
{
Serial.println ("ansluta...");
om (twitter.post(msg)) {
Ange & Serial output fick svar på följetong.
Om ingen utgång krävs, kan du bara utesluta argumentet, t.ex.
int status = twitter.wait();
int status = twitter.wait (& följetong);
om (status == 200) {
Serial.println("OK.");
} annat {
Serial.Print ("misslyckades: koden");
Serial.println(status);
}
} annat {
Serial.println ("Anslutning misslyckades.");
}
}
//=============================
Sensorer
//=============================
/ * Kontrollerar om det har skett en förändring i accelerometer läge * /
booleska checkMovement() //function jämför gamla värden till nya och identifierar endast om en viss mängd rörelse sker
{
Boolean ret = false;
int känslighet = 3;
int newX, newY, newZ;
/ * Läs de nya värdena * /
newX = analogRead(0); Läs analog ingångsstift 0
newY = analogRead(1); Läs analog ingång stift 1
newZ = analogRead(2); Läs analog ingång stift 2
/ * För ändringskontroll * /
om (x-newX > känslighet || x-newX <-känslighet)
{
ret = sant;
}
annars om (y-newY > känslighet || y-newY <-känslighet)
{
ret = sant;
}
annars om (z-newZ > känslighet || z-newZ <-känslighet)
{
ret = sant;
}
om (millis() - lastMovementReadingTime > 30000)
{
för (int jag = 4; jag > 0; i--)
{
movementHistory [i] = movementHistory [i-1]; Uppdateringar i matrisen så det första värdet kan ändras
}
movementHistory [0] = false;
Duty cycle = 10%
om (10 < = ((movementReads/movementCount) * 100))
{
movementHistory [0] = true;
}
movementReads = 0;
movementCount = 0;
lastMovementReadingTime = millis();
}
om (ret)
{
movementCount ++;
}
movementReads ++;
Lagra nya värden
x = newX;
y = newY;
z = newZ;
/ * Serial.print(newX);
Serial.Print("");
Serial.Print(newY);
Serial.Print("");
Serial.println(newZ); * /
återgå om det finns rörelse
återgå movementHistory [0];
}
/ * Läser IR-sensorn och får tiden mellan hjärtat slår * /
int getHeartRate()
{
Brukade stor status för foto transistorn
int newState = digitalRead(SensorPin);
Det har skett en förändring
om (newState! = irSensorState)
{
IF(newState == 1)
{//beat är 1 eller 0 om uttalande endast anges när en 1 vänder sig till en 0 eller 0 till 1
för (int jag = 4; jag > 0; i--)
{
pulseTime [i] = pulseTime [i-1]; Uppdateringar i matrisen så det första värdet kan ändras
}
/*
* Detta är filtret för systemet. Pulsen-är inte tillåtet att gå över 250BPM eller under 30BPM
* Andra filtrering metoder. Kontrollera om värdet mellan beats är större än en viss nivå. En stor förändring fungerar inte, viktat medelvärde. dröjsmål grejer.
*/
IF(Millis() - currentTime > 240 & & millis() - currentTime < 2000 / * & & isMoving() == false * /)
{
pulseTime [0] = millis() - currentTime; håller tiden mellan beats till ett rimligt intervall för att undvika missförstånd
}
}
IF(newState == 0)
{
currentTime = millis();
}
Lagra den nya staten
irSensorState = newState;
}
beräknar pulsen i slutet
återvända calcPulseRate();
}
//=============================
Utgång
//=============================
/ * Skriver ut all information till seriell monitor * /
void printStatus (boolean isMoving, int pulseRate)
{
om (millis() - lastPrint > = 1000)
{
Skriva ut rörelsen status
Serial.Print ("rörelse:");
om (isMoving)
{
Serial.println("true");
}
annat
{
Serial.println("false");
}
Puls utskriftsstatus
om (pulseTime [4] == 0)
{
Serial.println("Calibrating"); om 5 avläsningar inte har vidtagits kalibrerar enheten fortfarande
} annat
{
Serial.Print(pulseTime[0]); Skriver ut data
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();
}
}
/ * Finner apprpriate meddelandet enligt rörelser och puls och skickar meddelandet till funktionen tweet * /
void tweetStatus (boolean isMoving, int pulseRate)
{
char msg [140];
Är längden av tid mellan tweets och andra filter för att bestämma vilken meddelande ska skickas till twitter
om (millis() - lastTweet > = 300000) //5 minuter
{
om (pulseRate > 120 & & isMoving)
{
sprintf (msg, "vakna upp med en puls på: %d", pulseRate);
}
annars om (pulseRate > 120 & &! isMoving)
{
sprintf (msg, "spännande dröm med en puls på: %d", pulseRate);
}
annat
{
sprintf (msg, "sova med en puls av: %d", pulseRate);
}
Tweet(MSG);
uppdateras senast sedan en tweet gjordes
lastTweet = millis();
}
}
//=============================
Arduino funktioner
//=============================
/ * Arduino setup-funktionen * /
void setup()
{
Delay(1000);
Ethernet.BEGIN (mac, ip);
Serial.BEGIN(9600);
pinMode(LEDpin,OUTPUT);
pinMode(SensorPin,INPUT);
digitalWrite(LEDpin,HIGH); Kontroller väder IR-LED är på eller av
}
/ * Arduino köra loopen som kontrollerar sensorer och sedan skickar en tweet beroende på sensorer * /
void loop()
{
booleska isMoving = false;
int hjärtrytm = 0;
/ * kontrollerar accelerometern för ändringar för se om enheten är flytta eller inte * /
isMoving = checkMovement();
/ * beräknar den genomsnittliga pulsen i slag per minut beroende skillnader upptäcks av IR tranistor * /
hjärtrytm = getHeartRate();
/ * skickar ett meddelande till den seriella konsolen * /
printStatus (isMoving, hjärtrytm);
/ * skickar ett meddelande till twitter beroende på användare puls och rörelse * /
tweetStatus (isMoving, hjärtrytm);
}