# IoT로 식물 성장 예측 ![이 수업에 대한 스케치 노트 개요](../../../../sketchnotes/lesson-5.jpg) > [Nitya Narasimhan](https://github.com/nitya)의 스케치 노트. 클릭하면 크게 보실 수 있습니다. ## 수업 전 퀴즈 [수업 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/9) ## 개요 식물이 자라기 위해서는 물, 이산화탄소, 영양분, 빛, 열과 같은 특정 요소가 필요합니다. 이 수업에서는 기온을 측정하여 식물의 성장과 성숙도를 계산하는 방법을 배웁니다. 이 수업에서 다룰 내용은 다음과 같습니다: - [디지털 농업](#디지털-농업) - [농사에서 왜 온도가 중요할까요?](#농사에서-왜-온도가-중요할까요?) - [주변 온도 측정](#주변-온도-측정) - [유효 적산 온도(Growing Degree Days, GDD)](#유효-적산-온도) - [온도 센서 데이터를 이용한 GDD 계산](#온도-센서-데이터를-이용한-GDD-계산) ## 디지털 농업 디지털 농업은 농업 데이터를 수집, 저장, 분석하는 도구를 사용하여 우리가 농사를 짓는 방식을 변화시키고 있습니다. 우리는 현재 세계 경제 포럼(WEF)이 '4차 산업 혁명'이라 설명하는 시기에 살고 있고, 디지털 농업의 증가는 `4차 농업 혁명` 또는 `농업 4.0`이라고 불리게 되었습니다. > 🎓 디지털 농업이라는 용어는 또한 농장에서 식탁까지 가는 전체 여정인 '농업 가치사슬'도 포함합니다. 이는 식품 배송 및 가공, 창고 및 전자 상거래 시스템, 심지어 트랙터 대여 앱에 대한 제품 품질 추적을 포함합니다! 이러한 변화를 통해 농부들은 생산량을 증가시키고, 더 적은 비료와 농약을 사용하고, 더 효율적으로 급수할 수 있었습니다. 주로 부유한 나라에서 사용하지만, 센서와 다른 장치들은 천천히 가격을 내리고 있고 개발도상국에서도 더 접근이 용이하도록 만들고 있습니다. 디지털 농업에서 사용 가능한 몇 가지 기술: - 온도 측정 - 온도를 측정하는 것은 농부들에게 식물의 성장과 성숙도를 예측할 수 있게 합니다. - 자동 관수 - 토양의 수분을 측정하고 토양이 너무 건조할 때, 시간을 정해 물을 주는 대신 관개 시스템을 켭니다. 시간을 정해 물을 주면 농작물이 더운 기간이나 가뭄 동안 물이 부족하거나, 비가 오는 동안 물이 너무 많아질 수 있습니다. 토양이 필요로 할 때만 물을 줌으로써 농부들은 물 사용을 최적화할 수 있습니다. - 해충 방제 - 농부들은 자동화된 로봇이나 드론에 해충을 확인하기 위해서 카메라를 장착하여 사용할 수 있고, 필요한 곳에만 살충제를 적용하여 사용되는 살충제의 양과 지역 상수로의 농약 유출을 줄일 수 있습니다. ✅ 조사를 해봅시다. 농산물의 생산량을 증가시키기 위한 다른 기술들에는 무엇이 있습니까? > 🎓 '정밀 농업'이라는 용어는 밭 단위를 기준으로 또는 밭의 일부에서 농작물의 관찰, 측정, 대응을 정의하기 위해 사용됩니다. 물, 영양분과 해충의 정도를 측정하고, 밭의 일부분에 물을 주는 것과 같이 정확하게 대응하는 것을 포함합니다. ## 농사에서 왜 온도가 중요할까요? 식물에 대해 배울 때, 대부분의 학생들은 물, 빛, 이산화탄소(CO2)와 영양분의 필요성에 대해 배웁니다. 식물은 또한 자라기 위해서 따뜻함을 필요로 합니다. 기온이 오르면서 봄에 식물들이 피어나는 이유, 짧은 온난 기간으로 설강화나 수선화가 일찍 싹을 틔울 수 있는 이유, 온실(hothouse)과 온실(greenhouse)이 식물을 잘 자라게 하는 이유가 여기에 있습니다. > 🎓 온실(Hothouse)과 온실(Greenhouse)은 비슷한 일을 하지만, 중요한 차이점이 있습니다. 온실(Hothouse)은 인위적으로 열을 공급하고 농부가 온도를 조금 더 정밀하게 조절할 수 있게 합니다. 온실(Greenhouse)은 따뜻함을 위해 태양에 의존하고 유일한 제어는 일반적으로 열을 내보내는 창이나 기타 개구부입니다. 식물은 일 평균 기온을 기준으로 기준 혹은 최저 온도와 적정 온도, 최고 온도를 가지고 있습니다. - 기준 온도 - 식물이 자라는 데에 필요한 최소한의 일 평균 온도입니다. - 적정 온도 - 식물이 가장 많이 자라게 하는 최적의 일 평균 온도입니다. - 최고 온도 - 식물이 견딜 수 있는 최고 일 평균 온도입니다. 이 온도 이상에서 식물은 물을 아끼고 살아 남기 위해 스스로의 성장을 멈춥니다. > 💁 이것들은 일간 및 야간 온도에 대한 평균을 낸 평균 온도입니다. 식물은 또한 더 효율적으로 광합성을 하고 밤에 에너지를 절약하기 위해 밤낮으로 다른 온도가 필요합니다. 각각의 식물 종들은 기준, 적정, 최고 온도의 값이 서로 다릅니다. 이것이 일부 식물이 더운 나라에서 번성하고, 다른 식물이 추운 나라에서 번성하는 이유입니다. ✅ 간단한 조사를 해봅시다. 정원, 학교, 지역 공원에서 기르는 식물들에 대해 기준 온도를 찾아보십시오. ![온도가 상승함에 따라 증가하는 성장률을 나타내는 그래프, 온도가 너무 높아지면 감소하는 그래프](../../../../images/plant-growth-temp-graph.png) 상단의 그래프는 기온이 성장에 끼치는 영향에 대한 예시를 보여주는 그래프입니다. 기준 온도까지는 성장을 하지 않습니다. 성장률은 적정 온도까지 계속해서 증가하고, 최고점에 도달한 후에는 점점 떨어집니다. 최고 온도에서는 성장을 멈추게 됩니다. 이 그래프의 형태는 식물의 종에 따라 달라집니다. 어떤 것은 적정 온도 이상에서 더 급격하게 떨어지고, 어떤 것은 기준 온도부터 적정 온도까지 느리게 증가합니다. > 💁 최고의 성장을 얻기 위해서 농부는 자신이 기르는 식물들에 대해 이 세 가지 온도의 값과 이 그래프의 형태에 대해 이해해야 합니다. 만약 농부가 상업용 온실에서와 온도를 조절한다면, 식물에 최적화 할 수 있습니다. 예를 들어, 토마토를 재배하는 상업용 온실은 가장 빠른 성장을 위해 낮에는 약 25°C, 밤에는 약 20°C로 온도를 설정합니다. > 🍅 이러한 온도를 인공 조명, 비료 및 통제된 CO2 레벨과 결합하면 상업적 재배자들이 일년 내내 재배하고 수확할 수 있습니다. ## 주변 온도 측정 온도 센서는 주변 온도를 측정하기 위해 IoT 장치와 함께 사용될 수 있습니다. ### 작업 - 온도 측정 IoT 장치를 사용하여 온도를 모니터링하려면 관련 가이드를 참조하십시오. - [Arduino - Wio Terminal](../wio-terminal-temp.md) - [싱글 보드 컴퓨터 - Raspberry Pi](./pi-temp.ko.md) - [싱글 보드 컴퓨터- 가상 장치](./virtual-device-temp.md) ## 유효 적산 온도 유효 적산 온도(Growing degree days, growing degree units)은 온도를 기준으로 식물의 성장을 측정하는 방법입니다. 식물에 물과 영양분, CO2가 충분하다고 가정하면, 기온이 성장 속도를 결정합니다. 유효 적산 온도(GDD)는 식물 기준 온도보다 높은 하루의 평균 섭씨 온도로 계산됩니다. 각 식물은 성장, 개화, 또는 생산과 성장을 위해 특정한 수의 GDD가 필요합니다. 매일 GDD가 더 많을수록, 식물은 더 빨리 자랄 것입니다. > 🇺🇸 미국인의 경우 성장도 일수는 화씨로 계산할 수도 있습니다. 5 GDDC(섭씨 기준의 GDD)는 9 GDDF(화씨 기준의 GDD)와 동알합니다. GDD를 계산하는 전체 공식은 약간 복잡합니다. 하지만 좋은 근사치로 종종 사용되는 단순화된 방정식이 있습니다: ![GDD = (최고 온도 + 최소 온도) 을 2로 나누고, 전체에서 기준 온도를 뺀 값](../../../../images/gdd-calculation.png) - **GDD** - 유효 적산 온도 - **Tmax** - 섭씨 단위의 일간 최고 기온 - **Tmin** - 섭씨 단위의 일간 최저 기온 - **Tbase** - 섭씨 단위의 식물의 기준 온도 > 💁 30°C가 넘는 Tmax나 Tbase 보다 낮은 Tmin에 대해 다루는 변형식이 있지만, 지금은 넘어가도록 하겠습니다. ### 예시 - 옥수수 🌽 품종에 따라 옥수수는 성숙하는 데에 기준 온도 10°C에서 800부터 2,700 사이의 GDD를 필요로 합니다. 기준 온도보다 높은 첫 날, 다음과 같은 온도가 측정되었습니다: | 측정 | 온도 °C | | :---------- | :-----: | | 최고 온도 | 16 | | 최저 온도 | 12 | 계산식에 이 숫자들을 대입합시다: - Tmax = 16 - Tmin = 12 - Tbase = 10 계산 결과는 다음과 같습니다: ![GDD = 16 + 12 에서 2로 나누고, 전체에서 10을 빼면, 정답은 4](../../../../images/gdd-calculation-corn.png) 옥수수는 그날 4 GDD를 받았습니다. 옥수수 품종이 성숙하는 데 800 GDD가 필요하다고 가정하면, 성숙에 도달하기 위해서는 추가적으로 796 GDD가 더 필요합니다. ✅ 조사를 해봅시다. 정원, 학교, 지역 공원에서 기르는 식물들에 대해 식물이 다 자라거나 작물을 생산하는 데 필요한 GDD 수를 조사해보십시오. ## 온도 센서 데이터를 이용한 GDD 계산 식물은 정해진 날짜에 자라지 않습니다. 예를 들어 씨앗을 심고 정확히 100일 후에 열매를 맺는다는 것을 알 수는 없습니다. 대신 농부는 식물이 자라는 데 걸리는 시간을 대략적으로 알 수 있으며 매일 작물이 준비되는 시간을 확인합니다. 이는 대규모 농장의 노동력에 막대한 영향을 끼칩니다. 그리고 농부들이 예상치 못하게 일찍 준비된 작물을 놓치는 위험을 줍니다. 농부는 기온을 측정하여 식물이 받은 GDD를 계산할 수 있고, 그들이 예상 성숙도와 가까워졌는지 확인 하도록 합니다. IoT 장치를 이용하여 온도 데이터를 수집하면, 농부는 자동적으로 식물이 성숙에 가까워졌는지 알 수 있습니다. 이러한 일일반적인 아키텍처는 IoT 장치가 온도를 측정한 다음 MQTT와 같은 것을 사용하여 인터넷을 통해 이 원격 측정 데이터를 게시하도록 하는 것입니다. 서버 코드는 이 데이터를 수신하고 이것을 데이터베이스와 같은 어딘가에 저장합니다. 이것은 데이터가 나중에 분석될 수 있다는 것을 의미합니다. 예를 들어, 야간 작업을 통해 하루의 GDD를 계산하고, 지금까지 각 작물에 대한 GDD를 합산하고, 식물이 성숙에 가까워지면 알림을 보낼 수 있습니다. ![원격 측정 데이터는 서버로 보내져 데이터베이스에 저장됩니다.](../../../../images/save-telemetry-database.png) 서버 코드는 또한 부가 정보를 추가함으로써 데이터를 보강할 수 있습니다. 예를 들어, IoT 장치는 어떤 장치인지 나타내기 위해 식별자를 게시할 수 있으며, 서버 코드는 이를 사용하여 장치의 위치와 모니터링 중인 작물을 조회할 수 있습니다.또한 일부 IoT 장치에는 정확한 시간을 추적하는 데 필요한 하드웨어가 없거나 인터넷을 통해 현재 시간을 읽는 데 추가 코드가 필요하므로 현재 시간과 같은 기본 데이터를 추가할 수 있습니다. ✅ 당신이 생각하기에 밭마다 다른 기온이 필요한 이유는 무엇입니까? ### 작업 - 온도 정보 게시 IoT 장치를 사용하여 MQTT를 통해 온도 데이터를 게시하여 나중에 분석할 수 있도록 관련 가이드를 참조하십시오: - [Arduino - Wio Terminal](../wio-terminal-temp-publish.md) - [싱글 보드 컴퓨터 - Raspberry Pi/가상 IoT 장치](single-board-computer-temp-publish.ko.md) ### 작업 - 온도 정보를 캡처하고 저장하십시오. IoT 장치가 원격 분석을 게시하면, 서버 코드를 작성하여 이 데이터를 구독하고 저장할 수 있습니다. 이것을 데이터베이스에 저장하는 대신 서버 코드가 Comma Seperated Values(CSV)로 저장합니다. CSV 파일은 데이터를 텍스트로 된 값의 행으로 저장합니다. 각 값은 쉼표(,)로 분리되고 각각이 새로운 줄에 기록됩니다. 이것은 편리하고, 사람이 읽을 수 있고 잘 지원되는 데이터를 파일로 저장하는 방법입니다. CSV 파일은 _날짜_ 와 _온도_ 2개의 열을 가집니다. _날짜_ 열 은 서버가 메시지를 수신한 현재 날짜와 시간으로 설정되며 _온도_ 는 원격 측정 메시지에서 가져옵니다. 1. 원격 분석을 구독하기 위한 서버 코드를 생성하기 위해 레슨 4에 있는 단계를 반복하십시오. 명령을 게시하기 위해서 코드를 추가할 필요는 없습니다. 이를 위한 단계는 다음과 같습니다: - Python 가상 환경 구성 및 활성화 - paho-mqtt pip package를 설치 - 원격 분석 주제에 게시된 MQTT 메시지를 수신 대기하는 코드 작성 > ⚠️ 필요한 경우 원격 분석을 수신할 Python 앱을 만드는 방법은 [Lesson4의 지침](../../../1-getting-started/lessons/4-connect-internet/README.md#receive-telemetry-from-the-mqtt-broker)을 참고할 수 있습니다. 이 프로젝트의 폴더명을 입력하십시오. `temperature-sensor-server`. 1. `client_name`이 이 프로젝트를 반영하는 지 확인하십시오. ```cpp client_name = id + 'temperature_sensor_server' ``` 1. 아래의 import 목록을 보고 파일의 상단에 import 하는 부분을 추가하십시오: ```python from os import path import csv from datetime import datetime ``` 이것은 파일을 읽기 위한 라이브러리, CSV 파일과 상호작용하는 라이브러리, 날짜와 시간을 지원하는 라이브러리를 가져옵니다. 1. `handle_telemetry` 함수 앞에 다음 코드를 추가합니다: ```python temperature_file_name = 'temperature.csv' fieldnames = ['date', 'temperature'] if not path.exists(temperature_file_name): with open(temperature_file_name, mode='w') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=fieldnames) writer.writeheader() ``` 이 코드는 작성할 파일의 이름과 CSV 파일의 열 헤더의 이름을 위한 몇 가지 상수를 선언합니다. CSV 파일의 첫 번째 행은 관습적으로 콤마로 분리된 열 헤더를 포함합니다. 그런 다음 CSV 파일이 이미 존재하는 지 확인합니다. 만약 존재하지 않는다면, 첫 번째 행에 열 헤더를 포함하여 생성합니다. 1. 다음 코드를 `handle_telemetry` 함수 뒷 부분에 추가하십시오: ```python with open(temperature_file_name, mode='a') as temperature_file: temperature_writer = csv.DictWriter(temperature_file, fieldnames=fieldnames) temperature_writer.writerow({'date' : datetime.now().astimezone().replace(microsecond=0).isoformat(), 'temperature' : payload['temperature']}) ``` 이 코드는 CSV 파일을 열고 끝 부분에 새로운 행을 추가합니다. 행에는 사람이 읽을 수 있는 형식으로 현재 데이터와 시간이 있으며 그 뒤에 IoT 장치에서 받은 온도가 표시됩니다. 데이터는 [ISO 8601 형식](https://wikipedia.org/wiki/ISO_8601)으로 마이크로초 없이 시간대와 함께 저장됩니다. 1. 이전과 동일한 방법으로 이 코드를 실행하고, IoT 장치가 데이터를 전송하는 지 확인하십시오. `temperature.csv` 이라 불리는 CSV 파일이 같은 폴더 내에 생성됩니다. 이것을 확인하면 날짜/시간과 기온 측정을 볼 수 있습니다. ```output date,temperature 2021-04-19T17:21:36-07:00,25 2021-04-19T17:31:36-07:00,24 2021-04-19T17:41:36-07:00,25 ``` 1. 데이터를 캡쳐하기 위해 이 코드를 잠시동안 실행하십시오. 이상적으로는 GDD 계산을 위한 충분한 데이터를 수집하기 위해 하루 종일 실행해야 합니다. > 💁 만약 당신이 가상 IoT 장치를 사용한다면, 랜덤 체크 박스를 선택하고 온도 값이 반환될 때마다 동일한 온도가 나오지 않도록 범위를 설정합니다. > ![랜덤 체크 박스를 선택하고 범위를 설정함](../../../../images/select-the-random-checkbox-and-set-a-range.png) > 💁 만약 이것을 하루 종일 실행하고 싶다면 전원 세팅을 바꾸거나 [시스템 활성 유지 Python 스크립트](https://github.com/jaqsparow/keep-system-active)와 같은 것을 실행하여 절전 상태에 빠지지 않도록 확인해야 합니다. > 💁 이 코드는 [code-server/temperature-sensor-server](code-server/temperature-sensor-server) 폴더에서 찾을 수 있습니다. ### 작업 - 저장된 데이터를 이용한 GDD 계산 서버가 온도 데이터를 캡쳐하고 나면, 식물의 GDD를 계산할 수 있습니다. 수동으로 하는 방법은 다음과 같습니다: 1. 식물의 기준 온도를 찾습니다. 예를 들어, 딸기의 기준 온도는 10°C 입니다. 1. `temperature.csv`에 가장 일간 최고 온도 최저 온도를 찾습니다. 1. 이전에 제공된 GDD 계산식을 이용하여 GDD를 계산합니다. 예를 들어, 만약 일간 최고 온도가 25°C이고, 최저 온도가 12°C라면: ![GDD = 25 + 12 를 2로 나누고 , 10을 빼면 결과는 8.5입니다.](../../../../images/gdd-calculation-strawberries.png) - 25 + 12 = 37 - 37 / 2 = 18.5 - 18.5 - 10 = 8.5 따라서 딸기는 지금까지 8.5의 GDD를 받았습니다. 딸기는 열매를 맺기 위해 약 250 GDD를 필요로 합니다. 따라서 아직 시간이 필요합니다. --- ## 🚀 도전 식물이 자라기 위해선 열 말고도 많은 것들을 필요로 합니다. 다른 필요한 것에는 무엇이 있을까요? 이를 측정할 수 있는 센서가 있는지 찾아보십시오. 이러한 레벨을 제어하는 액추에이터는 어떻습니까? 식물의 성장을 최적화하기 위해 하나 이상의 IoT 장치를 어떻게 조합해야 할까요? ## 강의 후 퀴즈 [강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/10) ## 복습 및 독학 - 디지털 농업에 대해 [디지털 농업에 대한 Wikipedia 페이지](https://wikipedia.org/wiki/Digital_agriculture)에서 더 읽어보십시오. 정밀 농업에 대해서는 [정밀 농업에 대한 Wikipedia 페이지](https://wikipedia.org/wiki/Precision_agriculture)에서 읽어보십시오. - 유효 적산 온도(GDD) 계산식의 원본은 이 수업에서의 간략한 식보다 훨씬 복잡합니다. [Growing Degree Day Wikipedia 페이지](https://wikipedia.org/wiki/Growing_degree-day)에서 더 복잡한 방정식과 기준 이하의 온도를 처리하는 방법에 대해 자세히 알아보십시오. - 우리가 여전히 농사에 동일한 방법을 사용하더라도 미래에는 식량이 부족할 수 있습니다. 하이테크 농업에 대해서 [YouTube의 미래의 하이테크 농장 비디오](https://www.youtube.com/watch?v=KIEOuKD9KX8)에서 더 자세히 배워봅시다. ## 과제 [Jupyter Notebook을 이용한 GDD 데이터 시각화](assignment.ko.md)