YOGYUI

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - Final 본문

홈네트워크(IoT)/힐스테이트 광교산

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - Final

요겨 2022. 9. 30. 01:26
반응형

9. PCB 제작

지난주 수요일에 주문한 부품과 PCB가 어제(09/29) 모두 도착했다 (너무 오래 걸려 ㅠㅠ)

야무지게 납땜해주자

CP2102같은 IC들은 손으로 납땜할 때 냉납 발생이 잦으니 광학 검사는 필수!

인두기 팁을 좀 더 섬세한 걸로 바꿔야할 텐데... 매번 납땜할 때마다 생각만 하고 실천은 하지 못하는 중 ㅎㅎ

 

납땜 + 검사 + 클리닝 전체 과정에 대략 1시간 정도 소요됐다

나이를 먹어갈 수록 납땜 작업 속도가 느려진다 ㅠ

메인 칩셋은 ES32-WROOM-32E

 

가로 5cm, 세로 4.3cm 크기로 손바닥에 착 감기는 귀여운 크기

저항, 캐패시터를 1005 사이즈로 바꾸고 커넥터 위치를 최적화하면 4cm X 4cm 정도로 줄일 수는 있을 것 같다 (시도해보진 않겠지만~)

 

JATA 본체와 절수 페달에 장착된 JST 커넥터를 Molex 커넥터로 변환해주기 위해 케이블 터미널 클램핑 작업도 야무지게 완료! (압착기는 너무 비싸서 회사에서 잠시 대여 ㅎㅎ)

 

전원 확인, CP2102 PC 인식 확인까지 별다른 문제없이 완료!

이제 펌웨어를 플래싱해보자

10. 펌웨어 구현

펌웨어는 Espressif사의 공식 SDK인 ESP-IDF (v4.4.2)를 100% 활용하여 구현했다

ESP-IDF를 사용하면 기본적인 peripheral인 GPIO, I2C, Timer 등의 제어 API 및 Wi-Fi + 블루투스 API를 제공할 뿐만 아니라, FreeRTOS 기반으로 구현할 수 있어 여러 동작 시퀀스를 체계적으로 설계 및 구현할 수 있다

(MQTT 메시지 송수신을 위한 json 라이브러리인 cJSON도 SDK 내에 서드모듈로 포함되어 있어서 편하다)

 

펌웨어 프로토타입을 깃허브에 커밋했다 (멋대가리없게 repo 이름을 esp32-sink-iot로 해버렸다 ㅎㅎ;;)

https://github.com/YOGYUI/esp32-sink-iot

 

GitHub - YOGYUI/esp32-sink-iot: 주방 싱크대 유량계 홈IoT 연동 소스코드 (ESP32)

주방 싱크대 유량계 홈IoT 연동 소스코드 (ESP32). Contribute to YOGYUI/esp32-sink-iot development by creating an account on GitHub.

github.com

GPIO, Wi-Fi + BLE Provisioning, MQTT, Pulse Counter(PCNT), Timer, I2C, SNTP 등 각종 코어 기능들을 모듈별로 분리해서 구현했다

[소스코드 디렉터리 구조]
-CMakeLists.txt
-partitions.csv
-sdkconfig
-main
--CMakeLists.txt
--main.cpp
--include
----defines.h
----module_display.h
----module_gpio.h
----module_mqtt.h
----module_ota.h
----module_pulse_counter.h
----module_pwm.h
----module_sntp.h
----module_timer.h
----module_wifi_provisioning.h
--src
----defines.cpp
----module_display.cpp
----module_gpio.cpp
----module_mqtt.cpp
----module_ota.cpp
----module_pulse_counter.cpp
----module_pwm.cpp
----module_sntp.cpp
----module_timer.cpp
----module_wifi_provisioning.cpp

딱히 C++을 쓰진 않았는데, 나중에 Migration할 일이 있을까봐 확장자는 모두 cpp로 작성해서 g++로 빌드할 수 있게 했다

 

NPN 트랜지스터 (MMBT2222) 2개를 CP2102의 RTS와 DTR 신호선에 물려서 esp-idf 플래싱 시작 시 자동으로 플래싱 부트모드로 전환되는 하드웨어 구성도 정상적으로 동작해서, 플래싱할 때마다 택트 스위치를 누를 일이 없다! (devkit schematic을 참고해서 설계하긴 했는데, 처음 해본거라 잘될지 의심스러웠지만 다행~)

오실로스코프로 찍어보니 CP2102의 RTS신호가 먼저 low level이 된 뒤 이어서 DTR이 low level이 되었다

(esp-idf가 CP2102에 이렇게 하라고 명령을 내린다 ㅋㅋ)

 

펌웨어를 플래싱한 뒤에 보드를 JATA 본체 옆에 부착해줬다

(드릴로 나사 구멍 뚫으려했는데, 싱크대 하부 작업 공간이 워낙에 협소해서 포기... 양면테이프로 부착!)

전원, 릴레이 동작, 와이파이 연결 여부를 파악하기 위해 빨간색과 파란색 LED를 실장했는데, 조명이 합쳐져서 뭔가 사이버펑크적인 인테리어(?)가 되어버렸다 ^^;;

 

집안 곳곳에서 와이파이 신호가 잡히도록 메시 네트워크를 구성해뒀는데, 다행히 싱크대 하부에서도 무리없이 안정적으로 ESP32가 와이파이에 연결됐다

 

※ 참고로 Wi-Fi 프로비저닝은 블루투스(BLE)를 베이스로 구현했으며, Espressif사의 공식 앱을 활용했다

(어플리케이션 이름 = ESP BLE Provisioning, 앱스토어에서 다운로드받을 수 있다)

 

11. 동작 테스트

Adafruit의 HT16K33 LED Display Backpack을 장착할 수 있도록 소켓 헤더를 장착해뒀는데, 14-segment LED 디스플레이를 장착해서 유량을 디스플레이할 수 있다 (나름의 전기 절약을 위해 물이 흐르지 않을 때는 디스플레이 OFF)

 

그리고 이번 프로젝트의 주요 목표였던 "일정 시간 후 자동 잠금 기능!"


자동 잠금 기능(auto_off): 설거지 등의 작업에 의해 물이 흐르는 상태가 아니라, 로봇청소기나 애완동물 등에 의해 원치 않게 물이 흐를 때 일정 시간 후 자동으로 잠궈주는 기능

기능이 항상 켜져있으면 설거지할 때 굉장한 불편함이 예상되기 때문에 홈네트워크 플랫폼에서 별도의 스위치로 빼두기로 결정

(디폴트 off 시간은 5초로 구현해뒀는데, 이 값은 MQTT 메시지로 변경할 수 있다)

 

이제 애플 기기를 사용해서 밸브를 연 뒤, 일정 시간 뒤에 자동으로 잠기는지 테스트해보자

역시나(?) 의도했던 대로 잘 된다!! 뿌듯

 

Home Assistant에서는 기록 그래프를 통해 시간별 유속을 확인할 수 있다

물이 흐를 때는 1초에 한번씩 MQTT 메시지를 통해 업데이트되며, 속도-시간 관계이기때문에 적분하면 유량을 계산할 수 있다 

나중에 시간나는대로 과연 얼마나 정확하게 유량을 측정할 수 있을지도 테스트해봐야겠다 (꽤 재밌을듯)

정수기처럼 250mL, 500mL 등 정량을 수전으로 흘릴 수 있으면 뭔가 유용한 사용처가 있지 않을려나?


애초에 설계했던 기능은 모두 정상적으로 구현된 것을 확인했다

이제 남은 과제는 로봇청소기를 Homebridge나 Home Assistant랑 연동해서 '청소가 시작되면 밸브 자동 잠금 기능을 활성화하고, 청소가 종료되면 자동 잠금 기능 비활성화' 태스크!

 

쓰고 있는 로봇청소기가 LG 제품(코드제로 M9)이라 LG ThinQ랑 연동해야 하는데, 내가 지금껏 찾아본 바로는 ThinQ의 로봇청소기를 쉽게 연동할 수 있는 라이브러리나 API가 없다 (세탁기, 건조기, 냉장고, 에어콘 모두 다 되는데... 쩝;; 좀 더 열심히 찾아봐야지 ㅠ)

 

끝~!

[시리즈]

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - (1)

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - (2)

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - (3)

힐스테이트 광교산::싱크대 절수페달 IoT 연동하기 - Final

반응형