질문게시판 > 아두이노 코딩 질문

TODAY1,005 TOTAL604,551
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 질문게시판 | 아두이노 코딩 질문

페이지 정보

작성자 119min 작성일2019-07-27 15:52 조회73회 댓글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-CLOCK

const 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초주기 }}

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 1

조회수 73

master님의 댓글

master 작성일

라이브러리 설치가 되어 있지 않아서 컴파일 해보지 못합니다.
어느 라인에서 에러가 나던가요?

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 592
공지 사이트 이용 안내댓글[8] master 17-10-29 7619
공지 [무료 공개] 소스코드 하이라이트 v2.0 beta [2013.02.07]댓글[1] 이미지첨부파일 master 18-01-23 2838
질문 atmega128a 카운터/타이머 출력비교 질문이요댓글[1] 새글 초짜 00:54 7
질문 모터드라이버 병렬 연결댓글[3] 새글 박준2 19-08-16 12
질문 서로 다른전원(5v 12v) 제어방법 질문 새글 master 19-08-16 9
질문 모터드라이버 관련 질문 드립니다.댓글[4] 박준이 19-08-15 14
질문 Atmega128, 초음파센서 ,부저 gksl 19-08-14 13
답변 답변글 답변 : Atmega128, 초음파센서 ,부저댓글[1] master 19-08-15 14
질문 led 전력소모에 관하여,,,댓글[9] 슬레a 19-08-14 33
질문 알고리즘 문의댓글[1] 벅바 19-08-13 16
질문 블루투스가 한번 작동하고 그 다음부터 작동을 하지 않습니다.댓글[1] 아야어여 19-08-13 19
질문 아두이노 코딩 질문입니다 너무 급해요 ㅠㅠ댓글[3] 전민결 19-08-12 39
질문 코딩 작성좀 부탁드립니다. 너무 급합니다 ㅠㅠ댓글[1] 아두이노보초 19-08-10 59
질문 stm32f1 계열에서 USB로 스마트폰 연결 방법(CDC)댓글[2] 에르테르 19-08-08 33
질문 코딩을 합치고 싶습니다.. 알려주세요 19-08-08 36
답변 답변글 답변 : 코딩을 합치고 싶습니다.. master 19-08-08 37
질문 금속센서를 이용한 서보모터 돌리기댓글[1] 후우 19-08-07 43
질문 아두이노로 빛 파장 계산하기 이미지 master 19-08-07 33
질문 ISP 질문이요댓글[2] 초짜 19-08-06 31
질문 atmega128a 다시 질문이요~댓글[4] 이미지첨부파일 초짜 19-08-05 47
질문 atmega128a SCK 질문이요댓글[1] 초짜 19-08-04 36
답변 답변글 답변 : atmega128a SCK 질문이요 master 19-08-04 29
질문 A4988 모터드라이버 발열에 대해...댓글[1] 이미지첨부파일 눈티이 19-07-30 61
현재글 아두이노 코딩 질문댓글[1] 119min 19-07-27 74
질문 아두이노 코딩질문 붕붕 19-07-26 60
답변 답변글 답변 : 아두이노 코딩질문댓글[6] master 19-07-26 144
질문 적외선 센서 송수신 코딩 알려주세요댓글[3] 이미지첨부파일 뱀비 19-07-22 107
질문 BLDC 모터 정역회전 알고리즘대로 코딩 이미지첨부파일 CIE18 19-07-21 71
답변 답변글 답변 : BLDC 모터 정역회전 알고리즘대로 코딩 master 19-07-21 66
게시물 검색

2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기