콘텐츠로 이동

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단원: 데이