

인도에서 일정 기간 살면서, 우리는 물탱크 채우기를 더 잘 제어할 방법이 필요하다는 것을 깨달았습니다. 적어도 주요 인도 도시 중심에서는 물이 집 밖의 지하 탱크로 공급됩니다. 그곳에서 물은 다락방의 탱크로 펌프질되어 소비자에게 흐릅니다. 펌프를 켜고 끄는 것은 지하실에서 수동으로 수행해야 하는 작업으로, 여러 가지 불편한 단점이 있습니다:
이를 해결하기 위해 자동 물탱크 컨트롤러를 만들었습니다. 초음파 센서가 탱크 내부의 수위를 측정합니다. 수위가 특정 임계값 이하로 떨어지면 릴레이가 자동으로 펌프를 켜고 탱크가 가득 차면 다시 끕니다. 또한 탱크 내부에서 사진을 찍기 위해 카메라도 추가했습니다.
원래의 수동 모드는 여전히 사용 가능하지만 일상적인 사용에는 더 이상 필요하지 않습니다. 우리는 이제 집을 오랜 기간 비울 때나 예기치 않은 시스템 고장이 발생할 경우에만 사용합니다.
제가 직면한 도전에도 불구하고(이는 "배운 교훈 및 전망" 섹션에서 다룰 것입니다), 이 프로젝트가 인도 사람들에게 자신만의 솔루션을 구축하도록 영감을 주기를 바랍니다. 이는 물 낭비를 방지하고 일상 생활에 조금 더 편안함을 추가하는 훌륭한 방법입니다.





추가로, 지붕에 전력을 공급하고 펌프를 릴레이에 연결하기 위해 UV 방사선에 매우 저항성이 있는 두 개의 잠수 케이블을 구입했습니다. 플러그, 소켓 및 저항기와 같은 일부 표준 부품은 이전 프로젝트에서 재사용되었습니다.
우리는 임대 중이며 재산을 소유하지 않기 때문에 별도의 물탱크 뚜껑도 구입했습니다. 초음파 센서, 카메라 및 LED가 "안쪽"을 볼 수 있도록 구멍을 뚫고 잘랐습니다. 마지막으로, 날씨 방수를 위해 절연 튜브를 사용하고, 전원 공급을 위해 오래된 5V 전화 충전기와 케이블을 사용했습니다.



ESP32-CAM은 내장 Wi-Fi 안테나가 있지만 신호 강도가 꽤 약합니다. 외부 안테나를 연결하기 위해 먼저 작은 0 Ω 저항기를 납땜 인두를 사용하여 제거했습니다. 인두로 저항기를 살짝 터치한 후 부드럽게 밀어내면 됩니다. 보드가 과열되지 않도록 인두를 한 곳에 너무 오래 두지 않아야 합니다. 정말 작습니다!
다음으로, 외부 안테나 단자에 연결을 다리해야 합니다. 세부 사항을 보기 위해 납땜 확대경을 사용했습니다. 새로운 연결이 설정되면 외부 안테나를 보드의 커넥터에 직접 연결합니다.

저는 전원 공급을 위해 오래된 5V 모바일 전화 충전기를 사용했습니다. 먼저, 전화 커넥터 플러그를 잘라내고 전선을 벗겼습니다. 충전기가 AC를 DC로 변환하기 때문에, 극성을 확인하기 위해 전선을 테스트해야 했습니다.
저는 충전기를 벽 소켓에 조심스럽게 꽂고 멀티미터를 DC 모드로 설정했습니다. 빨간 멀티미터 프로브를 분홍색 충전기 전선에 연결하고 검은 프로브를 밝은 녹색 전선에 연결하니 안정적인 5V 판독값이 나왔습니다. 이는 분홍색 전선이 양극(VCC)이고 녹색 전선이 접지(GND)임을 확인해주었습니다.
다음으로, 보드 연결을 준비했습니다:
이 연결이 안전하게 완료되면, ESP32-CAM은 5V 전원으로 안전하게 전원을 공급받을 준비가 됩니다.





전체 프로젝트를 조립한 뒤에야 무언가 작동하지 않는다는 사실을 알게 되고 어떤 부품이 고장 났는지도 모르는 상황을 피하기 위해, 구성 요소를 단계적으로 테스트하기로 했습니다.
먼저 외부 안테나가 부착된 ESP32-CAM 보드를 ESP32-CAM-MB 프로그래머 모듈에 연결했습니다. 그런 다음 이 조립체를 USB 케이블로 컴퓨터에 연결했습니다. 온보드 LED가 즉시 켜졌습니다.
다음으로 Arduino IDE를 열고 "esp32 by Espressif Systems" 보드 매니저를 설치했습니다. 메뉴에서 도구 > 보드 > esp32 > AI Thinker ESP32-CAM을 선택했습니다.
그 후 올바른 COM 포트를 선택했습니다(사진 참조). 포트가 하나도 표시되지 않는다면, 4개의 전선 대신 2개의 전선만 있는 충전 전용 케이블을 사용하고 있을 수 있습니다. 더 굵은 데이터 전송용 USB 케이블을 사용해야 합니다.
다음으로 IDE에 테스트 코드를 불러오고, 자리 표시자를 실제 Wi-Fi 자격 증명으로 바꾼 다음 보드에 업로드했습니다.
업로드가 완료되자 시리얼 모니터 로그에 연결 상태가 나타났습니다. 외부 안테나를 테스트하기 위해 양손으로 안테나를 감쌌습니다. 신호 감쇠가 증가하면서 보고된 Wi-Fi 신호 세기(RSSI)가 낮아졌습니다. 손을 치우자 신호 세기가 다시 높아졌고, 이를 통해 외부 안테나가 완벽하게 작동한다는 것을 확인했습니다.



초음파 센서의 배선을 살펴보겠습니다. AJ-SR04M은 구형 JSN-SR04T의 더 현대적인 후속 모델로, 3.0V에서 5.5V까지의 넓은 공급 전압 범위에서 작동합니다. 이 센서는 공급 전압에 맞춰 자동으로 논리 전압을 조정합니다. 이 프로젝트에서는 ECHO 및 TRIG 신호를 위해 ESP32-CAM의 GPIO 핀 12와 13에 연결됩니다. 그러나 AJ-SR04M이 5V로 전원이 공급되면 ESP에 5V 신호를 출력하게 됩니다. 이는 ESP32-CAM의 GPIO 핀이 최대 3.3V만 처리할 수 있기 때문에 문제입니다.
하나의 해결책은 AJ-SR04M을 5V 핀 대신 ESP32-CAM의 3.3V 핀에서 전원을 공급하는 것입니다. 이렇게 하면 ECHO 신호가 자동으로 3.3V로 떨어집니다. 그러나 3.3V에서 센서에 전원을 공급하면 종종 부정확한 측정값과 감소된 측정 범위로 이어집니다.
이 단점을 피하기 위해 전압 분배기를 만들기로 결정했습니다. 아래에서는 회로 설정, 멀티미터로 테스트하는 방법, 그리고 왜 작동하는지에 대한 전자 이론을 설명하겠습니다.
설정
사진에서 보이는 것처럼 조립은 간단합니다:
멀티미터로 설정 테스트하기
마이크로컨트롤러에 연결하기 전에 멀티미터를 20 kΩ 저항 모드로 전환하여 회로를 확인했습니다:
왜 이것이 작동하는가
직렬 회로(저항이 끝에서 끝으로 연결된 경우)에서는 총 전압이 저항 값에 비례하여 나뉩니다. 저항 값이 더 높은 저항이 전압의 더 큰 부분을 떨어뜨립니다.
전류는 ECHO 핀(5V)에서 1 kΩ 저항을 통해 흐르고, 그 다음 2.2 kΩ 저항을 거쳐 직접 GND(0V)로 흐릅니다. GPIO 12는 두 저항 사이의 정확한 지점에서 분기되므로, GND에 대한 두 번째 저항(2.2 kΩ)을 통한 전압 강하만 측정합니다.
전압 분배기 공식을 사용하면 GPIO 핀에서의 결과 전압은 약 3.44V입니다. 이는 ESP32의 허용 범위 내에 있으며(3.3V 핀은 일반적으로 3.6V까지의 피크를 처리할 수 있습니다). 또한 실제 부하 하에서는 센서 핀이 일반적으로 완벽한 5.0V보다 약간 낮은 값을 출력하므로 실제 전압은 거의 정확하게 3.3V에 위치하게 됩니다. 1 kΩ 저항은 또한 전류 제한기로 작용하여 GPIO 핀에 대한 훌륭한 보호를 제공합니다.
구성을 마무리하고 단락을 방지하기 위해 모든 노출된 접합부를 열수축 튜브로 절연했습니다.

AJ-SR04M 센서는 ECHO, TRIG, 5V, GND의 네 개 핀을 특징으로 합니다. 이들은 점퍼 케이블을 통해 다음과 같이 연결됩니다:
이 프로젝트는 SD 카드를 사용하지 않습니다. 이는 GPIO 12, 13, 14가 ESP32-CAM의 온보드 microSD 카드 리더 데이터 라인에 하드와이어되어 있기 때문에 매우 중요합니다. SD 카드가 초기화되면 초음파 센서는 SD 데이터 트래픽을 신호 입력으로 해석하여 거리 측정값이 완전히 손상됩니다.
왜 GPIO 12와 13을 선택해야 할까요?
ESP32-CAM에서 올바른 핀을 선택하는 것은 이들의 이중 기능 때문에 주의가 필요합니다:
부팅 중 GPIO 12가 LOW (0V)이면 플래시 메모리는 표준 3.3V (정상 작동)로 작동합니다. 그러나 부팅 중 GPIO 12가 HIGH로 설정되면 ESP32는 플래시 메모리 공급을 1.8V로 전환합니다. 결과적으로 플래시 메모리는 충분한 전력을 받지 못해 보드가 무한 부팅 루프에 빠지게 됩니다.
이것이 우리의 배선 선택을 결정합니다. AJ-SR04M의 TRIG 핀은 일반적으로 시작 시 중립적으로 동작하거나 약간 접지 쪽으로 끌어당깁니다. 이는 괜찮습니다. 그러나 센서가 유휴 상태나 시작 중에 TRIG 라인을 약간이라도 HIGH로 끌어당기면 ESP32-CAM이 부팅에 실패합니다. 따라서 TRIG를 GPIO 13에 연결하는 것이 훨씬 안전합니다.
반대로, ECHO는 GPIO 12에 안전하게 연결할 수 있습니다 전압 분배 네트워크 덕분에. 분배기 내의 2.2 kΩ 저항이 충전기의 GND에 영구적으로 연결되어 있기 때문에, 이는 매우 효과적인 풀다운 저항으로 작용합니다. 이는 부팅 시퀀스 동안 GPIO 12를 확실한 LOW (0V) 상태로 강제하여 ESP32가 항상 3.3V 플래시 모드에서 완벽하게 시작되도록 보장합니다.


표준 ESP32 개발 보드는 전원 공급 안정성에 있어 상당히 관대합니다. 그러나 ESP32-CAM 모듈은 독특하고 도전적인 특성을 가지고 있습니다: 카메라가 스트리밍 중이거나 사진을 캘 때, 전력 소비가 몇 밀리초 동안 급격히 증가합니다. 마찬가지로, 릴레이 코일이 활성화되면 5V 레일에서 갑자기 상당한 양의 전류를 끌어옵니다. ESP32-CAM은 밀리초 단위의 전압 강하에도 매우 민감하기 때문에, 이러한 스파이크는 즉시 브라운아웃 리셋을 유발하여 마이크로컨트롤러가 충돌하게 만듭니다.
“미니 배터리” 역할을 하는 커패시터가 없으면 카메라 모듈은 자주 네트워크 연결을 잃거나 전체 칩이 재부팅됩니다. 이를 방지하기 위해, 5V 레일에서 이러한 짧은 전압 강하를 흡수할 수 있는 전해 커패시터가 필요하며, 이는 로컬 버퍼 역할을 하여 갑작스러운 전력 변동을 완화합니다.
디커플링 또는 바이패스 커패시터는 항상 부하에 최대한 가깝게 배치해야 합니다. 제 첫 번째 프로토타입에서는 두 개의 짧은 점퍼 와이어를 사용하여 1000 µF 25V 전해 커패시터를 ESP32-CAM 핀에 직접 연결했습니다. 이렇게 하면 핀이 깨끗하게 유지되어 ESP32-CAM-MB 도터보드를 컴퓨터 프로그래밍을 위해 여전히 부착할 수 있었습니다. 충전기에서 오는 전원 공급 케이블은 커패시터의 다리에 직접 납땜한 후 두껍게 절연했습니다.
최종 조립에서는 부피가 큰 커패시터를 프로젝트 박스 안에 안전하게 장착해야 했기 때문에 약간 긴 점퍼 와이어로 변경했습니다. 안정성을 스트레스 테스트하기 위해 약 20장의 사진을 빠르게 연속 촬영하여 ESP32가 충돌하는지 확인했습니다. 시스템은 완벽하게 안정적으로 유지되어 디커플링 솔루션이 신뢰성 있게 작동함을 확인했습니다.

안전한 작동을 보장하기 위해 릴레이 모듈의 물리적 트리거 점퍼는 HIGH로 설정되어 있으며, 릴레이의 IN 핀은 ESP32-CAM의 GPIO 15에 연결되어 있습니다. 이 구성은 초기 부팅 시퀀스 동안 발생하는 중요한 하드웨어 충돌을 해결합니다.
문제: GPIO 14 및 GPIO 2의 하드웨어 트랩
부팅 중에 ESP32는 내부 ROM에 의해 제어되는 300밀리초의 하드웨어 초기화 단계를 거칩니다. 표준 저수준 트리거 릴레이(LOW/GND 신호를 감지할 때 활성화됨)를 사용할 경우, 대부분의 핀에서 위험한 충돌이 발생합니다:
결과: 저수준 트리거 릴레이는 LOW 신호에서 활성화되므로, 이 두 핀 모두 릴레이가 전원이 공급되는 마이크로초에 즉시 ON으로 클릭하게 만듭니다. 결과적으로, 물 펌프는 사용자 정의 C++ setup() 코드가 보호용 digitalWrite(RELAY_PIN, HIGH) 명령을 실행할 기회도 없이 강제로 시작됩니다.
해결책: GPIO 15 및 고수준 트리거링
부팅 중에 펌프가 의도치 않게 켜지지 않도록 하기 위해 중립 핀을 사용하고 릴레이 논리를 반전시켜야 합니다:
최종 결과
아래층의 메인 전원 스위치를 켜면 ESP32의 초기 부팅 접지 상태가 이제 릴레이에 의해 엄격한 "Keep OFF" 명령으로 해석됩니다. 릴레이의 상태 LED는 어두운 상태를 유지하고, 내부 접점은 열려 있으며, 펌프는 완전히 조용하게 유지됩니다. 이제 펌프는 초음파 센서가 실제로 낮은 수위 를 감지하고 GPIO 15를 HIGH로 명시적으로 구동할 때만 활성화됩니다.
전원 연결
모듈의 배선을 완료하기 위해 릴레이의 VCC 및 GND 핀은 다른 구성 요소와 병렬로 5V 충전기에 연결됩니다. IN 핀은 GPIO 15에 직접 연결됩니다. 릴레이의 부하 측 고전압 AC 배선은 다음 섹션 "AC에 연결하기"에서 다룰 것입니다.


RC 스너버(또는 RC 회로, 부셰로 셀, 스파크 억제기라고도 함)는 이 프로젝트에 필수적입니다. 수동 벽 스위치는 펌프의 스위칭 부하를 문제 없이 처리할 수 있지만, ESP32-CAM으로 제어되는 작은 전자 릴레이는 그렇지 않습니다.
수중 펌프는 매우 유도성 부하입니다. 릴레이가 펌프를 끌 때, 모터의 구리 코일에 있는 자기장이 붕괴되어 전류가 계속 흐르도록 강요합니다. 릴레이 접점이 정확히 그 순간에 열리기 때문에, 전류는 작은 공기 간극을 넘어 점프하여 전기 아크(스파크)를 형성합니다. 보호 장치가 없으면 이 아크는 두 가지 파괴적인 결과를 초래합니다:
상업적으로 조립된 스너버를 구할 수 없었기 때문에, 100옴 저항기와 AC 등급 커패시터를 사용하여 직접 만들었습니다. 스너버는 릴레이의 스위칭 접점에 병렬로 연결되어 있습니다(한쪽은 COM 단자에, 다른 쪽은 NO 단자에 연결됨).
조립 및 배선
릴레이 단자가 두 개의 두꺼운 전선을 동시에 수용하기에는 너무 작기 때문에, 저는 기발한 배선 우회 방법을 사용했습니다:
결과: 릴레이가 열리면, 펌프의 파괴적인 유도 에너지가 번개처럼 빠르게 스너버의 커패시터로 전환되어 저항기를 통해 최소한의 열로 무해하게 방출됩니다. 전기 아크가 형성되지 않으며, ESP32-CAM은 리셋 없이 완전히 원활하게 작동합니다.




프로젝트 박스는 스탠드오프, 케이블 및 외부 안테나를 수용하기 위해 구멍을 뚫어 준비되었습니다. 박스의 뚜껑은 불투명하여 실제로 이상적입니다: 카메라 렌스가 탱크를 들여다볼 수 있도록 작은 구멍 하나만 뚫으면 되었고, 탑재된 플래시 LED는 반투명 플라스틱을 통과할 만큼 밝습니다.
처음에는 오래된 신용카드에서 잘라낸 스트립을 사용하여 ESP32-CAM을 장착했으며, 이를 납땜 인두로 뚜껑에 융합하고 핫글루로 고정했습니다. 이 방법은 한동안 효과적이었지만, 플라스틱 스트립이 따뜻함으로 인해 결국 부드러워져서 더 내구성이 좋은 솔루션을 위해 적절한 장착 나사로 교체했습니다.
인도에서는 케이블 글랜드가 널리 사용되지만, 일반적으로 소매 시장을 위한 둥근 것만 있습니다. 그러나 인도의 잠수 펌프 케이블은 평평합니다. 틈을 밀봉하기 위해 절연 테이프와 핫글루를 조합하여 사용했습니다. 이 밀봉은 또 다른 이유로 중요합니다: 이렇게 따뜻한 전자 박스는 곤충의 좋아하는 둥지 장소가 될 수 있습니다. 또한 박스 내부에 절연 테이프를 단단히 붙여 기본적인 스트레인 릴리프 역할을 하여 케이블이 외부에서 당겨지는 것을 방지했습니다. 박스가 고정되어 있기 때문에 와이어 마모의 위험은 최소화됩니다.
ESP32-CAM 핀 할당 요약
왜 Arduino보다 ESP32-CAM을 선택했는가?
중앙 컨트롤러로서, USB 프로그래밍을 쉽게 하기 위해 ESP32-CAM 보드와 ESP32-CAM-MB 자식 보드를 선택했습니다. ESP32-CAM은 내장된 OV2640 카메라, 강력한 플래시 LED, 통합 Wi-Fi 및 Bluetooth를 특징으로 합니다. 크기가 작고, 표준 Arduino 설정보다 전력을 덜 소모하며, 자체 웹 서버를 호스팅할 수 있어 스마트폰으로 수위 확인이 가능합니다.
표준 Arduino는 기본적인 무선 연결이 부족하기 때문에 사용하지 않기로 결정했습니다. 동일한 목표를 달성하기 위해서는 Arduino와 ESP-01와 쌍을 이루어야 합니다. Arduino는 센서 데이터를 읽고 이를 직렬 통신(TX/RX)을 통해 ESP-01에 전송하여 방송합니다.
하지만 이 이중 칩 설정은 메이커 커뮤니티에서 매우 짜증나는 것으로 악명이 높습니다. ESP-01는 3.3V에서 작동하고, Arduino Uno는 5V에서 작동하여 추가적인 로직 레벨 변환기가 필요합니다. 또한 두 개의 별도 마이크로컨트롤러 간의 통신 코드를 디버깅하는 것은 매우 오류가 발생하기 쉽습니다. 독립형 ESP32-CAM을 사용함으로써 이러한 호환성 문제를 완전히 피할 수 있었습니다.





수동 펌프 스위치는 여러 스위치와 전원 소켓이 있는 더 큰 벽면 패널의 일부입니다. 처음 패널을 열었을 때 발견한 혼란스러운 배선(사진 참조)이 너무 무서웠기 때문에, 원래는 탱크 내부를 들여다보고 수위만 확인하는 시스템을 만들 계획이었습니다. 그래서 처음부터 카메라 모듈이 장착된 마이크로컨트롤러를 선택했습니다! 적어도 수위를 눈으로 확인할 수 있기를 바랐습니다. 하지만 나중에 어두운 탱크 내부에서는 화질이 좋지 않기 때문에 카메라에만 의존하기 어렵다는 것을 깨달았습니다(아래의 "배운 점과 전망" 섹션에서 몇 가지 샘플 사진을 볼 수 있습니다).
포기하지 않고 회로를 더 자세히 분석했습니다. 기존 펌프 스위치에는 단자가 네 개 있습니다. 멀티미터로 확인한 결과, 활선(상선)은 왼쪽 아래 단자로 들어온 뒤 그곳에서 패널의 다른 스위치와 소켓에 전원을 공급하도록 분기됩니다. 마찬가지로 중성선은 오른쪽 아래 단자로 들어옵니다.
스위치를 켜면 하단 단자가 상단 단자와 연결됩니다(왼쪽 아래에서 왼쪽 위로, 오른쪽 아래에서 오른쪽 위로). 왼쪽 위 단자는 활선(상선)을 펌프로 보내고, 오른쪽 위 단자는 펌프 모터에서 돌아오는 중성선을 받습니다.
수동 작동과 자동 작동을 안전하게 전환할 수 있도록 2방향 스위치 두 개를 추가로 설치했습니다. 기존 스위치 패널에서 케이블 두 개를 밖으로 뺐습니다. 첫 번째는 펌프에 전원을 공급하는 기존 왼쪽 위 활선이고, 두 번째는 동일한 왼쪽 위 단자에 연결한 새 우회선입니다. 이 케이블들은 배선도(사진 참조)에 따라 새 스위치 두 개에 연결합니다.
첨부된 매트릭스에는 스위칭 조합이 정리되어 있지만, 일상적인 사용에 해당하는 위치는 다음 두 가지입니다:




이 프로젝트의 전체 소스 코드는 GitHub에서 확인할 수 있습니다.
초기 테스트 단계에서는 임계값 설정을 보드의 비휘발성 플래시 메모리에 직접 편집하고 저장할 수 있는 버전의 코드를 작성했습니다. 그러나 이상적인 설정을 찾은 후에는 모든 값을 하드코딩하기로 했습니다. 일반적인 플래시 메모리의 정격 쓰기 수명은 보통 약 10,000~100,000회입니다. 제 ESP32-CAM은 정품 모듈이 아니라 저가형 클론이므로 쓰기 수명이 훨씬 짧아 1,000회 미만의 쓰기만으로도 고장 날 가능성이 있습니다. 칩의 조기 마모를 방지하려면 하드코딩이 가장 안전한 방법이었습니다.
광범위한 테스트가 필요했던 이유는 AJ-SR04M 센서의 물리적 한계 때문입니다. 이 센서에는 약 25cm의 사각 지대가 있어 이 거리보다 가까운 물체는 매우 불안정한 측정값을 생성합니다. 따라서 센서에서 30cm 떨어진 지점을 자동 차단 임계값으로 설정했습니다. 이 안전 여유를 두고도 탱크가 완전히 채워지도록 코드에 작동 후 타이머를 넣었습니다. 이 타이머는 임계값에 도달한 후 미리 정해진 시간(초) 동안 펌프를 계속 작동시켜 탱크의 용량을 안전하게 최대한 활용합니다.
초음파 신호 트리거 작동 방식
코드 자체에는 주석이 잘 작성되어 있어 이해하기 쉽습니다. 아래에서는 getFilteredDistance() 메서드가 초음파 측정 펄스를 트리거하는 방식을 자세히 살펴봅니다.
거리 계산
음파가 전송되면 코드는 에코를 포착하고 시간을 거리로 변환합니다.
pulseIn() 함수는 ECHO_PIN을 감시하면서 HIGH로 전환되기를 기다린 뒤, 다시 LOW로 떨어질 때까지의 정확한 마이크로초 수를 측정합니다. 에코가 사라졌을 때 마이크로컨트롤러가 무한정 멈추지 않도록 30,000마이크로초(30ms)의 타임아웃도 추가했습니다.
음파는 수면까지 갔다가 다시 돌아와야 하므로 전체 시간을 2로 나누어야 합니다. 공기 중에서 소리는 약 343m/s로 이동하며, 이는 마이크로초당 0.03432cm로 환산됩니다. 전체 시간의 절반에 이 상수를 곱하면 최종적으로 센티미터 단위의 매우 정확한 거리를 얻을 수 있습니다.

전체 시스템을 설치한 뒤에야 하드웨어나 소프트웨어 버그를 발견하는 위험을 최소화하기 위해, 나는 엄격한 단계별 테스트 절차를 따랐다:
책상에서의 테스트
ESP32-CAM은 로컬 웹 인터페이스를 호스팅하므로 책상에서 전체 기능 테스트를 수행할 수 있었다. 완전히 빈 물탱크를 시뮬레이션하기 위해 초음파 센서가 천장을 향하도록 배치했다.
로직을 테스트하기 위해 센서에서 약 30cm 위에 책을 들고 있었다. 웹 인터페이스에는 변화가 즉시 반영되었고, 코드는 표준 센서 기반 급수에서 설정된 시간 동안의 운전 후 타이머 단계로 매끄럽게 전환되었다. 무엇보다 사이클이 정확히 시작되고 끝나는 순간 릴레이가 내는 만족스러운 물리적 "클릭" 소리를 들으니 제어 회로가 완벽하게 작동한다는 것이 확인되었다.
실제 환경에서의 개선
그러나 아무리 철저한 벤치 테스트라도 모든 예외 상황을 포착할 수는 없다. 시스템을 지붕에 완전히 설치한 후에도 코드에서 몇 가지 사소한 버그를 발견했다. 따라서 모든 구성 요소가 장착된 탱크 뚜껑을 분리하고, 인클로저를 열고, ESP32-CAM을 분리한 다음 프로그래머 보드를 통해 업데이트된 펌웨어를 업로드하고, 모든 것을 다시 설치해야 했다. 시스템이 실제 환경에서 완벽하게 작동하기까지 이 과정을 몇 차례 반복해야 했다.


계획 및 아키텍처
돌이켜보면, 나는 이 빌드를 마치 애자일 소프트웨어 개발 프로젝트처럼 접근했으며, AI에 크게 의존했습니다. 그러나 처음부터 해야 했던 것은 포괄적이고 종합적인 청사진을 수립하는 것이었습니다. 이는 모든 구성 요소에 대한 더 깊은 초기 분석을 요구했을 것입니다 — 특히 혼란스러운 벽 스위치 패널 — 각 부분이 실제로 가치를 더하는지, 그리고 그 조합이 의미가 있는지를 검증하기 위해서요.
게다가, 부품을 구매하기 전에 메이커 포럼이나 동료들과 초기 디자인에 대해 논의하여 이를 다듬었어야 했습니다. 그렇게 했다면, 카메라 모듈이 실제로 내 핵심 문제를 해결하는 데 도움이 되지 않는다는 것을 훨씬 더 빨리 깨달았을 것입니다. 시각적 참조를 위해 탱크 내부에 라벨이 붙은 물리적 측정 파이프를 설치했더라도, 그 환경에서 카메라의 각도를 조정하고 렌즈의 선명도를 유지하는 것은 매우 어려웠을 것입니다. 궁극적으로, 더 철저한 사전 계획 단계가 나를 카메라가 없는 다른 마이크로컨트롤러를 선택하게 만들었을 것이며 — 확실히 훨씬 더 넓은 프로젝트 박스를 선택했을 것입니다!
하드웨어 개발에서의 AI 사용
AI는 이 프로젝트를 완료하는 데 큰 도움을 주었습니다. 그러나 대부분의 AI 사용자들이 이제 알고 있는 것처럼, 그 출력은 항상 회의적으로 다루어져야 합니다.
시스템을 AC 전원에 안전하게 연결하고 수동-자동 모드 선택기를 구현하는 방법을 알아내는 과정에서 이는 명백하게 드러났습니다. 그 단계에서 AI는 완전히 환각을 일으켜 근본적으로 결함이 있는 회로 솔루션을 제공했습니다. 자신의 한계를 인정하는 대신, 반복적으로 고장 난 디자인을 계속 조정했습니다. 내가 대안 회로 아이디어를 적극적으로 제안하기 전까지는 최종적으로 작동하는 솔루션을 확정할 수 없었습니다.
또한, 전체 프로젝트 맥락을 붙여넣지 않고 새로운 채팅 세션을 시작하면 AI가 나중에 기술적 막다른 길로 판명된 것처럼 보이는 유용한 경로를 제안하는 것을 알게 되었습니다.
전망
앞으로, 나는 중앙 집중식 스마트 홈 서버 역할을 할 Raspberry Pi를 설치할 계획입니다. 이를 통해 시간이 지남에 따라 모든 물탱크 소비 매개변수를 기록하고 모니터링할 수 있게 될 것입니다. 그 준비가 완료되면, ESP32-CAM을 더 효율적인 마이크로컨트롤러로 교체하고 카메라 모듈을 실제로 유용한 프로젝트에 재사용할 계획입니다.
원문: https://www.instructables.com/ESP32-CAM-Automated-Water-Tank-Controller/