BASIC4MCU | 질문게시판 | 아두이노 심박센서와 스피커
페이지 정보
작성자 이채희 작성일2019-06-05 18:21 조회9,281회 댓글3건본문
옥현님의 심박센서 코드
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정
//
#define PROCESSING_VISUALIZER 1
#define SERIAL_PLOTTER 2
//
int pulsePin=A6,blinkPin=13,fadePin=5;
//
int fadeRate=0,initCounter=0,initBPM=0;
//
volatile int BPM,difference;
volatile int Signal;
volatile int IBI=600;
volatile bool Pulse=false;
volatile bool QS=false;
static int outputType=SERIAL_PLOTTER;
//
char str[100];
//
void setup(){
pinMode(3,OUTPUT);
pinMode(blinkPin,OUTPUT);
pinMode(fadePin,OUTPUT);
Serial.begin(9600);
mySerial.begin(9600);
interruptSetup();
}
//
void loop(){
serialOutput();
//
if(QS==true){ fadeRate=255; serialOutputWhenBeatHappens(); QS=false; }
//
ledFadeToBeat();
//if(difference>15){ digitalWrite(3,HIGH); delay(1000); }
else { digitalWrite(3,LOW); }
//
delay(1000);
}
//
void ledFadeToBeat(){
fadeRate-=15; fadeRate=constrain(fadeRate,0,255); analogWrite(fadePin,fadeRate);
}
//
void serialOutput(){
switch(outputType){
case PROCESSING_VISUALIZER: sprintf(str,"Signal: %d\r\n",Signal); Serial.print(str); mySerial.print(str); break;
case SERIAL_PLOTTER: sprintf(str,"BPM: %d\r\n",BPM); Serial.print(str); mySerial.print(str); break;
}
}
//
void serialOutputWhenBeatHappens(){
switch(outputType){
case PROCESSING_VISUALIZER: sprintf(str,"BPM: %dd\r\n",BPM); Serial.print(str); mySerial.print(str); break;
}
}
//
volatile int rate[10];
volatile unsigned long sampleCounter=0;
volatile unsigned long lastBeatTime=0;
volatile int P=512;
volatile int T=512;
volatile int thresh=530;
volatile int amp=0;
volatile boolean firstBeat=true;
volatile boolean secondBeat=false;
//
void interruptSetup(){
TCCR2A=0x02; TCCR2B=0x06; OCR2A=0X7C; TIMSK2=0x02; sei();
}
//
ISR(TIMER2_COMPA_vect){
cli();
Signal=analogRead(pulsePin);
sampleCounter+=2;
int N=sampleCounter-lastBeatTime;
//
if(Signal<thresh&&N>(IBI/5)*3){ if(Signal<T)T=Signal; }
//
if(Signal>thresh&&Signal>P){ P=Signal; }
//
if(N>250){
if((Signal>thresh)&&(Pulse==false)&&(N>(IBI/5)*3)){
Pulse=true;
digitalWrite(blinkPin,HIGH);
IBI=sampleCounter-lastBeatTime;
lastBeatTime=sampleCounter;
//
if(secondBeat){ secondBeat=false; for(int i=0; i<=9; i++)rate[i]=IBI; }
//
if(firstBeat){ firstBeat=false; secondBeat=true; sei(); return; }
//
word runningTotal=0;
for(int i=0; i<=8; i++){ rate[i]=rate[i+1]; runningTotal+=rate[i]; }
rate[9]=IBI;
runningTotal+=rate[9]; runningTotal/=10;
BPM=60000/runningTotal;
//
if(initCounter==0){ initBPM=BPM; initCounter=1; }
//
difference=initBPM-BPM;
QS=true;
}
}
if(Signal<thresh&&Pulse==true){
digitalWrite(blinkPin,LOW); Pulse=false; amp=P-T; thresh=amp/2+T; P=thresh; T=thresh;
}
//
if(N>2500){
thresh=530; P=512; T=512; lastBeatTime=sampleCounter; firstBeat=true; secondBeat=false;
}
sei();
}
스피커 코드
int speaker=5;
void setup(){
pinMode(speaker, OUTPUT); //스피커
}void loop(){
if(BPM<40){ //스피커
tone(speaker,440); //스피커
delay(1000); //스피커
} //스피커
else{ //스피커
noTone(speaker); //스피커
} //스피커
}
스피커 코드는 제가 짠 코드입니다.
아두이노에 있는 심박수 예제와 스피커 코드를 결합하였을때는 잘 작동되었는데
옥현님이 주신 코드와 결합하였을때는 '보드Arduino Nano 컴파일 에러'라고 뜹니다
뭐가 문제인지 알려주세요...
추가적으로 심박센서가 많이 불안정한데 이는 어떻게 해결해야되나요?
댓글 3
조회수 9,281master님의 댓글
master 작성일합친 코드는 어느 것인가요?
이채희님의 댓글
이채희 작성일
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2,3); //블루투스의 Tx, Rx핀을 2번 3번핀으로 설정
//
#define PROCESSING_VISUALIZER 1
#define SERIAL_PLOTTER 2
//
int pulsePin=A6,blinkPin=13,fadePin=5;
//
int fadeRate=0,initCounter=0,initBPM=0;
//
volatile int BPM,difference;
volatile int Signal;
volatile int IBI=600;
volatile bool Pulse=false;
volatile bool QS=false;
static int outputType=SERIAL_PLOTTER;
//
char str[100];
//
int speaker=5; //스피커
void setup(){
pinMode(3,OUTPUT);
pinMode(blinkPin,OUTPUT);
pinMode(fadePin,OUTPUT);
Serial.begin(9600);
mySerial.begin(9600);
interruptSetup();
pinMode(speaker, OUTPUT); //스피커
}
//
void loop(){
serialOutput();
//
if(QS==true){ fadeRate=255; serialOutputWhenBeatHappens(); QS=false; }
//
ledFadeToBeat();
//
if(difference>15){ digitalWrite(3,HIGH); delay(1000); }
else { digitalWrite(3,LOW); }
//
delay(1000);
if(BPM<40){ //스피커
tone(speaker,440); //스피커
delay(1000); //스피커
} //스피커
else{ //스피커
noTone(speaker); //스피커
} //스피커
}
//
void ledFadeToBeat(){
fadeRate-=15; fadeRate=constrain(fadeRate,0,255); analogWrite(fadePin,fadeRate);
}
//
void serialOutput(){
switch(outputType){
case PROCESSING_VISUALIZER: sprintf(str,"Signal: %d\r\n",Signal); Serial.print(str); mySerial.print(str); break;
case SERIAL_PLOTTER: sprintf(str,"BPM: %d\r\n",BPM); Serial.print(str); mySerial.print(str); break;
}
}
//
void serialOutputWhenBeatHappens(){
switch(outputType){
case PROCESSING_VISUALIZER: sprintf(str,"BPM: %dd\r\n",BPM); Serial.print(str); mySerial.print(str); break;
}
}
//
volatile int rate[10];
volatile unsigned long sampleCounter=0;
volatile unsigned long lastBeatTime=0;
volatile int P=512;
volatile int T=512;
volatile int thresh=530;
volatile int amp=0;
volatile boolean firstBeat=true;
volatile boolean secondBeat=false;
//
void interruptSetup(){
TCCR2A=0x02; TCCR2B=0x06; OCR2A=0X7C; TIMSK2=0x02; sei();
}
//
ISR(TIMER2_COMPA_vect){
cli();
Signal=analogRead(pulsePin);
sampleCounter+=2;
int N=sampleCounter-lastBeatTime;
//
if(Signal<thresh&&N>(IBI/5)*3){ if(Signal<T)T=Signal; }
//
if(Signal>thresh&&Signal>P){ P=Signal; }
//
if(N>250){
if((Signal>thresh)&&(Pulse==false)&&(N>(IBI/5)*3)){
Pulse=true;
digitalWrite(blinkPin,HIGH);
IBI=sampleCounter-lastBeatTime;
lastBeatTime=sampleCounter;
//
if(secondBeat){ secondBeat=false; for(int i=0; i<=9; i++)rate[i]=IBI; }
//
if(firstBeat){ firstBeat=false; secondBeat=true; sei(); return; }
//
word runningTotal=0;
for(int i=0; i<=8; i++){ rate[i]=rate[i+1]; runningTotal+=rate[i]; }
rate[9]=IBI;
runningTotal+=rate[9]; runningTotal/=10;
BPM=60000/runningTotal;
//
if(initCounter==0){ initBPM=BPM; initCounter=1; }
//
difference=initBPM-BPM;
QS=true;
}
}
if(Signal<thresh&&Pulse==true){
digitalWrite(blinkPin,LOW); Pulse=false; amp=P-T; thresh=amp/2+T; P=thresh; T=thresh;
}
//
if(N>2500){
thresh=530; P=512; T=512; lastBeatTime=sampleCounter; firstBeat=true; secondBeat=false;
}
sei();
}
master님의 댓글
master
int fadePin=5;
int speaker=5;
같은 핀번호로 두 개가 설정되어 있고
analogWrite(fadePin,fadeRate);
tone(speaker,440); //스피커
하나는 아나로그 출력으로, 다른 하나는 톤 출력을 하고 있습니다.
핀 번호를 중복되지 않도록 변경하세요