Plant Guardian 문서에 연결된 guardian.ino를 읽고 계산한 소프트웨어 사례입니다. 실물 배선·토양 교정·급수 시험 결과가 아니며, 이 코드가 영상 촬영 당시 장치에 탑재됐는지도 확인하지 않았습니다.
원시값을 바꾼 숫자가 곧 수분율은 아닙니다
ADC(Analog-to-Digital Converter, 아날로그 디지털 변환기)는 센서 전압을 정수 원시값으로 읽습니다. 이 숫자는 곧바로 토양의 체적 수분 함량이 아닙니다. 예시의 map(raw, 4095, 1500, 0, 100)은 원시값 4095를 0, 1500을 100으로 선형 변환합니다. 여기서 4095와 1500은 코드의 끝점이지, 모든 센서와 토양에 맞는 교정값이 아닙니다.
센서·공급 전압·토양·삽입 깊이를 기록한 뒤, 정의한 건조·습윤 기준 조건에서 원시값을 측정합니다. 습해질 때 숫자가 증가하는지 감소하는지도 확인합니다. 두 점을 정했다고 실제 수분 함량 측정기가 되는 것은 아닙니다. 물리 단위로 검증하지 않았다면 상대 수분 표시값으로 구분합니다. 전기적 입력 자체의 확인은 ADC 입력 범위와 획득 시간을 먼저 참고합니다.
Arduino map()은 정수 연산이며 결과를 자동 제한하지 않습니다. 이 예시는 뒤에 constrain(..., 0, 100)을 적용하므로 끝점을 벗어난 원시값도 0 또는 100으로 보일 수 있습니다. 보정 두 끝점이 같은지, 입력이 장치에서 정한 유효 범위 안인지 먼저 검사하고, 범위를 벗어난 값은 원시값과 함께 별도 기록합니다. 단순히 표시를 0~100으로 잘랐다고 해서 센서가 정상이라는 뜻은 아닙니다.
5%인데 열 스트레스가 선택되는 이유
공개 코드는 상태마다 토양 범위 일치에 40점, 온도 범위에 30점, 공기 상대습도 범위에 30점을 더합니다. 조건을 모두 만족해야 선택되는 방식이 아니라, 합계가 가장 큰 상태를 고르는 방식입니다. 범위의 양 끝은 모두 포함합니다.
계산 입력: 토양 상대 표시값 5%, 온도 25°C, 공기 상대습도 60%. 이 입력으로 코드의 13개 상태를 대조하면 HEAT STRESS가 70점으로 선택됩니다. 아래는 그중 비교에 필요한 세 상태입니다.
| 상태 | 토양 범위 / 점수 | 온도 범위 / 점수 | 공기 습도 범위 / 점수 | 합계 |
|---|---|---|---|---|
| DROUGHT CRISIS | 0~10 / 40 | 35~50°C / 0 | 0~30% / 0 | 40 |
| Kinda Dry | 25~40 / 0 | 25~35°C / 30 | 30~60% / 30 | 60 |
| HEAT STRESS | 0~100 / 40 | 35~50°C / 0 | 0~100% / 30 | 70 · 선택 |
25°C는 이 코드의 열 스트레스 온도 범위 밖입니다. 그래도 토양과 공기 습도 범위가 넓어 70점을 얻습니다. 따라서 상태 이름만 보고 해당 위험 조건을 실제로 만족했다고 해석하면 안 됩니다. 이는 공개된 판정 코드에서 계산한 반례이며, 실제 식물의 열 스트레스나 가뭄을 진단한 결과가 아닙니다.
읽기 실패 뒤에 남은 값도 구분합니다
readEnvironmentalData()는 dht22.getData()가 성공했을 때만 온도와 습도를 갱신합니다. 실패하면 이전 값이 남으며, 첫 성공 전에는 초기값 0이 남습니다. 이어지는 점수 계산은 그 값이 새 측정인지, 과거 측정인지 확인하지 않습니다. 토양의 analogRead() 숫자 하나만으로 단선·센서 접촉 상태까지 판별할 수도 없습니다.
각 센서에 값, 마지막 성공 시각, 이번 읽기의 성공 여부를 함께 보관합니다. 허용 경과 시간은 센서 주기와 장치의 요구에 맞춰 정합니다. 이전 값을 표시할 필요가 있다면 ‘마지막 유효값’과 경과 시간을 표시하고 새 정상 입력으로 점수에 섞지 않습니다. 토양 경고는 신뢰할 수 있는 토양 입력으로 판단하고, 온습도 실패는 별도의 측정 상태로 함께 표시할 수 있습니다.
경고 조건을 일반 상태 점수 앞에 둡니다
- 1. 토양 입력의 유효성실패·오래된 값·입력 범위 오류이면 측정 오류를 표시합니다.
- 2. 보정의 유효성기준 조건과 끝점을 확인하지 못했으면 보정 필요로 구분합니다.
- 3. 건조·과습 경고 조건장치별 경고 조건에 들면 해당 경고를 우선 표시합니다. 다른 센서의 오류 표시는 유지합니다.
- 4. 일반 상태 점수경고가 없고 필요한 입력이 모두 유효할 때 계산합니다. 입력이 부족하면 측정 불완전으로 표시합니다.
예시의 10%를 모든 식물의 건조 기준으로 가져오지 않습니다. 경고와 일반 상태를 분리하면, 정상인 다른 입력의 점수가 중요한 경고를 덮는 문제를 피할 수 있습니다. 필요하면 상태 하나를 강제로 고르는 대신 ‘토양 경고’와 ‘온습도 측정 실패’를 동시에 보여 줍니다.
경계값과 화면 문구를 함께 테스트합니다
공개 코드에는 또 하나의 경계 차이가 있습니다. 상태 표의 건조 범위는 0 <= soil <= 10이지만 OLED 토양 줄의 CRISIS 조건은 soil < 10입니다. 정확히 10일 때 두 조건의 포함 여부가 다릅니다. 여기에 점수 경쟁까지 있으므로 얼굴 상태와 토양 줄을 함께 검사해야 합니다.
| 시험 입력 | 확인할 결과 |
|---|---|
| 경고 경계 바로 아래·같음·바로 위 | 비교 연산의 포함 여부와 모든 표시 문구가 명세와 일치하는지 확인합니다. |
| 토양 5%, 25°C, 60% | 원래 점수 계산의 HEAT STRESS 70점을 재현하고, 제안한 경고 우선 방식과 구분합니다. |
| 보정 끝점 동일 / 범위 밖 원시값 | 0~100으로 잘린 숫자만 보고 정상이라고 판정하지 않는지 확인합니다. |
| DHT22 첫 읽기 실패 / 성공 후 실패 | 초기값·이전 값이 새 측정처럼 쓰이지 않는지 확인합니다. |
| 값은 남아 있지만 유효기간 초과 | 오래된 값 표시와 경고·일반 상태 판단을 분리하는지 확인합니다. |
경계 부근의 잡음으로 경고가 반복 전환되면 켜짐·해제 경계를 다르게 두는 히스테리시스나 시간 조건을 검토합니다. 그 값도 실제 장치의 요구로 정하고, 코드 입력 시험과 현장 센서 시험의 결과를 분리해 기록합니다.
근거와 적용 범위
출발점은 Instagram의 Plant Guardian 소개 영상입니다. 주최 측 결과 페이지가 같은 프로젝트 문서를 연결하는 것을 확인했고, 위 수치와 분기는 문서에 연결된 공개 코드에서 대조했습니다. 영상·사진·제3자 코드는 이 글에 재배포하지 않았습니다.
- PCBCUPID 결과: Plant Guardian · 프로젝트와 문서의 연결 관계.
- Guardian v10.0 제작 문서 및 공개 guardian.ino · 상태 범위, 입력 갱신, 40/30/30 점수, OLED 조건. 2026-10-13 확인본 기준이며 이후 변경될 수 있습니다.
- Arduino map() 문서 · 정수 범위 변환과 자동 제한이 없는 동작.
- 센서 원시값과 실제 단위를 나누어 기록하기 · 관련 입력 검증 절차.
이 글은 센서 입력과 표시 상태의 판정을 다룹니다. 화면에 WATERING이 보인다고 해서 물 공급이 확인되는 것은 아닙니다. 실제 급수 성공, 실물 배선의 적합성, 센서의 정량 정확도는 이 코드 분석으로 주장하지 않습니다.