반응형
#include  
#include  
#include 

double factor; 
int n, i, j, k; 

int main() 
{ 

printf(" \n 행렬의 사이즈 n =  "); 
scanf_s(" %d", &n); 

float** a; 
a = (float**)malloc(sizeof(float*) * n); 
a[0] = (float*)malloc(sizeof(float) * n); 
for (i = 1; i < n; i++) { 
a[i] = a[i - 1] + n; 

} 

printf(" 계수행렬 A(i,j)을 입력하시오 \n"); 
for (i = 0; i < n; i++) 
{ 

for (j = 0; j < n; j++) 
{ 
printf(" A(%d, %d) :   ", i, j); 
scanf_s(" %f", &a[i][j]); 
} 
} 


printf("\n 행렬 출력 \n"); 
for (i = 0; i < n; i++) 
{ 
printf("\n"); 
for (j = 0; j < n; j++) 
{ 
printf(" %10.f", a[i][j]); 
} 

} 
printf("\n"); 

printf("\n 행렬 주소 출력 \n"); 
for (i = 0; i < n; i++) 
{ 
printf("\n"); 
for (j = 0; j < n; j++) 
{ 
printf(" %d   ", &a[i][j]); 
} 

} 
printf("\n"); 


for (k = 0; k < n - 1; k++) 
{ 
for (i = k + 1; i < n; i++) 
{ 
factor = a[i][k] / a[k][k]; 

for (j = k + 1; j < n; j++) 
{ 
a[i][j] = a[i][j] - factor * a[k][j]; 
} 


} 
} 

printf("\n 계산결과 출력 \n"); 
double sol = 1; 
for (i = 0; i < n; i++) 
{ 
for (j = 0; j < n; j++) { 
if (i == j) 
{ 

printf("%10.2f \n", a[i][j]); 
sol = sol * a[i][j]; 

} 

} 
} 
printf("행렬식의 답은 : %lf", round(sol)); 
printf("\n "); 

free(a[0]); 
free(a); 

return 0; 
}
728x90
반응형
반응형

안녕하세요! 두 번째 아두이노 시간입니다.

1초에 한 번씩 LED 점멸, 2초에 한 번씩 LED 점멸 동시에 작동하는 예제입니다. 

 

과연 아래 예제와 같이 delay()함수를 사용한다면 어떻게 동작할까요?

delay()함수를 잘못 쓴 경우 

많은 예제들을 보면 delay()함수를 사용합니다.

간단하고 편하기 때문에 많이 쓰이지만, 제대로 된 동작을 알지 못하면 상당히 위험한 함수입니다. 

 

위 스케치를 들어서 설명하겠습니다.

1. LED_state1 = !LED_state1 : LED_state1을 False 상태로 초기화되어 있기 때문에 True값이 대입됩니다.

2. digitalWrite(pin_LED1, LED_state1) : pin_LED1의 LED를 LED_state1의 상태에 동작합니다.

3. delay(1000) : 1초동안 아두이노의 동작을 멈춥니다. 

4. 1, 2번과 똑같이 동작합니다.

5. delay(2000) : 2초동안 아두이노의 동작을 멈춥니다. 

 

결국 두 개의 LED는 1초, 2초씩 깜빡이지 않고, LED1가 상태에 맞춰 동작하고,

1초 아두이노가 멈춘 후에 또 LED2가 상태에 맞춰 동작을  한 후  아두이노가 2초동안 멈추기를 반복합니다.

 

그렇다면 아두이노가 멈추지 않고 어떻게 해야 1초 깜빡, 2초 깜빡이게 만들 수 있을까요?

 

 

 

 

바로 millis()함수를 사용하면 됩니다. 

millis()함수를 이용한 2개의 LED 점멸

이와 같이 사용하면 됩니다.

이렇게 사용하면 아두이노는 동작을 멈추지 않고 계속해서 loop()문이 동작합니다.

 

현재 시간 - 시작 시간 >= 1초

현재 시간 - 시작 시간 >= 2초

 

센서가 늘어나고, 함수가 늘어나다보면 delay()함수는 상당히 위험한 함수가 됩니다.

delay()함수를 사용해버리면 us(마이크로단위)로 동작하는데

delay(1000)을 주게 되면 

아두이노 입장에서는 상당히 부담이 되는 함수일 수 밖에 없습니다.

delaymicroseconds() 함수인가? 마이크로 단위로 delay를 주는 함수도 있지만 결국 아두이노가 그 시간만큼의 동작을 

하지 못하는 것은 상당히 치명적일 수 있습니다. 

 delay()함수와 millis()함수를 주어진 역할대로 적절히 쓰는 것이 중요한 포인트라고 생각합니다. 

 

728x90
반응형
반응형

 

안녕하세요. 블로그 첫 글이네요.

이 블로그는 공부 노트와 같이 제가 공부하면서 팁과 필요한 부분을 점점 적어내려갈 예정입니다.

바로 시작하겠습니다!

 

아두이노는 교육용 목적으로 만들어진 C++ 기반의 언어라고 볼 수 있습니다. 

초등학생부터 나이불문하고 쉽게 접할 수 있습니다. 

 

저도 아두이노를 처음 사용할 때 예제를 따라하고 LED를 점멸하고 스위치를 눌러보고 아주 신기했던 기억이 납니다.

 

하지만 예제를 따라하는 것만으로는 제가 원하는 것을 만들 수 없었습니다.

저는 학부 연구생으로 평소와 같이 아두이노를 돌리고 있었습니다.

여러 센서를 붙여 delay()함수를 사용하여 한번에 여러 작동을 하려고 했으나 계속해서 실패했습니다.

제 뒤로 하드웨어 박사과정 중이신 선배님께서 delay()함수와 millis()함수에 대해 알려주셨습니다. 

 

delay(1000)은 1초동안 멈춘다는 뜻입니다.  좀 더 생각을 해보았죠. 1초동안 멈춘다. 1초동안 아무 동작을 하지 않는다.

 

제가 3학년 때 컴퓨터 구조시간에 배운 하나의 cpu는 하나의 명령밖에 수행할 수 없다고 배웠습니다.

 

delay(1000)라는 뜻은 cpu가 1초동안 아무 동작을 할 수 없다는 뜻입니다. 

 

하드웨어에서 1초는 매우 긴 시간입니다.

저희 컴퓨터 구조 시간 때 교수님은 IT에서 일주일은 무한의 시간이라고 말씀하셨던게 기억이 나네요! 

 

 

자! 그렇다면 본론으로 들어가서 그러면 어떻게 한 번에 여러가지 함수를 사용할 수 있을까요.

 

바로 정답은 millis() 함수에 있습니다. 

 

millis() 함수는 아두이노 보드에서 프로그램이 시작된 시점부터 밀리초(ms) 단위로 카운트(증가) 된 값을 unsigned long 타입으로 반환한다고 나와 있

네요!

우선 두 개의 변수를 선언해주세요

 

       

void setup()에 선언해주세요. 
void roop()문에 이와 같이 선언해줍니다.
가장 중요한 부분입니다.  현재시간의 카운트에서 시작시간의 카운트를 뺸 값이 1초보다 크면 if문을 실행합니다. 만약 >= 10000이라면 10초를 의미합니다.

 

loop() 함수가 반복되면서 현재의 밀리초를 millis() 함수로부터 계속 업데이트하며 이전 밀리초 값과 차이를 비교하는 방식으로 delay() 함수와 똑같은 기능을 할 수 있습니다. 

 

 

 

마치 cpu는 분명 한 가지의 동작을 하고 있지만, 아두이노의 속도가 상당히 빨라 저희 눈에는 동시에 움직이는 것처럼 보이는 것입니다. 마치 도트 매트리스의 잔상효과처럼!

 

delay()보다 사용하기 어려운건 분명 하나 여러가지 동작을 줄 때는 millis()함수가 상당히 효율적으로 사용할 수 있습니다.

 

선배님께서도 delay()함수는 없다고 생각하고 오로지 millis()함수만을 이용해서 공부하라고 하셨던 기억이 납니다!

여러분들도 최대한 delay()함수를 사용하지 않고 millis()함수를 애용하면 좋겠습니다!!

728x90
반응형

+ Recent posts