Buenas tardes, soy nueva en la programación y actualmente estoy trabajando en un lector de pulso cardíaco y temperatura. Los errores que me salen, por lo que veo, son bastantes sencillos ademas que quería incluir la media aritmética de los datos que me arrojan los sensores después de un determinado tiempo pero, no se cual sería el más conveniente para mi caso. Espero que me puedan ayudar y de antemano muchas gracias por su tiempo al leer esto.
#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
int pulsePin = 0; // Sensor de Pulso conectado al puerto A0
// Estas variables son volatiles porque son usadas durante la rutina de interrupcion en la segunda Pestaña
volatile int BPM; // Pulsaciones por minuto
volatile int Signal; // Entrada de datos del sensor de pulsos
volatile int IBI = 600; // tiempo entre pulsaciones
volatile boolean Pulse = false; // Verdadero cuando la onda de pulsos es alta, falso cuando es Baja
volatile boolean QS = false; // Verdadero cuando el Arduino Busca un pulso del Corazon
void setup() {
pinMode(5, OUTPUT);
Serial.begin(9600); // Puerto serial configurado a 9600 Baudios
mlx.begin();
int erruptSetup(); // Configura la interrucion para leer el sensor de pulsos cada 2mS
}
void loop() {
int pulso = analogRead(A0); //Lee el valor del pulsometro conectado al puerto Analogo A0
if (pulso >= 530) { // Enciende led 13 cuando el pulso pasa de un valor (debe ajustarse)
digitalWrite(5, HIGH);
}
else {
digitalWrite(5, LOW);
}
delay(1000);
Serial.print("Pulsos ");
Serial.println(BPM);
Serial.print("\n");
Serial.print(mlx.readObjectTempC());
Serial.print(" °C ");
Serial.print("\n");
}
// Serial.println(" ");
//Serial.print("BPM = "); Serial.println(BPM); //Habilitar estas linea para ver BPM en el monitor serial pero deshabilitar la siguiente
// Serial.println(pulso); // envia el valor del pulso por el puerto serie (desabilitarla si habilita la anterior linea)
if (QS == true) { // Bandera del Quantified Self es verdadera cuando el Arduino busca un pulso del corazon
else (QS = false) ; // Reset a la bandera del Quantified Self
}
}
La media de estos valores?
int pulso = analogRead(A0); //Lee el valor del pulsometro conectado al puerto Analogo A0
No sabes calcular un promedio?
Suma los valores de tu variable pulso, y lo divides por la cantidad de muestras tomadas.
Al hacerlo ten en cuenta que las variables no deben desbordarse, es decir, cuando sumas los valores se incrementan y como toda variable en un microcontrolador tiene limites, si superas el limite positivo en este caso tienes un desborde u overflow.
Entonces el tipo de variable que lleve la suma dependerá de cuantas muestras tomes para tu promedio.
Es facil calcularlo: una variable del tipo unsigned int (entero sin signo) puede llegar hasta 65535 entonces
ya que tu AD toma valores de hasta 1023, esa será la mayor suma posible
Si divides 65535 entre 1023 tienes la cantidad de muestras que puedes tomar con un entero sin signo o unsigned int.
65535/1023 = 64
Si necesitas mas entones usas unsigned long.
Siendo mas especifica, necesito que promedie los valores que se dan en un tiempo de 1 minuto, de ambos sensores (pulso y temperatura).
Es la primea vez que trato con la programación por lo que mis conocimientos son muy limitados, y a pesar de que investigo sobre esta, no tengo una idea clara de como hacerlo correctamente, te agradecería si me pudieras ayudar.
Olvide mencionar también que a partir del promedio dado, asignarle un rango y que este diga si el pulso o la temperatura son los indicados.
por ejemplo:
prom pulso
<=0-50 es inadecuado con tendencia a bradicardia
=70-110 es normal o Excelente
=220 es inadecuado con tendencia a taquicardia
Bueno si lo que necesitas son valores en 1 minuto, primero usa millis() para controlar el tiempo
Ve a Documentación => Indice de temas tutoriales => Millis()
y mientras vas tomando y acumulando datos como te he indicado.
Usas un contador para saber cuantos valores has muestreado y como dije si superas 64 usa unsigned long para la variable suma
Te diré como encararlo, pero el tema de las comparaciones es tan básico que te lo dejo a ti, si no lo sabes hacer ve a Documentación mismo sitio y mira las clases de youtube y otros tutoriales de ayuda.
Promedio
Cuando usas millis() es como tener un cronometro que comienza con la largada de los competidores y en este caso cuando arduino se energiza.
Dicho cronómetro se incrementa en 1 x cada mili segundo así que es bastante preciso para la gran mayor parte de las tareas a realizar.
Entonces voy a suponer una variable que cubra todas las necesidades
unsigned long Tiempo;
unsigned long suma;
unsigned int contador;
float promedio;
void setup() {
Serial.begin(115200);
contador = 0;
suma = 0;
Tiempo = millis();
}
void loop(){
suma += analogRead(A0); // supongo que lees en pin analogico A0
contador++; // Lleva cuantas muestras
if (millis() - Tiempo > 60000UL) { // 60x1000 mseg = 1 min
promedio = (float) suma/contador;
Serial.print("suma : ");
Serial.println(suma);
Serial.print("muestras : ");
Serial.println(contador);
Serial.print("Promedio : ");
Serial.println(promedio);
suma = 0; // pongo a 0 la variable acumuladora
Tiempo = millis(); // preparo para la proxima toma de muestras
}
}