프로젝트 / RECORD
Selected portfolio터치 HMI와 상태 머신으로 구성한 UV 경화 제어
터치 조작·진공·UV LED·턴테이블·타이머를 상태별로 연결한 장비 펌웨어.
코드 기록 · 2024.10 · 2026.04 (수정일 기준)
터치 화면에서 설정한 모드와 시간을 UV 경화 장비의 동작으로 연결하는 펌웨어를 작성했다. HMI 통신, 압력 입력과 진공 펌프·밸브, UV LED·턴테이블을 공정 상태에 따라 제어하도록 구성했다. 여러 입출력과 공정 조건을 하나의 프로그램 안에서 관리한 임베디드 소프트웨어 개발 기록이다.
원자료의 제어 구성을 단순화한 설명도 — 원본 코드의 동작을 정리한 구성도
화면 통신과 공정 제어를 분리
프로그램은 화면 통신, 공정 상태, 타이머를 모듈로 나눴다. 화면에서 값이 바뀌는 처리와 실제 출력이 동작하는 처리의 역할을 구분했다. 터치 입력이 곧바로 모든 출력을 바꾸는 구조보다, 입력을 공정의 현재 상태에 전달하도록 구성한 것이다.
HMI에서는 설정값과 버튼 상태를 순서대로 확인하고, 수신한 값이 이전 값과 달라졌을 때 변경을 전달했다. 요청 후 응답을 기다리는 상태와 시간 초과를 다뤄, 화면 통신의 흐름을 반복 갱신하는 공정 제어와 함께 진행하도록 작성했다.
화면으로 보내는 값과 화면에서 읽어오는 값을 각각의 통신 함수로 정리했다. 시간 표시를 갱신하는 부분과 버튼·모드 변경을 읽는 부분이 같은 통신 규칙을 사용하도록 구성한 것이다. 표시 기능과 공정 실행이 서로 다른 모듈이면서 하나의 화면을 공유하는 관계를 만들었다.
시작 요청을 공정의 상태 전환으로
공정 상태는 대기, 진공 도달 대기, 실행, 정리 단계로 나눠 다뤘다. 진공 모드가 선택되어 있으면 시작 요청 이후 먼저 압력을 읽으며 조건 도달을 기다린다. 조건에 도달하면 펌프를 정리하고 UV LED와 턴테이블을 켜 실행 상태로 넘어가도록 했다.
진공 조건을 기다리는 시간을 별도로 관리하고, 정해진 시간 안에 도달하지 않으면 정지 흐름으로 이어지도록 처리했다. 시작 버튼 하나가 장치의 여러 동작을 어떤 순서로 진행하는지 상태 머신으로 표현한 부분이다.
실행 중 압력과 출력 상태를 관리
실행 중에는 압력의 두 경계를 사용해 펌프의 재가동과 정지를 구분했다. 목표 근처에서 같은 조건으로 켜짐·꺼짐이 반복되는 대신, 켜는 조건과 끄는 조건을 나눠 다루는 히스테리시스 제어를 구성했다.
UV LED와 턴테이블, 펌프·밸브의 실제 활성 상태도 모드 선택값과 구분해 관리했다. 사용자가 선택한 기능과 현재 켜진 출력은 같은 정보가 아니므로, 종료나 정지 요청에서 각 출력의 상태를 정리하는 흐름을 만들었다.
설정 시간과 실행 시간을 따로 다루기
타이머는 사용자가 정한 시간과 실행 중 남은 시간을 구분했다. 시작하면 설정값을 실행 시간으로 가져오고, 주기적인 갱신에서 카운트다운과 화면 표시를 처리했다. 종료 뒤에는 설정값으로 돌아가는 흐름도 구성했다.
시간 증가·감소 입력에는 짧은 누름과 누르고 있는 상태를 나눠 처리했다. 반복 입력과 값의 상한·하한을 다루며, 공정 제어뿐 아니라 실제 조작 화면에서 시간을 설정하는 사용 흐름까지 작성했다.
카운트다운 완료와 정지 요청은 공정 모듈에서 출력 정리로 이어진다. 시간을 표시하는 기능이 독립된 화면 효과로 끝나지 않고, 실제 경화 동작의 종료 조건으로 사용되도록 연결했다. 설정·표시·실행의 관계를 모듈 사이의 명확한 호출로 정리한 부분이다.
코드의 구조를 설명하는 작업 기록
직접 맡은 범위는 터치 HMI 통신과 공정 상태 머신, 타이머·출력 제어다. 구성도는 남아 있는 코드의 입력·상태·출력 관계를 정리한 설명 자료이며, 장비 실물 사진과 구분해 배치했다.
이 기록의 결과는 여러 공정 조건을 모듈과 상태 전환으로 구성한 펌웨어다. 화면 입력과 센서값, 시간과 출력 제어를 분리하면서 하나의 장비 동작으로 연결한 개발 경험을 보여준다.