아두이노에서 날짜, 시간 출력하기.

먼저 아두이노에서 링크를 통해 Time 라이브러리는 받는다. 압축을 해제하고 각 폴더들을 아두이노 라이브러리폴더안에 넣는다. (그냥 압축 풀고 통째로 넣으면 헤더파일을 읽어오지 못한다.)



다운로드 주소
http://playground.arduino.cc/Code/Time
아두이노 라이브러리 경로
C:\Program Files (x86)\Arduino\libraries 혹은
C:\Users\사용자명\Documents\Arduino\libraries

라이브러리를 사용하는 2가지 방법이 있다. 먼저 아두이노 설치경로안에 libraries 폴더 안에 넣거나, Documents 폴더내의 아두이노 폴더에 넣는 방법이다. 다른 점은 크게 없고, 어떻게 화면에 나누어지는가의 차이인 것 같다. 아래 사진은 Documents 폴더 내의 아두이노 라이브러리에 넣은 화면이다.(초록색)


실행하기

코드는 라이브러리 설치 후에 '파일 > 예제'에 있는 TimeRTC 코드를 조금 수정한 것으로, RTC(Real Time Clock)칩에 저장된 값을 불러와서 출력한다.

#include <Time.h>  
#include <Wire.h>  
#include <DS1307RTC.h> 

void setup()  {
  Serial.begin(9600);
  setSyncProvider(RTC.get);  
  setTime(17,39,0,24,2,15);
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");      
}

void loop()
{
   digitalClockDisplay();  
   delay(1000);
}

void digitalClockDisplay(){
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}
시간 설정
setTime(hr, min, sec, day, month, year);
예 : setTime(17,39,0,24,2,15); // 2015.2.24 17:39:00

업로드하고 난 뒤에, 시리얼 모니터를 확인하면 다음과 같은 화면을 보여준다.



관련 문제점

에러 : 'BYTE' was not declared in this scope

에러 : must be const in order to be put into read-only section by means of '__attribute__((progmem))'


결론

먼저 실행하기 전에 컴파일단계에서 에러때문에 꽤나 답답하였다. 위 코드에서 문제점은 현재시각을 출력하지 않는다는 점이다. 앞으로 컴퓨터나 핸드폰의 시간을 받아와서 출력하도록 해봐야겠다. 혹은 인터넷의 시간을 가져오는 방법도 찾아봐야겠다.


참고사이트 링크링크, 링크


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.7.0_51

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


코드 실행시간 확인하기

조금 더 정확한 측정 방법

public class TimerTest {
	public static void main(String[] args) {

		ExecTime timer = new ExecTime();
		timer.start();

		// code
		for (int i = 0; i < 100000000; i++) {

		}
		timer.stop();

		timer.printExecTime();
		System.out.println(timer.getRunTimeNano() / 1000000 + " ms");
		System.out.println(timer.getRunTimeNano() / 1000000 / 1000 + " sec");
	}

}

class ExecTime {
	private long start;
	private long stop;

	void start() {
		start = System.nanoTime();
	}

	void stop() {
		stop = System.nanoTime();
	}

	long getRunTimeNano() {
		return stop - start;
	}

	void printExecTime() {
		System.out.println(stop - start + " ns");
	}
}

방법1

class TimeTest1 {
	public static void main(String[] args) {

		long startTime = System.currentTimeMillis();

		// code

		long stopTime = System.currentTimeMillis();
		long runTime = stopTime - startTime;

		System.out.println(runTime);
	}
}

방법 2

public class Stopwatch {
	long start;
	long end;
	
	void start() {
		start = System.currentTimeMillis();
	}
	
	void stop() {
		end = System.currentTimeMillis();
	}
	
	String getRunTime(){
		return end - start + "";
	}
}
class TimeTest2 {
	public static void main(String[] args) {

		Stopwatch timer = new Stopwatch().start();

		// code

		timer.stop();

		System.out.println(timer.getRunTime());
	}
}

'대학 생활 > JAVA' 카테고리의 다른 글

[JAVA] java.io.RandomAccessFile() (작성중)  (0) 2014.05.27
[JAVA] 전기 요금 계산  (0) 2014.05.14
[JAVA] 연산자 우선순위  (0) 2014.05.02
[JAVA] 파일 읽기, 쓰기  (0) 2014.04.16


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit


문제점

작업표시줄을 오른쪽으로 바꾸었더니 날짜가 표시되지 않는다.

그리고 날짜를 표시하는데 이왕 내가 원하는 형식으로 표시하도록 하자.


해결방안

■ 세로모드(오른쪽, 왼쪽) 에서 날짜 표시하기.

1. 작업표시줄 오른쪽 클릭을 하고 작업표시줄 잠금을 해제한다.



2. 그리고 작업표시줄을 넓히면 날짜까지 모두 나오게 된다.



■ 시계 형식 바꾸기

날짜때문에 넓어진 작업표시줄을 위해 날짜형식을 바꾸어보자.


제어판 - 시계, 언어 및 국가별 옵션 - 국가 및 언어 - 추가 설정(D)


아래 형식처럼 바꾼다.



훨씬 보기 편한 형식으로 바뀌었다.



참고 : http://memesong.blogspot.kr/2012/09/blog-post.html


import java.text.SimpleDateFormat;
import java.util.Date;

// 시스템으로부터 현재시간(ms) 가져오기
long now = System.currentTimeMillis();
// Data 객체에 시간을 저장한다.
Date date = new Date(now);
// 각자 사용할 포맷을 정하고 문자열로 만든다.
SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String strNow = sdfNow.format(date);

// 1. 위 코드를 2줄로 줄였다.
SimpleDateFormat sdfNow = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
time = sdfNow.format(new Date(System.currentTimeMillis()));
					
// 2. 위 코드를 1줄로 줄였다. 하지만 위에 코드를 이해하지 못한 상태라면 가독성이 떨어질 수 있다.
time = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(new Date(System.currentTimeMillis()));


다른 방법

Calendar calendar = Calendar.getInstance();

// long으로 가져올 때
long now = calendar.getTimeInMillis();
// 문자열로 가져올 때
String str = calendar.getTime().toString();

calendar.getTime().toString(); 일 때 출력 형식



인터넷에 검색하면 많이 나오는 코드이다.

하지만 컴퓨터가 너무 빠른이유인지 모르겠지만... 0초가 나온다.


#include <stdio.h>
#include <time.h>

int main(void) {
    clock_t start, end;
    double timechk;

    start = clock();

    int i;
    for(i = 0; i < 20000; i++) {
        //실행할 문장들
    }

    end = clock();
    timechk = (double)(end - start) / CLOCKS_PER_SEC;
    printf("time : %f\n", timechk);

    return 0;
}


다음은 결과값이 나온 코드이다. 정확한지는 모르겠지만 결과는 나온다... 우선 이걸로 측정해야겠다.
#include <stdio.h>
#include <sys/time.h>

int main(void) {
    struct timeval start, end;
    double timechk;

    // 현재시간
    gettimeofday(&start, NULL);

    int i;
    for(i = 0; i < 10000; i++) {}

    // 계산
    gettimeofday(&end, NULL);
    timechk = (double)(end.tv_sec) + (double)(end.tv_usec) / 1000000.0 -
        (double)(start.tv_sec) - (double)(start.tv_usec) / 1000000.0;
    printf("%f\n", timechk);

    return 0;
}


+ Recent posts