교실 자동 냉난방·환기 시스템의 과제 명세와 설계 근거입니다. 결과 요약은 프로젝트 메인을, 실제 동작은 시뮬레이터를 보세요.
과제 명세
「불 대수와 논리게이트로 만드는 스마트 발명품」 2일차 팀 프로젝트(도전 난이도). 가상 센서를 읽어 장치를 제어하는 프로토타입을 tkinter 로 만들고, 진리표에서 옮겨 적은 제품 시험표로 검증하는 과제입니다.
구현 제약은 세 가지였습니다.
- Python 표준 라이브러리와 tkinter 만 씁니다.
pip install은 하지 않습니다. - 논리 연산은
and,or,not세 개만 씁니다. 비트 연산자(&,|,^,~)는 쓰지 않고, XOR 이 필요하면 셋을 조합해 직접 만듭니다. - 여러 비트는 정수 비트필드가 아니라 불리언 리스트로 다룹니다.
입력 변수
R자동 운영 모드가 켜져 있는가P교실에 사람이 있는가W창문이 열렸는가T1외부 온도가 28도를 초과하는가T2외부 온도가 18도 미만인가Q이산화탄소 농도가 높은가
출력 변수
C냉방H난방A1창문 닫기 경고음A2창문 열기 경고음
자연어 조건
- 자동 냉방 — 자동 운영 모드가 켜져 있고, 교실에 사람이 있고, 창문이 닫혀 있고, 외부 온도가 28도를 초과하고, 이산화탄소 농도가 높지 않을 때 냉방을 가동합니다.
- 자동 난방 — 자동 운영 모드가 켜져 있고, 교실에 사람이 있고, 창문이 닫혀 있고, 외부 온도가 18도 미만이고, 이산화탄소 농도가 높지 않을 때 난방을 가동합니다.
- 창문 닫기 경고 — 자동 운영 모드가 켜져 있고, 교실에 사람이 있고, 창문이 열려 있고, 외부 온도가 28도를 초과하거나 18도 미만이고, 이산화탄소 농도가 높지 않을 때 창문 닫기 경고음을 냅니다.
- 창문 열기 경고 — 교실에 사람이 있고, 창문이 닫혀 있고, 이산화탄소 농도가 높을 때 창문 열기 경고음을 냅니다.
논리식
hot = T1 and (not T2) 더위 신호가 믿을 만한가
cold = T2 and (not T1) 추위 신호가 믿을 만한가
C = R and P and (not W) and hot and (not Q)
H = R and P and (not W) and cold and (not Q)
A1 = R and P and W and (hot or cold) and (not Q)
A2 = P and (not W) and Q
두 경고음은 창문 상태가 서로 반대입니다. 닫으라는 경고는 열려 있을 때만, 열라는 경고는 닫혀 있을 때만 울리므로 A1 과 A2 가 동시에 울리는 일은 없습니다.
수동 조작
자동 운영 모드(R)가 꺼지면 사람이 냉방과 난방을 직접 켜고 끕니다. 다시 켜면 자동 판단이 되찾아가고 수동 스위치는 잠깁니다. 수동 냉방과 수동 난방은 동시에 켤 수 없습니다.
C_최종 = (R and C) or ((not R) and 수동냉방)
H_최종 = (R and H) or ((not R) and 수동난방)
A1_최종 = A1 경고음은 자동 판단을 그대로 씁니다
A2_최종 = A2
R 이 선택 신호로 동작하는 2:1 멀티플렉서입니다. 경고음은 안전 장치라 수동 모드에서도 자동 판단을 그대로 씁니다. A1 은 조건에 R 이 들어 있어 수동 모드에서는 저절로 꺼지고, A2 는 R 과 무관하므로 수동 모드에서도 공기가 나빠지면 울립니다. 진리표는 자동 운영 논리만 담고, 수동 조작은 사람이 결정하므로 넣지 않았습니다.
센서 오류 처리
외부 온도가 28도를 초과하면서 동시에 18도 미만일 수는 없습니다. T1 과 T2 가 함께 참이면 온도 센서가 고장 난 것으로 보고 온도로 움직이는 출력(C, H, A1)을 모두 멈춥니다. 화면에서도 두 체크박스가 동시에 켜지지 않도록 막았습니다.
설계 근거
| 물음 | 답 |
|---|---|
왜 냉난방에 not W 가 붙나 |
창문이 열려 있으면 냉난방이 낭비됩니다 |
왜 A1 에 W 가 붙나 |
이미 닫혀 있는 창문을 닫으라고 할 이유가 없습니다 |
왜 A2 에 not W 가 붙나 |
이미 열려 있는 창문을 열라고 할 이유가 없습니다 |
왜 A2 에만 R 이 없나 |
공기 질은 안전 문제라 자동 운영을 꺼 두어도 알려야 합니다 |
왜 냉난방이 not Q 인가 |
공기가 나쁘면 환기가 우선이므로 냉난방을 멈춥니다 |
C 와 H 가 동시에 켜지나 |
켜지지 않습니다. hot 과 cold 는 동시에 참일 수 없습니다 |
A1 과 A2 가 동시에 켜지나 |
켜지지 않습니다. W 조건이 서로 반대입니다 |
설계하면서 고친 세 가지
| 문제 | 증상 | 해결 |
|---|---|---|
A1 에 창문 조건이 없었습니다 |
창문이 닫혀 있는데 "닫아 주세요"가 울립니다 | W 추가 |
A2 에 창문 조건이 없었습니다 |
창문이 열려 있는데 "여세요"가 울립니다 | not W 추가 |
T1 과 T2 가 동시에 참일 수 있었습니다 |
냉방과 난방이 함께 켜집니다 | hot / cold 로 분리 |
세 가지 모두 식만 봐서는 찾지 못했고, 진리표 64줄을 눈으로 훑다가 발견했습니다.
검증
프로그램의 전체 테스트 버튼이 진리표 64줄(TEST_CASES)과 decide() 의 실제 동작을 비교합니다. 결과는 64 / 64 통과입니다.
논리식과 별개로 조건 분기 방식의 참조 구현을 따로 만들어 64가지를 교차 검증했고, 아래 네 가지가 모든 조합에서 한 번도 일어나지 않음을 확인했습니다.
- 냉방과 난방 동시 작동
- 창문 닫기 경고와 열기 경고 동시 작동
- 창문 상태와 경고 내용의 모순
- 온도 센서 모순 입력에서 온도 출력 작동
구현 구조
classroom_hvac.py 는 수업 템플릿 05_invention_starter_2out.py(입력 3 / 출력 2)의 구조를 따릅니다. 파일은 두 영역으로 나뉩니다.
- 학생이 수정하는 부분 —
TITLE,INPUT_LABELS,OUTPUT_LABELS, 상태 문구,decide(),TEST_CASES. 여기에EXCLUSIVE_INPUTS(함께 참일 수 없는 센서 묶음),MANUAL_LABELS·EXCLUSIVE_MANUAL(수동 스위치),final_outputs()(멀티플렉서)를 더했습니다. - GUI 프레임워크 — 창 생성, 체크박스, 버튼, 결과 갱신, 테스트 실행은 템플릿 구조를 따랐습니다. 여기에 수동 조작 상자, 함께 켤 수 없는 스위치를 끄는 토글 처리,
final_outputs()호출, 상태 줄의 모드 표시를 더했고, "두 출력" 문구는 "네 출력"으로 바꿨습니다.
웹으로 옮기며
tkinter 창은 Python 을 깔고 파일을 내려받아야 열립니다. 그 절차를 없애려고 같은 프로그램을 HTML 한 장으로 옮겼습니다.
같은 것:
decide()와final_outputs()의 논리식,TEST_CASES64줄, 출력 문구 여덟 개를 그대로 옮겼습니다.T1·T2배타 입력, 수동 냉방·난방 배타 입력, 자동 운영 모드가 켜지면 수동 스위치가 잠기는 동작이 같습니다.초기화·전체 테스트·진리표 보기세 버튼과 하단 상태 줄(모드·입력 비트·출력 비트)이 같습니다.
달라진 것:
- 진리표가 별도 창이 아니라 같은 페이지 아래에 있고, 켜지는 12줄만 추려 볼 수 있습니다. 줄을 누르면 그 입력이 스위치에 들어갑니다. T1 과 T2 가 함께 참인 조합(12줄 중 2줄)은 스위치로 만들 수 없어 흐리게만 표시합니다.
- 판단 규칙을 화면에 두고, 지금 입력에서 참인 항과 거짓인 항을 색으로 구분해 식이 어떻게 평가되는지 보이게 했습니다.
- 전체 테스트 결과가 대화상자 대신 버튼 아래에 나옵니다.
- 제목의 구분 기호만 원본의
/대신·(냉난방·환기)로 적었습니다. 나머지 문구는 원본 그대로입니다.