3단원 마무리 - 스마트 교실 환경 제어기¶
🎯 이 장에서 배우는 것¶
예상 학습 시간: 2차시 (100분)
- [ ] 여러 센서와 출력 장치를 통합한 시스템을 구현할 수 있다
- [ ] 상태 기계 패턴으로 복잡한 로직을 관리할 수 있다
- [ ] 자신의 코드를 문서화하고 발표할 수 있다
📚 미리 알아야 할 것¶
3단원에서 배운 내용을 총동원합니다: - 온습도 센서와 불쾌지수 계산 - 조도 센서 활용 - LED와 부저 제어 - 조건문과 함수 작성
📚 핵심 개념¶
개념: 통합 시스템 설계¶
여러 센서와 출력 장치를 하나의 프로그램으로 연결하는 것은 마치 교실 관리 선생님과 같아요. 온도, 습도, 밝기를 모두 확인하고 상황에 맞는 조치를 취하죠!
flowchart TB
subgraph 입력["📥 센서 입력"]
A[🌡️ 온습도 센서]
B[💡 조도 센서]
end
subgraph 처리["⚙️ 처리"]
C[상태 판단]
end
subgraph 출력["📤 출력"]
D[🔴 LED]
E[🔔 부저]
F[📺 화면]
end
A --> C
B --> C
C --> D
C --> E
C --> F
개념: 상태 기계 패턴¶
복잡한 조건을 관리하는 패턴입니다. 현재 "상태"를 변수로 관리하면 코드가 깔끔해져요!
# 교실 상태를 문자열로 관리
classroom_state = "NORMAL" # NORMAL, HOT, DARK, ALERT
# 상태에 따른 동작
if classroom_state == "HOT":
# 환기 알림
elif classroom_state == "DARK":
# 조명 제안
🔨 따라하기¶
Step 1: 센서 데이터 수집 함수 만들기¶
코드:
import random
import time
def get_sensor_data():
"""모든 센서 데이터를 한번에 수집"""
temperature = random.uniform(18, 32)
humidity = random.uniform(40, 80)
light = random.randint(100, 900)
return {
"temp": round(temperature, 1),
"humidity": round(humidity, 1),
"light": light
}
def calculate_discomfort(temp, humidity):
"""불쾌지수 계산"""
di = 0.81 * temp + 0.01 * humidity * (0.99 * temp - 14.3) + 46.3
return round(di, 1)
# 테스트
data = get_sensor_data()
print(f"센서 데이터: {data}")
실행 결과:
센서 데이터: {'temp': 26.3, 'humidity': 65.2, 'light': 450}
Step 2: 상태 판단 함수 만들기¶
코드:
def determine_state(data):
"""센서 데이터를 분석해서 교실 상태 결정"""
di = calculate_discomfort(data["temp"], data["humidity"])
# 우선순위: 불쾌지수 > 조도
if di >= 80:
return "ALERT" # 매우 불쾌 - 긴급
elif di >= 75:
return "HOT" # 불쾌 - 환기 필요
elif data["light"] < 300:
return "DARK" # 어두움 - 조명 필요
else:
return "NORMAL" # 쾌적
# 테스트
state = determine_state(data)
print(f"교실 상태: {state}")
Step 3: 출력 제어 함수 만들기¶
코드:
def control_output(state):
"""상태에 따른 알림 출력"""
messages = {
"NORMAL": ("🟢 쾌적", "교실 환경이 좋습니다"),
"HOT": ("🟡 환기 필요", "창문을 열어주세요!"),
"DARK": ("🔵 조명 필요", "불을 켜주세요!"),
"ALERT": ("🔴 긴급!", "에어컨을 켜주세요!")
}
status, message = messages.get(state, ("❓", "알 수 없음"))
print(f"\n{'='*30}")
print(f" 상태: {status}")
print(f" 안내: {message}")
print(f"{'='*30}")
# 긴급 상황 시 부저 효과
if state == "ALERT":
print("🔔 삐삐삐! (부저 알림)")
# 테스트
control_output("HOT")
실행 결과:
==============================
상태: 🟡 환기 필요
안내: 창문을 열어주세요!
==============================
📝 전체 코드¶
"""
스마트 교실 환경 제어기
작성자: (여러분 이름)
설명: 온습도, 조도를 측정하여 교실 환경을 자동으로 모니터링합니다.
"""
import random
import time
# === 센서 함수 ===
def get_sensor_data():
"""모든 센서 데이터 수집"""
return {
"temp": round(random.uniform(18, 32), 1),
"humidity": round(random.uniform(40, 80), 1),
"light": random.randint(100, 900)
}
def calculate_discomfort(temp, humidity):
"""불쾌지수 계산"""
di = 0.81 * temp + 0.01 * humidity * (0.99 * temp - 14.3) + 46.3
return round(di, 1)
# === 상태 판단 ===
def determine_state(data):
"""교실 상태 결정"""
di = calculate_discomfort(data["temp"], data["humidity"])
if di >= 80:
return "ALERT", di
elif di >= 75:
return "HOT", di
elif data["light"] < 300:
return "DARK", di
else:
return "NORMAL", di
# === 출력 제어 ===
def control_output(state, data, di):
"""상태에 따른 알림"""
messages = {
"NORMAL": ("🟢 쾌적", "교실 환경이 좋습니다"),
"HOT": ("🟡 환기 필요", "창문을 열어주세요!"),
"DARK": ("🔵 조명 필요", "불을 켜주세요!"),
"ALERT": ("🔴 긴급!", "에어컨을 켜주세요!")
}
status, message = messages[state]
print(f"\n{'='*40}")
print(f" 🏫 스마트 교실 환경 제어기")
print(f"{'='*40}")
print(f" 🌡️ 온도: {data['temp']}°C")
print(f" 💧 습도: {data['humidity']}%")
print(f" 💡 조도: {data['light']} lux")
print(f" 📊 불쾌지수: {di}")
print(f"{'─'*40}")
print(f" 상태: {status}")
print(f" 안내: {message}")
print(f"{'='*40}")
if state == "ALERT":
print(" 🔔 삐삐삐! (긴급 알림)")
# === 메인 실행 ===
def main():
print("🏫 스마트 교실 환경 제어기 시작!")
print("(Ctrl+C로 종료)\n")
try:
for i in range(5): # 5회 측정 (실제: while True)
data = get_sensor_data()
state, di = determine_state(data)
control_output(state, data, di)
time.sleep(2) # 2초 대기
except KeyboardInterrupt:
print("\n\n프로그램을 종료합니다. 👋")
# 프로그램 실행
if __name__ == "__main__":
main()
🎤 발표 준비하기¶
코드 설명서 작성 양식¶
# 프로젝트명: 스마트 교실 환경 제어기
## 👤 제작자 정보
- 이름:
- 날짜:
## 📋 프로젝트 설명
(한두 문장으로 무엇을 만들었는지)
## 🔧 사용한 기술
- 센서: 온습도, 조도
- 출력: LED, 부저, 화면
- 패턴: 상태 기계
## 💡 핵심 기능
1. 불쾌지수 계산
2. 환경 상태 판단
3. 자동 알림
## 🎯 어려웠던 점과 해결 방법
(솔직하게 작성)
## 🚀 개선하고 싶은 점
(아이디어 자유롭게)
발표 팁¶
💡 좋은 발표의 비결 1. 시연 먼저: 코드 설명보다 실행 결과를 먼저 보여주세요 2. 핵심만: 모든 코드를 설명하지 말고 자랑하고 싶은 부분만! 3. 솔직하게: 어려웠던 점을 공유하면 공감을 얻어요
⚠️ 주의할 점¶
1. 센서 우선순위를 정하세요
# 나쁜 예: 모든 조건을 동시에 처리
if di >= 75 and light < 300: # 둘 다일 때 어떻게?
# 좋은 예: 우선순위 명확히
if di >= 80: # 1순위: 긴급
...
elif di >= 75: # 2순위: 불쾌
...
elif light < 300: # 3순위: 어두움
...
2. 상태 전환을 기록하세요
previous_state = "NORMAL"
current_state = determine_state(data)
if current_state != previous_state:
print(f"상태 변경: {previous_state} → {current_state}")
previous_state = current_state
✅ 점검하기¶
📝 3단원 종합 퀴즈¶
1. 상태 기계 패턴의 장점은 무엇인가요?
정답 확인
복잡한 조건문을 "상태"라는 하나의 변수로 관리해서 코드가 깔끔해지고, 상태 전환을 추적하기 쉬워집니다.2. 여러 센서를 사용할 때 왜 우선순위가 필요한가요?
정답 확인
동시에 여러 문제가 발생할 수 있기 때문입니다. 예: 덥고 어두울 때, 더 긴급한 문제(더위)를 먼저 처리해야 합니다.3. 코드 문서화가 중요한 이유는?
정답 확인
- 나중에 코드를 다시 볼 때 이해하기 쉬움 - 다른 사람과 협업할 때 소통이 원활 - 전문 개발자의 필수 역량🏆 3단원 완료!¶
┌─────────────────────────────────────┐
│ │
│ 🎉 3단원 수료를 축하합니다! 🎉 │
│ │
│ 📚 배운 것: │
│ ✓ 온습도 센서와 불쾌지수 │
│ ✓ 조도 센서 활용 │
│ ✓ LED, 부저 제어 │
│ ✓ 통합 시스템 설계 │
│ ✓ 상태 기계 패턴 │
│ │
│ 🌟 당신은 이제 센서 마스터! 🌟 │
│ │
└─────────────────────────────────────┘
💡 여러분의 성장: 처음엔 LED 하나 켜는 것도 어려웠는데, 이제 여러 센서를 통합한 시스템을 만들었어요! 정말 대단해요! 👏
🔗 다음 장 미리보기¶
**4단원: 데이