학원에서 아두이노 일일 프로젝트로 엘리베이터 호출을 그대로 구현하는 프로젝트를 진행했다.
오른쪽 초록 불빛은 호출 상태를 나타낸다. 호출을 한다면 불빛이 커지고, 엘베가 도착하면 불빛을 꺼야 한다.
왼쪽 빨간/노란 불빛은 엘베 위치를 나타낸다. 천천히 올라가는 걸 시각화 해야 한다. 엘베가 도착하면 해지해야 한다. 엘리베이터는 초록 불빛이 있는 곳(층)에서 멈춰야 한다.
스위치는 층에 있는 엘리베이터 버튼이다. 호출 취소도 나름의 방법으로 구현해야 한다. (나는 스위치를 2번 누르면 호출 취소로 구현했다)

러프하게 그렸던 Flow chart다.
last_target_floorup_request_list, down_request_listcur_elev_mode위 변수들은 전역으로 선언한 뒤, 여러 함수들에서 전역 변수를 수정하는 방식으로 구현했다.
사용되는 중심 함수는 이렇다:
find_next_floor_with_dir(),find_next_floor_with_idle()write_elev_led()check_elevator_call()
하루만 집중하면 끝날 줄 알았는데 생각보다 시간을 많이 썼다. 실제론 이틀 정도 집중해야 했다.
지금까지의 경험상, 설계를 탄탄하게 하고 구현하는 게 훨씬 효율적이었다.
특히 여러 변수가 상호작용하는 이번 프로젝트는 더더욱 그랬다.
테스트케이스를 설계 단계에서 미리 검증했어야 했는데,
"일단 구현하고 보자"는 마음이 앞서서 설계를 대충 넘어갔다.
그 결과 loop 함수에서 예상과 다르게 동작하는 함수들이 생겼다.
교훈: IoT 개발에서는 탑다운 방식으로 접근해야겠다.
loop 함수의 전체 구조를 먼저 설계하고, 그 다음 세부 함수로 내려가자.
스프링이나 장고 같은 프레임워크는 정해진 컨벤션이 있어서
그것만 따르면 "일단 돌아갈 것"이라는 믿음이 있었다.
디버깅 도구도 잘 되어있고...
하지만 아두이노는 너무 자유로워서 오히려 혼란스러웠다.
어디서 버그가 생긴 건지 찾기도 어렵고, 내가 짠 코드가 맞는 건지 확신이 서지 않았다.
디버깅이 시리얼로만 가능한 것도 답답한 점이었다.
이번 프로젝트에서 처음으로 테스트케이스를 먼저 작성하고
구현하는 방식을 시도해봤다.
확실히 효과가 있었다! 테스트를 통과한 함수들은
loop에 통합했을 때도 안정적으로 작동했다.
그런데 이번엔 내가 따로 함수에 값을 넣어보며 직접 테스트해본 것이다. 앞으로 있을 팀 프로젝트에선 테스트 툴을 이용해야 할 것 같다.
IoT 개발이 웹 개발과는 또 다른 재미가 있다는 걸 느꼈다.
LED가 실제로 켜지고 엘리베이터가 움직이는 걸 보니
성취감이 더 컸던 것 같다.
복잡한 상태 관리와 우선순위 로직을 직접 구현하면서
알고리즘적 사고의 중요성도 다시 한번 깨달았다.
시간이 더 있었다면 실제 엘리베이터처럼 내부 버튼(목적지 선택)도
구현해보고 싶었다. 여러 대의 엘리베이터가 있는 시스템으로
확장하는 것도 재미있을 것 같다.
일일 프로젝트였지만 많은 걸 배운 시간이었다!