Paso 6: programación
Funciones de utilidad
La única utilidad que tengo es tomar ritmo 5 leído veces y adecua entonces convertirlos en pulsaciones por minuto.
Twitter
Esto es donde es procesado y enviado el mensaje de twitter. Se alertó a si algo sale mal y da el mensaje de error de twitter en el monitor serie. Esto es importante porque las redes son siempre un dolor. También twitter no es molesto cuando envíe duplicados. Así que cuando estás corazón es el mismo para dos tweets en una fila y son o no son móviles. No se twittear a menos que algo ha cambiado.
Sensores de
En la función de movimiento de control se puede ver que se comparan valores pasados y presentes para ver si ha habido un cambio. El cambio es un movimiento de algún tipo. Tengo si declaraciones configurado para detectar movimiento en las tres dimensiones y tengo una sensibilidad creada para que usted pueda cambiar exactamente cuánto movimiento pone en marcha la función de movimiento. El número de veces que se movió luego es comparado con la cantidad total de movimiento Lee y luego se pasa un veredicto final si había o no movimiento durante el período de tiempo. Estos períodos son como windows. Así que si me muevo en la segunda ventana 30, Arduino se tweet que me he trasladado dentro de 30 segundos. Si estoy todavía, a decir que me sigue hasta la siguiente ventana. También se se filtra para que va a picar la nariz o cosas así no contarán como movimiento total.
El sensor de ritmo cardíaco cuenta la cantidad de tiempo entre cada latido del corazón de 5 latidos y luego los promedios. No se registrará el tiempo entre latidos si es fuera del rango de un corazón humano. De lo contrario cada contracción o táctil del sensor registraría como un salvaje beat por minuto valor. A menos que usted Lance Armstrong o un colibrí tu BPM debe estar entre 30 y 220. En estudios realizados a continuación 30BPM es extremadamente improbable y sobre 250BPM generalmente significa que un médico le da te de descarga con un desfibrilador. Esta gama se puede cambiar fácilmente en el programa si le sucede así que el Sr. Armstrong. O una zumbido cosa del hombre pájaro squirrle.
Salida
Esto es donde pasarán mucho tiempo si se producen errores. Pasé un par de horas mirando sin comprender esta ventana durante muchas horas en este proyecto. Espero que hacer demasiado, porque si funciona la primera vez no hacerlo bien.
La salida simplemente toma todo grabado información y salidas a la consola serial en la función printStatus. Esto es para cualquier consulta o resolución de problemas.
El tweetStatus toma la información recabada de los sensores y tweets un mensaje dependiendo de qué estado que estás en durante su sueño.
Funciones de Arduino
Sólo la configuración y el bucle principal. Bastante autoexplicativo.
Aquí está el código:
#if defined(ARDUINO) & & ARDUINO > 18 / / Arduino 0019 o posterior
#include
#endif
#include
#include
#include
#include
#include
Estado de acelerómetro
int x, y, z;
Lecturas del acelerómetro
Boolean movementHistory [5] = {falso, falso, falso, falso, falso};
El tiempo de los últimos latidos del corazón
lastMovementReadingTime largo sin signo = 0;
El número de lecturas tomadas
int movementReads = 0;
El número de veces en movimiento cuando se lee
int movementCount = 0;
Estado del sensor de ritmo cardíaco
int irSensorState = 0;
Lecturas de ritmo cardíaco
pulseTime int [5] = {0,0,0,0,0};
El tiempo de los últimos latidos del corazón
currentTime larga sin signo = 0;
Pernos de la frecuencia cardíaca
int SensorPin = 8;
int LEDpin = 9;
para twitter
lastPrint largo sin signo = 0;
lastTweet largo sin signo = 0;
Configuración de Ethernet Shield
mac de bytes [] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
sustituir una dirección de red aquí
byte ip [] = {192 168 0, 250};
Su Token a Tweet (obtenerlo del http://arduino-tweet.appspot.com/)
Twitter twitter ("ponga su ficha aquí.");
//=============================
Funciones de utilidad
//=============================
/ * Toma un promedio de tiempo entre latidos del corazón * /
int calcPulseRate()
{
int pulseRate;
pulseRate = pulseTime [0] pulseTime [1] pulseTime [2] + pulseTime [3] + pulseTime [4]; luego toma 60/media para BPM
pulseRate = 60000 / (pulseRate/5);
volver pulseRate;
}
//=============================
Twitter
//=============================
/ * tweets el mensaje entrado a la twitter /
void tweet (char * msg)
{
Serial.println ("conectando...");
Si (twitter.post(msg)) {}
Especificar y serie a la respuesta de salida recibida a la serie.
Si no hay salida es necesaria, sólo puede omitir el argumento, por ejemplo
int estado = twitter.wait();
int estado = twitter.wait (y serie);
Si (status == 200) {}
Serial.println("OK.");
} else {}
Serial.Print ("error: código");
Serial.println(Status);
}
} else {}
Serial.println ("fallada la conexión.");
}
}
//=============================
Sensores de
//=============================
/ * Comprueba si ha habido un cambio en la posición del acelerómetro * /
checkMovement() Boolean //function compara valores antiguos a los nuevos y sólo detecta si está ocurriendo una cierta cantidad de movimiento
{
Boolean ret = false;
sensibilidad de int = 3;
int newX, newY, newZ;
/ * Leer los nuevos valores * /
newX = analogRead(0); leyó el pin de entrada analógica 0
newY = analogRead(1); leyó el pin de entrada analógica 1
newZ = analogRead(2); leyó el pin de entrada analógica 2
/ * Comprobar cambios * /
Si (x-newX > sensibilidad || x newX <-sensibilidad)
{
RET = true;
}
else if (newY y > sensibilidad || newY y <-sensibilidad)
{
RET = true;
}
else if (z-newZ > sensibilidad || newZ z <-sensibilidad)
{
RET = true;
}
Si (millis() - lastMovementReadingTime > 30000)
{
para (int i = 4; i > 0; i--)
{
movementHistory [i] = movementHistory [i-1]; Actualizaciones de la matriz por lo que puede cambiar el primer valor
}
movementHistory [0] = false;
Ciclo de servicio = 10%
Si (10 < = ((movementReads/movementCount) * 100))
{
movementHistory [0] = true;
}
movementReads = 0;
movementCount = 0;
lastMovementReadingTime = millis();
}
Si (ret)
{
movementCount ++;
}
movementReads ++;
Guardar nuevos valores
x = newX;
y = newY;
z = newZ;
/ * Serial.print(newX);
Serial.Print("");
Serial.Print(newY);
Serial.Print("");
Serial.println(Newz); * /
volver si hay movimiento
volver movementHistory [0];
}
/ * Lee el sensor de infrarrojos y obtiene el tiempo entre latidos del corazón * /
int getHeartRate()
{
Utiliza para stor el estado del transistor de la foto
newState int = digitalRead(SensorPin);
Ha habido un cambio
Si (newState! = irSensorState)
{
if(newState == 1)
{//beat es 1 o 0 si la declaración se introduce solamente cuando un 1 a un 0 o un 0 a un 1
para (int i = 4; i > 0; i--)
{
pulseTime [i] = pulseTime [i-1]; Actualizaciones de la matriz por lo que puede cambiar el primer valor
}
/*
* Este es el filtro para el sistema. La frecuencia cardíaca no debe ir encima 250BPM o debajo de 30BPM
* Otros métodos de filtrado. Compruebe si el valor entre latidos es mayor que un cierto nivel. Un gran cambio no funciona, media ponderada. materia de retraso.
*/
if(Millis() - currentTime > 240 & & millis() - currentTime < 2000 / * & & isMoving() == false * /)
{
pulseTime [0] = millis() - currentTime; mantiene el tiempo entre latidos a un rango razonable para evitar la confusión
}
}
if(newState == 0)
{
currentTime = millis();
}
Almacenar el estado de nuevo
irSensorState = newState;
}
calcula la frecuencia del pulso en el extremo
volver calcPulseRate();
}
//=============================
Salida
//=============================
/ * Imprime toda la información en el monitor serial * /
void printStatus (isMoving boolean, int pulseRate)
{
Si (millis() - lastPrint > = 1000)
{
Imprimir estado de movimiento
Serial.Print ("movimiento:");
Si (isMoving)
{
Serial.println("true");
}
otra cosa
{
Serial.println("false");
}
Imprimir estado de pulso
Si (pulseTime [4] == 0)
{
Serial.println("calibrating"); Si no se han tomado 5 lecturas todavía es calibrar el dispositivo
} else
{
Serial.Print(pulseTime[0]); Imprime los datos de
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();
}
}
/ * Encuentra el mensaje de apprpriate según el pulso y los movimientos y envía el mensaje a la función del tweet * /
void tweetStatus (boolean isMoving, int pulseRate)
{
char mensaje [140];
Es la longitud del tiempo entre tweets y otros filtros para decidir que mensaje debe enviarse a twitter
Si (millis() - lastTweet > = 300000) //5 minutos
{
Si (> 120 pulseRate & & isMoving)
{
sprintf (msg, "despierta con un pulso de: %d", pulseRate);
}
else if (pulseRate > 120 & &! isMoving)
{
sprintf (msg, "sueño emocionante con un pulso de: %d", pulseRate);
}
otra cosa
{
sprintf (msg, "durmiendo con un pulso de: %d", pulseRate);
}
Tweet(MSG);
la última vez que se actualiza desde que se hizo un tweet
lastTweet = millis();
}
}
//=============================
Funciones de Arduino
//=============================
/ * La función de configuración de Arduino * /
void setup()
{
Delay(1000);
Ethernet.Begin (mac, ip);
Serial.Begin(9600);
pinMode(LEDpin,OUTPUT);
pinMode(SensorPin,INPUT);
digitalWrite(LEDpin,HIGH); Controla el tiempo en el LED IR está activado o desactivado
}
/ * El Arduino ejecuta bucle que comprueba los sensores y envía un tweet dependiendo del estado de los sensores * /
void loop()
{
Boolean isMoving = false;
ritmo cardíaco int = 0;
/ * comprueba si el acelerómetro de cambios también ver si el dispositivo es móvil o no * /
isMoving = checkMovement();
/ * calcula el promedio ritmo cardiaco en pulsaciones por minuto según las diferencias detectadas por el tranistor IR * /
ritmo cardíaco = getHeartRate();
/ * envía un mensaje a la consola serial * /
printStatus (isMoving, ritmo cardíaco);
/ * envía un mensaje de twitter según el ritmo cardiaco de los usuarios y el movimiento * /
tweetStatus (isMoving, ritmo cardíaco);
}