브라우저에서 자바스크립트가 꺼져 있어 화면을 보여 드릴 수 없습니다.
프로젝트 목록
컴퓨터논리회로

교실 자동 냉난방·환기 시스템

센서 6개로 장치 4개를 제어하는 논리 회로. and·or·not 세 연산만으로 설계해 진리표 64줄로 검증했고, tkinter 프로그램을 브라우저 시뮬레이터로 옮겼습니다.

2026-10-01조회 66GitHub

설계 노트

설계노트.md · 2026-10-01 수정

교실 자동 냉난방·환기 시스템의 과제 명세와 설계 근거입니다. 결과 요약은 프로젝트 메인을, 실제 동작은 시뮬레이터를 보세요.

과제 명세

「불 대수와 논리게이트로 만드는 스마트 발명품」 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_CASES 64줄, 출력 문구 여덟 개를 그대로 옮겼습니다.
  • T1·T2 배타 입력, 수동 냉방·난방 배타 입력, 자동 운영 모드가 켜지면 수동 스위치가 잠기는 동작이 같습니다.
  • 초기화·전체 테스트·진리표 보기 세 버튼과 하단 상태 줄(모드·입력 비트·출력 비트)이 같습니다.

달라진 것:

  • 진리표가 별도 창이 아니라 같은 페이지 아래에 있고, 켜지는 12줄만 추려 볼 수 있습니다. 줄을 누르면 그 입력이 스위치에 들어갑니다. T1 과 T2 가 함께 참인 조합(12줄 중 2줄)은 스위치로 만들 수 없어 흐리게만 표시합니다.
  • 판단 규칙을 화면에 두고, 지금 입력에서 참인 항과 거짓인 항을 색으로 구분해 식이 어떻게 평가되는지 보이게 했습니다.
  • 전체 테스트 결과가 대화상자 대신 버튼 아래에 나옵니다.
  • 제목의 구분 기호만 원본의 / 대신 ·(냉난방·환기)로 적었습니다. 나머지 문구는 원본 그대로입니다.