본문 바로가기

전체 글215

아두이노와 미분방정식 항상 그렇지만 오늘하는 주제는 재미로 하는 주제 입니다. 인터넷을 보다가 아두이노 328P, 우노보드가 286 컴퓨터보다 빠르다는 기사를 봤습니다. 과연...? 사실 본인이 컴퓨터 처음공부 할떄는 286,XT 컴퓨터 이전이라.... XT컴퓨터에 도스가 와.... 오락실에서만 하던 테트리스가 흑백이지만. 플로피디스크에 돌아 갈떄 와 했던 기억이.... 그래서 한번해 봤습니다. 우노가 미분방정식을 풀수 있는지...? 결론부터 이야기 하면 2차 미분방정식을 푸는데 0.0008,9초 정도 걸리는것보니 정말 빠르네요. 식이 간단한것도 있지만, 그래도 미분방정식이니 재미있게 한번 보죠. 두원의 교점을 구하는 문제 입니다. 사실 제가 아는 방법만해도 많으니, 방법의 소개는 그만 두고, 제일 쉬운 뉴턴랍슨 방법으로 풀.. 2020. 10. 8.
아두이노와 가변인자 #4 마지막으로 sprintf를 대체할만한 xprintf를 만들어 보자. sprintf만 가지고도 충분히 좋기는 하지만, 한가지 부족한 실수 문제를 극복하자. 별다른 이유는 없다. 가변인자에 대한 설명이다. 가변인자를 바로 활용하기는 어렵겠지만, 기본개념만 알고가는것도, 이런것이 있다는것도 재미있는 코딩 생활이 될것이다. #include #include void xprintf(char* p, char *types, ...) { va_list ap; int i = 0; va_start(ap, types); while (types[i] != '\0') { if(types[i]=='%') { i++; switch (types[i]) { case 'i': p += sprintf(p, "%d", va_arg(ap, i.. 2020. 9. 29.
아두이노와 가변인자 #3 앞에서 가변인자의 대략적인 형식을 배웠다면, 이제 본격적으로 형태를 공부하자. 단순한 문장인데, 앞에 특별한 단어를 삽입해서 출력을 하는 함수이다. #include #include void errorPrintf(char* p, char* fmt, ...) { va_list ap; strcpy(p, "[ERROR] "); va_start(ap, fmt); vsprintf(p + strlen(p), fmt, ap); va_end(ap); } void setup() { Serial.begin(9600); } void loop() { char buf[25]; errorPrintf(buf, "%d %s", 1, "xxx"); Serial.println(buf); delay(1000); } Colored by Co.. 2020. 9. 29.
아두이노와 가변인자 #2 가변인자란 말그래도 인자의 개수가 정해져 있지 않다. C++의 함수의 오버로딩과의 개념과도 다르다. printf의 경우 함수의 인자의 개수가 정의 되어 있지 않다. 사실 이런식으로 코딩을 하지 않겠지만, 아래 예시는 가변인자의 기본개념이다. 인자의 개수가 정의 되어 있지 않다는거다. #include #include int sum(int count, ...) { int res = 0; va_list ap; int i; va_start(ap, count); for(i=0; i 2020. 9. 29.
아두이노와 가변인자 #1 아두이노와 가변인자 C 프로그래밍을 하면서 자주사용하는 부분이다. 그러나 이정도까지는 잘 모른다. 본인도 그렇고 그다지 잘 활용하지는 않는 부분이다. C언어의 printf는 의외로 활용도가 높다. C++의 cout이 있지만, 아직까지 printf를 선호 한다. 그러나 아두이노로오면, 시리얼 print가 있지만, 왠지.. 쓰래기 같다. 문장울 만들가애 왠지 불편하다. 그래서 본인은 sprintf를 선호한다. 아무래도 활용도가 자유롭다. 단 한가지만 제외한다면, 실수 출력이 되지 않는다. 대충 편법으로 극복은 하지만 이것도 불편하다. p+= sprintf(p, "%s", String(12.34,2).c_str()); 그래서 가변인자에 대해서 알아보자. 솔찍히 아두이노 컴파일러가 이정도까지 지원할지는 몰랐다... 2020. 9. 29.
아두이노를 이용한 데이터 저장 -#11 이전에 구조체를 이해 했기를 바라면서, 알아도 되고 몰라도 되는 부분이지만, 알면 얼청난 위력을 발휘하는게 구조체와 포인터 이다. 오늘은 간단하게 함수 두개만 공부하고 넘어가자. 구지 설명이 필요 없을수도 있지만, 설명을 하는것으로 하자. 온도센서에서 온도를 읽기 위한 함수 void read_temp(Info& _info); 초보들이 보면 많은 의문이 있겠지만, 왜 전역변수를 구지 인자로 넘겨서 처리 했을까? 이것은 함수의 재활용성에 있다. 이 함수를 여기에서만 사용한다면 ? 그렇수도 있다. 만약 전역변수가 아니라면 ? 여러가지 이유로 습관적으로 인자로 넘긴다. 그리고 디버깅의 관점에서도 용의 할수도 있다. 많은 이유를 설명으로 하기는 어렵지만 전역변수는 필요악으로 보는게 좋다. 최대한 사용하지 않는 습.. 2020. 9. 27.
아두이노를 이용한 데이터 저장 -#10 오늘부터 이전 소스코드도 공부하면서 C/C++ 언어 복습도 하자. 이번에 공부할것은 구조체 하나 이다. 처음하는 초보들은 구조체에 대해서 알지못하는것 보다, 더 어려운게 어디에 사용하지 ? 왜 사용하지 이다. 사실 C언어 이전에는 잘 없었다. C언어 이전에 포트란까지는 없었다. 파스칼 부터 구조체가 등장했다고 생각하면 쉬울것이다. 그렇다고 포트란에 없느냐 ? 그것도 아니다. 포트란 77까지는 없었지만 포트란 90으로 오면서 생겨 났다.심지어는 C언어의 포인트까지 있다. 어쨰던 C언어에서 공부해야 할것은 두가지가 있다. 구조체와 포인트이다. 본인이 학생들가르칠때는 구조체 포인트 쓰지 말라고 한다. 둘다 쉬운게 아니기 떄문이다. 모른다고 프로그램 못만드는것도 아니다. 다만 삽질을 많이 해야 한다. 포크레인 .. 2020. 9. 15.
아두이노를 이용한 데이터 저장 -#9 여기서 저장된 데이터를 보자. 1초에 한줄을 기록한다. 약 59에서 62정도 글자이다. 곧 62바이트 이다. 그러면 1시간에 3600*62 바이트다. 한시간 217 k바이트 기록한다고 볼수 있다. 파일 하나당 1024K바이트 기록한다고 했으니까 그냥 대충잡아서 4시간에 파일 하나 기록한다. 하루는 24시간이니까 6개 파일을 기록한다는 계산이 나온다. 이전 소스코드는 파일을 천개만든다고 했으니, 몇달은 데이터가 삭제 되지 않고 기록 될것이다. ​ 그리그 6번째 줄에 다시 시작했다. 4에서 0으로... 이것은 강제 재부팅, 아두이노를 강제로 다시 on/off 했다. 쉽게 말해서 전원이 나갔다가 들어 오면 그다음에 다시 기록하는것으로 했다. 제일 좋은것은 시계 모듈을 달아서 데이터가 저장되는 시점을 기록하는것.. 2020. 9. 15.
아두이노를 이용한 데이터 저장 -#8 지금까지 길게 했지만 오늘 하는것이 핵심이다. 오늘 하고 싶은것은 1초 마다 데이터를 취득해서 저장 할것이다. 물론 하드웨어가 허용하는 한도에서 시간을 줄여 0.5초 0.3초 마다 저장도 할 수 있을것 같다, 그런데 그것이 중요한것은 아니다. 1개 파일에 저장하고 그 파일의 용량이 어느정도, 정한 용량까지 기록하면 다음파일에 기록하고, 다시 다음파일에 기록하고 싶다. 물론 파일개수는 정해진 개수만큼 기록을 할 것이다. 여기소스에서는 1024 *1024 바이트, 즉 1메가 단위로 기록한다. 파일 개수는 1000개로 했다. 물론 소스코드에서 본인이 적당히 수정해도 된다. 일단은 클래스로 분리했고 오늘 부터 하나 하나씩 공부하기로 하자. 일단 소스코드 부터 보자. #include "SystemLog.h" #i.. 2020. 9. 14.