P. 224 활동노트 플러그드 : 팔 굽혀 펴기 자동 측정 시스템 만들기 II(비상교육 정보교과서)
본 위키는 비상교육 고교 정보교과서 P. 224 활동노트 플러그드 : 팔 굽혀 펴기 자동 측정 시스템 만들기 II에 대한 내용을 서술합니다.
P. 224 활동노트 플러그드 : 팔 굽혀 펴기 자동 측정 시스템 만들기 II
다음과 같은 조건의 '팔 굽혀 펴기 자동 측정 시스템'을 만들려고 한다. 이 문제를 해결하기 위해 피지컬 컴퓨팅을 설계하고 오른쪽과 같은 회로를 완성하였다. 제어 프로그램을 작성하여 피지컬 컴퓨팅을 완성해보자.
조건 | 완성된 회로도 |
---|---|
329x329픽셀 |
※ 교과서의 회로에서 버튼 회로는 수정했으니 참고바랍니다.
풀업 저항을 사용했으며 저항 및 플로팅 현상에 대한 자세한 내용은 택트 스위치 문서에서 확인하세요.
1. 주어진 문제의 '현재 상태'와 '목표 상태'를 각각 적어 보자.
현재 상태 |
|
목표 상태 |
|
2. 피지컬 컴퓨팅을 제어하는 프로그램을 작성해 보자.
(1) 입력 자료 만들기
#define TRIGGER_PIN 10
#define ECHO_PIN 11
#define LED_PIN 12
#define BUTTON_PIN 8
int count = 0;
bool measuring = false;
bool isInPosition = false; // 10cm 이하에 있는지 여부
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
pinMode(TRIGGER_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.begin(9600);
}
(2) 계산하기
단순히 초음파 센서 값을 확인하고 카운트를 한다면 몸이 10cm 이내에 있는 동안 계속 카운트가 되어 측정 횟수에 오류가 생깁니다.
IsInPosition 변수를 사용하여 초음파 센서 값 10cm 이내에 들어온 이후 몸을 다시 들어올려 20cm 밖으로 나가면 카운트가 1 올라가도록 했습니다.
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) {
measuring = !measuring;
if (measuring) {
count = 0;
isInPosition = false; // 초기화
Serial.println("측정 시작!");
} else {
Serial.print("총 팔 굽혀 펴기 횟수: ");
Serial.println(count);
}
delay(500); // debounce delay
}
if (measuring) {
delay(50); // 측정 간격
long duration, distance;
// 초음파 발사
digitalWrite(TRIGGER_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGGER_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGGER_PIN, LOW);
// 반사된 초음파 수신
duration = pulseIn(ECHO_PIN, HIGH);
// 거리 계산 (cm 단위)
distance = (duration / 2) * 0.0343; // 소리의 속도: 0.0343 cm/μs
if (distance > 0) {
if (distance <= 10) {
digitalWrite(LED_PIN, HIGH);
if (!isInPosition) {
isInPosition = true; // 10cm 이하로 들어옴
}
} else if (distance >= 20) {
digitalWrite(LED_PIN, LOW);
if (isInPosition) {
count++; // 다시 10cm 이상으로 나가면 카운트 증가
isInPosition = false; // 상태 초기화
}
}
}
}
}
(3) 출력 자료 만들기
import matplotlib.pyplot as mplot
# Sample data
names = ['Student A', 'Student B', 'Student C']
counts = [5, 8, 3]
# Create bar graph
mplot.bar(names, counts, color=['blue', 'orange', 'green'])
# Set graph title and axis labels
mplot.xlabel('Students')
mplot.ylabel('Push-up Count')
mplot.title('Push-up Count Comparison')
# Show the graph
mplot.show()
실행 결과
○ 작동 영상
○ 시리얼 모니터