Internet de les coses amb ESP32 i ESP8266

Exemples Referència Plaques   Recursos CITCEA
Projectes Programació Perifèrics   Inici

Sensor de ritme cardíac

Per poder monitoritzar el ritme cardíac podem fer servir aquest sensor que ens dona un senyal analògic amb una forma aproximada del pols cardíac. Aquest sensor el tindrem connectat a l'entrada analògica A2.

sensor

El sensor incorpora un LED i un sensor de llum, a part d'altres elements electrònics. Es coloca sobre el dit (amb una cinta que l'aguanta) o al lòbul de l'orella (amb una pinça). El sensor de llum rep més o menys llum provinent del LED segons el moment del cicle cardíac. El senyal de sortida del sensor és similar al que es mostra a la figura següent. Els valors concrets poden ser diferents segons el ritme cardíac, la tensió d'alimentació i la forma com està col·locat el sensor.

senyal

Veiem que, fonamentalment, el senyal té una zona vall i un pols. Ens interessen els polsos. El fabricant, recomana considerar que es passa de pols a vall (o al contrari) en el centre del senyal. Per trobar el centre agafarem el valor màxim i el mínim i cercarem el punt mig, la mitjana. Per evitar problemes causats per petites oscil·lacions, considerarem que el pols comença quan el senyal supera la mitjana entre el centre i el màxim i que acaba quan baixa de la mitjana entre el centre i el mínim. A la següent gràfica s'indiquen els valors que acabem de comentar i, en vermell, el nom de la variable que farem servir per guardar-los. En verd s'indica el període del senyal, que no farem servir.

mesura

A continuació presentarem una funció que primer cerca els valors que hem indicat a la imatge anterior (mentrestant Centre = 0) i després compta el nombre de polsos que es produeixen en quinze segons. Amb aquesta dada, calcula les pulsacions per minut, que és el valor que retorna. La funció també encén un LED quan hi ha el pols i l'apaga a la zona vall. Això és útil per veure si tenim el sensor ben posat en el dit. Les variables que emprarem en la funció seran les següents:

Nom Mida Finalitat Observacions
Max unsigned int Valor màxim del senyal en un període
Min unsigned int Valor mínim del senyal en un període
Centre unsigned int Valor mig del senyal en un període Centre = (Max + Min) / 2
Polsos unsigned char Durant l'execució, compta els polsos
Al final, conté les pulsacions per minut
Pols boolean S'activa quan el senyal està per sobre del centre
TempsLec unsigned long Guarda l'instant de la darrera lectura
Temps unsigned long Guarda l'instant en el que s'ha començat a comptar el temps
Lectura unsigned int Valor llegit a l'entrada analògica

A continuació tenim un programa senzill que llegeix les pulsacions i les envia al canal sèrie. La funció que llegeix el sensor també envia els valors de les variables Max, Centre i Min; aquesta informació pot ser útil mentre es fan les proves del programa, després es poden eliminar aquestes línies.

#define LEDPIN 6  // Pota on hi ha el LED de la placa
#define SENSOR A2  // Pota on hi ha el sensor
#define	ValComp	6  // Nombre de repeticions per eliminar soroll
unsigned char Pulsacions = 0;  // Pulsacions per minut
void setup(){
  pinMode(LEDPIN, OUTPUT);
  Serial.begin(9600);
  digitalWrite(LEDPIN, LOW);
}
// Compta els polsos en 15 s i retorna les pulsacions per minut
unsigned char llegir(){
  unsigned int Max = 0;  // Valor màxim del senyal en un període	
  unsigned int Min = 4096;  // Valor mínim del senyal en un període	
  unsigned int Centre = 0;  // Valor mig del senyal en un període
  unsigned char Polsos = 0;
  boolean Pols = 1;  // Posem a 1 perquè primer hem de trobar una vall
  unsigned long TempsLec = millis();  // Guarda l'instant de la lectura anterior
  unsigned long Temps = millis();  // Guarda l'instant d'inici del procés
  while((millis() - Temps) <= 15000){  // Farem mesures durant 15 s
                                          // a partir del moment en el que trobem el centre
    if((millis() - TempsLec) >= 2){  // Fa una lectura cada 2 ms
      TempsLec = millis();  // Guardem el nou instant
      unsigned int Lectura = analogRead(SENSOR);  // Valor llegit a l'entrada analògica
      if(Centre == 0){  // Estem a la primera fase, buscant el centre
        if(Lectura > Max){
          Max = Lectura;
        }
        if(Lectura < Min){
          Min = Lectura;
        }
        if((millis() - Temps) > 2000){
          Centre = (Max + Min) / 2;  // Ja tenim el valor del centre de l'ona
          Temps = millis();  // Torna a iniciar el temps
          Serial.print("Max = ");
          Serial.print(Max);
          Serial.print("    Centre = ");
          Serial.print(Centre);
          Serial.print("    Min = ");
          Serial.println(Min);
        }
      } else {
        if(Pols){  // Si busquem la vall
          if(Lectura < (Centre + Min)/2){
            Pols = 0;  // Hem trobat la vall
            digitalWrite(LEDPIN, LOW);  // Apaga el LED
         }
        } else {
          if(Lectura > (Centre + Max)/2){
            Pols = 1;  // Hem trobat el pic
            digitalWrite(LEDPIN, HIGH);  // Encén el LED
            Polsos++;  // Afegim un pols
          }
        }
      }
    }
  }
  Polsos = Polsos * 4;
  return Polsos;
}
void loop(){
  Pulsacions = llegir();
  Serial.print(Pulsacions);
  Serial.println(" pulsacions per minut");
  delay(1000);  // Espera 1 segon
}

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.