Pulsos del corazon

Buenas tardes, soy nueva en esto de la programacion con arduino y me han puesto a realizar el siguiente ejercicio:

“Realizar el código de programación de un arduino que permita calcular las pulsaciones por minuto del corazón, estas pulsaciones son visualizadas en un LCD. Si las pulsaciones por minuto son mayores a 100, se enciende un led rojo y se visualiza en el LCD “taquicardia”, si las pulsaciones son menores a 60 se enciende un led amarillo y se visualiza en el LCD “bradicardia”, si las pulsaciones son mayores a 60 y menores a 100, se enciende el led verde y se visualiza en el LCD “normal”.
Realizar el diseño del circuito electrónico a implementar y/o realizar la simulación, descripción del funcionamiento del circuito”

ya tengo desarrollada una gran parte del codigo pero no he sido capaz de contar las pulsaciones por un minuto y que se reinicie.

Les agradeceria mucho su ayuda!!!

Contador.ino (1.18 KB)

El código que adjuntaste supongo simula situaciones pero no veo nada orientado a una electronica que lea BPM Beats per minute (pulos por minuto)

Mi consejo: cuando busques algo no pierdas el tiempo haciéndolo en español. Consume tiempo descubiendo que palabra en inglés describe la tarea que persigo y luego cuando la encuentras se te abre el mundo.. con infinitas soluciones.
En tu caso busca Arduino BPM y verás lo que digo.

Tu código hasta ahora simulando con un pulsador esta bien.
Los BPM vas a tener que medirlos usando analogRead y luego fijar algun umbral que sea determinante para los pulsos x min.

Mira este link

Te falta un led morado que se encienda si las pulsaciones son igual a 0 y un texto en el LCD que ponga HAS PALMAO :slight_smile: :slight_smile: :slight_smile:

Bromas aparte te diría que te falta implementar realmente algo en cero pulsaciones y es un reset del contador y que se quede en espera de pulsos, ten en cuenta que si no está el dedo bien colocado "digo dedo porque imagino que usas ese del corazón dibujado" o que el sujeto se cansa de esperar, el cacharro seguirá hasta concluir el minuto y hablando de minuto, tampoco estoy seguro de que deba contar un minuto entero, porque será un coñazo tener un minuto el dedito inmóvil. Lo que está claro es que a mayor tiempo de lectura, mayor precisión pero más peñazo. Creo que deberías hacer pruebas con eso, para determinar si con por ejemplo 10 segundo es suficiente.

Pero si lo que hizo fue un simulador… que hay que resetear?
Para mejorar la simulación debería generar pulsos dentro de una ventana de tiempo, y superado ese tiempo si poner a cero el contador.
Pero con un pulsador como lo haces… tengo que tener una ventana de 10 segundos?

Buenas noches, soy algo nueva en la programacion con arduino y me pidieron reaizar el siguiente codigo:

“Realizar el código de programación de un arduino que permita calcular las pulsaciones por minuto del corazón, estas pulsaciones son visualizadas en un LCD. Si las pulsaciones por minuto son mayores a 100, se enciende un led rojo y se visualiza en el LCD “taquicardia”, si las pulsaciones son menores a 60 se enciende un led amarillo y se visualiza en el LCD “bradicardia”, si las pulsaciones son mayores a 60 y menores a 100, se enciende el led verde y se visualiza en el LCD “normal”.
Realizar el diseño del circuito electrónico a implementar y/o realizar la simulación, descripción del funcionamiento del circuito”

Ya tengo desarrollada una parte de codigo pero aun no he podido realizar el conteo de los pulsos por un minuto y que vuelva a cero, lo he intentado hacer con

delay(1000);
contador=0;

pero no me funciona

#include<LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);


int ledVerde=8;
int ledAmarillo=9;
int ledRojo=10;
int boton=13;
int contador=0;
int estadoAnterior=0;


void setup() {

lcd.begin(16,2);

Serial.begin(9600);
pinMode(ledVerde,OUTPUT);
pinMode(ledAmarillo, OUTPUT);
pinMode(ledRojo, OUTPUT);
pinMode(boton,INPUT);
  
}

void loop() {
 

int lectura= digitalRead(boton);
if(lectura!=estadoAnterior){
  
  if(lectura==HIGH){
    contador++;
    Serial.println(contador);
    }
  }

  estadoAnterior=lectura;

 if (contador > 10)
{
  digitalWrite(ledRojo,HIGH);
  lcd.setCursor(1,0);lcd.print(contador);
  lcd.setCursor(3,1);lcd.print("TAQUICARDIA");
  //delay(2000);
 //lcd.clear();

}
else 
{

 digitalWrite(ledRojo,LOW);

 
}

if (contador< 6 )
{
  digitalWrite(ledAmarillo,HIGH);
  lcd.setCursor(1,0);lcd.print(contador);
  lcd.setCursor(3,1);lcd.print("BRADICARDIA");
  //delay(2000);
  //lcd.clear(); 
    

}
else 
{
   
 digitalWrite(ledAmarillo,LOW);

}

if (contador>6 & contador<10)
{
  digitalWrite(ledVerde,HIGH);
  lcd.setCursor(1,0);lcd.print(contador);
  lcd.setCursor(3,1);lcd.print("NORMAL     ");
  //delay(2000);
 //lcd.clear();
  
}
else 
{
 digitalWrite(ledVerde,LOW);
}

}

Les agradeceria mucho su ayuda!!!

Lo que tienes que hacer y lo está haciendo bien es aumentar en 1 el contador de pulsaciones cada vez que se oprima el botón y luego usar la función millis para determinar si ya pasaron 60.000 milisegundos y comprobar el estado del contador si es >100, <60 o entre 60 y 100 y luego volver el contador a 0.

Más o menos sería algo así:

#include<LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
unsigned long lastConnectionTime = 0;
const unsigned long postingInterval = 1L * 1000L;
int isegundos = 0;

int ledVerde=8;
int ledAmarillo=9;
int ledRojo=10;
int boton=13;
int contador=0;
int estadoAnterior=0;


void setup() {

lcd.begin(16,2);

Serial.begin(9600);
pinMode(ledVerde,OUTPUT);
pinMode(ledAmarillo, OUTPUT);
pinMode(ledRojo, OUTPUT);
pinMode(boton,INPUT);
  
}

void loop() {
  int lectura= digitalRead(boton);
  if(lectura!=estadoAnterior){
    if(lectura==HIGH){
      contador++;
      Serial.println(contador);
    }
    estadoAnterior=lectura;
  }

  if (millis() - lastConnectionTime > postingInterval) {
    isegundos ++;
    if (isegundos >= 60)
    {
      digitalWrite(ledRojo,LOW);
      digitalWrite(ledAmarillo,LOW);
      digitalWrite(ledVerde,LOW);
      if (contador >= 100)
      {
        digitalWrite(ledRojo,HIGH);
        lcd.setCursor(1,0);lcd.print(contador);
        lcd.setCursor(3,1);lcd.print("TAQUICARDIA");
      }
      if (contador <= 60)
      {
        digitalWrite(ledAmarillo,HIGH);
        lcd.setCursor(1,0);lcd.print(contador);
        lcd.setCursor(3,1);lcd.print("BRADICARDIA");
      }
      if (contador > 60 && contador < 100 )
      {
        digitalWrite(ledVerde,HIGH);
        lcd.setCursor(1,0);lcd.print(contador);
        lcd.setCursor(3,1);lcd.print("NORMAL     ");
      }
      isegundos = 0;
      contador = 0;
    }
    lastConnectionTime = millis();
  }
}

@karcilan se que eres nueva pero todo nuevo debe respetar las mismas se que eres nueva pero todo nuevo debe respetar las mismas Normas del foro.
No puedes abrir un tema en hardware y luego otro en software porque no lo encuentras.

No somos el foro en inglés, los hilos no se modifican mucho de dia a dia incluso de semana en semana.
De modo que hilo que comienza no puede abrirse en ningún otro sitio hasta terminarse.

Si puedes hacerlo con un tema diferente a este.
Ahora he mezclado los temas porque habia respuestas sino borraba el nuevo que posteaste en Software.

@surbyte Lo siento es que estaba un poco perdida, no volvera a suceder.

@hgsiabato Muchas gracias por tu ayuda, lo voy a simular en proteus a ver como me va.