BASIC4MCU | 질문게시판 | 아두이노 코딩 질문
페이지 정보
작성자 119min 작성일2019-07-27 15:52 조회6,388회 댓글1건본문
안녕하세요
아두이노 코딩에 대해 질문이 있습니다
자꾸 }에 대해 오류가 뜨는데 이유를 모르겠어요...
답답해서 올립니다
제발 부탁드려요ㅠㅠㅠㅠㅠ
코딩 원본입니다
#include <DS1302.h>
#include <Time.h>
#include <RtcDS1302.h>
#include <ThreeWire.h> // IIC 통신 -- 심박센서
#include <SoftwareSerial.h> // 블루투스 통신 - 스마트폰앱
#include <SPI.h> // SD, RTC 통신
#include <SD.h> // SD모듈
ThreeWire myWire(3,4,2);#define BUF_NUM 180 // 1초 샘플, 3분단위
#define SAMPLING_PERIOD 800 // 약 1초 쉼(처리시간 ? 고려)
#define HEART_RATE_MIN 40 // 정상 심박수 최저치
#define HEART_RATE_MAX 180 // 정상 심박수 최고치
#define HEART_RATE_NOMAL_SLEEP 93.0 // 얕은 수면 기준
#define HEART_RATE_DEEP_SLEEP 85.0 // 깊은 수면 기준
#define HEART_RATE_STD1 4.0 // 심박수 표준편차, 이상이면 REM 가능성
#define HEART_RATE_STD2 10.0 // 심박수 표준편차, 이상이면 깨어있음
#define XYZ_STD_TURN 30 // 가속도 표준편차 -- 이상이면 몸을 뒤척임
#define XYZ_STD_MOVE 50 // 가속도 표준편차 -- 이상이면 몸을 많이움직임#define BUTTON_PIN 7 // 테스트하기 위한 푸시버튼 핀 번호
#define LED_PIN 9 // 아날로그 출력 핀(pwm, pluse width modulation)
#define X_PIN A0 // X축 -- 아나로그 입력 핀번호
#define Y_PIN A1 // Y축
#define Z_PIN A2 // Z축
#define VAR_RES_HEART_PIN A7 // 가변저항 입력 핀, 심박센서 대신
#define VAR_RES_XYZ_PIN A8 // 가변저항 입력 핀, 가속도센서 대신SoftwareSerial btSerial(12,13); // 블루투스 tx, rx(우노는 2~3번, 메가는 10~15번)
RtcDS1302<ThreeWire> Rtc(myWire);
// DS1302 RTC 초기화, D2-CS(Chip Select), D3-DATA, D4-CLOCKconst int chipSelectPin = 4; // SD카드 Chip Select Pin = D4
unsigned int goingCnt = 0; // 배열의 몇번째 접근인지
unsigned int xyzAdc[BUF_NUM]; // 가속도 값 저장 배열
unsigned char heartRate[BUF_NUM]; // 심박수 값 저장 배열float stdDev_heart, stdDev_xyz; // 심박수 표준편차, 가속도 표준편차
unsigned int avg_xyz; // 샘플링 기간의 가속도 평균값
unsigned char avg_heart; // 샘플링 기간의 심박수 평균값
unsigned char awake_heart=0; // 기준 심박수
unsigned char sleepStage='0'; // '깨어있음' 상태로 초기화
boolean firstPeriod = true; // 수면단계 판별의 첫주기
boolean SDcardOk = false; // SD 카드상태
boolean prevButtonStat = LOW; // 이전의 푸시버튼 상태, 리얼로 초기화
boolean buttonStat = LOW; // 현재의 푸시버튼 상태, 리얼로 초기화
unsigned int tmp_BUF_NUM = BUF_NUM; // 사용할 배열 개수
//---- 수면 단계 판별한다 ------------------------//
unsigned char calculateSleepStage(void)
{
float heart_rate_diff;
boolean existMOVE = false;
boolean existTURN = false;
boolean existREM = false;
boolean existAWAKE = false;
unsigned char stage='0';
heart_rate_diff= ((float)avg_heart / (float)awake_heart) * 100.0;
// 기준심박수 대비 평균심박수의 비율if (stdDev_heart >= HEART_RATE_STD2) // 심박 변화10보다 크면
existAWAKE = true; // 깨어있을 가능성
if ((stdDev_heart >= HEART_RATE_STD1) &&
(stdDev_heart < HEART_RATE_STD2) ) // 5~10이면 REM 가능성
existREM = true; // REM 가능성
if (stdDev_xyz >= XYZ_STD_MOVE) // 움직임 있으면
existMOVE = true;
if ((stdDev_xyz >= XYZ_STD_TURN) && // 뒤척임 있으면
(stdDev_xyz < XYZ_STD_MOVE))
existTURN = true;
if (heart_rate_diff <= HEART_RATE_NOMAL_SLEEP) // 기준 심박수대비: 0% ~93%
{
stage = '1';
if (heart_rate_diff <= HEART_RATE_DEEP_SLEEP) // 기준 심박수대비: 0% ~85%
{
stage ='2';
if ((existTURN == true) || (existREM == true)) // 뒤척임과 심박수 변화 있으면
{
stage = '1';
}
}
// if ((existREM == true) && (existTURN == false) && (existMOVE == false))
// 심박수의 변화가 많으면서 몸 안움직이면
{
stage ='3';
}if ((existMOVE == true) || (existAWAKE == true)) // 움직임 많고 심박 변화 크면
stage ='0';
}
else // 기준 심박수대비 93% 보다 크면
stage ='0';return stage;
}
//----- 심박수의 평균, 표준편차 구한다
void calculateStdDev_heart(void)
{
float sum=0, avg, dev, stdd, z;
int i;
for(i=0;i<tmp_BUF_NUM;i+=1)
{
sum+=heartRate[i];
}
avg=sum/tmp_BUF_NUM; avg_heart=avg;
if (firstPeriod == true)
{
awake_heart =avg_heart;
firstPeriod = false;
}
dev=0;
for(i=0;i<tmp_BUF_NUM;i+=1)
{
z=heartRate[i]-avg;
dev+=z*z;
}
dev=dev/tmp_BUF_NUM; // 분산
stdd=sqrt(dev);
stdDev_heart = stdd; // 표준편차
}//----- 가속도 평균, 표준편차구한다
void calculateStdDev_xyz(void)
{
float sum=0, avg, dev, stdd, z;
int i;
for(i=0;i<tmp_BUF_NUM;i+=1)
{
sum+=xyzAdc[i];
}
avg=sum/tmp_BUF_NUM; avg_xyz=avg;
dev=0;
for(i=0;i<tmp_BUF_NUM;i+=1)
{
z=xyzAdc[i]-avg;
dev+=z*z;
}
dev=dev/tmp_BUF_NUM; // 분산
stdd=sqrt(dev);
stdDev_xyz=stdd; // 표준편차}
//----- 센서값을 배열변수에 넣고, 주기가 되면 수면단계를 분류 ------//
void saveSensorData (unsigned int x, unsigned int y, unsigned int z, unsigned char heartCnt)
{Time t = rtc.getTime(); // RTC시간 가져온다
if (goingCnt < tmp_BUF_NUM ) { // 샘플링 주기가 안됬다면--
xyzAdc[goingCnt] = x+y+z; // x, y, z 축 adc값 더해서 배열에 저장
heartRate[goingCnt] = heartCnt; // 심박수도 배열에 저장
goingCnt += 1;
}
if (goingCnt == tmp_BUF_NUM){ // 수면단계 계산 주기가 되었다면--
calculateStdDev_heart(); // 심박수 평균, 표준편차 구하고
calculateStdDev_xyz(); // x, y, z 축 합계값의 평균, 표준편차
sleepStage = calculateSleepStage(); // 수면단계를 분류한다
goingCnt = 0;// SD카드에 수면단계 및 특징 데이타를 저장 --------//
static char tBuf[9] ="";
sprintf(tBuf, "%1c,%3d,%3d", sleepStage, awake_heart, avg_heart);String myStr = "";
myStr += String(t.year);
myStr += "/";
myStr += String(t.mon);
myStr += "/";
myStr += String(t.date);
myStr += " ";
myStr += rtc.getTimeStr();
myStr += ",";
myStr += tBuf;
myStr += ",";
myStr += String(stdDev_heart);
myStr += ",";
myStr += String(avg_xyz);
myStr += ",";
myStr += String(stdDev_xyz);File mySFile = SD.open("LOGSTAGE.csv", FILE_WRITE);
if (mySFile) {
mySFile.println(myStr);
mySFile.close();
}
else {
Serial.println("Error opening, LOGSTAGE.csv");
}
}
// SD카드에 수집한 센서 데이타를 저장 ------------//
static char tmpBuf[9] ="";
sprintf(tmpBuf, "%1c,%3d,%3d", sleepStage, awake_heart, heartCnt);String myString = "";
myString += String(t.year);
myString += "/";
myString += String(t.mon);
myString += "/";
myString += String(t.date);
myString += " ";
myString += rtc.getTimeStr();
myString += ",";
myString += tmpBuf;
myString += ",";
myString += String(x);
myString += ",";
myString += String(y);
myString += ",";
myString += String(z);
myString += ",";
myString += String(x+y+z);
File myFile = SD.open("LOGHEART.csv", FILE_WRITE);
if (myFile) {
myFile.println(myString);
myFile.close();
}
else {
Serial.println("Error opening, LOGHEART.csv");
}
}//----- 아두이노 셋업 모듈 ----------------------//
void setup(){
Serial.begin(57600); // 시리얼 모니터 시작
btSerial.begin(9600); // 블루투스 통신 시작 - 앱과 통신rtc.halt(false); // RTC 동작모드로 설정
rtc.writeProtect(true); // RTC 시간 변경 못하게 설정
Wire.begin(); // I2C통신 시작 - 심박센서
pinMode(X_PIN,INPUT); // 가속도 센서 - X축 아나로그 입력모드로 설정
pinMode(Y_PIN,INPUT);
pinMode(Z_PIN,INPUT);
pinMode(BUTTON_PIN, INPUT); // 푸시버튼 - 디지탈 입력 모드로 설정
pinMode(LED_PIN, OUTPUT); // LED 핀 - 디지탈 출력 모드로 설정
while (!SD.begin(chipSelectPin)) // SD카드 에러인지 체크
{
SDcardOk = false;
Serial.println("SD Card Error..., Check");
delay(1000);
}
SDcardOk= true;
Serial.println("SD Card OK...");
}//----- 아두이노 무한 루프 ---------------------//
void loop()
{
{
unsigned char heartBuf; // 심박수
int varResistor_Heart, varResistor_Xyz; // 가변저항 adc값(0~1023)
}
//----- 테스트/REAL 모드인지 체크-----------//
buttonStat = digitalRead(BUTTON_PIN);
if (prevButtonStat != buttonStat){ // 버튼상태 변경됨, 계산주기를 다시 시작
prevButtonStat = buttonStat;
goingCnt = 0; // --> 계산주기를 다시시작
}
if (buttonStat == LOW) { // ----------- REAL 모드이면
tmp_BUF_NUM = BUF_NUM; // 원래 배열크기 사용
digitalWrite(LED_PIN, LOW); // LED를 끈다
Wire.requestFrom(0xA0 >> 1, 1); // 심박센서에 데이타 요청, 주소는 OXA0
delay(10);
while(Wire.available()) { // 심박센서에서 데이타 수신한것이 있으면
heartBuf= Wire.read();
}
}
else { // ----- 테스트 모드 -----------//
tmp_BUF_NUM = 15; // 1초간 15번으로 배열 줄인다
varResistor_Heart = analogRead(VAR_RES_HEART_PIN);
analogWrite(LED_PIN, varResistor_Heart/4);// 가변저항에 따라 LED밝기 변경
heartBuf = varResistor_Heart/5; // 가변 저항값으로 심박센서값 사용
}
//----- 심박수가 정상 범위이면 고고씽
if ((heartBuf >= HEART_RATE_MIN) && (heartBuf < HEART_RATE_MAX))
{
unsigned int xAxisADC = analogRead(X_PIN);
unsigned int yAxisADC = analogRead(Y_PIN);
unsigned int zAxisADC = analogRead(Z_PIN);
// 센서값을 저장하고, 샘플링 주기가 되면 수면상태 판별
saveSensorData(xAxisADC, yAxisADC, zAxisADC, heartBuf);
}delay(SAMPLING_PERIOD); // 약 1초주기 }}
}
댓글 1
조회수 6,388master님의 댓글
master 작성일
라이브러리 설치가 되어 있지 않아서 컴파일 해보지 못합니다.
어느 라인에서 에러가 나던가요?