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.

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.

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.

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.

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