1단계: 만들어 보세요.
프로젝트 소개
micro:bit 자체를 데이터 로깅 장치로 만들어 보세요. 최고-최저 온도를 측정해서 저장해 두는 방법을 사용해서, 배터리가 떨어지거나 전기가 끊어지더라도 데이터들이 사라지지 않도록 만들 수 있습니다.
Python 프로그래밍언어로 작성되어있습니다만, 데이터를 측정하고 수집하기 위한 목적 뿐이라면, 파이썬 프로그래밍에 대해서 정확히 이해 해야할 필요는 없습니다.
학습 내용
- Python 으로 메모리 저장 장치에서 데이터를 읽고 쓰는 방법. 전기가 끊어져도 기록된 데이터를 읽어올 수 있습니다.
- 파이썬 프로그램에서 오류가 발생했을 때 처리하는 방법
- 수 데이터들을 문자열로 변환하거나, 숫자로 구성된 문자열을 수로 바꾸는 방법
준비물
- micro:bit 1대
- 배터리 팩 (옵션)
사용방법
- hex 프로그램 파일을 다운로드 한 후, micro:bit 에 업로드합니다.
- 배터리 팩을 micro:bit 에 연결한 후, 온도 변화를 측정할 장소에 가져다 둡니다. 마이크로비트를 집 밖에 두거나, 냉장고 안에 잠시 넣어 두었다가 꺼내도 됩니다.
- 마이크로비트를 흔들면 현재 온도를 출력해서 보여줍니다.
- A 버튼을 누르면, 기록되었던 온도 중에서 가장 낮은 최저 온도를 출력해 보여 줍니다.
- B 버튼을 누르면, 기록되었던 온도 중에서 가장 높은 최고 온도를 출력해 보여 줍니다.
- GND 핀과 2 번 핀을 두 손으로 잡으면, 현재 측정되고 있는 온도를 최고 온도와 최저 온도로 기록합니다.
2단계: 프로그래밍 해보세요.
1from microbit import *
2
3# function to read data file:
4def get_nv_data(name):
5 try:
6 with open(name) as f:
7 v = int(f.read())
8 except OSError:
9 v = temperature()
10 try:
11 with open(name, 'w') as f:
12 f.write(str(v))
13 except OSError:
14 display.scroll('Cannot create file %s' % name)
15
16 except ValueError:
17 display.scroll('invalid data in file %s' % name)
18 v = temperature()
19
20 return v
21
22# function to write data file:
23def set_nv_data(name, value):
24 try:
25 with open(name, 'w') as f:
26 f.write(str(value))
27 except OSError:
28 display.scroll('Cannot write to file %s' % name)
29
30min = get_nv_data('min.txt')
31max = get_nv_data('max.txt')
32
33while True:
34 currentTemp = temperature()
35 if currentTemp < min:
36 min = currentTemp
37 set_nv_data('min.txt', min)
38 if currentTemp > max:
39 max = currentTemp
40 set_nv_data('max.txt', max)
41 if accelerometer.was_gesture('shake'):
42 display.scroll(currentTemp)
43 if button_a.was_pressed():
44 display.scroll(get_nv_data('min.txt'))
45 if button_b.was_pressed():
46 display.scroll(get_nv_data('max.txt'))
47 if pin2.is_touched():
48 display.scroll('clearing data')
49 set_nv_data('min.txt', currentTemp)
50 set_nv_data('max.txt', currentTemp)
51
설명
이 데이터 로깅 프로그램은 micro:bit 에 전기가 끊어지더라도, 그 이전까지 기록 했던 데이터가 남아있습니다. 측정한 데이터 값을 마이크로비트 내부에 있는 비휘발성 내부 메모리 장치에 저장하기 때문입니다. 컴퓨터 전원을 꺼도 데이터들이 남아있는 보조기억 장치와 같은 것이라고 생각할 수 있습니다. micro:bit 에 업로드 한 프로그램이 전기를 끊어도 지워지지 않고 남아있는 것과 같은 기능이라고 생각할 수 있습니다.
프로그램은 micro:bit 의 메모리 기억 장치 안에 2개의 텍스트 파일을 저장합니다. min.txt
파일과 max.txt
파일에 값을 저장하고, 파이썬 프로그램으로 그 안에 들어있는 값을 읽거나 갱신할 수 있습니다.
프로그램에서는 3개의 변수를 사용해서 온도를 추적하고 비교합니다:
currentTemp
는 micro:bit 에 내장되어있는 온도 센서로 읽은 온도를 저장하는 변수입니다.max
는 최고 온도를 저장하는 변수입니다. 측정한 온도가 이전까지 알고 있었던max
값보다 크면 (>) 값을 갱신합니다.min
은 최저 온도를 저장하는 변수입니다. 측정한 온도가 이전까지 알고 있었던min
값보다 작으면 (<) 값을 갱신합니다.
2개의 함수 get_nv_data
와 set_nv_data
는, 내부 메모리 에 저장되어있는 텍스트 파일에서 값을 읽고 쓰는데 사용합니다. 다음 함수들은 수를 문자열로 바꾸거나, 문자열을 수로 바꾸는데 사용됩니다.:
int()
함수는 텍스트(문자열)를 수(정수)로 바꾸는데 사용 되는데, 기록 되어 있던 값을 수로 바꾸어 현재 읽은 온도 값과 비교하는데 사용됩니다.str()
함수는 수를 문자열로 변환합니다. 예를 들어, 온도값(정수)를 문자열로 바꾸어 텍스트 파일로 저장할 때 사용합니다.
함수 안에서는 try
와 except
명령을 사용해서 데이터 파일을 읽거나 쓸 때 발생하는 오류를 처리합니다. 프로그램을 처음 실행시켰을 때 처럼 최고값 파일(max.txt)이나 최저값 파일(min.txt)이 없는 경우에는, max
변수와 min
변수의 값을 현재 온도로 설정합니다.
프로그램의 주요 부분들은 while True:
반복 실행 구조 안에서 실행됩니다. 이 반복 실행 구조는 MakeCode 에 있는 무한 반복 실행 블록처럼 실행됩니다.
3단계: 더 좋게 만들어 보세요.
- micro:bit 의 온도 센서는 CPU 안에 들어있기 때문에, 실제 micro:bit 주변의 온도보다 더 높게 측정됩니다. 다른 일반 온도계를 사용해서 측정한 온도값과 비교한 후, 그 차이 값을
temperature()
를 사용해 읽은 온도값에서 빼는 방법으로 더 정확한 온도를 측정할 수도 있습니다. - 프로그램을 수정해서 다른 종류의 데이터들도 저장할 수 있습니다. 예를 들어, 가속도 센서로 측정한 힘도 파일로 기록할 수 있습니다.
- 무선 라디오 기능을 더 추가해서, 다른 위치에 있는 micro:bit 로 데이터를 전송할 수도 있습니다.
This content is published under a Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) licence.