학습목표    1

학습주제    1

예습내용    1

실습방법    1

        1

중요함수    1

그래프 그리기

학습목표

데이터를 그래프로 그리는 방법을 배운다.

학습주제

타이머를 0.1초로 동작시키고 1부터 1 증가하는 데이터를 메모리에 저장하고 이를 그래프로 그린다.

예습내용

 

실습방법

   

(1)     프로젝트 이름을 Graph 만든다. 아래 해당번호의 프로그램은 GraphDlg.cpp 빨간 글씨로 표시되어 있다.

(2)     메뉴의 View->ClassWizard에서 0.5초마다 동작하는 타이머를 설정한다.

WM_TIMER 마우스 왼쪽 버튼을 두번 크릭하면 OnTimer 함수가 만들면 함수는 0.1초마다 동작하게 된다.

(3)     BOOL CGraphDlg::OnInitDialog() SetTimer(1,100,NULL); 추가하여 타이머가 0.1초마다 동작하게 한다.

(4)     Control Tool Bar에서  선택하여 그래프창을 만든다.

 

CWGraph1 오른쪽 마우키를 눌러 Properties 선택한다. 아래 그림과 같이 Xaxis, Yaxis-1 Auto scale 선택을 해제하고 Minimur, Maximur 0~100으로 한다.

 

(5)     그래프의 Variable 아래와 같이 추가한다.

(5)     ClassView에서 마우스 오른쪽키를 눌러 Y 데이터 저장을 위한 배열을 정의 한다.

BOOL CGraphDlg::OnInitDialog() 함수에 배열을 만든다.

Yvalue = new double[100];                           // (6)

 

(7)     같은 방법으로 iTime 정의 하여 타이머가 On 때마다 1 증가 시킨다. 100개까지 저장되게 한다.

BOOL CGraphDlg::OnInitDialog() iTime=0으로 초기화를 한다.

 

(8)     OnTimer(UINT nIDEvent) 함수를 아래와 같이 구성한다.

 

void CGraphDlg::OnTimer(UINT nIDEvent)

{

              // TODO: Add your message handler code here and/or call default

              if(iTime >= 100)      // 데이타를 100개까지 반복적으로 저장

                                                                iTime = 0;

              Yvalue[iTime] = (double)iTime;

             

              // Move the data to the CNiReal64Vector data type

              CNiReal64Vector myvector(iTime+1, Yvalue);

              m_graph.PlotY(myvector, 0., 1.);

              iTime++;

 

              CDialog::OnTimer(nIDEvent);

}

 

처음

   

1.        그래프를 그릴 때마다 “sndPlaySound("꿈의소리", SND_SYNC)” 함수를 써서 스피커에서 소리가 나도록 프로그램한다. “꿈의소리.wav” 파일은 실행 파일과 같은 디렉토리에 있어야 한다.

아래는 “OnTimer” 함수에 프로그램을 수정한 것이다.

 

void CGraphDlg::OnTimer(UINT nIDEvent)

{

              // TODO: Add your message handler code here and/or call default

              if(iTime >= 100)                    // 데이타를 100개까지 반복적으로 저장

                             iTime = 0;

              Yvalue[iTime] = (double)iTime;

             

              // Move the data to the CNiReal64Vector data type

              CNiReal64Vector myvector(iTime+1, Yvalue);

              m_graph.PlotY(myvector, 0., 1.);

              iTime++;

              sndPlaySound("꿈의소리", SND_SYNC);

 

              CDialog::OnTimer(nIDEvent);

}

 

2.        위의 예제 타이머를 정지 시키고 마우스를 움직일 때마다 그래프가 그려지도록 프로그램 하시오.

1)       OnInitDialog()에서 SetTimer() 함수를 정지 시킨다.

2)       메뉴에서 ClassWizard 선택하고 “WM_MOUSEMOVE” 선택해 OnMouseMove(UINT nFlags, CPoint point) 함수를 만들고 여기에 위의 OnTimer() 있는 함수를 그대로 복사한다.

    아래는 “OnMouseMove” 함수이다.

 

void CGraphDlg::OnMouseMove(UINT nFlags, CPoint point)

{

              // TODO: Add your message handler code here and/or call default

              if(iTime >= 100)      // 데이타를 100개까지 반복적으로 저장

                             iTime = 0;

              Yvalue[iTime] = (double)iTime;

             

              // Move the data to the CNiReal64Vector data type

              CNiReal64Vector myvector(iTime+1, Yvalue);

              m_graph.PlotY(myvector, 0., 1.);

              iTime++;

              CDialog::OnMouseMove(nFlags, point);

}

 

 

AVR 통신 프로그램

1.        과제1” 그래프를 그릴 마다 통신으로 보드의 LED 8개가 동시에 On/Off 반복적으로 동작하도록 프로그램한다.

if(iTime%2==0) iTime 2 나눈 나머지는 01 반복해서 발생함으로 값을 따라 LED 동작하도록 프로그램 하였다.

 

void CRs232Dlg::OnTimer(UINT nIDEvent)

{

              // TODO: Add your message handler code here and/or call default

              if(iTime >= 100)      // 데이타를 100개까지 반복적으로 저장

                             iTime = 0;

              Yvalue[iTime] = (double)iTime;

             

              // Move the data to the CNiReal64Vector data type

              CNiReal64Vector myvector(iTime+1, Yvalue);

              m_graph.PlotY(myvector, 0., 1.);

              iTime++;

              sndPlaySound("꿈의소리", SND_SYNC);

 

              // LED 동작을 통신으로 보낸다.

              unsigned char buff[5]="";

              if(iTime%2==0) {

                             buff[0]=0x00;

                             m_ComuPort.WriteComm((unsigned char*)buff,1);

              }

              else {

                             buff[0]=0xff;

                             m_ComuPort.WriteComm((unsigned char*)buff,1);

              }

 

              CDialog::OnTimer(nIDEvent);

}

 

[전체프로그램 내려받기]

2.        “과제2 프로그램에서 타이머 동작을 정지 시키고 마우스가 움직일 마다 그래프를 그리고 보드의 LED 동작 하도록 프로그램 하시오.

 

void CRs232Dlg::OnMouseMove(UINT nFlags, CPoint point)

{

             // TODO: Add your message handler code here and/or call default

             if(iTime >= 100)       // 데이타를 100개까지 반복적으로 저장

                               iTime = 0;

             Yvalue[iTime] = (double)iTime;

            

             // Move the data to the CNiReal64Vector data type

             CNiReal64Vector myvector(iTime+1, Yvalue);

             m_graph.PlotY(myvector, 0., 1.);

             iTime++;

             sndPlaySound("꿈의소리", SND_SYNC);

 

             // LED 동작을 통신으로 보낸다.

             unsigned char buff[5]="";

             if(iTime%2==0) {

                               buff[0]=0x00;

                               m_ComuPort.WriteComm((unsigned char*)buff,1);

             }

             else {

                               buff[0]=0xff;

                               m_ComuPort.WriteComm((unsigned char*)buff,1);

             }

             CDialog::OnMouseMove(nFlags, point);

}

 

 [전체프로그램 내려받기]

중요함수