From e564550b7590fd65660e5af8327d70521d7a1657 Mon Sep 17 00:00:00 2001 From: JiHyeon Yun <81208791+jhYun505@users.noreply.github.com> Date: Tue, 6 Dec 2022 01:54:45 +0900 Subject: [PATCH 1/4] [ko] Korean Translation for 2-Farm lesson1 (#433) * Translate Project2 - Lesson1 to Korean * fix README.ko.md Co-authored-by: Jim Bennett --- .../translations/README.ko.md | 268 ++++++++++++++++++ .../translations/assignment.ko.md | 43 +++ .../translations/pi-temp.ko.md | 111 ++++++++ .../single-board-computer-temp-publish.ko.md | 57 ++++ 4 files changed, 479 insertions(+) create mode 100644 2-farm/lessons/1-predict-plant-growth/translations/README.ko.md create mode 100644 2-farm/lessons/1-predict-plant-growth/translations/assignment.ko.md create mode 100644 2-farm/lessons/1-predict-plant-growth/translations/pi-temp.ko.md create mode 100644 2-farm/lessons/1-predict-plant-growth/translations/single-board-computer-temp-publish.ko.md diff --git a/2-farm/lessons/1-predict-plant-growth/translations/README.ko.md b/2-farm/lessons/1-predict-plant-growth/translations/README.ko.md new file mode 100644 index 00000000..e93136bf --- /dev/null +++ b/2-farm/lessons/1-predict-plant-growth/translations/README.ko.md @@ -0,0 +1,268 @@ +# 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) diff --git a/2-farm/lessons/1-predict-plant-growth/translations/assignment.ko.md b/2-farm/lessons/1-predict-plant-growth/translations/assignment.ko.md new file mode 100644 index 00000000..631eb828 --- /dev/null +++ b/2-farm/lessons/1-predict-plant-growth/translations/assignment.ko.md @@ -0,0 +1,43 @@ +# Jupyter Notebook을 이용한 GDD 데이터 시각화 + +## 개요 + +이번 수업에서 IoT 센서를 사용해 GDD 데이터를 수집했습니다. 좋은 GDD 데이터를 얻기 위해서는 수 일간 데이터를 수집해야 합니다. 온도 데이터를 시각화 하고 GDD를 계산하는 것을 돕기 위해선 [Jupyter Notebooks](https://jupyter.org)과 같은 도구를 사용하여 데이터를 분석할 수 있습니다. + +며칠 간 데이터를 수집하는 것으로 시작하십시오. 전원 관리 설정을 조정하거나 [시스템 활성 유지 Python 스크립트](https://github.com/jaqsparow/keep-system-active) 와 같은 것을 실행하여 IoT 장치가 실행되는 동안 서버 코드가 항상 실행되고 있는지 확인해야 합니다. + +온도 데이터를 얻은 후에는 이 레포지토리에 있는 Jupyter Notebook을 이용하여 데이터를 시각화하고 GDD를 계산할 수 있습니다. Jupyter Notebook은 _셀_ 이라 불리는 블럭 안에 코드와 지침들이 섞여있습니다. 이는 주로 파이썬으로 작성됩니다. 지침을 읽고, 각각의 코드 블럭을 하나씩 실행할 수 있습니다. 또한 코드를 수정할 수도 있습니다. 예를 들자면 당신의 식물을 위해 GDD를 계산할 때 사용되는 기준 온도를 이 notebook에서 수정할 수 있습니다. + +1. `gdd-calculation` 이름을 가진 폴더를 생성합니다. + +1. [gdd.ipynb](../code-notebook/gdd.ipynb) 파일을 다운받고 `gdd-calculation`로 복사합니다. + +1. MQTT 서버가 생성한 `temperature.csv` 파일을 복사합니다. + +1. `gdd-calculation`폴더에 새로운 Python 환경을 생성합니다. + +1. 데이터를 관리하고 표시하는 데 필요한 라이브러리와 함께 Jupyter Notebook을 위한 몇가지 pip 패키지들을 설치합니다: + + ```sh + pip install --upgrade pip + pip install pandas + pip install matplotlib + pip install jupyter + ``` + +1. 이 notebook을 Jupyter에서 실행합니다: + + ```sh + jupyter notebook gdd.ipynb + ``` + + Jupyter가 시작되고 브라우저에서 notebook을 열게 됩니다. notebook의 지시에 따라 측정된 온도를 시각화하고 유효 적산 온도(GDD)를 계산합니다. + + ![The jupyter notebook](../../../../images/gdd-jupyter-notebook.png) + +## 평가 기준 + +| 기준 | 모범 답안 | 적절함 | 개선이 필요함 | +| ----------- | ------------------------------------------- | ------------------------------------- | ------------------------- | +| 데이터 캡쳐 | 최소 완전한 이틀 이상의 데이터를 캡처함 | 최소 완전한 하루 이상의 데이터 캡처함 | 몇개의 데이터를 캡처함 | +| GDD 계산 | 성공적으로 notebook을 실행하고 GDD를 계산함 | 성공적으로 notebook을 실행함 | notebook을 실행할 수 없음 | diff --git a/2-farm/lessons/1-predict-plant-growth/translations/pi-temp.ko.md b/2-farm/lessons/1-predict-plant-growth/translations/pi-temp.ko.md new file mode 100644 index 00000000..3b0be52b --- /dev/null +++ b/2-farm/lessons/1-predict-plant-growth/translations/pi-temp.ko.md @@ -0,0 +1,111 @@ +# 온도 측정 - 라즈베리 파이 + +이 단원에서는 라즈베리 파이에 온도 센서를 추가합니다. + +## 하드웨어 + +당신이 사용할 센서는 두 센서를 하나의 패키지로 결합한 [DHT11 습도 및 온도 센서](https://www.seeedstudio.com/Grove-Temperature-Humidity-Sensor-DHT11.html)입니다. 이것은 온도, 습도와 때로는 대기압을 결합한 다수의 상업적으로 이용 가능한 센서로 상당히 인기가 있습니다. 온도 센서 구성 요소는 음의 온도 계수(NTC) 서미스터로, 온도가 증가함에 따라 저항이 감소하는 서미스터입니다. + +이것은 디지털 센서이므로 마이크로컨트롤러가 읽을 수 있는 온도와 습도 데이터가 포함된 디지털 신호를 생성하는 온보드 ADC를 가지고 있습니다. + +### 온도 센서 연결 + +Grove 온도 센서는 라즈베리 파이에 연결할 수 있습니다. + +#### 임무 + +온도 센서를 연결하십시오. + +![Grove 온도 센서](../../../../images/grove-dht11.png) + +1. 온도와 습도 센서의 소켓에 Grove 케이블의 한 쪽 끝을 삽입합니다. 한쪽 방향으로만 진행됩니다. + +1. 라즈베리 파이의 전원을 끈 상태에서 Grove 케이블의 다른 쪽 끝을 Pi에 부착된 Grove Base hat의 **D5**가 적힌 디지털 소켓에 연결합니다. 이 소켓은 GPIO 핀 옆의 소켓 행에서 왼쪽 두 번째입니다. + +![소켓 A0에 연결된 Grove 온도 센서](../../../../images/pi-temperature-sensor.png) + +## 온도 센서 프로그래밍 + +이제 부착된 온도 센서를 사용하도록 장치를 프로그래밍할 수 있습니다. + +### 임무 + +장치를 프로그래밍합니다. + +1. Pi의 전원을 켜고 부팅될 때까지 기다립니다. + +1. Pi에서 직접 VS Code를 실행하거나 원격 SSH 확장을 통해 연결합니다. + + > ⚠️ 필요한 경우 [레슨 1의 VS Code를 설정 및 실행 설명](../../../../1-getting-started/lessons/1-introduction-to-iot/pi.md)을 참고할 수 있습니다. + +1. 터미널에서 `pi` 사용자 홈 디렉토리에 `temperature-sensor`라는 새 폴더를 만듭니다. 이 폴더 안에 `app.py` 파일을 생성합니다. + + ```sh + mkdir temperature-sensor + cd temperature-sensor + touch app.py + ``` + +1. 이 폴더를 VS Code에서 엽니다. + +1. 온습도 센서를 사용하기 위해서는 추가적인 pip 패키지 설치가 필요합니다. VS Code의 터미널에서 Pi에 이 pip 패키지를 설치하기 위한 다음의 명령어를 실행합니다: + + ```sh + pip3 install seeed-python-dht + ``` + +1. 필요한 라이브러리를 import하기 위해 다음의 코드를 `app.py` 파일에 추가합니다: + + ```python + import time + from seeed_dht import DHT + ``` + + `from seeed_dht import DHT`는 `seeed_dht` 모듈에서 Grove 온도 센서와 상호 작용할 `DHT` 클래스를 import 합니다. + +1. 위의 코드 뒤에 다음의 코드를 추가하여 온도 센서를 관리하는 클래스의 인스턴스를 생성합니다: + + ```python + sensor = DHT("11", 5) + ``` + + 이것은 디지털 온습도 센서(**D**igital **H**umidity and **T**emperature)를 제어하는 `DHT` 클래스의 인스턴스를 선언입니다. 첫 번째 파라미터는 사용되는 센서가 _DHT11_ 센서임을 나타내는 코드입니다. 사용 중인 라이브러리는 이 센서의 다른 버전들을 지원합니다. 두 번째 파라미터는 센서가 Grove base hat에서 디지털 포트 `D5`에 연결되었다는 것을 나타내는 코드입니다. + + > ✅ 모든 소켓은 고유한 핀 번호를 가졌다는 것을 기억하세요.핀 번호 0, 2, 4, 6번은 아날로그 핀이고, 핀 번호 5, 16, 18, 22, 24, 26 번은 디지털 핀입니다. + +1. 위의 코드 뒤에 무한 루프를 추가하여 온도 센서 값을 폴링하고 콘솔에 출력합니다: + + ```python + while True: + _, temp = sensor.read() + print(f'Temperature {temp}°C') + ``` + + `sensor.read()`의 호출은 습도와 온도의 튜플을 반환합니다. 온도 값만 필요하므로 습도 값은 무시됩니다. 온도 값은 콘솔에 출력됩니다. + +1. 온도를 지속적으로 확인할 필요는 없으므로 10초의 짧은 sleep을 `loop`의 끝에 추가합니다. sleep은 장치가 소비하는 전력을 줄여줍니다. + + ```python + time.sleep(10) + ``` + +1. VS Code의 터미널에서 다음을 실행하여 Python 앱을 실행합니다: + + ```sh + python3 app.py + ``` + + 콘솔에 온도 값이 출력되는 것을 볼 수 있습니다. 엄지 손가락으로 누르는 것처럼 센서에 따뜻한 것을 데거나 팬을 사용하여 값이 변하는 것을 확인하십시오: + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + Temperature 26°C + Temperature 26°C + Temperature 28°C + Temperature 30°C + Temperature 32°C + ``` + +> 💁 이 코드는 [code-temperature/pi](../code-temperature/pi) 폴더에 있습니다. + +😀 온도 센서 프로그램이 성공적이었습니다! diff --git a/2-farm/lessons/1-predict-plant-growth/translations/single-board-computer-temp-publish.ko.md b/2-farm/lessons/1-predict-plant-growth/translations/single-board-computer-temp-publish.ko.md new file mode 100644 index 00000000..76f35399 --- /dev/null +++ b/2-farm/lessons/1-predict-plant-growth/translations/single-board-computer-temp-publish.ko.md @@ -0,0 +1,57 @@ +# 온도 게시 - 가상 IoT 하드웨어와 라즈베리 파이 + +이 단원에서는 나중에 GDD를 계산하는 데 사용될 수 있도록 MQTT를 이용해 라즈베리 파이나 가상 IoT 장치에서 감지한 온도 값을 게시합니다. + +## 온도 게시 + +온도를 읽은 후에는 MQTT를 통해 값을 읽고 GDD 계산에 사용할 수 있도록 저장하는 '서버' 코드에 게시할 수 있습니다. + +### 임무 - 온도 게시하기 + +온도를 게시하기 위해 장치를 프로그래밍하십시오. + +1. `temperature-sensor` 앱 프로젝트가 열려있지 않다면 해당 프로젝트를 엽니다. + +1. 레슨 4에서 했던 MQTT를 연결하고 원격 분석을 전송하는 다음 단계들을 반복합니다. 동일한 공개 Mosquitto 브로커를 사용하게 됩니다. + + 이를 위한 단계는 다음과 같습니다: + + - MQTT pip 패키지를 추가합니다. + - MQTT 브로커와 연결하는 코드를 추가합니다. + - 원격 분석을 게시하는 코드르 추가합니다. + + > ⚠️ 필요하다면 레슨 4의 [MQTT 연결을 위한 지침](../../../../1-getting-started/lessons/4-connect-internet/translations/single-board-computer-mqtt.md)과 [원격 분석 전송 지침](../../../../1-getting-started/lessons/4-connect-internet/translations/single-board-computer-telemetry.ko.md)를 참고하십시오. + +1. `client_name`이 이 프로젝트의 이름을 반영 하는지 확인하십시오. + + ```python + client_name = id + 'temperature_sensor_client' + ``` + +1. 원격 분석 전송의 경우 빛의 값을 전송하는 대신 DHT 센서에서 읽은 온도 값을 전송하기 위해 JSON 문서의 속성 `temperature`에서 다음과 같이 보냅니다. + + ```python + _, temp = sensor.read() + telemetry = json.dumps({'temperature' : temp}) + ``` + +1. 온도 값은 자주 읽어올 필요가 없습니다. 짧은 시간에 크게 변하지 않기 때문에 `time.sleep`을 10분으로 설정합니다. + + ```cpp + time.sleep(10 * 60); + ``` + + > 💁 `sleep`함수는 몇 초간 시간이 가지는 함수입니다. 따라서 계산식의 결과로 전달되는 값을 읽어 오는 것을 더 쉽게 만들어줍니다. 60초는 1분이므로, 10 x (1분에 60초)는 10분의 지연을 제공합니다. + +1. 과제의 이전 부분에서 코드를 실행한 것과 동일한 방식으로 코드를 실행합니다. 가상 IoT 장치를 사용한다면 CounterFit 앱이 실행 중인지, 습도 및 온도 센서가 올바른 핀에 생성되었는지 확인하십시오. + + ```output + pi@raspberrypi:~/temperature-sensor $ python3 app.py + MQTT connected! + Sending telemetry {"temperature": 25} + Sending telemetry {"temperature": 25} + ``` + +> 💁 이 코드는 [code-publish-temperature/virtual-device](../code-publish-temperature/virtual-device) 폴더 또는 [code-publish-temperature/pi](../code-publish-temperature/pi) 폴더에서 찾을 수 있습니다. + +😀장치에서 원격 분석 전송으로 온도를 성공적으로 게시했습니다. From 4d30b8a03e019c8715952eb8b83af272572bdfb5 Mon Sep 17 00:00:00 2001 From: Hyejin Kim <62338783+WZNT-KimHyeJin@users.noreply.github.com> Date: Tue, 6 Dec 2022 05:23:20 +0900 Subject: [PATCH 2/4] [ko] Korean Translation for README.md (#434) * Translate - 1-4connect-internet * Translate - 1-4 connect-internet * translate lesson 1-4 * word refactoring * word refactoring * modified link * Korean translation * Korean translation * korean translation * modified sentence * korean translation * korean translation - pedagogy, hardware * Create README.ko.md * Update README.ko.md * Update README.md * Delete README.ko.md * Delete README.ko.md * Delete pi-speech-to-text.ko.md * Delete assignment.ko.md * Update README.ko.md Co-authored-by: eomhojeong Co-authored-by: Jim Bennett Co-authored-by: jhYun505 --- README.md | 1 + translations/README.ko.md | 146 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 translations/README.ko.md diff --git a/README.md b/README.md index f1ca7bba..ac024105 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ [![Chinese](https://img.shields.io/badge/-Chinese-yellow)](translations/README.zh-cn.md) [![Turkish](https://img.shields.io/badge/-Turkish-darkgreen)](translations/README.tr.md) [![French](https://img.shields.io/badge/-French-purple)](translations/README.fr.md) +[![Korean](https://img.shields.io/badge/-Korean-white)](translations/README.ko.md) [![Japanese](https://img.shields.io/badge/-Japanese-red)](translations/README.ja.md) # IoT for Beginners - A Curriculum diff --git a/translations/README.ko.md b/translations/README.ko.md new file mode 100644 index 00000000..87c77e55 --- /dev/null +++ b/translations/README.ko.md @@ -0,0 +1,146 @@ +[![GitHub license](https://img.shields.io/github/license/microsoft/IoT-For-Beginners.svg)](https://github.com/microsoft/IoT-For-Beginners/blob/master/LICENSE) +[![GitHub contributors](https://img.shields.io/github/contributors/microsoft/IoT-For-Beginners.svg)](https://GitHub.com/microsoft/IoT-For-Beginners/graphs/contributors/) +[![GitHub issues](https://img.shields.io/github/issues/microsoft/IoT-For-Beginners.svg)](https://GitHub.com/microsoft/IoT-For-Beginners/issues/) +[![GitHub pull-requests](https://img.shields.io/github/issues-pr/microsoft/IoT-For-Beginners.svg)](https://GitHub.com/microsoft/IoT-For-Beginners/pulls/) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) + +[![GitHub watchers](https://img.shields.io/github/watchers/microsoft/IoT-For-Beginners.svg?style=social&label=Watch)](https://GitHub.com/microsoft/IoT-For-Beginners/watchers/) +[![GitHub forks](https://img.shields.io/github/forks/microsoft/IoT-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/IoT-For-Beginners/network/) +[![GitHub stars](https://img.shields.io/github/stars/microsoft/IoT-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/IoT-For-Beginners/stargazers/) + +[![Bengali](https://img.shields.io/badge/-Bengali-blue)](translations/README.bn.md) +[![Chinese](https://img.shields.io/badge/-Chinese-yellow)](translations/README.zh-cn.md) +[![Turkish](https://img.shields.io/badge/-Turkish-darkgreen)](translations/README.tr.md) +[![French](https://img.shields.io/badge/-French-purple)](translations/README.fr.md) +[![English](https://img.shields.io/badge/-English-white)](translations/README.md) +[![Japanese](https://img.shields.io/badge/-Japanese-red)](translations/README.ja.md) + +# IoT for Beginners - 커리큘럼 + +마이크로소프트의 Azure 클라우드 담당자들이 IoT 기본에 대한 12주 24시간 교육 과정을 제공하게 되어 기쁩니다. 각 수업에는 수업 전/후 퀴즈, 수업 완료를 위한 강의, 해결책, 과제 등이 포함됩니다. NAT의 프로젝트 기반 교육학을 통해 새로운 기술을 구축하는 동안 `익힐 수 있는` 검증된 방법을 학습할 수 있습니다. + +그 프로젝트들은 농부의 농장에서 사용자의 식탁으로 까지의 음식의 여정을 다룹니다. 여기에는 농업, 물류, 제조, 소매 및 소비자 등 모든 IoT 장치에서 인기 있는 산업 분야가 포함됩니다. + +![A road map for the course showing 24 lessons covering intro, farming, transport, processing, retail and cooking](../sketchnotes/Roadmap.jpg) + +> [Nitya Narasimhan](https://github.com/nitya)의 스케치 노트입니다. 클릭하여 사진을 크게 보세요 + +**저자 [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett)와 스케치노트를 그려 준 [Nitya Narasimhan](https://github.com/nitya)에게 감사를 보냅니다.** + +**이 커리큘럼을 검토하고 번역해 주신 [Microsoft Learn Student Ambassadors](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn) 팀에게도 감사드립니다. - [Aditya Garg](https://github.com/AdityaGarg00), [Anurag Sharma](https://github.com/Anurag-0-1-A), [Arpita Das](https://github.com/Arpiiitaaa), [Aryan Jain](https://www.linkedin.com/in/aryan-jain-47a4a1145/), [Bhavesh Suneja](https://github.com/EliteWarrior315), [Faith Hunja](https://faithhunja.github.io/), [Lateefah Bello](https://www.linkedin.com/in/lateefah-bello/), [Manvi Jha](https://github.com/Severus-Matthew), [Mireille Tan](https://www.linkedin.com/in/mireille-tan-a4834819a/), [Mohammad Iftekher (Iftu) Ebne Jalal](https://github.com/Iftu119), [Mohammad Zulfikar](https://github.com/mohzulfikar), [Priyanshu Srivastav](https://www.linkedin.com/in/priyanshu-srivastav-b067241ba), [Thanmai Gowducheruvu](https://github.com/innovation-platform), [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).** + +팀을 만나보세요! + + +[![Promo video](./images/IOT.gif)](https://youtu.be/-wippUJRi5k) + +**Gif by** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) + +> 🎥 프로젝트에 대한 비디오를 보려면 위의 이미지를 클릭하세요! + +> **선생님**, 본 교육과정의 사용법에 대해 [안내](../for-teachers.md) 드립니다. 귀하께서 직접 강의를 만들고 싶다면 [lesson template](../lesson-template/README.md)에 그에 대한 안내를 드립니다. + +> [**학생분들**](https://aka.ms/student-page)은 본 교육과정을 스스로 사용하기 위해 레포 전체를 분기하여 미리 준비된 퀴즈부터 시작하여 강의를 읽고 나머지 활동을 완료합니다. 솔루션 코드를 복사하는 대신 해당 과정을 이해하여 프로젝트를 만드십시오. 그러나 해당 코드는 각 프로젝트 지향 과정의 /solutions 폴더에서 사용할 수 있습니다. 또 다른 아이디어는 친구들과 스터디 그룹을 구성해서 그 내용을 함께 검토하는 것입니다. 자세한 내용은[Microsoft Learn](https://docs.microsoft.com/users/jimbobbennett/collections/ke2ehd351jopwr?WT.mc_id=academic-17441-jabenn)에서 확인할 수 있습니다. + +본 코스의 영상 개요는 다음 비디오를 참고하십시오. + +[![Promo video](https://img.youtube.com/vi/bccEMm8gRuc/0.jpg)](https://youtube.com/watch?v=bccEMm8gRuc "Promo video") + +> 🎥 프로젝트에 대한 비디오를 보려면 위의 이미지를 클릭하십시오! + + +## 교육학 + +우리는 이 커리큘럼을 구축하면서 두 가지 교육학적 원칙을 선택했습니다. 첫 번째는 프로젝트를 기반으로 한다는 것이고 두 번째는 자주 퀴즈를 포함하도록 하는 것입니다. 이 시리즈가 끝나면 학생들은 식물 모니터링 및 관수 시스템, 차량 추적, 음식을 추적하고 확인하는 스마트 공장 설정, 음성으로 제어되는 요리 타이머를 구축하게 됩니다. 또한 장치 코드를 작성하고, 클라우드에 연결하고, 원격 측정을 분석하고, AI를 edge에서 실행하는 방법을 포함해 사물 인터넷의 기초에 대해 배우게 됩니다. + +내용과 프로젝트가 일치하도록 보장함으로써, 이 과정이 학생들에게 더 매력적으로 다가가며 개념을 더 잘 유지할 수 있을 것입니다. + +또한 수업 전에 부담이 적은 퀴즈를 통해 학생이 주제를 학습하려는 의도를 설정하고 수업 후 두 번째 퀴즈를 통해 기억에 더 남도록 할 수 있습니다. 이 커리큘럼은 유연하고 재미있게 설계되었으며 전체 또는 부분적으로 수강할 수 있습니다. 프로젝트는 소규모로 시작하여 12주 주기가 끝날 때까지 점점 복잡해집니다. + +각각의 프로젝트는 학생과 취미로 하는 사람들이 사용할 수 있는 실제 하드웨어롤 기반으로 합니다. 각 프로젝트는 특정 프로젝트 영역을 조사하여 관련된 배경 지식을 제공합니다. 성공적인 개발자가 되기 위해서는 해결해야 하는 문제의 도메인을 이해하는 것이 도움이 됩니다. 이러한 배경 지식을 제공하면 학생들이 IoT 개발자로서 해결하도록 요청받을 수 있는 실제 문제의 맥락에서 IoT 솔루션과 학습에 대해 생각할 수 있습니다. 학생들은 자신들이 구축하고 있는 솔루션의 '이유'에 대해 배우고 최종 사용자를 이해합니다. + +## 하드웨어 + +개인 선호도, 프로그래밍 언어 지식 또는 선호도, 학습 목표 및 가용성에 따라 프로젝트에 사용할 두 가지 IoT 하드웨어 중에서 선택할 수 있습니다. 또한 하드웨어에 액세스할 수 없거나 구매하기 전에 자세히 알아보고 싶은 사용자를 위해 '가상 하드웨어' 버전을 제공했습니다. Seeed Studio에서 전체 키트를 구입할 수 있는 링크를 포함하여 [하드웨어 페이지](../hardware.md)에서 자세한 내용을 읽고 '쇼핑 목록'을 찾을 수 있습니다. + +> 💁 우리의 [행동 강령](../CODE_OF_CONDUCT.md), [컨트리뷰팅](../CONTRIBUTING.md), and [번역](../TRANSLATIONS.md) 가이드 라인을 찾아보세요. 건설적인 피드백은 언제나 환영입니다! + +## 각각의 레슨은 다음을 포함합니다: + +- 스케치 노트 +- 선택적인 보충 영상 +- 강의 전 워밍업 퀴즈 +- 필기 수업 +- 프로젝트 기반 강의의 경우 프로젝트 빌드 방법에 대한 단계별 가이드 +- 지식 확인 +- 도전 +- 보충 읽을거리 +- 과제 +- 강의 후 퀴즈 + +> **퀴즈에 대한 참고 사항**: 모든 퀴즈는 [이 앱](https://black-meadow-040d15503.1.azurestaticapps.net)에 포함되어 있으며 각 3개의 질문으로 구성된 총 48개의 퀴즈가 있습니다. 수업 내에서 연결되지만 퀴즈 앱은 로컬에서 실행할 수 있습니다. `quiz-app` 폴더의 지침을 따르세요. 점차 지역화하고 있습니다. + +## 레슨 + +| | 프로젝트 이름 | 배운 개념 | 학습 목표 | 연결된 수업 | +| :-: | :----------------------------------------------------------: | :------------------------------------------: | ----------------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------: | +| 01 | [시작하기](./1-getting-started/translations/README.ko.md) | IoT에 대한 소개 | IoT의 기본 원리와 센서 및 클라우드 서비스와 같은 IoT의 구성 요소에 대해 배우고 첫 번째 IoT 장치를 설정합니다. | [IoT에 대한 소개](./1-getting-started/lessons/1-introduction-to-iot/translations/README.ko.md) | +| 02 | [시작하기](./1-getting-started/README.ko.md) | IoT에 대한 심층 분석 | IoT 시스템의 구성 요소와 마이크로컨트롤러 및 Single-board 컴퓨터에 대해 자세히 배웁니다. | [IoT에 대한 심층 분석](./1-getting-started/lessons/2-deeper-dive/translations/README.ko.md) | +| 03 | [시작하기](./1-getting-started/translations/README.ko.md) | 센서 및 액추에이터로 물리적 세계와 상호 작용 | 야간 조명을 만드는 동안 물리적 세계에서 데이터를 수집하는 센서와 피드백을 보내는 액추에이터에 대해 배웁니다. | [센서 및 액추에이터로 물리적 세계와 상호 작용](./1-getting-started/lessons/3-sensors-and-actuators/translations/README.ko.md) | +| 04 | [시작하기](./1-getting-started/translations/README.ko.md) | 장치를 인터넷에 연결하기 | 야간 조명을 MQTT 브로커에 연결하여 IoT 장치를 인터넷에 연결하여 메시지를 보내고 받는 방법에 대해 배웁니다. | [장치를 인터넷에 연결하기](./1-getting-started/lessons/4-connect-internet/translations/README.ko.md) | +| 05 | [농장](./2-farm/translations/README.ko.md) | 식물 성장 예측 | IoT 장치에서 캡처한 온도 데이터를 사용하여 식물 성장을 예측하는 방법을 배웁니다. | [식물 성장 예측](./2-farm/lessons/1-predict-plant-growth/translations/README.ko.md) | +| 06 | [농장](./2-farm/translations/README.ko.md) | 토양 수분 측정 | 토양 수분을 측정하고 토양 수분 센서를 보정하는 방법을 배웁니다. | [토양 수분 측정](./2-farm/lessons/2-detect-soil-moisture/translations/README.ko.md) | +| 07 | [농장](./2-farm/translations/README.ko.md) | 자동화된 식물 급수 | 릴레이 및 MQTT를 사용하여 자동화 및 시간 급수 방법에 대해 배웁니다. | [자동화된 식물 급수](./2-farm/lessons/3-automated-plant-watering/translations/README.ko.md) | +| 08 | [농장](./2-farm/translations/README.ko.md) | 식물을 클라우드로 이동하기 | 클라우드 및 클라우드 호스팅 IoT 서비스에 대해 알아보고 식물을 공용 MQTT 브로커 대신 서비스 중 하나에 연결하는 방법에 대해 배웁니다. | [식물을 클라우드로 이동하기](./2-farm/lessons/4-migrate-your-plant-to-the-cloud/translations/README.ko.md) | +| 09 | [농장](./2-farm/translations/README.ko.md) | 어플리케이션 로직을 클라우드로 이동하기 | IoT 메시지에 응답하는 클라우드에서 애플리케이션 로직을 작성하는 방법에 대해 배웁니다. | [어플리케이션 로직을 클라우드로 이동하기](./2-farm/lessons/5-migrate-application-to-the-cloud/translations/README.ko.md) | +| 10 | [농장](./2-farm/translations/README.ko.md) | 식물은 안전하게 유지하기 | IoT를 통한 보안과 키 및 인증서로 식물 보안을 유지하는 방법에 대해 배웁니다. | [식물을 안전하게 유지하기](./2-farm/lessons/6-keep-your-plant-secure/translations/README.ko.md) | +| 11 | [수송](./3-transport/README.md) | 위치 추적 | IoT 장치의 GPS 위치 추적에 대해 배웁니다. | [위치 추적](./3-transport/lessons/1-location-tracking/translations/README.ko.md) | +| 12 | [수송](./3-transport/translations/README.ko.md) | 위치 데이터 저장 | 나중에 시각화하거나 분석할 IoT 데이터를 저장하는 방법을 배웁니다. | [위치 데이터 저장](./3-transport/lessons/2-store-location-data/translations/README.ko.md) | +| 13 | [Transport](./3-transport/translations/README.ko.md) | 위치 데이터 시각화 | 지도에서 위치 데이터를 시각화하는 방법과 지도가 실제 3D 세계를 2차원으로 표현하는 방법에 대해 배웁니다. | [위치 데이터 시각화](./3-transport/lessons/3-visualize-location-data/translations/README.ko.md) | +| 14 | [수송](./3-transport/translations/README.ko.md) | 지오펜스 | 지오펜스에 대해 알아보고 공급망의 차량이 목적지에 가까워졌을 때 경고하는 데 어떻게 사용할 수 있는지 알아봅니다. | [지오펜스](./3-transport/lessons/4-geofences/translations/README.ko.md) | +| 15 | [조작](./4-manufacturing/translations/README.ko.md) | 과일 품질 감지 훈련 | 과일 품질을 감지하기 위해 클라우드에서 이미지 분류기를 교육하는 방법을 배웁니다. | [과일 품질 감지 훈련](./4-manufacturing/lessons/1-train-fruit-detector/translations/README.ko.md) | +| 16 | [조작](./4-manufacturing/translations/README.ko.md) | IoT 장치에서 과일 품질 확인 | IoT 장치에서 과일 품질 감지기를 사용하는 방법을 배웁니다. device | [IoT 장치에서 과일 품질 확인](./4-manufacturing/lessons/2-check-fruit-from-device/translations/README.ko.md) | +| 17 | [조작](./4-manufacturing/translations/README.ko.md) | edge에서 과일 탐지기 실행하기 | edge의 IoT 기기에서 과일 탐지기를 실행하는 방법을 배웁니다. | [edge에서 과일 탐지기 실행하기](./4-manufacturing/lessons/3-run-fruit-detector-edge/translations/README.ko.md) | +| 18 | [Manufacturing](./4-manufacturing/translations/README.ko.md) | 센서에서 과일 품질 감지 작동하기 | 센서에서 과일 품질 감지 작동하는 방법을 배웁니다. | [센서에서 과일 품질 감지 작동하기](./4-manufacturing/lessons/4-trigger-fruit-detector/translations/README.ko.md) | +| 19 | [소매](./5-retail/translations/README.ko.md) | 재고 감지기 훈련 | 물체 감지를 사용하여 상점의 재고를 계산하도록 재고 감지기를 훈련시키는 방법을 배웁니다. | [재고 감지기 훈련](./5-retail/lessons/1-train-stock-detector/translations/README.ko.md) | +| 20 | [소매](./5-retail/translations/README.ko.md) | IoT 장치에서 재고 확인하기 | 객체 감지 모델을 사용하여 IoT 장치에서 재고를 확인하는 방법을 배웁니다. | [IoT 장치에서 재고 확인하기](./5-retail/lessons/2-check-stock-device/translations/README.ko.md) | +| 21 | [소비자](./6-consumer/translations/README.ko.md) | IoT 장치로 음성 인식 | 스마트 타이머를 구축하기 위해 IoT 장치에서 음성을 인식하는 방법을 배웁니다. | [IoT 장치로 음성 인식](./6-consumer/lessons/1-speech-recognition/translations/README.ko.md) | +| 22 | [소비자](./6-consumer/translations/README.ko.md) | 언어 이해 | IoT 장치에 말한 문장을 이해하는 방법을 배웁니다. | [언어 이해](./6-consumer/lessons/2-language-understanding/translations/README.ko.md) | +| 23 | [소비자](./6-consumer/translations/README.ko.md) | 타이머 설정 및 음성 피드백 제공 | IoT 장치에서 타이머를 설정하고 타이머가 설정되고 종료될 때 음성 피드백을 제공하는 방법을 배웁니다. | [타이머 설정 및 음성 피드백 제공](./6-consumer/lessons/3-spoken-feedback/translations/README.ko.md) | +| 24 | [소비자](./6-consumer/translations/README.ko.md) | 여러 언어 지원 | 음성 및 스마트 타이머의 응답에서 여러 언어를 지원하는 방법을 배웁니다. | [여러 언어 지원](./6-consumer/lessons/4-multiple-language-support/translations/README.ko.md) | + +## Offline access + +[Docsify](https://docsify.js.org/#/)를 사용하여 이 문서를 오프라인으로 실행할 수 있습니다. 로컬 시스템에서 [install Docsify](https://docsify.js.org/#/quickstart) 레포를 포크하고, 이 레포의 루트 폴더에 `docsify serve`를 입력합니다. 이 웹 사이트는 로컬 호스트인 `localhost:3000`에서 제공됩니다. + +### PDF + +필요한 경우 오프라인 액세스를 위해 이 컨텐츠의 PDF를 생성할 수 있습니다. 이 작업을 위해서 [npm installed](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)이 수행되어 있는지 확인하고 이 레포지토리의 루트 폴더에서 아래 명령을 실행하십시오: + + +```sh +npm i +npm run convert +``` + +### Slides + +[slides](../slides)폴더에는 일부 레슨을 위한 슬라이드 데크가 있습니다. + +## 도움이 필요하신가요? + +번역에 기여하고 싶으시다면 [번역 지침](../TRANSLATIONS.md)를 읽고 [번역 issue 중 하나](https://github.com/microsoft/IoT-For-Beginners/issues?q=is%3Aissue+is%3Aopen+label%3Atranslation)에 추가하십시오. 만약 당신이 새로운 언어로 번역하고 싶다면, tracking을 위해 새로운 이슈를 제기해주세요. + +## 기타 커리큘럼 + +우리 팀은 다른 커리큘럼을 생산합니다! 확인 해 보세요: + +- [초보자를 위한 웹 개발](https://aka.ms/webdev-beginners) +- [초보자용 ML](https://aka.ms/ml-beginners) +- [초보자용 데이터 과학](https://aka.ms/datascience-beginners) +- [초보자용 AI](https://aka.ms/ai-beginners) + +## 이미지 속성 + +본 교육과정에 사용된 이미지의 모든 속성은 [Attributions](./attributions.md)에서 확인할 수 있습니다. + From 51606946cfc2c7f1ffa029c50677f4210af71545 Mon Sep 17 00:00:00 2001 From: Jim Bennett Date: Mon, 5 Dec 2022 12:24:16 -0800 Subject: [PATCH 3/4] Update README.ko.md --- translations/README.ko.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/translations/README.ko.md b/translations/README.ko.md index 87c77e55..16f94176 100644 --- a/translations/README.ko.md +++ b/translations/README.ko.md @@ -8,12 +8,12 @@ [![GitHub forks](https://img.shields.io/github/forks/microsoft/IoT-For-Beginners.svg?style=social&label=Fork)](https://GitHub.com/microsoft/IoT-For-Beginners/network/) [![GitHub stars](https://img.shields.io/github/stars/microsoft/IoT-For-Beginners.svg?style=social&label=Star)](https://GitHub.com/microsoft/IoT-For-Beginners/stargazers/) -[![Bengali](https://img.shields.io/badge/-Bengali-blue)](translations/README.bn.md) -[![Chinese](https://img.shields.io/badge/-Chinese-yellow)](translations/README.zh-cn.md) -[![Turkish](https://img.shields.io/badge/-Turkish-darkgreen)](translations/README.tr.md) -[![French](https://img.shields.io/badge/-French-purple)](translations/README.fr.md) -[![English](https://img.shields.io/badge/-English-white)](translations/README.md) -[![Japanese](https://img.shields.io/badge/-Japanese-red)](translations/README.ja.md) +[![Bengali](https://img.shields.io/badge/-Bengali-blue)](README.bn.md) +[![Chinese](https://img.shields.io/badge/-Chinese-yellow)](README.zh-cn.md) +[![Turkish](https://img.shields.io/badge/-Turkish-darkgreen)](README.tr.md) +[![French](https://img.shields.io/badge/-French-purple)](README.fr.md) +[![English](https://img.shields.io/badge/-English-white)](../README.md) +[![Japanese](https://img.shields.io/badge/-Japanese-red)](README.ja.md) # IoT for Beginners - 커리큘럼 From b730ba88a5872e920de5d48cbf179d48732fc870 Mon Sep 17 00:00:00 2001 From: Hyejin Kim <62338783+WZNT-KimHyeJin@users.noreply.github.com> Date: Tue, 6 Dec 2022 05:35:11 +0900 Subject: [PATCH 4/4] [ko] Korean Translation for 3-transport lesson 4 (#432) * Translate - 1-4connect-internet * Translate - 1-4 connect-internet * translate lesson 1-4 * word refactoring * word refactoring * modified link * Korean translation * Korean translation * translation korean * Update README.ko.md translated Test points against a geofence _ HJ * Update README.ko.md * Update README.ko.md * Update README.ko.md * Update README.ko.md * Update README.ko.md * Delete README.ko.md * Delete assignment.ko.md * Delete single-board-computer-commands.ko.md * Delete README.ko.md * Delete assignment.ko.md * Delete pi-speech-to-text.ko.md * Update README.ko.md * Update README.ko.md Co-authored-by: eomhojeong Co-authored-by: Jim Bennett --- .../4-geofences/translations/README.ko.md | 461 ++++++++++++++++++ 1 file changed, 461 insertions(+) create mode 100644 3-transport/lessons/4-geofences/translations/README.ko.md diff --git a/3-transport/lessons/4-geofences/translations/README.ko.md b/3-transport/lessons/4-geofences/translations/README.ko.md new file mode 100644 index 00000000..a926eb42 --- /dev/null +++ b/3-transport/lessons/4-geofences/translations/README.ko.md @@ -0,0 +1,461 @@ +# Geofences + +![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-14.jpg) + +> [Nitya Narasimhan](https://github.com/nitya)의 스케치 노트입니다. 사진을 클릭하여 크게 보세요 + +이 비디오는 Geofence에 대한 개요와 Azure Maps에서 Geofence를 사용하는 방법을 제공하며, 이 레슨에서 다룰 주제는 아래와 같습니다. + +[![Geofencing with Azure Maps from the Microsoft Developer IoT show](https://img.youtube.com/vi/nsrgYhaYNVY/0.jpg)](https://www.youtube.com/watch?v=nsrgYhaYNVY) + +> 🎥 영상을 시청하려면 이미지를 클릭하세요 + +## 강의 전 퀴즈 + +[강의 전 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/27) + +## 개요 + +지난 3번의 수업에서, 여러분은 농장에서 물류 허브로 농산물을 운반하는 트럭을 찾기 위해 IoT를 사용했습니다. GPS의 데이터를 캡처하여 저장할 클라우드로 전송하고, 시각화하여 지도에 표현하였습니다. 공급망의 효율성을 높이기 위한 다음 단계는 트럭이 물류 허브에 도착하려고 할 때 알림을 받는 것 입니다. 사전 알람을 통해 직원들은 차량이 도착하자 마자 지게차 등의 장비들을 가지고 짐을 내릴 준비를 할 수 있습니다. 이렇게 하면 직원들은 기다림 없이 빠르게 짐을 내릴 수 있고, 여러분은 기다리는 트럭 운전사 혹은 다른 직원들에게 돈을 지불하지 않아도 됩니다. + +이번 강의에서는 Geofence 정의 지리 공간 영역에 대하여 배웁니다(예: 물류 허브 2Km 이내 주행구역). 그리고 GPS 좌표가 Geofence 내부 또는 외부에 있는지 테스트하여 GPS센서가 해당 범위 내에 도착했는지 여부를 확인하고자 합니다. + + +이번 강의에서는 다음을 다룹니다 : + +- [지오펜스(Geofence)란](#지오펜스(Geofence)란) +- [지오펜스(Geofence) 정의](#지오펜스(Geofence)-정의) +- [Geofence에 대한 테스트 포인트](#Geofence에-대한-테스트-포인트) +- [서버리스 코드의 Geofence 사용](#서버리스-코드의-Geofence-사용) + +> 🗑 이 강의가 3강의 마지막 강의이므로 이 강의와 과제를 마친 후에는 클라우드 서비스를 정리하는 것을 잊지 마세요. 할당을 완료하려면 클라우드 서비스가 필요하기에 강의 이전에 클라우드 서비스 작업을 완료 해 주세요. +> +> 필요한 경우 [프로젝트 가이드 정리](../../../../clean-up.md) 를 참고하세요 + +## 지오펜스(Geofence)란 + +지오펜스는 실제 지리적 가상 경계입니다. 지오펜스는 점과 반경으로 정의된 원(예를 들어 건물 주변 100m 너비의 원) 또는 스쿨 존, 도시 경계, 대학 또는 사무실 캠퍼스와 같은 영역을 덮는 다각형으로 정의될 수 있습니다 + +![Some geofence examples showing a circular geofence around the Microsoft company store, and a polygon geofence around the Microsoft west campus](../../../../images/geofence-examples.png) + +> 💁 여러분은 이미 모르는 사이에 지오펜스를 사용했을 수도 있습니다. iOS 알림 앱 또는 위치 기반 Google Keep을 사용하여 알림을 설정한 경우 지오펜스를 사용한 것입니다. 이 앱들은 주어진 위치를 기반으로 지오펜스를 설정하고 당신의 휴대전화가 지오펜스에 들어가면 당신에게 알려줍니다. + +차량이 지오펜스 범위 내에 있는지 확인하려는 이유는 다음과 같습니다. : +- 하역 준비 - 차량이 현장에 도착했다는 알림을 받으면 직원이 차량에서 물품을 내릴 준비를 할 수 있어 차량 대기 시간을 줄일 수 있습니다. 이를 통해 운전자가 더 적은 대기 시간으로 하루에 더 많은 배달을 할 수 있도록 합니다. +- 세금 준수 - 뉴질랜드와 같은 일부 국가에서는 공공 도로에서만 주행할 때 차량 중량을 기준으로 디젤 차량에 대해 도로세를 부과합니다. 지오펜스를 사용하면 농장이나 벌목장과 같은 부지의 개인 도로와 달리 공공 도로에서 주행하는 주행 거리를 추적할 수 있습니다. +- 도난 모니터링 - 차량이 농장과 같은 특정 지역에만 머물러야 하고 지오펜스를 벗어나면 도난의 가능성이 있습니다. +- 위치 준수 - 작업 현장, 농장 또는 공장의 일부는 특정 차량에 출입이 금지될 수 있습니다. 예를 들어, 인공 비료 및 살충제를 운반하는 차량이 유기농 농산물을 재배하는 밭에서 멀리 떨어져 있도록 하는 것입니다. 지오펜스를 입력하면 차량이 규정을 준수하지 않는 상태일 경우 운전자에게 이 사실을 알릴 수 있습니다. + +✅ 지오펜스의 다른 용도를 생각할 수 있나요? + +지난 강의에서 GPS 데이터를 시각화하기 위해 사용한 Azure Maps를 사용하면 지오펜스를 정의한 후에 해당 사물의 위치를 나타내는 점이 지오펜스 내부에 있는지 또는 외부에 있는지 테스트할 수 있습니다. + +## 지오펜스(Geofence) 정의 + +지오펜스는 이전 학습에서 지도에 추가한 지점과 동일하게 GeoJSON을 사용하여 정의됩니다. 이 경우, `FeatureCollection` 의 `Point` 값 대신, `FeatureCollection` 이 `Polygon`을 포함하게 됩니다. + +```json +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [-122.13393688201903, 47.63829579223815], + [-122.13389128446579, 47.63782047131512], + [-122.13240802288054, 47.63783312249837], + [-122.13238388299942, 47.63829037035086], + [-122.13393688201903, 47.63829579223815] + ] + ] + }, + "properties": { + "geometryId": "1" + } + } + ] +} +``` + +다각형의 각 점은 경도, 위도의 배열 쌍으로 정의되며, 이러한 점들은 `coordinates` 로 설정된 배열에 있습니다. 지난 수업의 `Point`에서, `coordinates`는 위도와 경도 2 개의 값을 포함하는 배열이었습니다. `Polygon`은 위도와 경도 배열을 포함하는 배열입니다. + +> 💁 기억하세요, GeoJSON 은 좌표에 `latitude, longitude`가 아닌 `longitude, latitude` 를 사용합니다. + +다각형 좌표 배열에는 항상 다각형의 점 수보다 1개 더 많은 항목이 있으며, 마지막 항목은 첫 번째 항목과 동일한 것으로 다각형을 닫습니다. 예를 들어 직사각형의 경우 5개의 점이 있습니다. + +![A rectangle with coordinates](../../../../images/polygon-points.png) + +다각형 좌표는 왼쪽 상단의 47, -122에서 시작해 오른쪽으로 47, -121 이동한 다음, 아래로 46, -121 이동하고, 오른쪽으로 46, -122 이동한 다음 다시 시작점인 47, -122로 돌아옵니다. 이렇게 하면 다각형에 왼쪽 위, 오른쪽 위, 오른쪽 아래, 왼쪽 아래, 왼쪽 위의 5개의 점이 제공되어 다각형을 닫습니다. + +✅ 집이나 학교 주변의 GeoJSON 다각형을 만들어 보세요. [GeoJSON.io](https://geojson.io/) 같은 도구를 사용하세요. + +### 작업 - 지오펜스 정의 + +Azure Maps에서 지오펜스를 사용하려면, 먼저 Azure Maps 계정에 업로드해야 합니다.업로드하면 지오펜스에 대한 지점을 테스트할 수 있는 고유 ID를 받게 됩니다. 지오펜스를 Azure Maps에 업로드하려면, 지도 웹 API를 사용해야 합니다. [curl](https://curl.se) 이라는 도구를 사용해 Azure Maps web API를 호출할 수 있습니다. + +> 🎓 Curl 은 웹 끝점에 대한 요청을 만드는 명령어 도구입니다. + +1. Linux, macOS, 또는 최신 버전의 Windows 10 를 사용하는 경우 curl 이 이미 설치되어 있을 수 있습니다. 터미널 또는 명령어에서 다음을 실행하여 확인합니다: + + ```sh + curl --version + ``` + + curl의 버전 정보가 표시되지 않으면, [curl 다운로드 페이지](https://curl.se/download.html)에서 설치해야 합니다. + + > 💁 Postman를 사용한 경헙이 있다면, 원하는 경우 이를 대신 사용할 수 있습니다. + +2. 다각형이 포함된 GeoJSON 파일을 생성합니다. GPS 센서를 사용하여 이를 테스트할 것이므로, 현재의 위치 주변에 다각형을 만듭니다. 위에 제공된 GeoJSON 예제를 편집하여 수동으로 만들거나, [GeoJSON.io](https://geojson.io/) 같은 도구를 사용할 수 있습니다. + + GeoJSON은 `Polygon` 타입의 `geometry`의 `Feature`를 포함한 `FeatureCollection`을 가지고 있습니다. + + **반드시** `geometry` 요소와 동일한 레벨의 `properties` 요소를 추가해야 합니다. 이는 `geometryId`를 포함하고 있습니다: + + ```json + "properties": { + "geometryId": "1" + } + ``` + + [GeoJSON.io](https://geojson.io/)를 사용하는 경우, JSON 파일을 다운로드 한 후, 또는 JSON 편집기에서 비어있는 `properties` 요소에 수동으로 이 항목을 추가해야 합니다. + + 이 `geometryId` 는 이 파일에서 고유해야 합니다. You can upload multiple geofences as multiple `Features` in the `FeatureCollection` in the same GeoJSON file, as long as each one has a different `geometryId`. 다각형은 다른 파일에서 다른 시간대에 업로드 된 경우, 동일한 `geometryId`를 가질 수 있습니다. + +3. 이 파일을 `geofence.json`로 저장하고, 터미널 또는 콘솔에 저장된 위치로 이동합니다. + +4. 다음 curl 명령을 실행하여 GeoFence를 생성합니다: + + ```sh + curl --request POST 'https://atlas.microsoft.com/mapData/upload?api-version=1.0&dataFormat=geojson&subscription-key=' \ + --header 'Content-Type: application/json' \ + --include \ + --data @geofence.json + ``` + + `` 을 Azure Maps 계정의 API key를 가지고 있는 URL로 바꿉니다. + + URL은 `https://atlas.microsoft.com/mapData/upload` API를 통해 지도 데이터를 업로드하는데 사용됩니다. 호출에는 사용할 Azure Maps API를 지정하는 `api-version` 매개 변수가 포함되어 있습니다. 이는 API가 시간이 지남에 따라 변경될 수 있지만 이전 버전과의 호환성을 유지하기 위한 것입니다. 업로드되는 데이터 형식은 `geojson`로 설정됩니다. + + 이것은 API 업로드를 위한 POST 요청을 실행하고 `location`이라고 부르는 응답 헤더 목록을 반환합니다. + + ```output + content-type: application/json + location: https://us.atlas.microsoft.com/mapData/operations/1560ced6-3a80-46f2-84b2-5b1531820eab?api-version=1.0 + x-ms-azuremaps-region: West US 2 + x-content-type-options: nosniff + strict-transport-security: max-age=31536000; includeSubDomains + x-cache: CONFIG_NOCACHE + date: Sat, 22 May 2021 21:34:57 GMT + content-length: 0 + ``` + + > 🎓 웹 엔드포인트를 호출할 때, `key=value`와 같은 키 값 쌍 뒤에 `?`를 더해서 매개 변수를 전달할 수 있습니다. 키 값 쌍은 `&`로 구분됩니다. + +5. Azure Maps 은 이를 즉시 처리하지 않으므로, `location` 헤더에 제공된 URL을 사용하여 업로드 요청이 완료되었는지 확인해야 합니다. 상태를 보려면 이 위치에 GET 요청을 만드십시오. `location` URL 끝에 subscription key `&subscription-key=` 와 같이 추가하고, `` 를 Azure Maps 계정의 API 키로 변경합니다. 다음 명령을 실행합니다: + + ```sh + curl --request GET '&subscription-key=' + ``` + + `` 를 `location` 헤더 값으로 변경합니다. 그리고 `` 를 Azure Maps 계정의 API 키 값으로 변경합니다. + +6. 응답에서 `status` 값을 확인하십시오. `Succeeded`가 아닌 경우, 잠시 기다렸다가 다시 시도하십시오. + +7. 상태가 `Succeeded`로 돌아오면, 응답에서 `resourceLocation` 를 확인하십시오. 여기에는 GeoJson 객체의 고유한 ID (UDID라고 함)에 대한 세부 정보가 포함되어 있습니다. UDID 는 `metadata/` 뒤에 오는 값dmfh `api-version`을 포함하지 않습니다. 예를 들어, `resourceLocation` 이 다음과 같은 경우: + + ```json + { + "resourceLocation": "https://us.atlas.microsoft.com/mapData/metadata/7c3776eb-da87-4c52-ae83-caadf980323a?api-version=1.0" + } + ``` + + 그러면 UDID는 `7c3776eb-da87-4c52-ae83-caadf980323a` 입니다. + + 이 UDID 의 사본을 보관하십시오. 지오펜스를 테스트하는데 필요한 것입니다. + +## Geofence에 대한 테스트 포인트 + +우선 다각형이 Azure Maps에 표시되면, 여러분은 점을 테스트하여 해당 점이 Geofence 내부에 있는지 외부에 있는지 확인할 수 있습니다. 웹 API 요청을 작성하고 Geofence의 UDID를 전달하며 테스트할 지점의 위도와 경도를 API에 전송합니다. + +해당 요청 시 `searchBuffer`라는 값을 전달 할 수도 있습니다. 이는 결과를 반환할 때 얼마나 정확해야하는지를 지도 API에 알려줍니다. 이러한 이유는 GPS가 완벽하게 정확하지 않고, 때떄로 위치가 미터단위 혹은 그 이하로 달라질 수 있기 때문입니다. 검색 버퍼의 기본값은 50m이지만 0m에서 500m 사이의 값을 설정할 수 있습니다. + +API 호출 결과 중 `거리`값이 반환됩니다. 이는 Geofence 가장자리에서 가장 가까운 지점까지 양수 값으로 측정된 것으로, 점이 Geofence 밖에 있으면 양수값이고 안에 있으면 음수 값 입니다. 이 거리가 버퍼보다 작으면 실제 거리가 미터 단위로 반환됩니다. 그렇지 않으면 값이 999또는 -999로 반환됩니다. 999는 양수이므로 검색 버퍼보다 Geofence 밖에 있음을 의미하고, -999는 음수이므로 검색 버퍼보다 지오펜스 안쪽에 있음을 의미합니다. + +![A geofence with a 50m search buffer around in](../../../../images/search-buffer-and-distance.png) + +위 이미지에서 지오펜스에는 50m 검색 버퍼가 있습니다. + +- 지오펜스 중앙의 한 점, 검색 버퍼 내부의 한 점 사이의 거리는 **-999**입니다. +- 검색 버퍼를 훨씬 벗어난 지점의 거리는 **999**입니다. +- 지오펜스에서 6m 떨어진 지오펜스 내부 및 검색 버퍼 내부 지점의 거리는 **6m**입니다. +- 지오펜스에서 39m 떨어진 지오펜스 바깥쪽 및 검색 버퍼 내부 지점의 거리는 **39m**입니다. + +Geofence의 가장자리까지의 거리를 알고, 차량 위치를 기반으로 결정을 할 때 이를 GPS 판독값, 속도 및 도로 데이터와 같은 다른 정보와 결합하는 것이 중요합니다. + +예를 들어, 차량이 Geofence 옆에 있는 도로를 따라 주행하고 있다고 가정하겠습니다. 만약 Geofence 내부로 어떠한 차량의 접근이 없었음에도 불구하고 하나라도 GPS값이 부정확하거나, 옆 도로로 주행하고 있는 차량을 Geofence 내부에 있다고 배치하는 경우 해당 값은 무시될 수 있습니다. + +![A GPS trail showing a vehicle passing the Microsoft campus on the 520, with GPS readings along the road except for one on the campus, inside a geofence](../../../../images/geofence-crossing-inaccurate-gps.png) + +위 이미지에서 마이크로소프트 캠퍼스 일부에 Geofence가 있습니다. 빨간 색 선은 트럭이 520번 도로를 주행하는 모습을 보여주며, GPS 판독값을 보여주는 원이 표시됩니다. 대부분의 값들은 정확하게 520번 도로를 따라 주행하지만 Geofence 내부에 하나 정도 작은 부정확한 정보가 있습니다. 판독값이 완벽하게 정확할 수 있는 방법은 없습니다. 트럭이 520번 도로에서 캡퍼스 방향으로 돌렸다가 다시 520번 도로로 돌아갈 수 있는 도로가 없습니다. 이 Geofence를 확인하는 코드는 Geofence 테스트 결과에 대해 작업하기 전에 이전 판독값을 고려해야 합니다. + +✅ GPS 판독값이 올바른 것으로 간주될 수 있는지 확인하기 위해 어떤 추가 데이터가 필요할까요? + +### 작업 - Geofence에 대한 테스트 포인트 + +1. 웹 API 쿼리의 URL을 작성하는 것으로 시작합니다. 형식은 다음과 같습니다. + + ```output + https://atlas.microsoft.com/spatial/geofence/json?api-version=1.0&deviceId=gps-sensor&subscription-key=&udid=&lat=&lon= + ``` + + ``를 AzureMaps 계정의 API 키로 바꿉니다. + + 이전 작업의 지오펜스의 UDID로 ``를 바꿉니다. + + ``와 ``을 테스트할 위도와 경도로 바꿉니다. + + 이 URL은 `https://atlas.microsoft.com/spatial/geofence/json`API를 통해 GeoJSON을 사용하여 정의된 Geofence를 쿼리합니다. `1.0` 버전 이상의 API 버전을 대상으로 하며, `deviceId`의 매개변수는 필수이고, 위도와 경도가 나오는 장치의 이름이어야 합니다. + + 기본 검색 버퍼는 50m이며, `searchBuffer=`와 같은 추가 매개변수를 전달하여 이 값을 변경할 수 있습니다. `` 는 검색 버퍼 거리(0~500 사이값, m 단위)로 설정합니다. + +1. curl을 사용하여 다음 URL에 GET 요청을 작성합니다. + + ```sh + curl --request GET '' + ``` + + > 💁 `BadRequest` 응답 코드가 표시되면 다음과 같은 오류가 발생합니다. + > + > ```output + > Invalid GeoJSON: All feature properties should contain a geometryId, which is used for identifying the geofence. + > ``` + > + > 이렇게 하면 GeoJSON은 `geometryId`가 있는 `properties` 섹션이 누락됩니다. GeoJSON을 수정한 다음 위의 단계를 반복하여 다시 업로드하고 새 UDID를 받아야 합니다. + +1. 응답에는 Geofence를 만드는데 사용되는 GeoJSON에 정의된 각 다각형에 대하여 `geometries`목록이 포함됩니다. 각 geometry는 `distance`, `nearestLat`, `nearestLon` 와 같은 3가지 분야가 있습니다. + + ```output + { + "geometries": [ + { + "deviceId": "gps-sensor", + "udId": "7c3776eb-da87-4c52-ae83-caadf980323a", + "geometryId": "1", + "distance": 999.0, + "nearestLat": 47.645875, + "nearestLon": -122.142713 + } + ], + "expiredGeofenceGeometryId": [], + "invalidPeriodGeofenceGeometryId": [] + } + ``` + + - `nearestLat`와 `nearestLon` 는 Geofence의 가장자리에 있는 test 장소에서 가장 가까운 지점의 위도와 경도입니다. + + - `distance` is the distance from the location being tested to the closest point on the edge of the geofence. Negative numbers mean inside the geofence, positive outside. This value will be less than 50 (the default search buffer), or 999. + - `distance`는 test하는 위치에서 Geofence의 edge와 가장 가까이에 있는 지점까지의 거리입니다. 음수는 Geofence 안에 있음을 양수는 Geofence 밖에 있음을 의미합니다. 이 값으 기본 검색 버퍼 값인 50보다 작거나 999입니다. + +1. Geofence 내부 및 외부의 위치에서 위의 작업을 여러 번 반복합니다. + +## 서버리스 코드의 Geofence 사용 + +이제 기능 앱에 새 트리거를 추가하여 지오펜스에 대해 IoT 허브 GPS 이벤트 데이터를 테스트할 수 있습니다. + +### 소비자 그룹 + +이전 강의에서 배운 것처럼 IoT 허브는 수신했지만 처리되지 않은 이벤트를 재생할 수 있게 합니다. 하지만 여러 트리거가 연결되면 어떤 일이 일어날까요? 어떤 동작이 어떤 이벤트를 처리했는지 어떻게 알 수 있을까요? + +알 수 없습니다! 대신 여러 개의 개별 연결을 정의하여 이벤트를 읽을 수 있으며, 각 연결은 읽지 않은 메시지의 재생을 관리할 수 있습니다. 이들을 '소비자 그룹'이라고 합니다. end point에 연결할 때 연결할 소비자 그룹을 지정할 수 있습니다. 애플리케이션의 각 구성 요소가 다른 소비자 그룹에 연결됩니다. + +![One IoT Hub with 3 consumer groups distributing the same messages to 3 different functions apps](../../../../images/consumer-groups.png) + +이론적으로 각 소비자 그룹에 최대 5개의 애플리케이션을 연결할 수 있으며, 애플리케이션이 도착하면 모두 메시지를 수신합니다. 중복된 메시지 처리를 방지하고 대기 중인 모든 메시지를 다시 시작할 때 올바르게 처리하려면 각 소비자 그룹에 하나의 응용 프로그램만 액세스하는 것이 좋습니다. 예를 들어, Functions 앱을 로컬에서 실행하고 동시에 클라우드에서 실행하는 경우 두 앱 모두 메시지를 처리하여 스토리지 계정에 중복된 블롭이 저장됩니다. + +이전 레슨에서 만든 IoT 허브 트리거에 대한 `function.json` 파일을 검토하면 이벤트 허브 트리거 바인딩 섹션에 다음과 같은 소비자 그룹이 표시됩니다. + +```json +"consumerGroup": "$Default" +``` + +IoT 허브를 만들면 기본적으로 `$Default` 소비자 그룹이 생성됩니다. 트리거를 추가하려면 새 소비자 그룹을 사용하여 트리거를 추가할 수 있습니다. + +> 💁 이 과정에서는 다른 기능을 사용하여 GPS 데이터를 저장하는 데 사용된 지오펜스를 테스트합니다. 이것은 소비자 그룹을 사용하는 방법을 보여주고 코드를 분리하여 읽고 이해하기 쉽게 하는 것을 목적으로합니다. 프로덕션 애플리케이션에서는 한 기능에 모두 적용하거나, 스토리지 계정에 트리거를 사용하여 지오펜스를 확인하는 기능을 실행하거나, 여러 기능을 사용하여 이러한 기능을 설계할 수 있습니다. 올바른 방법은 없습니다. 나머지 애플리케이션과 필요에 따라 다릅니다. + +### 작업 - 새 소비자 그룹 만들기 + +1. 다음 명령을 실행하여 IoT 허브에 사용할 `geofence`라는 새 소비자 그룹을 만듭니다. + + ```sh + az iot hub consumer-group create --name geofence \ + --hub-name + ``` + + ``을 IoT 허브에 사용한 이름으로 바꿉니다. + +1. IoT 허브의 모든 소비자 그룹을 보려면 다음 명령을 실행하십시오. + + ```sh + az iot hub consumer-group list --output table \ + --hub-name + ``` + + ``을 IoT 허브에 사용한 이름으로 바꿉니다. 모든 소비자 그룹이 나열됩니다. + + ```output + Name ResourceGroup + -------- --------------- + $Default gps-sensor + geofence gps-sensor + ``` + +> 💁 이전 강의에서 IoT Hub 이벤트 모니터를 실행하면 `$Default` 소비자 그룹에 연결되었습니다. 이 때문에 이벤트 모니터와 이벤트 트리거를 실행할 수 없었습니다. 두 가지를 모두 실행하려면 모든 기능 앱에 대해 개별적인 소비자 그룹을 사용하고, 이벤트 모니터에 대해 `$Default`를 유지해야합니다. + +### 작업 - 새 IoT 허브 트리거 생성 + +1. 이전 강의에서 만든 `gps-trigger` 기능 앱에 새로운 IoT 허브 이벤트 트리거를 추가합니다. 이 함수를 지오펜스 트리거라고 합니다. + + > ⚠️ 필요한 경우 [project 2, lesson 5 IoT 허브 이벤트 트리거를 생성하기 위한 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#create-an-iot-hub-event-trigger)에서 참고할 수 있습니다. + +1. `function.json` 파일에서 IoT Hub 연결 문자열을 구성합니다. `local.settings.json`은 기능 앱의 모든 트리거에 공유됩니다. + +1. `function.json` 파일의 `consumerGroup` 값을 업데이트하여 새로운 `geofence` 소비자 그룹을 참조하십시오. + + ```json + "consumerGroup": "geofence" + ``` + +1. 이 트리거에서 AzureMaps 계정에 대한 구독 키를 사용해야 하므로 `local.settings.json` 파일에 `MAPS_KEY`인 파일을 추가하십시오. + +1. Functions App을 실행하여 메시지를 연결하고 처리하는지 확인합니다. 또한 이전 수업의 `iot-hub-trigger`도 실행되어 blob을 스토리지에 업로드합니다. + + > 다음 명령어를 통해 BLOB 저장소에서 GPS 판독값이 중복되지 않도록 클라우드에서 실행 중인 Functions App을 중지할 수 있습니다. : + > + > ```sh + > az functionapp stop --resource-group gps-sensor \ + > --name + > ``` + > + > ``을 Functions App에 사용한 이름으로 바꿉니다. + > + > 나중에 다음 명령을 사용하여 재시작할 수 있습니다. + > + > ```sh + > az functionapp start --resource-group gps-sensor \ + > --name + > ``` + > + > ``을 Functions App에 사용한 이름으로 바꿉니다. + +### 작업 - 트리거에서 지오펜스를 테스트합니다. + +이 강의 초반에 당신은 위치를 나타내는 점이 안에 있는지 밖에 있는지 확인하기 위한 지오펜스를 쿼리하기 위해 컬을 사용했습니다. 트리거 내부에서 유사한 웹 요청을 만들 수 있습니다. + +1. 지오펜스를 쿼리하려면 지오펜스의 UDID가 필요합니다. `local.settings.json` 파일에 `GEOFENCE_UDID` 값을 추가합니다. + +1. 새 `geofence-trigger` 트리거에서 `__init_.py` 파일을 엽니다. + +1. 파일 맨 위에 다음 가져오기를 추가합니다. + + ```python + import json + import os + import requests + ``` + + `request` 패키지를 사용하면 웹 API 호출을 할 수 있습니다. Azure Map에는 파이썬 SDK가 없으므로 파이썬 코드에서 사용하려면 웹 API 호출을 해야 합니다. + +1. `main` 메서드의 시작 부분에 다음 두 줄을 추가하여 지도 구독 키를 가져옵니다. + + ```python + maps_key = os.environ['MAPS_KEY'] + geofence_udid = os.environ['GEOFENCE_UDID'] + ``` + +1. `for events in events` 루프 안에 다음을 추가하여 각 이벤트의 위도와 경도를 얻습니다. + + ```python + event_body = json.loads(event.get_body().decode('utf-8')) + lat = event_body['gps']['lat'] + lon = event_body['gps']['lon'] + ``` + + 이 코드는 JSON을 이벤트 본문에서 사전으로 변환한 다음 `gps` 필드에서 `lat`와 `lon`을 추출합니다. + +1. `request`를 사용할 때는 컬을 사용하는 것처럼 긴 URL을 작성하는 것이 아니라 URL 부분만 사용하여 파라미터를 사전으로 전달할 수 있습니다. 다음 코드를 추가하여 호출할 URL을 정의하고 매개 변수를 구성합니다. + + ```python + url = 'https://atlas.microsoft.com/spatial/geofence/json' + + params = { + 'api-version': 1.0, + 'deviceId': 'gps-sensor', + 'subscription-key': maps_key, + 'udid' : geofence_udid, + 'lat' : lat, + 'lon' : lon + } + ``` + + `params` 사전의 항목은 컬을 통해 웹 API를 호출할 때 사용한 키 값 쌍과 일치합니다. + +1. 다음 코드 행을 추가하여 웹 API를 호출합니다. + + ```python + response = requests.get(url, params=params) + response_body = json.loads(response.text) + ``` + + 매개 변수가 있는 URL을 호출하고 응답 개체를 반환합니다. + +1. 아래에 다음 코드를 추가합니다. + + ```python + distance = response_body['geometries'][0]['distance'] + + if distance == 999: + logging.info('Point is outside geofence') + elif distance > 0: + logging.info(f'Point is just outside geofence by a distance of {distance}m') + elif distance == -999: + logging.info(f'Point is inside geofence') + else: + logging.info(f'Point is just inside geofence by a distance of {distance}m') + ``` + + 이 코드는 1개의 지오메트리를 가정하고 해당 단일 지오메트리에서 거리를 추출합니다. 그런 다음 거리를 기준으로 다양한 메시지를 기록합니다. + +1. 이 코드를 실행하십시오. GPS 좌표가 지오펜스 범위 안에 있는지, 점이 50m 이내에 있는지에 대한 여부가 로깅 출력에 표시됩니다. GPS 센서의 위치를 기반으로 다른 지오펜스를 사용하여 이 코드를 시도하고, 휴대폰에서 WiFi에 연결되거나 가상 IoT 장치에서 다른 좌표를 사용하여 센서를 움직여 보세요. + +1. 준비가 되었으면 이 코드를 클라우드의 Functions 앱에 배포하십시오. 새 응용 프로그램 설정을 배포하는 것을 잊지 마십시오. + + > ⚠️ 필요한 경우 [project 2, lesson 5 의 응용 프로그램 설정 업로드 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---upload-your-application-settings)을 참고하십시오. + + > ⚠️ 필요한 경우 [project 2, lesson 5 Functions 앱을 배포하기 위한 지침](../../../../2-farm/lessons/5-migrate-application-to-the-cloud/README.md#task---deploy-your-functions-app-to-the-cloud)을 참고하십시오. + +> 💁 [code/functions](../code/functions)폴더에서 코드를 확인할 수 있습니다. + +--- + +## 🚀 도전 + +이 과정에서는 단일 polygon이 있는 GeoJSON 파일을 사용하여 지오펜스 하나를 추가했습니다. `properties` 섹션의 `geometryId` 값이 서로 다른 경우 여러 polygon을 동시에 업로드할 수 있습니다. + +여러 polygon이 있는 GeoJSON 파일을 업로드하고 코드를 조정하여 GPS 좌표가 가장 가까운 폴리곤을 찾습니다. + +## 강의 후 퀴즈 + +[강의 후 퀴즈](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/28) + +## 복습 및 독학 + +- [Geofencing page on Wikipedia](https://en.wikipedia.org/wiki/Geo-fence)에서 지오펜스와 그 사용 사례에 대한 자세한 내용을 읽어보십시오. +- [Microsoft Azure Maps Spatial - Get Geofence documentation](https://docs.microsoft.com/rest/api/maps/spatial/getgeofence?WT.mc_id=academic-17441-jabenn)에서 Azure Maps 지오펜싱 API에 대한 자세한 내용을 참조하십시오. +- [Features and terminology in Azure Event Hubs - Event consumers documentation on Microsoft docs](https://docs.microsoft.com/azure/event-hubs/event-hubs-features?WT.mc_id=academic-17441-jabenn#event-consumers)에서 소비자 그룹에 대한 자세한 내용을 참조하십시오. + +## 과제 + +[Twilio를 사용하여 알림 보내기](../assignment.md)