collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Pulse sensor with led or Buzzer  (Lida 2394 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Nspire

  • Mini Robot
  • *
  • Mensagens: 1
Pulse sensor with led or Buzzer
« em: 21 de Abril de 2014, 17:05 »
Boa tarde pessoal.
Tenho os seguintes dois códigos que são referentes a um sensor de pulsação (são dois códigos distintos, não têm nada haver um com o outro). A minha intenção era meter um led a piscar ou um buzzer a tocar, sempre que o batimento cardíaco fosse por exemplo inferior a 50, mas sinceramente não o estou a conseguir fazer. Já perdi aqui bastantes horas com isto e não há maneira de conseguir.

Se alguém me conseguir ajudar, agradecia imenso!




Código: [Seleccione]
volatile int rate[10];                 // used to hold last ten IBI values
volatile unsigned long sampleCounter = 0;         // used to determine pulse timing
volatile unsigned long lastBeatTime = 0;         // used to find the inter beat interval
volatile int P =512;                     // used to find peak in pulse wave
volatile int T = 512;                     // used to find trough in pulse wave
volatile int thresh = 512;             // used to find instant moment of heart beat
volatile int amp = 100;                 // used to hold amplitude of pulse waveform
volatile boolean firstBeat = true;     // used to seed rate array so we startup with reasonable BPM
volatile boolean secondBeat = true;     // used to seed rate array so we startup with reasonable BPM
int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;             // pin to blink led at each beat
int fadePin = 5;                 // pin to do fancy classy fading blink at each beat
int fadeRate = 0;                 // used to fade LED on with PWM on fadePin

// these variables are volatile because they are used during the interrupt service routine!
volatile int BPM;                 // used to hold the pulse rate
volatile int Signal;             // holds the incoming raw data
volatile int IBI = 600;             // holds the time between beats, the Inter-Beat Interval
volatile boolean Pulse = false;     // true when pulse wave is high, false when it's low
volatile boolean QS = false;     // becomes true when Arduoino finds a beat.

void interruptSetup(){   
// Initializes Timer2 to throw an interrupt every 2mS.
TCCR2A = 0x02;     // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
TCCR2B = 0x06;     // DON'T FORCE COMPARE, 256 PRESCALER
OCR2A = 0X7C;     // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
TIMSK2 = 0x02;     // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
sei();             // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED   
}

// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE.
// Timer 2 makes sure that we take a reading every 2 miliseconds
ISR(TIMER2_COMPA_vect){                         // triggered when Timer2 counts to 124
cli();                                     // disable interrupts while we do this
Signal = analogRead(pulsePin);             // read the Pulse Sensor
sampleCounter += 2;                         // keep track of the time in mS with this variable
int N = sampleCounter - lastBeatTime;     // monitor the time since the last beat to avoid noise
// find the peak and trough of the pulse wave
if(Signal < thresh && N > (IBI/5)*3){     // avoid dichrotic noise by waiting 3/5 of last IBI
     if (Signal < T){                     // T is the trough
         T = Signal;                         // keep track of lowest point in pulse wave
         }
     }

if(Signal > thresh && Signal > P){         // thresh condition helps avoid noise
     P = Signal;                             // P is the peak
     }                                     // keep track of highest point in pulse wave

// NOW IT'S TIME TO LOOK FOR THE HEART BEAT
// signal surges up in value every time there is a pulse
if (N > 250){                                 // avoid high frequency noise
if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){   
Pulse = true;                             // set the Pulse flag when we think there is a pulse
digitalWrite(blinkPin,HIGH);             // turn on pin 13 LED
IBI = sampleCounter - lastBeatTime;         // measure time between beats in mS
lastBeatTime = sampleCounter;             // keep track of time for next pulse

         if(firstBeat){                         // if it's the first time we found a beat, if firstBeat == TRUE
             firstBeat = false;                 // clear firstBeat flag
             return;                         // IBI value is unreliable so discard it
         }
         if(secondBeat){                     // if this is the second beat, if secondBeat == TRUE
         secondBeat = false;                 // clear secondBeat flag
             for(int i=0; i<=9; i++){         // seed the running total to get a realisitic BPM at startup
                 rate[i] = IBI;                   
                 }
         }

// keep a running total of the last 10 IBI values
word runningTotal = 0;                 // clear the runningTotal variable
for(int i=0; i<=8; i++){             // shift data in the rate array
         rate[i] = rate[i+1];             // and drop the oldest IBI value
         runningTotal += rate[i];         // add up the 9 oldest IBI values
     }

rate[9] = IBI;                         // add the latest IBI to the rate array
runningTotal += rate[9];             // add the latest IBI to runningTotal
runningTotal /= 10;                     // average the last 10 IBI values
BPM = 60000/runningTotal;             // how many beats can fit into a minute? that's BPM! AQUI
QS = true;                             // set Quantified Self flag
// QS FLAG IS NOT CLEARED INSIDE THIS ISR
}                   
}
if (Signal < thresh && Pulse == true){     // when the values are going down, the beat is over
     digitalWrite(blinkPin,LOW);         // turn off pin 13 LED
     Pulse = false;                         // reset the Pulse flag so we can do it again
     amp = P - T;                         // get amplitude of the pulse wave
     thresh = amp/2 + T;                 // set thresh at 50% of the amplitude
     P = thresh;                         // reset these for next time
     T = thresh;
     }

if (N > 2500){                             // if 2.5 seconds go by without a beat
     thresh = 512;                         // set thresh default
     P = 512;                             // set P default
     T = 512;                             // set T default
     lastBeatTime = sampleCounter;         // bring the lastBeatTime up to date   
     firstBeat = true;                     // set these to avoid noise
     secondBeat = true;                     // when we get the heartbeat back
     }

sei();                                     // enable interrupts when youre done!
}// end isr


void setup(){
pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
pinMode(fadePin,OUTPUT);         // pin that will fade to your heartbeat!
Serial.begin(115200);             // we agree to talk fast!
interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS
// UN-COMMENT THE NEXT LINE IF YOU ARE POWERING The Pulse Sensor AT LOW VOLTAGE,
// AND APPLY THAT VOLTAGE TO THE A-REF PIN
//analogReference(EXTERNAL);
}

void loop(){


ledFadeToBeat();
delay(20);                             // take a break
}

void ledFadeToBeat(){
fadeRate -= 15;                         // set LED fade value
fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!
analogWrite(fadePin,fadeRate);         // fade LED
}

Retirado de: http://www.inmotion.pt/store/pulse-sensor

Código: [Seleccione]
// Pins
const int ledPin = 13;
const int sensePin = 0;

// LED blink variables
int ledState = LOW;
long ledOnMillis = 0;
long ledOnInterval = 50;
int ledsinal = 7;
// Hearbeat detect variables
int newHeartReading = 0;
int lastHeartReading = 0;
int Delta = 0;
int recentReadings[8] = {0,0,0,0,0,0,0,0};
int historySize = 8;
int recentTotal = 0;
int readingsIndex = 0;
boolean highChange = false;
int totalThreshold = 2;
// Heartbeat Timing
long lastHeartbeatTime = 0;
long debounceDelay = 150;
int currentHeartrate = 0;
void setup() {
// initialize the serial communication:
Serial.begin(9600);
// initialize the digital pin as an output:
pinMode(ledPin, OUTPUT);
pinMode (ledsinal, OUTPUT);
}
void loop() {
// Turn off LED
digitalWrite(ledPin, LOW);
// Read analogue pin.
newHeartReading = analogRead(sensePin);
//Serial.println(newHeartReading);
//Calculate Delta
Delta = newHeartReading - lastHeartReading;
lastHeartReading = newHeartReading;
// Find new recent total
recentTotal = recentTotal - recentReadings[readingsIndex] + Delta;
// replace indexed recent value
recentReadings[readingsIndex] = Delta;
// increment index
readingsIndex = (readingsIndex + 1) % historySize;
//Debug
//Serial.println(recentTotal);
// Decide whether to start an LED Blink.
if (recentTotal >= totalThreshold) {
// Possible heartbeart, check time
if (millis() - lastHeartbeatTime >= debounceDelay) {
// Heartbeat
digitalWrite(ledPin, HIGH);
currentHeartrate = 60000 / (millis() - lastHeartbeatTime);
lastHeartbeatTime = millis();
// Print Results
//Serial.println("Beat");
if (currentHeartrate <= 200) { Serial.println(currentHeartrate); } } } delay(10);

}

Já não me lembro de que site retirei ...