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

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

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


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

페이지 정보

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

조회수 202

master님의 댓글

master 작성일

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

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

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.
ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
질문게시판 목록
제목 작성자 작성일 조회
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은 질문게시판에서만 작성 가능합니다. 스태프 19-01-15 791
공지 사이트 이용 안내댓글[10] master 17-10-29 8357
공지 [무료 공개] 소스코드 하이라이트 v2.0 beta [2013.02.07]댓글[1] 이미지첨부파일 master 18-01-23 3108
질문 수정부탁드립니다 새글 gud3948 03:36 1
질문 혹시 atmega128a 에 제어바이트가 있나요? 새글 초짜 02:49 3
질문 아두이노 인터럽트 질문 새글 검은볼펜 19-10-22 5
답변 답변글 답변 : 아두이노 인터럽트 질문 새글 master 19-10-22 3
질문 atmega128 TWI 를 독학하고 있습니다.댓글[6] 새글 초짜 19-10-22 8
질문 L298N 으로 DC 모터제어댓글[2] 새글 sss1 19-10-22 10
질문 아두이노로 5v dc팬 돌릴려고 하는데요댓글[1] 새글 승훈 19-10-22 9
질문 아두이노 RGB LED 질문 새글 master 19-10-22 8
질문 코드확인부탁드립니다.댓글[1] 새글 gud3948 19-10-22 13
질문 많이 급합니다 도움 부탁드립니다 새글 rkdeh 19-10-22 9
답변 답변글 답변 : 아두이노 가스센서 질문입니다. 새글 master 19-10-22 11
질문 많이 급합니다. 제발 도와주세요ㅠ댓글[1] 새글 gud3948 19-10-22 11
답변 답변글 답변 : 많이 급합니다. 제발 도와주세요ㅠ 새글 master 19-10-22 11
질문 아두이노를 이용해서 코드를 짜는걸 코딩이라고 하는데 선을 연결하고 만드는걸 뭐라고 부르는건가요? 새글 master 19-10-21 29
질문 아두이노 코드 해석 부탁드립니다.댓글[5] 새글 아두에듀잉 19-10-21 19
답변 답변글 답변 : 아두이노 코드 해석 부탁드립니다. 새글 master 19-10-21 12
질문 랜덤 LED FND 질문드립니다 새글 아두이노신입 19-10-21 15
답변 답변글 답변 : 랜덤 LED FND 질문드립니다 새글 master 19-10-21 12
질문 서보모터와 LCD 결합 질문입니다.댓글[1] 새글 Winavr 19-10-21 15
질문 아두이노 무게센서 2개 사용 질문입니다.댓글[1] 새글 Winavr 19-10-21 14
질문 아두이노 질문있습니다!! asd123 19-10-20 24
답변 답변글 답변 : 아두이노 질문있습니다!!댓글[1] master 19-10-20 27
질문 ★★★아두이노 초음파센서 모터 제어댓글[1] 이미지 롤토체스 19-10-20 37
답변 답변글 답변 : 다시한번 봐주세요 ㅠㅠ 아두이노 초음파센서 모터 제어 새글 롤토체스 19-10-21 20
답변 답변글 답변 : 답변 : 다시한번 봐주세요 ㅠㅠ 아두이노 초음파센서 모터 제어 새글 master 19-10-21 14
질문 mega2560 질문이요. 도와주세요.ㅠㅠ sky3014 19-10-20 21
답변 답변글 답변 : mega2560 질문이요. 도와주세요.ㅠㅠ master 19-10-20 18
게시물 검색

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
모바일버전으로보기