Skip to content

활동

최고-최저 온도 데이터 기록 및 수집 프로그램

고급 | Python | LED, 버튼, 온도 센서, | 데이터 처리, 데이터 형, 변수, 입력/출력

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_dataset_nv_data 는, 내부 메모리 에 저장되어있는 텍스트 파일에서 값을 읽고 쓰는데 사용합니다. 다음 함수들은 수를 문자열로 바꾸거나, 문자열을 수로 바꾸는데 사용됩니다.:

  • int() 함수는 텍스트(문자열)를 수(정수)로 바꾸는데 사용 되는데, 기록 되어 있던 값을 수로 바꾸어 현재 읽은 온도 값과 비교하는데 사용됩니다.
  • str() 함수는 수를 문자열로 변환합니다. 예를 들어, 온도값(정수)를 문자열로 바꾸어 텍스트 파일로 저장할 때 사용합니다.

함수 안에서는 tryexcept 명령을 사용해서 데이터 파일을 읽거나 쓸 때 발생하는 오류를 처리합니다. 프로그램을 처음 실행시켰을 때 처럼 최고값 파일(max.txt)이나 최저값 파일(min.txt)이 없는 경우에는, max 변수와 min 변수의 값을 현재 온도로 설정합니다.

프로그램의 주요 부분들은 while True: 반복 실행 구조 안에서 실행됩니다. 이 반복 실행 구조는 MakeCode 에 있는 무한 반복 실행 블록처럼 실행됩니다.

3단계: 더 좋게 만들어 보세요.

  • micro:bit 의 온도 센서는 CPU 안에 들어있기 때문에, 실제 micro:bit 주변의 온도보다 더 높게 측정됩니다. 다른 일반 온도계를 사용해서 측정한 온도값과 비교한 후, 그 차이 값을 temperature()를 사용해 읽은 온도값에서 빼는 방법으로 더 정확한 온도를 측정할 수도 있습니다.
  • 프로그램을 수정해서 다른 종류의 데이터들도 저장할 수 있습니다. 예를 들어, 가속도 센서로 측정한 힘도 파일로 기록할 수 있습니다.
  • 무선 라디오 기능을 더 추가해서, 다른 위치에 있는 micro:bit 로 데이터를 전송할 수도 있습니다.
파이썬 프로그래밍언어로 데이터를 저장하는 방법에 대해 더 살펴보세요.