From c3d044a579a0d43afda7e9d746a701005db472c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ali=20Hakim=20Ta=C5=9Fk=C4=B1ran?= <52009742+alihakimtaskiran@users.noreply.github.com> Date: Sat, 9 Oct 2021 21:42:15 +0300 Subject: [PATCH 01/36] Correction of spelling mistake.[TR translation] (#321) * Update README.tr.md * Update README.tr.md --- translations/README.tr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/README.tr.md b/translations/README.tr.md index ee25bbfd..54bef696 100644 --- a/translations/README.tr.md +++ b/translations/README.tr.md @@ -121,7 +121,7 @@ Bir çeviriyle katkıda bulunmak ister miydiniz? Lütfen [çeviri rehberimizi](. ## Diğer Dersler -Takımımız başka derler de yapıyor: +Takımımız başka dersler de yapıyor: - [Yeni başlayanlar için web geliştiriciliği](https://aka.ms/webdev-beginners) - [Yeni başlayanlar için makine öğrenimi](https://aka.ms/ml-beginners) From 69087654bfb525748417c186129790f41c634f1c Mon Sep 17 00:00:00 2001 From: Jim Bennett Date: Mon, 11 Oct 2021 12:43:50 -0700 Subject: [PATCH 02/36] Fix typos (#324) * Update README.md * Spelling fixes * Update hardware.md * Adding IoT for beginners episode * Adding intro video * Fixing formatting of read more and self study sections. * Adding instructions for installing the ReSpeaker * Adding auth to language understanding * Adding Wio terminal timer setting * Update config.h * Fixing links and images * Increasing version numbers for SD card fix * Adding SD card requirement * speech and translations * Adding more on translations * All Wio Terminal now working except playing audio * Adding more details on virtual environments. * Fixing tracking links * Update app.py * Changing casing for case sensitive OSes * Fix for #322 * Fix for #323 --- 4-manufacturing/lessons/2-check-fruit-from-device/README.md | 2 +- 4-manufacturing/lessons/3-run-fruit-detector-edge/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/README.md b/4-manufacturing/lessons/2-check-fruit-from-device/README.md index e8d5ca06..2eadee45 100644 --- a/4-manufacturing/lessons/2-check-fruit-from-device/README.md +++ b/4-manufacturing/lessons/2-check-fruit-from-device/README.md @@ -24,7 +24,7 @@ In this lesson we'll cover: ## Camera sensors -Camera sensors, as the name suggests, are cameras that you can connect to your IoT device. They can take still images, or capture streaming video. Some will return raw image data, others will compress the image data into an image file such as a JPEG or PNG. Usually the cameras that work with IoT devices are much smaller and lower resolution that what you might be used to, but you can get high resolution cameras that will rival top end phones. You can get all manner of interchangeable lenses, multiple camera setups, infra-red thermal cameras, or UV cameras. +Camera sensors, as the name suggests, are cameras that you can connect to your IoT device. They can take still images, or capture streaming video. Some will return raw image data, others will compress the image data into an image file such as a JPEG or PNG. Usually the cameras that work with IoT devices are much smaller and lower resolution than what you might be used to, but you can get high resolution cameras that will rival top end phones. You can get all manner of interchangeable lenses, multiple camera setups, infra-red thermal cameras, or UV cameras. ![The light from a scene passes through a lens and is focused on a CMOS sensor](../../../images/cmos-sensor.png) diff --git a/4-manufacturing/lessons/3-run-fruit-detector-edge/README.md b/4-manufacturing/lessons/3-run-fruit-detector-edge/README.md index 0e1ede34..f75452c3 100644 --- a/4-manufacturing/lessons/3-run-fruit-detector-edge/README.md +++ b/4-manufacturing/lessons/3-run-fruit-detector-edge/README.md @@ -71,7 +71,7 @@ There are downsides to edge computing, where the cloud may be a preferred option 1. **Scale and flexibility** - cloud computing can adjust to network and data needs in real-time by adding or reducing servers and other resources. To add more edge computers requires manually adding more devices. -1. **Reliability and resiliency** - cloud computing provides multiple servers often in multiple locations for redundancy and disaster recovery. To have the same level of redundancy on the edge requires large investments and a lor of configuration work. +1. **Reliability and resiliency** - cloud computing provides multiple servers often in multiple locations for redundancy and disaster recovery. To have the same level of redundancy on the edge requires large investments and a lot of configuration work. 1. **Maintenance** - cloud service providers provide system maintenance and updates. From ed62baba50f272baaf28d811e5102b5054e458b5 Mon Sep 17 00:00:00 2001 From: emilyf11 <89915168+emilyf11@users.noreply.github.com> Date: Tue, 12 Oct 2021 10:30:02 -0500 Subject: [PATCH 03/36] Lesson 18 that to than - in Introduction (#325) --- 4-manufacturing/lessons/4-trigger-fruit-detector/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4-manufacturing/lessons/4-trigger-fruit-detector/README.md b/4-manufacturing/lessons/4-trigger-fruit-detector/README.md index addc74db..51b0c3e8 100644 --- a/4-manufacturing/lessons/4-trigger-fruit-detector/README.md +++ b/4-manufacturing/lessons/4-trigger-fruit-detector/README.md @@ -10,7 +10,7 @@ ## Introduction -An IoT application is not just a single device capturing data and sending it to the cloud, it is more often that not multiple devices all working together to capture data from the physical world using sensors, make decisions based off that data, and interacting back with the physical world via actuators or visualizations. +An IoT application is not just a single device capturing data and sending it to the cloud, it is more often than not multiple devices all working together to capture data from the physical world using sensors, make decisions based off that data, and interacting back with the physical world via actuators or visualizations. In this lesson you will learn more about architecting complex IoT applications, incorporating multiple sensors, multiple cloud services to analyze and store data, and showing a response via an actuator. You will learn how to architect a fruit quality control system prototype, including about using proximity sensors to trigger the IoT application, and what the architecture of this prototype would be. From 7419dfdd22a8264d526152ce6797755d13c7e216 Mon Sep 17 00:00:00 2001 From: Wu-Haitao <59434361+Wu-Haitao@users.noreply.github.com> Date: Thu, 14 Oct 2021 23:39:23 +0800 Subject: [PATCH 04/36] [zh-cn Translation] Add Translation for 2-farm (#320) * Create README.zh-cn.md * Create README.zh-cn.md for 2-farm lesson 1 * Update lesson 1 README.zh-cn.md Co-authored-by: Jim Bennett --- .../translations/README.zh-cn.md | 271 ++++++++++++++++++ 2-farm/translations/README.zh-cn.md | 20 ++ 2 files changed, 291 insertions(+) create mode 100644 2-farm/lessons/1-predict-plant-growth/translations/README.zh-cn.md create mode 100644 2-farm/translations/README.zh-cn.md diff --git a/2-farm/lessons/1-predict-plant-growth/translations/README.zh-cn.md b/2-farm/lessons/1-predict-plant-growth/translations/README.zh-cn.md new file mode 100644 index 00000000..12739f20 --- /dev/null +++ b/2-farm/lessons/1-predict-plant-growth/translations/README.zh-cn.md @@ -0,0 +1,271 @@ +# 应用物联网预测植物生长 + +![这个课程概述的涂鸦笔记(sketchnote)](../../../../sketchnotes/lesson-5.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 如果你想看比较大的图片,请点击它。 + +## 课前测验 + +[课前测验](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/9) + +## 介绍 + +植物需要一些东西才能生长 - 水,二氧化碳,养分,光照,还有热。在这节课程中,你将会学习怎样通过测量空气温度来计算植物的生长和成熟率。 + +这节课程将包含: + +* [数字农业](#数字农业) +* [为什么温度在耕作中很重要?](#为什么温度在耕作中很重要?) +* [测量环境温度](#测量环境温度) +* [生长度日 (GDD)](#生长度日) +* [用温度传感器数据计算 GDD](#用温度传感器数据计算 GDD) + +## 数字农业 + +通过使用工具来收集、存储和分析耕作数据,数字农业 (Digital Agriculture) 正在改变我们的耕作方式。我们目前正处于被世界经济论坛描述为“第四次工业革命”的时期,而数字农业的崛起也被称为“第四次农业革命”,或“农业4.0”。 + +> 🎓 数字农业一词也包括整个“农业价值链”,即从农场到餐桌的整个过程。它包括在食品运输和加工过程中跟踪农产品质量,仓库和电子商务系统,甚至拖拉机租赁应用程序! + +这些改变使得农民们能够提高产量,减少肥料和农药的使用,并更有效率地浇水。尽管主要在富裕国家中使用,传感器和其它设备的价格在慢慢降低,使得它们在发展中国家也更容易被使用了。 + +数字农业所促成的技术包括: + +* 温度测量——测量温度使农民能够预测植物的生长和成熟度。 +* 自动浇水——测量土壤湿度,在土壤过于干燥时开启灌溉系统,而不是定时浇水。定时浇水可能导致作物在高温干旱时浇水不足,或在下雨时浇水过多。通过只有在土壤需要时才浇水的方式,农民可以优化水资源的使用。 +* 虫害控制——农民可以使用自动机器人或无人机上的摄像头来检查虫害,然后只在需要的地方施用农药。这样不仅能减少农药的使用量,也能减少流入当地水源中的农药量。 + +✅ 做些研究。还有哪些技术是用来提高农业产量的? + +> 🎓 “精准农业”一词被用来定义在某块田地,甚至在某块田地的部分区域的尺度上,对作物进行的观察、测量和反应。这包括测量水、养分和虫害程度,并作出准确的反应,例如只对一小部分田地进行浇灌。 +> + +## 为什么温度在耕作中很重要? + +在学习植物时,大多数学生都了解了水、光、二氧化碳 (CO2) 和养分的必要性。其实植物的生长也需要温暖——这就是为什么植物在春天随着温度的升高而开花,为什么雪钟花或水仙花会因为短暂的暖流而提前发芽,以及为什么暖房和温室能里的植物生长得很好。 + +> 🎓 暖房和温室挺类似的,但它们有一个重要区别。暖房是人工加热的,农民能够更准确地控制温度,而温室依靠太阳取暖,通常唯一的控制是利用窗户或其他开口来让热量散发出去。 + +植物有基础温度或者说最低温度、最佳温度和最高温度,所有这些都基于日平均温度。 + +* 基础温度 (Base temperature) - 这是植物生长所需的最低日平均温度。 +* 最佳温度 (Optimum temperature) - 这是能够使植物获得最多生长的最佳日平均温度。 +* 最高温度 (Maximum temperature) - 这是植物可以承受的最高温度。超过这个温度,植物就会停止生长,以节省水分和保持存活。 + +> 💁 这些都是平均温度,是每日和每夜温度的平均值。植物也需要昼夜不同的温度以帮助它们更有效地进行光合作用并在夜间节省能量。 + +每种植物都有不同的基础、最佳、最高温度值。这就是为什么一些植物能够在炎热的地区茁壮成长,而另一些则更适应寒冷地区。 + +✅ 做些研究。对于那些花园、学校或当地公园里的植物,你是否可以找到其基础温度。 + +![本图展示了生长率随着温度的升高而增长,然后在温度过高时下跌的过程](../../../../images/plant-growth-temp-graph.png) + +上图显示了一个生长率与温度关系图的例子。在最低温度之前植物不会生长。随着温度升高生长率增加,并在最佳温度处达到这个峰值,然后下降。在最高温度处,生长停止。 + +该图的形状因植物种类的不同而不同。有些植物在最佳温度之后有较明显的下降,有些植物从最低温度到最佳温度的增长更加缓慢。 + +> 💁 对于农民来说,要想让作物长得更好,他们需要知道这三个温度值,并了解他们所种植的作物的图形形状。 + +如果农民能够控制温度,比如在商业暖房中,那么他们可以为其作物进行温度的优化。例如,一个种植西红柿的商业暖房可以在白天将温度设置为25°C而在晚上设置为20°C,这样能够获得最快的生长。 + +> 🍅 将温控与人工照明、肥料和 CO2 水平控制相结合能够能够实现全年的种植和收获。 + +## 测量环境温度 + +温度传感器可与物联网设备一起使用来测量环境温度。 + +### 任务 - 测量温度 + +通过以下这些相关指南,应用你的物联网设备监测温度: + +* [Arduino - Wio Terminal](../wio-terminal-temp.md) +* [单板机 - Raspberry Pi](../pi-temp.md) +* [单板机 - 虚拟设备](../virtual-device-temp.md) + +## 生长度日 + +生长度日 (Growing degree days),也称为生长度单位 (growing degree units),是根据温度衡量植物生长的一种方式。假设一株植物具有足够的水分、养分和二氧化碳,温度将会决定植物的生长率。 + +生长度日,或称 GDD,是以每日中高于植物基础温度的的平均温度(摄氏度)来计算的。每个植物需要一定数量的生长度日来生长、开花、成熟。每天的 GDD 越多,植物的生长就越快。 + +> 🇺🇸 For Americans, growing degree days can also be calculated using Fahrenheit. 5 GDDC (growing degree days in Celsius) is the equivalent of 9 GDDF (growing degree days in Fahrenheit). <= 华氏度计算 + +GDD 的完整公式有点复杂,大多是情况下使用一个简化方程就能得到一个很好的近似值: + +![GDD = T max + T min 除以 2,再减去 T base](../../../../images/gdd-calculation.png) + +* **GDD** - 生长度日的数量 +* **Tmax** - 每日最高温度,单位是摄氏度 +* **Tmin** - 每日最低温度,单位是摄氏度 +* **Tbase** - 植物的基础温度,单位是摄氏度。 + +> 💁 Tmax 高于 30°C 或者 Tmin 低于 Tbase 的情况下有所不同,但是我们暂且忽略。 + +### 例子 - 玉米 🌽 + +根据品种的不同,玉米大概需要 800 到 2,700 的 GDD 来成熟,基础温度是 10°C。 + +在高于基础温度的第一天,测量的温度值如下: + +| 测量 | 温度 °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,这样可以就能只在接近预期成熟度时进行检查。 + +通过使用物联网设备收集温度数据,农民可以在植物接近成熟时自动收到通知。这方面的典型架构是让物联网设备测量温度,然后使用类似 MQTT 的协议在互联网上发布这些遥测数据。接着服务器代码监听这些数据并将其保存在某个地方,比如数据库。这意味着之后能够对这些数据进行分析,比如在每晚计算当天的 GDD,对每种作物的 GDD 进行累计,如果植物接近成熟就发出警报。 + +![遥测数据被发送到一个服务器上然后被保存至数据库中](../../../../images/save-telemetry-database.png) + +服务器代码也可以通过添加额外的信息来增强数据。例如,物联网设备可通过一个标识符以表明它是哪个设备,而服务器代码可以使用这个标识符来查找设备的位置以及它正在监测哪些作物。还可以添加一些基本数据,如当前时间,因为一些物联网设备没有追踪时间的必要的硬件或者是需要额外的代码来通过互联网读取当前时间。 + +✅ 你觉得为什么不同地方的温度可能会不同? + +### 任务 - 发布温度信息 + +通过以下这些相关指南,应用你的物联网设备通过 MQTT 发布温度数据,以便之后的分析: + +* [Arduino - Wio Terminal](../wio-terminal-temp-publish.md) +* [单板机 - Raspberry Pi/虚拟物联网设备](../single-board-computer-temp-publish.md) + +### 任务 - 捕获并存储温度信息 + +如果物联网设备成功发布遥测数据,就可以开始编写服务器代码来订阅这些数据并将其存储起来。服务器代码将其保存到 CSV 文件中而非使用数据库来存储。CSV文件以文本形式存储数据,每个值用逗号隔开,每个记录占一行。它是一种方便的、人类可读的、受到良好支持的保存数据为文件的方式。 + +CSV 文件将有两列 - *时间 (date)*和*温度 (temperature)*。*时间*列将存储服务器收到消息时的日期和时间,*温度*列存储遥测信息。 + +1. 重复第4课的步骤,创建服务器代码以订阅遥测数据。你不需要添加代码来发布命令。 + + 具体步骤: + + * 配置并激活一个 Python 虚拟环境 + + * 安装 paho-mqtt pip 包 + + * 编写代码来监听发布在遥测主题上的 MQTT 消息 + + > ⚠️ 如果需要的话你可以参考 [课程 4 中关于创建 Python 应用来接受遥测数据的说明](../../../../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. 在文件开头,已有导入的下方,添加下列导入: + + ```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 文件,然后在末尾添加一个新行。这一行会包含当前的日期和时间(可阅读格式),紧跟着从物联网设备中接收到的温度。时间数据将以 [ISO 8601 format](https://wikipedia.org/wiki/ISO_8601) 进行保存,包含时区,但是不包含毫秒。 + +1. 以与之前相同的方式运行此代码,确保你的物联网设备正在发送数据。一个名为 `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 的计算。 + + > 💁 如果你正在使用虚拟物联网设备,选择随机复选框并设置一个范围来避免每次返回温度时都得到同样的值。 + > ![Select the random checkbox and set a range](../../../../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℃ + +1. 根据 `temperature.csv`,找到一天中的最低温度和最高温度 + +1. 使用之前给出的公式来计算 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 来结果,看来还得等一会儿呢。 + +--- + +## 🚀 挑战 + +植物的生长,除了热量以外,还需要些什么? + +对于这些(其它因素),寻找是否有可以测量它们的传感器。那么控制它们水平的执行器呢?你会如何把一个或多个物联网设备放在一起,以优化植物的生长? + +## 课后测验 + +[课后测验](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/10) + +## 复习 & 自学 + +* 在 [Digital Agriculture Wikipedia page](https://wikipedia.org/wiki/Digital_agriculture) 上阅读更多关于数字农业的知识。在 [Precision Agriculture Wikipedia page](https://wikipedia.org/wiki/Precision_agriculture) 上阅读更多关于精准农业的知识。 +* 完整的生长度日计算比这里给出的简化计算更复杂。在 [Growing Degree Day Wikipedia page](https://wikipedia.org/wiki/Growing_degree-day) 上查看更复杂的方程以及处理低温条件的方法。 +* 即使我们仍然使用相同的耕作方法,未来的食物也可能是稀缺的。在 [Hi-Tech Farms of Future video on YouTube](https://www.youtube.com/watch?v=KIEOuKD9KX8) 上了解更多高科技种植手段。 + +## 作业 + +[使用 Jupyter Notebook 进行 GDD 数据的可视化](../assignment.md) \ No newline at end of file diff --git a/2-farm/translations/README.zh-cn.md b/2-farm/translations/README.zh-cn.md new file mode 100644 index 00000000..97389d75 --- /dev/null +++ b/2-farm/translations/README.zh-cn.md @@ -0,0 +1,20 @@ +# 应用物联网至农业 + +随着人口增加,对于农业的需求也一并增加。可用的土地数量保持不变,但是气候却不断变化——这给农民们带来了更多的挑战,尤其是那20亿依赖于亲自耕种以养活自己和家庭的[自耕农](https://wikipedia.org/wiki/Subsistence_agriculture)。物联网可以帮助农民们做出更加聪明的决定,比如耕种何种作物、何时收获,并且帮助他们增产、减少劳力、检测和处理害虫。 + +在这6节课程中你将会学到怎样应用物联网去改进和自动化农业生产。 + +> 💁 这些课程将会使用一些云端资源。如果你没有完成这个项目的所有课程,请确保你[清理你的项目](../clean-up.md). + +## 主题 + +1. [应用物联网预测植物生长](lessons/1-predict-plant-growth/translations/README.zh-cn.md) +1. [检测土壤湿度](lessons/2-detect-soil-moisture/README.md) +1. [自动给植物浇水](lessons/3-automated-plant-watering/README.md) +1. [将你的植物迁移到云端](lessons/4-migrate-your-plant-to-the-cloud/README.md) +1. [将你的应用程序逻辑迁移到云端](lessons/5-migrate-application-to-the-cloud/README.md) +1. [确保你的植物安全](lessons/6-keep-your-plant-secure/README.md) + +## 作者 + +所有课程均由 [Jim Bennett](https://GitHub.com/JimBobBennett) 用 ♥️ 编写。 From a23d8e9ca76e82a577dfc4b0fb04391bd5b621e9 Mon Sep 17 00:00:00 2001 From: emilyf11 <89915168+emilyf11@users.noreply.github.com> Date: Thu, 14 Oct 2021 10:40:01 -0500 Subject: [PATCH 05/36] change my to by in "Trigger fruit quality checking from a sensor" (#326) * Lesson 18 that to than - in Introduction * change my to by Co-authored-by: Jim Bennett --- 4-manufacturing/lessons/4-trigger-fruit-detector/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4-manufacturing/lessons/4-trigger-fruit-detector/README.md b/4-manufacturing/lessons/4-trigger-fruit-detector/README.md index 51b0c3e8..c0d043ea 100644 --- a/4-manufacturing/lessons/4-trigger-fruit-detector/README.md +++ b/4-manufacturing/lessons/4-trigger-fruit-detector/README.md @@ -105,7 +105,7 @@ For the prototype, you will implement all of this on a single device. If you are ## Trigger fruit quality checking from a sensor -The IoT device needs some kind of trigger to indicate when fruit is ready to be classified. One trigger for this would be to measure when the fruit is at the right location on the conveyor belt my measuring the distance to a sensor. +The IoT device needs some kind of trigger to indicate when fruit is ready to be classified. One trigger for this would be to measure when the fruit is at the right location on the conveyor belt by measuring the distance to a sensor. ![Proximity sensors send laser beams to objects like bananas and time how long till the beam is bounced back](../../../images/proximity-sensor.png) From e23a162c226803e7568c7d54c1ad482b5aba79f6 Mon Sep 17 00:00:00 2001 From: Jim Bennett Date: Fri, 15 Oct 2021 08:19:34 -0700 Subject: [PATCH 06/36] Update TRANSLATIONS.md --- TRANSLATIONS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/TRANSLATIONS.md b/TRANSLATIONS.md index 70171e2c..3f54b22f 100644 --- a/TRANSLATIONS.md +++ b/TRANSLATIONS.md @@ -19,6 +19,10 @@ where _[language]_ is a two letter language abbreviation following the ISO 639-1 > Important: when translating text in this repo, please ensure that you do not use machine translation. We will verify translations via the community, so please only volunteer for translations in languages where you are proficient. +## Links + +When translating, please update links to the translated files. If a file hasn't been translated, keep the link to the English version. As each file is in a `translations` folder, you will also need to update the link depth for hyperlinks and images. + ## Quizzes Add your translation to the quiz-app by adding a file here: https://github.com/microsoft/IoT-For-Beginners/tree/main/quiz-app/src/assets/translations. Please don't localize the words 'true' or 'false' however. thanks! From d58b9eaff117f8c22b490e2e129349eb9c85a069 Mon Sep 17 00:00:00 2001 From: emilyf11 <89915168+emilyf11@users.noreply.github.com> Date: Mon, 18 Oct 2021 13:51:30 -0500 Subject: [PATCH 07/36] know to known (#333) * Lesson 18 that to than - in Introduction * change my to by * know as to known as Co-authored-by: Jim Bennett --- 6-consumer/lessons/4-multiple-language-support/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6-consumer/lessons/4-multiple-language-support/README.md b/6-consumer/lessons/4-multiple-language-support/README.md index bc0302b7..ee273f8a 100644 --- a/6-consumer/lessons/4-multiple-language-support/README.md +++ b/6-consumer/lessons/4-multiple-language-support/README.md @@ -42,7 +42,7 @@ Text translation has been a computer science problem that has been researched fo Text translation started out as a technology known as Machine Translation (MT), that can translate between different language pairs. MT works by substituting words in one language with another, adding techniques to select the correct ways of translating phrases or parts of sentences when a simple word-for-word translation doesn't make sense. -> 🎓 When translators support translating between one language and another, these are know as *language pairs*. Different tools support different language pairs, and these may not be complete. For example, a translator may support English to Spanish as a language pair, and Spanish to Italian as a language pair, but not English to Italian. +> 🎓 When translators support translating between one language and another, these are known as *language pairs*. Different tools support different language pairs, and these may not be complete. For example, a translator may support English to Spanish as a language pair, and Spanish to Italian as a language pair, but not English to Italian. For example, translating "Hello world" from English into French can be performed with a substitution - "Bonjour" for "Hello", and "le monde" for "world", leading to the correct translation of "Bonjour le monde". From 708f64aa6392e64d2a07e59e090b9e796e104826 Mon Sep 17 00:00:00 2001 From: Jiyeon Seo Date: Tue, 19 Oct 2021 03:53:01 +0900 Subject: [PATCH 08/36] fix a broken link (#331) Co-authored-by: USER Co-authored-by: Jim Bennett --- 6-consumer/lessons/2-language-understanding/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6-consumer/lessons/2-language-understanding/README.md b/6-consumer/lessons/2-language-understanding/README.md index 0004c934..53be2c10 100644 --- a/6-consumer/lessons/2-language-understanding/README.md +++ b/6-consumer/lessons/2-language-understanding/README.md @@ -19,7 +19,7 @@ In this lesson you will learn about language understanding models, how to create In this lesson we'll cover: * [Language understanding](#language-understanding) -* [Create a language understanding model](create-a-language-understanding-model) +* [Create a language understanding model](#create-a-language-understanding-model) * [Intents and entities](#intents-and-entities) * [Use the language understanding model](#use-the-language-understanding-model) From 698e582d4779158db303cef78ff0c674110cf066 Mon Sep 17 00:00:00 2001 From: "Mohammad Iftekher (Iftu) Ebne Jalal" Date: Tue, 19 Oct 2021 00:54:46 +0600 Subject: [PATCH 09/36] Reflecting changes from English Version (#330) Co-authored-by: Jim Bennett --- translations/README.bn.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/translations/README.bn.md b/translations/README.bn.md index 535547b4..3ce2f415 100644 --- a/translations/README.bn.md +++ b/translations/README.bn.md @@ -9,8 +9,10 @@ [![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/) [![English](https://img.shields.io/badge/-English-red)](../README.md) -[![Chinese](https://img.shields.io/badge/-Chinese-yellow)](README.zh-cn.md) -[![Turkish](https://img.shields.io/badge/-Turkish-darkgreen)](README.tr.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) + # বিগিনারদের জন্য আইওটি - একটি সুবিন্যস্ত পাঠ্যক্রম @@ -24,7 +26,7 @@ **হৃদয়ের অন্তঃস্থল থেকে কৃতজ্ঞতা জানাই এই কোর্সের রচয়িতা [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), [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/).** +**ধন্যবাদ জানাতে চাই আমাদের সেসকল [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/).** পুরো টীমের সাথে পরিচিত হওয়া যাক ! @@ -89,9 +91,9 @@ | 12 | [পরিবহন](../3-transport) | লোকেশন ডেটা সংরক্ষণ | পরবর্তী সময়ে বিশ্লেষণ বা চিত্রভিত্তিক ডেটা প্রদর্শন (Visualization) এর জন্য আইওটি ডেটা কীভাবে স্টোর করা যায় তা জানা | [লোকেশন ডেটা সংরক্ষণ](../3-transport/lessons/2-store-location-data/translations/README.bn.md) | | 13 | [পরিবহন](../3-transport) | লোকেশন ডেটা প্রদর্শন |মানচিত্রে অবস্থানের ডেটা প্রদর্শন করা এবং মানচিত্রগুলি কীভাবে ২টি মাত্রায় বাস্তব ত্রিমাত্রিক বিশ্বের উপস্থাপন করে সে সম্পর্কে জ্ঞান অর্জন | [লোকেশন ডেটা প্রদর্শন](../3-transport/lessons/3-visualize-location-data/translations/README.bn.md) | | 14 | [পরিবহন](../3-transport) | Geofences | Geofences সম্পর্কে জানা এবং কীভাবে এটি ব্যবহার করে সাপ্লাই চেইনের বিভিন্ন পর্যায়ের বাহনগুলো যখন গন্তব্যের কাছাকাছি পৌঁছায় তখন এলার্ট দেয়া যায় তা শেখা | [Geofences](../3-transport/lessons/4-geofences/README.md) | -| 15 | [উৎপাদন](../4-manufacturing) | Train a fruit quality detector | ক্লাউডের ছবি শ্রেণিবদ্ধকরণ মডেলকে (Image Classifier) ফলের মান সনাক্ত করতে কীভাবে প্রশিক্ষিত করতে হবে সে সম্পর্কে জানা | [Train a fruit quality detector](../4-manufacturing/lessons/1-train-fruit-detector/README.md) | +| 15 | [উৎপাদন](../4-manufacturing) | খাদ্যপণ্যের গুণমান সনাক্তকারী মডেলকে ট্রেনিং প্রদান | ক্লাউডের ছবি শ্রেণিবদ্ধকরণ মডেলকে (Image Classifier) ফলের মান সনাক্ত করতে কীভাবে প্রশিক্ষিত করতে হবে সে সম্পর্কে জানা | [খাদ্যপণ্যের গুণমান সনাক্তকারী মডেলকে ট্রেনিং প্রদান](../4-manufacturing/lessons/1-train-fruit-detector/translations/README.bn.md) | | 16 | [উৎপাদন](../4-manufacturing) | Check fruit quality from an IoT device | আইওটি ডিভাইসে ফলের গুণগত মান সনাক্তকারী ব্যবহার | [Check fruit quality from an IoT device](../4-manufacturing/lessons/2-check-fruit-from-device/README.md) | -| 17 | [উৎপাদন](../4-manufacturing) | Run your fruit detector on the edge | ফলের গুণগত মান সনাক্তকারীকে Edge হিসেবে ব্যবহার | [Run your fruit detector on the edge](../4-manufacturing/lessons/3-run-fruit-detector-edge/README.md) | +| 17 | [উৎপাদন](../4-manufacturing) | Edge এ Fruit Detector পরিচালনা করা | ফলের গুণগত মান সনাক্তকারীকে Edge হিসেবে ব্যবহার | [Edge এ Fruit Detector পরিচালনা করা](../4-manufacturing/lessons/3-run-fruit-detector-edge/translations/README.bn.md) | | 18 | [উৎপাদন](../4-manufacturing) | Trigger fruit quality detection from a sensor | সেন্সর থেকে ফলের গুণাগুণ সনাক্তকরণ নিয়ন্ত্রণ করা শেখা| [Trigger fruit quality detection from a sensor](../4-manufacturing/lessons/4-trigger-fruit-detector/README.md) | | 19 | [খুচরাপর্যায়](../5-retail) | Train a stock detector | কোনও দোকানে স্টক গণনা করতে স্টক ডিটেক্টরকে প্রশিক্ষণ দেওয়ার জন্য কীভাবে অবজেক্ট সনাক্তকরণ ব্যবহার করা যায় তা শেখা | [Train a stock detector](../5-retail/lessons/1-train-stock-detector/README.md) | | 20 | [খুচরাপর্যায়](../5-retail) | Check stock from an IoT device | কোন অবজেক্ট সনাক্তকরণ মডেল ব্যবহার করে আইওটি ডিভাইস থেকে স্টক পর্যবেক্ষণ করা শেখা | [Check stock from an IoT device](../5-retail/lessons/2-check-stock-device/README.md) | @@ -112,10 +114,13 @@ npm i npm run convert ``` +### স্লাইড + +কিছু কিছু লেসনের স্লাইড ডেক, এখানে [slides](./slides) ফোল্ডারে রয়েছে। ## সাহায্য প্রয়োজন! -অনুবাদের কাজ করে এই কারিক্যুলামে অবদান করতে চান? তাহলে অনুগ্রহ করে আমাদের [অনুবাদ গাইডলাইন](translations/TRANSLATIONS.bn.md) পড়ে , যেকোন একটি [Translation Issue](https://github.com/microsoft/IoT-For-Beginners/issues?q=is%3Aissue+is%3Aopen+label%3Atranslation) এ ইনপুট দেয়ার অনুরোধ করা হলো। যদি কোন নতুন ভাষায় অনুবাদ করতে কেউ আগ্রহী হয়, তবে ট্র্যাকিংয়ের জন্য দয়া করে একটি নতুন Issue সাবমিট করতে হবে। +অনুবাদের কাজ করে এই কারিক্যুলামে অবদান করতে চান? তাহলে অনুগ্রহ করে আমাদের [অনুবাদ গাইডলাইন](TRANSLATIONS.md) পড়ে , যেকোন একটি [Translation Issue](https://github.com/microsoft/IoT-For-Beginners/issues?q=is%3Aissue+is%3Aopen+label%3Atranslation) এ ইনপুট দেয়ার অনুরোধ করা হলো। যদি কোন নতুন ভাষায় অনুবাদ করতে কেউ আগ্রহী হয়, তবে ট্র্যাকিংয়ের জন্য দয়া করে একটি নতুন Issue সাবমিট করতে হবে। ## অন্য পাঠ্যক্রম সমূহ @@ -123,6 +128,7 @@ npm run convert - [Web Dev for Beginners](https://aka.ms/webdev-beginners) - [ML for Beginners](https://aka.ms/ml-beginners) +- [Data Science for Beginners](https://aka.ms/datascience-beginners) ## চিত্রের Attributions From af65af95b217697c2aae1fddb2d3ec77f723bc38 Mon Sep 17 00:00:00 2001 From: Mirza Nihal Baig <53098259+nihalbaig0@users.noreply.github.com> Date: Tue, 19 Oct 2021 21:19:20 +0600 Subject: [PATCH 10/36] [BN Translation] Check Fruit from Device (#332) * [BN Translation] Check Fruit from Device * deleted dummy.md * check fruit from device changed based on review * removed the english sentence that was translated Co-authored-by: Jim Bennett --- .../translations/.dummy.md | 9 - .../translations/README.bn.md | 208 ++++++++++++++++++ 2 files changed, 208 insertions(+), 9 deletions(-) delete mode 100644 4-manufacturing/lessons/2-check-fruit-from-device/translations/.dummy.md create mode 100644 4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/translations/.dummy.md b/4-manufacturing/lessons/2-check-fruit-from-device/translations/.dummy.md deleted file mode 100644 index 6e7db247..00000000 --- a/4-manufacturing/lessons/2-check-fruit-from-device/translations/.dummy.md +++ /dev/null @@ -1,9 +0,0 @@ -# Dummy File - -This file acts as a placeholder for the `translations` folder.
-**Please remove this file after adding the first translation** - -For the instructions, follow the directives in the [translations guide](https://github.com/microsoft/IoT-For-Beginners/blob/main/TRANSLATIONS.md) . - -## THANK YOU -We truly appreciate your efforts! diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md b/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md new file mode 100644 index 00000000..bfa11bdf --- /dev/null +++ b/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md @@ -0,0 +1,208 @@ +# IoT ডিভাইস ব্যবহার করে ফল এর মান যাচাই + +![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-16.jpg) + +> স্কেচনোটটি তৈরী করেছেন [Nitya Narasimhan](https://github.com/nitya)। বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে। + +## লেকচার-পূর্ববর্তী কুইজ + +[লেকচার-পূর্ববর্তী কুইজ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/31) + +## সূচনা + +পূর্ববর্তী লেসন এ আমরা ইমেজ ক্লাসিফায়ার নিয়ে জানলাম, এবং কিভাবে তাদের train করা যায় ভাল এবং খারাপ ফল সনাক্ত করার জন্য। এই ইমেজ ক্লাসিফায়ার টাকে IoT এপ্লিকেশন এ ব্যবহার করতে আমাদেরকে কোনো ধরনের ক্যামেরা দিয়ে ইমেজ ক্যাপচার করতে হবে এবং এই ইমেজ টাকে ক্লাউড এ পাঠাতে হবে। + + +এই লেসন এ আমরা ক্যামেরা সেন্সর নিয়ে জানবো , এবং কিভাবে এগুলোকে IoT ডিভাইস এর সাথে ব্যবহার করে ইমেজ ক্যাপচার করতে হয়। আমরা আরো জানবো কিভাবে ইমেজ ক্লাসিফায়ারটাকে IoT ডিভাইস থেকে কল করতে হয়। + +এই লেসন এ আমরা কভার করবোঃ + +* [ক্যামেরা সেন্সর](#ক্যামেরা-সেন্সর) +* [IoT ডিভাইস ব্যবহার করে একটি ইমেজ ক্যাপচার করা](#IoT-ডিভাইস-ব্যাবহার-করে-একটি-ইমেজ-ক্যাপচার-করা) +* [আমাদের ইমেজ ক্লাসিফায়ার পাবলিশ করি](#আমাদের-ইমেজ-ক্লাসিফায়ার-পাবলিশ-করি) +* [IoT ডিভাইস থেকে ইমেজ ক্লাসিফাই করা](#IoT-ডিভাইস-থেকে-ইমেজ-ক্লাসিফাই-করা) +* [Model উন্নত করা](#Model-উন্নত-করা) + + + +## ক্যামেরা সেন্সর + +ক্যামেরা সেন্সর, তার নামের মতই এমন ক্যামেরা যা IoT ডিভাইস এর সাথে কানেক্ট করা যায়। এগুলো স্থিরচিত্র অথবা স্ট্রিমিং ভিডিও ক্যাপচার করতে পারে, কিছু ডিভাইস গুলো মূল ইমেজ ডাটা ফেরত পাঠাই , বাকি গুলো ইমেজ ডাটা কমপ্রেস করে JPEG অথবা PNG টাইপ এর ইমেজ ফাইল বানাবে। সাধারণত যে কামেরা গুলো IoT ডিভাইস গুলোর সাথে ব্যবহার করা হয় আমরা যেগুলো ব্যবহার করে অভ্যস্ত সেগুলো থেকে অনেক ছোট সাইজ এর এবং কম রেজোলিউশান এর, কিন্তু আমরা হাই রেজোলিউশান এর ক্যামেরা নিতে পারি যেগুলো আধুনিক ফোন গুলার সাথে টেক্কা দেয়। আমরা সব ধরনের ইন্টারচেঞ্জেবল লেন্স , কয়েকটা ক্যামেরা সেটাপ , ইনফ্রারেড থার্মাল ক্যামেরা অথবা ইউভি ক্যামেরা নিতে পারি। + +![The light from a scene passes through a lens and is focused on a CMOS sensor](../../../../images/cmos-sensor.png) + + +বেশিরভাগ ক্যামেরা সেন্সর ইমেজ সেন্সর ব্যবহার করে যেখানে প্রত্যেক পিক্সেল হল ফটোডায়োড। একটা লেন্স ইমেজ সেন্সর এর উপর ইমেজ টাকে ফোকাস করে এবং হাজার অথবা লক্ষ লক্ষ ফটোডায়োড। প্রত্যেকের উপর পরা আলো ডিটেক্ট করে , এবং পিক্সেল ডাটা হিসাবে রেকর্ড করে। + + + +> 💁 লেন্স ইমেজ কে উল্টায়, পরে ক্যামেরা সেন্সর আবার ঠিক ভাবে ইমেজ টাকে উল্টায়। ঠিক একই রকম আমাদের চোখে হয় - আমরা যা দেখি তা চোখের পিছনে +উল্টো ভাবে ডিটেক্ট করে এবুং ব্রেন সেটাকে ঠিক করে। + + + +> 🎓 ইমেজ সেন্সরটা একটিভ-পিক্সেল সেন্সর (APS) হিসেবে পরিচিত, এবং সবচেয়ে জনপ্রিয় টাইপ এর APS হল কমপ্লিমেন্টারি মেটাল-অক্সাইড সেমিকন্ডাক্টর সেন্সর, অথবা CMOS। আমরা শুনে থাকতে পারি ক্যামেরা সেন্সর এ CMOS সেন্সর ব্যবহার এর টার্ম টা। + + + + +ক্যামেরা সেন্সর হল ডিজিটাল সেন্সর , ইমেজ ডাটা কে ডিজিটাল ডাটা হিসেবে পাঠায়, সাধারণত যে লাইব্রেরি কমিউনিকেশন প্রদান করে তার সাহায্য নিয়ে, ক্যামেরা গুলো কানেক্ট করে SPI এর মত প্রোটকল ব্যবহার করে যা তাদের বড় পরিমাণে ডাটা পাঠাতে অনুমোদন দেয় - ইমেজ গুলো temperature সেন্সর এর মত সেন্সর থেকে পাওয়া সিংগেল নাম্বার থেকে যথেষ্ট পরিমাণে বড়। + + +✅ IoT ডিভাইস গুলোর ইমেজ সাইজ এর সীমাবদ্ধতা কি কি? সীমাবদ্ধতাগুলো চিন্তা করি বিশেষ করে মাইক্রোকন্ট্রোলার হার্ডওয়ার এর উপর। + + + +## IoT ডিভাইস ব্যবহার করে একটি ইমেজ ক্যাপচার করা + +আমরা আমাদের IoT ডিভাইস ক্যাপচার এবুং ইমেজ ক্লাসিফাই করতে ব্যবহার করতে পারি। + +### কাজ - IoT ডিভাইস ব্যবহার করে ইমেজ ক্যাপচার করা + +নিম্নের কোন একটি প্রাসঙ্গিক গাইড এর মাধ্যমে IoT ডিভাইস ব্যবহার করে ইমেজ ক্যাপচার করিঃ + + +* [Arduino - Wio Terminal](wio-terminal-camera.md) +* [Single-board computer - Raspberry Pi](pi-camera.md) +* [Single-board computer - Virtual device](virtual-device-camera.md) + + + +## আমাদের ইমেজ ক্লাসিফায়ার পাবলিশ করি + +আমরা শেষ লেসন এ ইমেজ ক্লাসিফায়ার ট্রেন করেছিলাম। IoT ডিভাইস এটা ব্যবহার করার আগে, আমাদের model তা পাবলিশ করতে হবে। + + +### Model Iteration + +যখন আমাদের model শেষ লেসন এ ট্রেন হচ্ছিলো, আমরা হয়ত খেয়াল করছিলাম যে **Performance** ট্যাব সাইড এ Iterationগুলো দেখায়। যখন আমরা প্রথম model টা ট্রেন করি তখন আমরা দেখে থাকতে পারি *Iteration 1* ট্রেইনিং এ। যখন আমরা model টাকে প্রেডিকশন ইমেজ ব্যবহার করে আরো উন্নত করি, তখন আমরা দেখে থাকতে পারি *Iteration 2* ট্রেইনিং এ। + +প্রতেকবার আমরা যখন model টাকে ট্রেইন করি, আমরা নতুন Iteration পাই। এভাবে আমরা বিভিন্ন ডাটাসেট এর উপর ট্রেইন করা আমাদের model এর বিভিন্ন ভার্সন ট্র্যাক করতে পারি। যখন আমরা **Quick Test** করি, এখানে আমরা Iteration সিলেক্ট করার একটি ড্রপডাউন মেনু পাই, যেন আমরা বিভিন্ন Iteration এর রেজাল্ট তুলনা করতে পারি। + +যখন আমরা একটি Iteration নিয়ে সন্তুষ্ট হই, আমরা এটাকে পাবলিশ করতে পারি এক্সটার্নাল এপ্লিকেশন থেকে ব্যবহার সহজলভ্য করার জন্য। এভাবে আমরা আমাদের ডিভাইস দিয়ে ব্যবহার করা একটি পাবলিক ভার্সন পেতে পারি, পরে আরো নতুন কিছু Iteration এর উপর নতুন ভার্সন নিয়ে কাজ করতে পারি, পরে যখন আমরা এটা নিয়ে সন্তুষ্ট হব তখন এটা পাবলিশ করতে পারি। + + + + +### কাজ - Iteration পাবলিশ করা + + +Iteration হল কাস্টম ভিসন পোর্টাল । + + + +1. [CustomVision.ai](https://customvision.ai) তে কাস্টম ভিসন পোর্টাল লঞ্চ করি এবং সাইন ইন করি যদি ইতিমধ্যে এটা খুলে না থাকি। পরে আমাদের `fruit-quality-detector` প্রোজেক্ট খুলি। + + + +1. উপরের অপশন থেকে **Performance** ট্যাব সিলেক্ট করি। + + +1. সাইড এর *Iterations* লিস্ট থেকে সর্বশেষ Iteration সিলেক্ট করি। + + + + +1. Iteration এর জন্য **Publish** বাটন সিলেক্ট করি। + + ![The publish button](../../../../images/custom-vision-publish-button.png) + + + + +1. *Publish Model* ডায়লগ এ, *Prediction resource* এ আগের লেসন এ আমাদের তৈরি রিসোর্স `fruit-quality-detector-prediction` সেট করি। নাম হিসেবে `Iteration2` রাখি, এবং **Publish** বাটন সিলেক্ট করি। + + +1. একবার পাবলিশ করা হলে, **Prediction URL** বাটন সিলেক্ট করি। এটা প্রেডিকশন এপিআই এর ডিটেলস দেখাবে, এবং আমাদের IoT ডিভাইস থেকে model কে কল করতে এগুলো দরকার হবে। নিচের সেকশন কে *If you have an image file* হিসেবে লেবেল করা , এবং এই ডিটেইল গুলো আমরা চাই। দেখানো URL এর কপি করি যেটা কিছু টা এরকম হবেঃ + + ```output + https://.api.cognitive.microsoft.com/customvision/v3.0/Prediction//classify/iterations/Iteration2/image + ``` + যেখানে `` হবে কাস্টম ভিসন পোর্টাল রিসোর্স তৈরি করার সময় ব্যবহার করা লোকেশন, এবং `` হবে অনেকগুলো লেটার এবং নাম্বার দিয়ে তৈরি করা লম্বা আইডি। + + এছাড়াও *Prediction-Key* ভ্যালু এর একটি কপি নিই। এটা একটি সিকিউরড কি যেটা model কে কল করার সময় পাস করা হয়। শুধুমাত্র যে আপ্লিকেশন গুলো এই কি পাস করবে তাদেরকে model টা ব্যবহার করতে দেয়া হবে, অন্য সব আপ্লিকেশন কে প্রত্যাখ্যান হবে। + + ![The prediction API dialog showing the URL and key](../../../../images/custom-vision-prediction-key-endpoint.png) + + + +✅ যখন একটি নতুন Iteration পাবলিশ করা হয়, তখন এটার অন্য নাম থাকে।ন IoT ডিভাইস এর ব্যবহার করা Iteration আমরা কিভাবে পরিবর্তন করা যায় সেটা আমরা কিভাবে চিন্তা করতে পারি। + +## IoT ডিভাইস থেকে ইমেজ ক্লাসিফাই করা + +আমরা এখন এই কানেকশন ডিটেইলস গুলো IoT ডিভাইস থেকে ইমেজ ক্লাসিফায়ার কল করার জন্য ব্যবহার করতে পারি। + +### কাজ - আমাদের IoT ডিভাইস থেকে ইমেজ ক্লাসিফাই করা + + +প্রাসঙ্গিক গাইড এর মাধ্যমে কাজ IoT ডিভাইস ব্যবহার করে ইমেজ ক্যাপচার করিঃ + +* [Arduino - Wio Terminal](wio-terminal-classify-image.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-classify-image.md) + + +## Model উন্নত করা + + + +আমরা যেনে থাকতে পারি যে, IoT ডিভাইস এর সাথে কানেক্টেড থাকা ক্যামেরা থেকে আমরা আশানুরূপ রেজাল্ট নাও পেতে পারি। আমাদের কম্পিউটার থেকে আপলোড করা ইমেজ ব্যবহার করা প্রেডিকশন গুলো সবসময় সঠিক হয় না। এটার কারন হল Model যে ডাটার উপর ট্রেইন করা হয়েছে তার থেকে ভিন্ন ডাটা প্রেডিকশন এর জন্য ব্যবহার করা। + + + +ইমেজ ক্লাসিফায়ার থেকে সবচেয়ে ভাল রেজাল্ট এর জন্য, আমরা প্রেডিকশন এর জন্য ব্যবহার করা ইমেজ এর মত যথাসম্ভব অনুরূপ ইমেজ উপর আমাদের model ট্রেইন করতে চাবো। উদাহরণ স্বরূপ, আমরা যদি ট্রেইনিং এর ইমেজ ক্যাপচার এর জন্য ফোন ক্যামেরা ব্যবহার করি, সেটার ইমেজ কোয়ালিটি, শার্পনেস, এবং কালার একট IoT ডিভাইস এর সাথে কানেক্টেড ক্যামেরা থেকে ভিন্ন হবে। + +![2 banana pictures, a low resolution one with poor lighting from an IoT device, and a high resolution one with good lighting from a phone](../../../../images/banana-picture-compare.png) + + + +উপরের ইমেজ এ, বামের কলার ছবি একটি রাস্পবেরি পাই ক্যামেরা থেকে নেয়া হয়েছিল, ডানের টা একই কলার ছবি আইফোন ক্যামেরা থেকে নেয়া হয়েছিল। এখানের কোয়ালিটির দিক থেকে লক্ষণীয় ভিন্নতা আছে - আইফোন এর ছবি টা শার্পার, উজ্জ্বল কালার সহ এবং বেশি কন্ট্রাস্ট এর। + + +✅ আমাদের IoT ডিভাইস দিয়ে ক্যাপচার করা ইমেজ এর ভুল প্রেডিকশন এর জন্য আর কি কি কারন থাকতে পারে? একটা IoT ডিভাইস যে পরিবেশে ব্যবহার করা হতে পারে সেটা নিয়ে চিন্তা করি, কি কি ফ্যাক্টর ক্যাপচার করা ইমেজ কে প্রভাবিত করতে পারে। + +model কে উন্নত করার জন্য, আমরা IoT ডিভাইস থেকে ক্যাপচার করা ইমেজ দিয়ে রিট্রেইন করতে পারি। + + +--- + +### কাজ - model উন্নত করা + +1. আমাদের IoT ডিভাইস দিয়ে পাকা এবং কাঁচা এর কিছু ইমেজ ক্লাসিফাই করি। + +1. কাস্টম ভিসন পোর্টাল এ, *Predictions* ট্যাব এর ইমেজ ব্যবহার করে রিট্রেইন করি। + + > ⚠️আমরা [এই সিরিজের ১ম লেসন থেকে ক্লাসিফায়ার retain করার জন্য প্রয়োজনীয় নির্দেশনা](../1-train-fruit-detector/README.md#retrain-your-image-classifier) দেখতে পারি, যদি প্রয়োজন হয়। + + +1. যদি আমাদের ইমেজ ট্রেইনিং এ ব্যবহার করা আসল ইমেজ থেকে দেখতে অনেক ভিন্ন হয়, আমরা আসল ইমেজ গুলো *Training Images* ট্যাব সিলেক্ট করে এবং **Delete** বাটন সিলেক্ট করে ডিলিট করতে পারি। ইমেজ সিলেক্ট করার জন্য, আমাদের কার্সর তা এর উপর মুভ করি এবং একটি টিক আসবে, টিক টা সিলেক্ট অথবা ডিসিলেক্ট করি ইমেজ সিলেক্ট অথবা ডিসিলেক্ট করার জন্য। + +1. একটি নতুন Iteration ট্রেইন করি এবং উপরের ধাপ ব্যবহার করে পাবলিশ করি। + +1. আমাদের কোড এর endpoint URL আপডেট করি, এবং অ্যাপ তা পুনরায় রান করি। + +1. প্রেডিকশন এর রেসাল্ট নিয়ে সন্তুষ্ট না হওয়া পর্যন্ত এই ধাপ গুলো Iteration করি। + +--- + + +## 🚀 চ্যালেঞ্জ + +ইমেজ এর রেজোলিউশন অথবা আলো প্রেডিকশন কে কতটুকু প্রভাবিত করে? + +আমাদের ডিভাইস এর কোড এ ইমেজ এর রেজোলিউশন পরিবর্তন করার চেষ্টা করি এবং দেখি এটা ইমেজ এর কোয়ালিটি তে কোন পার্থক্য আনে কিনা। এছাড়াও আলো চেঞ্জ করেও চেষ্টা করে দেখতে পারি। + +যদি আমরা এই প্রোডাকশন ডিভাইসটি কোন ফার্ম অথবা ফ্যাক্টরি তে বিক্রয়ের জন্য তৈরী করি, আমরা কিভাবে নিশ্চিত করতে পারি যে এটা সব সময় ধারাবাহিকভাবে ভালো ফলাফল দিবে। + +## ## লেকচার-পরবর্তী কুইজ + +[লেকচার-পরবর্তী কুইজ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/32) + +## রিভিউ ও স্ব-অধ্যয়ন + +আমরা আমাদের কাস্টম ভিসন মডেল পোর্টাল ব্যবহার করে ট্রেইন করেছি। এটা ইমেজ এর সহজলভ্যতার উপর নির্ভর করে - এবং বাস্তব জগতে আমরা আমাদের ক্যামেরা ডিভাইস এর সাথে ম্যাচ করে এমন ট্রেইনিং ডাটা হয়ত পাবো না। আমরা এটার বদলে আমাদের ডিভাইস থেকে সরাসরি ট্রেইনিং করতে পারি করতে এপিআই ব্যবহার করে, IoT ডিভাইস থেকে ক্যাপচার করা ইমেজ দিয়ে মডেল ট্রেইন করার জন্য। + +* ট্রেইনিং এপিআই এর উপর পড়ুন [using the Custom Vision SDK quick start](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/quickstarts/image-classification?WT.mc_id=academic-17441-jabenn&tabs=visual-studio&pivots=programming-language-python) + +## এসাইনমেন্ট + +[ক্লাসিফিকেশন রেজাল্টের প্রতিক্রিয়া জানানো](../assignment.md) From 7eb0885953bd52cc6a767f61000afd0a07c4ee9a Mon Sep 17 00:00:00 2001 From: "Mohammad Iftekher (Iftu) Ebne Jalal" Date: Tue, 19 Oct 2021 21:20:10 +0600 Subject: [PATCH 11/36] [BN Translation] Fruit Detector on Edge (#329) * Create README.bn.md * Delete .dummy.md * Update README.bn.md * Create assignment.bn.md Co-authored-by: Jim Bennett --- .../translations/.dummy.md | 9 - .../translations/README.bn.md | 615 ++++++++++++++++++ .../translations/assignment.bn.md | 14 + 3 files changed, 629 insertions(+), 9 deletions(-) delete mode 100644 4-manufacturing/lessons/3-run-fruit-detector-edge/translations/.dummy.md create mode 100644 4-manufacturing/lessons/3-run-fruit-detector-edge/translations/README.bn.md create mode 100644 4-manufacturing/lessons/3-run-fruit-detector-edge/translations/assignment.bn.md diff --git a/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/.dummy.md b/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/.dummy.md deleted file mode 100644 index 6e7db247..00000000 --- a/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/.dummy.md +++ /dev/null @@ -1,9 +0,0 @@ -# Dummy File - -This file acts as a placeholder for the `translations` folder.
-**Please remove this file after adding the first translation** - -For the instructions, follow the directives in the [translations guide](https://github.com/microsoft/IoT-For-Beginners/blob/main/TRANSLATIONS.md) . - -## THANK YOU -We truly appreciate your efforts! diff --git a/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/README.bn.md b/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/README.bn.md new file mode 100644 index 00000000..fb6ab350 --- /dev/null +++ b/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/README.bn.md @@ -0,0 +1,615 @@ +# Edge এ Fruit Detector পরিচালনা করা + +![A sketchnote overview of this lesson](../../../../sketchnotes/lesson-17.jpg) + +> স্কেচনোটটি তৈরী করেছি [Nitya Narasimhan](https://github.com/nitya)। বড় সংস্করণে দেখার জন্য ছবিটিতে ক্লিক করতে হবে। + +এই ভিডিওটি আইওটি ডিভাইসে চলমান ইমেজ ক্লাসিফায়ারগুলির একটি সংক্ষিপ্ত বিবরণ দেয়, যে বিষয়টি এই পাঠেই অন্তর্ভুক্ত। + +[![Custom Vision AI on Azure IoT Edge](https://img.youtube.com/vi/_K5fqGLO8us/0.jpg)](https://www.youtube.com/watch?v=_K5fqGLO8us) + +> 🎥 উপরের ছবিতে ক্লিক করে ভিডিওটি দেখে নিই + +## লেকচার-পূর্ববর্তী কুইজ + +[লেকচার-পূর্ববর্তী কুইজ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/33) + +## সূচনা + +গত পাঠে আমরা পাকা এবং কাঁচা ফলের শ্রেণিবিন্যাস করতে ইমেজ ক্লাসিফায়ার ব্যবহার করেছি, ইন্টারনেটে আমাদের আইওটি ডিভাইসে ক্যামেরা দ্বারা ধারণ করা একটি ছবি ক্লাউড সার্ভিসে পাঠিয়েছি। এই কাজগুলি হতে সময় নেয়, অর্থ ব্যয় হয় এবং আমরা যে ধরণের ছবি ব্যবহার করছি, তার উপর নির্ভর করে গোপনীয়তা সুংক্রান্ত বিষয়ের প্রভাব থাকতে পারে। + +এই পাঠে আমরা শিখবো কিভাবে মেশিন লার্নিং (এমএল) মডেলগুলি Edge এ চালানো যায় - ক্লাউডের পরিবর্তে আমাদের নিজের নেটওয়ার্কে চলমান আইওটি ডিভাইসে। আমরা ক্লাউড কম্পিউটিং বনাম Edge কম্পিউটিং এর সুবিধা এবং অসুবিধা সম্বন্ধে জানবো, কিভাবে আমাদের AI মডেলকে Edge এ স্থাপন করবো এবং কিভাবে আমাদের IoT ডিভাইস থেকে এটি অ্যাক্সেস করবো সেটিও দেখবো। + +এই পাঠে আমরা শিখবো : + +* [Edge computing](#edge-computing) +* [Azure IoT Edge](#Azure-IoT-Edge) +* [IoT Edge device রেজিস্টার করা](#IoT-Edge-device-রেজিস্টার-করা) +* [IoT Edge device সেটাপ করা](#IoT-Edge-device-সেটাপ-করা) +* [মডেল এক্সপোর্ট করা](#মডেল-এক্সপোর্ট-করা) +* [ডেপ্লয়মেন্টের জন্য কন্টেইনার প্রস্তুতকরণ](#ডেপ্লয়মেন্টের-জন্য-কন্টেইনার-প্রস্তুতকরণ) +* [কন্টেইনার ডেপ্লয় করা](#কন্টেইনার-ডেপ্লয়-করা) +* [আমাদের IoT Edge device ব্যবহার করা](#আমাদের-IoT-Edge-device-ব্যবহার-করা) + +## Edge computing + +Edge কম্পিউটিংয়ের ধারণা টি এমন যে যেখানে ডেটা তৈরী বা যেখান থেকেই গৃহীত হয়, সেখানকার কাছাকাছি ডেটা প্রসেস করতে পারা। ক্লাউডে এই প্রসেসিং এর পরিবর্তে, এটি ক্লাউডের Edge এ স্থানান্তরিত হয় - যেটি কিনা আমাদের অভ্যন্তরীণ নেটওয়ার্ক। + +![An architecture diagram showing internet services in the cloud and IoT devices on a local network](../../../../images/cloud-without-edge.png) + +এ পর্যন্ত পাঠগুলিতে আমরা শিখেছি কীভাবে আমাদের কাছের ডিভাইসগুলি তথ্য সংগ্রহ এবং ক্লাউডে ডেটা পাঠানোর জন্য বিশ্লেষণ করে, ক্লাউডে সার্ভারহীন ফাংশন বা এআই মডেল কীভাবে চালানো হয়। + +![An architecture diagram showing IoT devices on a local network connecting to edge devices, and those edge devices connect to the cloud](../../../../images/cloud-with-edge.png) + +Edge কম্পিউটিং এ মূলত কিছু ক্লাউড পরিষেবা বা সার্ভিসকে ক্লাউড থেকে সরিয়ে এবং IoT ডিভাইস যে নেটওয়ার্কে চলমান সেই একই নেটওয়ার্কের কোন কম্পিউটারে নিয়ে আসা। শুধুমাত্র প্রয়োজন হলেই ক্লাউডের সাথে যোগাযোগ করা হবে। উদাহরণস্বরূপ, আমরা কোন ফল পাকা কিনা তা বিশ্লেষণ করতে Edge এর ডিভাইসে এআই মডেল চালাতে পারি এবং শুধুমাত্র বিশ্লেষণগুলি ক্লাউডে ফেরত পাঠাতে পারি, যেমন ফলের পাকা বনাম কাঁচা ফলের সংখ্যা। + +✅ আমরা এতদিন পর্যন্ত শেখা আইওটি অ্যাপ্লিকেশনগুলি সম্পর্কে চিন্তা করি। তাদের কোন অংশগুলি Edge এ নিয়ে আসা যেতে পারে। + +### সুবিধা + +Edge কম্পিউটিং এর সুবিধা গুলো হলো: + +1. **দ্রততা** - সময়-সংবেদনশীল (time-sensitive) তথ্যের জন্য খুবই সুবিধাজনক কারণ সমগ্র ইন্টারনেট জুড়ে সংযোগ করার পরিবর্তে লোকাল ডিভাইসেই কাজগুলি করা হয়। এটি উচ্চ গতিতে তা করতে সক্ষম হয় কারণ অভ্যন্তরীণ নেটওয়ার্কগুলি ইন্টারনেট সংযোগের তুলনায় যথেষ্ট দ্রুত গতিতে চলতে পারে, যার ডেটা অনেক কম দূরত্বে ভ্রমণ করে। + + > 💁 ইন্টারনেট সংযোগের জন্য অপটিক্যাল ক্যাবল ব্যবহার করা হলেও , আলোর গতিতে ডেটা পরিবহণের সুযোগ দেয়া হলেও, ডেটা ক্লাউড প্রোভাইডারদের কাছে পৌছতে সময় নিতে পারে। উদাহরণস্বরূপ, যদি আমরা ইউরোপ থেকে মার্কিন যুক্তরাষ্ট্রে ক্লাউড পরিষেবাদিতে ডেটা পাঠাই তবে অপটিক্যাল ক্যাবলে আটলান্টিক অতিক্রম করতে ডেটার জন্য কমপক্ষে 28ms সময় লাগে (এখানে তাও উপেক্ষা করা হচ্ছে - ট্রান্সঅ্যাটলান্টিক কেবলে ডেটা পাওয়া, বৈদ্যুতিক থেকে আলোকীয় সংকেতে রূপান্তর এবং তারপর আবার অপটিক্যাল ক্যাবল থেকে ক্লাউড প্রোভাইডারের কাছে পৌছানোর মত বিষয়গুলো)। + + Edge কম্পিউটিংয়ের জন্য কম নেটওয়ার্ক ট্র্যাফিকের প্রয়োজন হয়, এতে করে ইন্টারনেট সংযোগের সীমিত ব্যান্ডউইথের সমস্যা বা এর মধ্যে যানজটের ফলে আমাদের ডেটা পরিবহন ধীর হওয়ার ঝুঁকি হ্রাস করে। + +1. **দূরবর্তী সংযোগ নিয়ন্ত্রণ** - Edge কম্পিউটিং কাজ করে যখন আমাদের কোন ইন্টারনেট সংযোগ থাকেনা বা খুবই সীমিত পর্যায়ের হয়। উদাহরণস্বরূপ যখন পরিবেশগত দূর্যোগ ঘটে, তখন ইন্টারনেটের কোন একসেস থাকেনা। + +1. **অল্প খরচ** - Edge ডিভাইসে ডেটা সংগ্রহ, সঞ্চয়, বিশ্লেষণ এবং ট্রিগারিং কার্যক্রম সম্পাদন করা ক্লাউড পরিষেবার ব্যবহার হ্রাস করে যা আমাদের আইওটি অ্যাপ্লিকেশনের সামগ্রিক খরচ কমাতে পারে। Edge কম্পিউটিংয়ের জন্য ডিজাইন করা ডিভাইসে সাম্প্রতিক অনেক উন্নয়ন হয়েছে, সম্প্রতি এআই এক্সিলারেটর বোর্ড যেমন [NVIDIA জেটসন ন্যানো](https://developer.nvidia.com/embedded/jetson-nano-developer-kit) এর আবির্ভাব ঘটেছে, যা GPU-ভিত্তিক হার্ডওয়্যার ব্যবহার করে AI ওয়ার্কলোডগুলি চালাতে পারে যে ডিভাইসগুলির দাম US $100 এরও কম। + +1. **গোপনীয়তা এবং নিরাপত্তা** - Edge কম্পিউটিং এর ক্ষেত্রে ডেটা আমাদের নেটওয়ার্কে থাকে এবং ক্লাউডে আপলোড করা হয় না। এটি প্রায়শই সংবেদনশীল এবং ব্যক্তিগতভাবে শনাক্তযোগ্য তথ্যের জন্য অধিকতর কল্যাণজনক। এছাড়াও ডেটা বিশ্লেষণ করার পরে ডেটা সংরক্ষণ করার প্রয়োজন হয় না, যা ডেটা ফাঁসের ঝুঁকি অনেক কমিয়ে দেয়। উদাহরণগুলির মধ্যে রয়েছে মেডিকেল ডেটা এবং সিসিটিভি ক্যামেরা ফুটেজ। + +1. **অনিরাপদ ডিভাইসগুলি পরিচালনা করা** - যদি আমাদের জানামতে নিরাপত্তা ত্রুটিযুক্ত কোন ডিভাইস থাকে যা আমরা সরাসরি আমাদের নেটওয়ার্ক বা ইন্টারনেটের সাথে সংযুক্ত করতে চাই না, সেগুলিকে একটি পৃথক নেটওয়ার্কে গেটওয়ে আইওটি Edge ডিভাইসে সংযুক্ত করতে পারি। এই Edge ডিভাইসটি আমাদের বৃহত্তর নেটওয়ার্ক বা ইন্টারনেটের সাথেও সংযোগ স্থাপন করতে পারে এবং ডেটা প্রবাহকে সামনে পেছনে পরিচালনা করতে পারে। + +1. **অসামঞ্জস্যপূর্ণ ডিভাইসের জন্য সাপোর্ট** - যদি আমাদের এমন ডিভাইস থাকে যা IoT হাবের সাথে সংযোগ করতে পারে না, উদাহরণস্বরূপ এমন ডিভাইস যা শুধুমাত্র HTTP সংযোগ ব্যবহার করে সংযোগ করতে পারে বা যে ডিভাইসগুলিতে কেবলমাত্র ব্লুটুথ সংযোগ আছে- সেক্ষেত্রে আমরা একটি IoT Edge ডিভাইসকে গেটওয়ে ডিভাইস হিসাবে ব্যবহার করতে পারি , IoT Hub- এ বার্তা পাঠানোর জন্য। + +✅ কিছু গবেষণা করি: Edge কম্পিউটিং এর অন্য কোন কোন সুবিধা থাকতে পারে? + +### অসুবিধা + +Edge কম্পিউটিংয়ের আবার কিছু অসুবিধাও রয়েছে, যেসব ক্ষেত্রে ক্লাউড ভালো অপশন হতে পারে: + +1. **স্কেল এবং ফ্লেক্সিবিলিটি** - ক্লাউড কম্পিউটিং এ সার্ভার এবং অন্যান্য রিসোর্স সংযোজন বা হ্রাস করে রিয়েল -টাইমে নেটওয়ার্ক এবং ডেটা প্রয়োজনের সাথে সামঞ্জস্য করতে পারে। কিন্তু Edge এর সুবিধা কম্পিউটারে যোগ করার জন্য ম্যানুয়ালি আরো ডিভাইস যোগ করা প্রয়োজন। + +1. **নির্ভরযোগ্যতা এবং সহনশীলতা** - ক্লাউড কম্পিউটিং এ অপ্রয়োজনীয় অতিরিক্ত রিসোর্স এবং দুর্যোগকালীন পরিস্থিতি এড়ানোর জন্য প্রায়ই একাধিক স্থানে একাধিক সার্ভার সরবরাহ করে। Edge এ একই মাত্রার অপ্রয়োজনীয়তার জন্য বড় বিনিয়োগ এবং কনফিগারেশনের কাজ প্রয়োজন। + +1. **রক্ষণাবেক্ষণ** - ক্লাউড পরিষেবা প্রদানকারীরারাই সিস্টেম রক্ষণাবেক্ষণ এবং আপডেট প্রদান করে। + +✅ কিছু গবেষণা করি: Edge কম্পিউটিংয়ে অন্য কোন অসুবিধা থাকতে পারে? + +ক্লাউড ব্যবহার করার অসুবিধার মধ্যে দেখা যায় - আমরা ক্লাউড সরবরাহকারীদের দক্ষতা এবং স্কেলের উপর নির্ভর করতে পারবোনা, বরং আমাদেরকে এই ডিভাইসগুলি নিজেই তৈরি এবং পরিচালনা করতে হবে। + +Edge কম্পিউটিংয়ের দ্বারা কিছু ঝুঁকি প্রশমিত করা যায়। উদাহরণস্বরূপ, যদি আমাদের যন্ত্রপাতি সহ কারখানায় যেখান থেকে ডেটা সংগ্রহ করা হয়, সেখানেই একটি Edge ডিভাইস থাকে, তাহলে আমাদেরকে দুর্যোগ পরিস্থিতি সম্পর্কে ভাবতে হবে না। যদি কারখানার বিদ্যুৎ চলে যায় তাহলে আমাদের ব্যাকআপ Edge ডিভাইসের প্রয়োজন হবে না কারণ মেশিনগুলি ডেটা তৈরির পর, Edge ডিভাইসের প্রক্রিয়াগুলিও বিদ্যুৎবিহীন পরিচালনা করা যাবে। + +IoT সিস্টেমের জন্য, আমরা প্রায়ই ক্লাউড এবং Edge কম্পিউটিং এর মিশ্রণ এর কৌশল গ্রহণ করি যেখানে সিস্টেম এর গ্রাহকদের এবং এর রক্ষণাবেক্ষণকারীদের প্রয়োজনের উপর ভিত্তি করে প্রতিটি সেবার সুবিধা পাওয়া যায়। + +## Azure IoT Edge + +![The Azure IoT Edge logo](../../../../images/azure-iot-edge-logo.png) + +Azure IoT Edge হল একটি পরিষেবা যা আমাদেরকে কাজের চাপকে ক্লাউডের বাইরে এবং Edge এ সরিয়ে নিতে সাহায্য করতে পারে। আমরা একটি Edge ডিভাইস হিসাবে একটি ডিভাইস সেট আপ, এবং ক্লাউড থেকে আমরা যে Edge ডিভাইসে কোড স্থাপন করতে পারি। এটি আমাদেরকে ক্লাউড এবং Edge এর ক্ষমতাগুলির সর্বোচ্চ ব্যবহার নিশ্চিত করে। + +> 🎓 *Workloads* বলতে সেসকল সার্ভিস বোঝায় যেগুলো কোন ধরনের কাজ করে, যেমন এআই মডেল, অ্যাপ্লিকেশন বা সার্ভারলেস ফাংশন। + +উদাহরণস্বরূপ, আমরা ক্লাউডে একটি ইমেজ ক্লাসিফায়ার প্রশিক্ষণ দিতে পারি, তারপর ক্লাউড থেকে এটি একটি Edge ডিভাইসে স্থাপন করি। আমাদের আইওটি ডিভাইস তারপর ইন্টারনেটে ছবি পাঠানোর পরিবর্তে Edge ডিভাইসে ইমেজ পাঠায় শ্রেণীবিন্যাসের জন্য। যদি আমাদের মডেলের পরিবর্তন বা উন্নয়ন প্রয়োজন হয়, তাহলে আমরা এটিকে ক্লাউডে প্রশিক্ষণ দিতে পারি এবং আইওটি Edge ব্যবহার করে Edge ডিভাইসে মডেলটিকে আমরা আপডেট করতে পারি। + +> 🎓 IoT Edge- এ যে সফটওয়্যারটি মোতায়েন করা হয় তা *মডিউল* নামে পরিচিত। ডিফল্টরূপে IoT Edge মডিউল চালায় যা IoT Hub- এর সাথে যোগাযোগ করে, যেমন `edgeAgent` এবং` edgeHub` মডিউল। যখন আমরা একটি ইমেজ ক্লাসিফায়ার স্থাপন করি, এটি একটি অতিরিক্ত মডিউল হিসাবে স্থাপন করা হয়। + +আইওটি Edge আইওটি হাবের মধ্যেই তৈরি করা হয়েছে, তাই আমরা একই স্তরের সুরক্ষা সহ আইওটি ডিভাইসগুলি পরিচালনা করতে যে পরিষেবাটি ব্যবহার করি, সেই একই সার্ভিস দিয়ে আমরা Edge ডিভাইসগুলি পরিচালনা করতে পারি। + +আইওটি Edge *কনটেইনার* থেকে কোড চালায় - এটি স্বয়ংসম্পূর্ণ অ্যাপ্লিকেশন যা আমাদের কম্পিউটারে বাকি অ্যাপ্লিকেশন থেকে বিচ্ছিন্নভাবে চালানো হয়। যখন আমরা একটি কন্টেইনার চালাই তখন এটি আমাদের কম্পিউটারের ভিতরে একটি পৃথক কম্পিউটারের মতো কাজ করে, যার নিজস্ব সফ্টওয়্যার, পরিষেবা এবং অ্যাপ্লিকেশনগুলি চলছে। বেশিরভাগ সময় কনটেইনার আমাদের কম্পিউটারে কিছু অ্যাক্সেস করতে পারে না যতক্ষণ না আমরা কন্টেইনারের সাথে একটি ফোল্ডারের মতো জিনিস ভাগ করা বেছে নেই। কন্টেইনার তারপর একটি খোলা পোর্টের মাধ্যমে সার্ভিসগুলি প্রকাশ করে যা আমরা আমাদের নেটওয়ার্কে সংযোগ করতে বা প্রকাশ করতে পারি। + +![A web request redirected to a container](../../../../images/container-web-browser.png) + +উদাহরণস্বরূপ, আমরা পোর্ট 80, ডিফল্ট HTTP পোর্টে চলমান একটি ওয়েব সাইটকে একটি কন্টেইনার রাখতে পারি এবং আমরা এটি আমাদের কম্পিউটার থেকে পোর্ট 80 তেও প্রকাশ করতে পারি। + +✅ কিছু গবেষণা করি: Docker বা Moby এর মতো সার্ভিস এবং কন্টেইনার সম্পর্কে আরো পড়ি। + +আমরা ইমেজ ক্লাসিফায়ার ডাউনলোড করার জন্য কাস্টম ভিশন ব্যবহার করতে পারি এবং সেগুলোকে কনটেইনার হিসেবে স্থাপন করতে পারি, হয় সরাসরি কোনো ডিভাইসে চালানো অথবা আইওটি Edge এর মাধ্যমে মোতায়েন করা যেতে পারে। একবার একটা কন্টেইনার চলতে থাকলে, ক্লাউড সংস্করণের মতো একই REST API ব্যবহার করে এটি একসেস করা যেতে পারে, তবে endpoint টি কন্টেইনার চালানোর জন্য Edge ডিভাইসের দিকে নির্দেশ করে। + +## IoT Edge device রেজিস্টার করা + +একটি আইওটি Edge ডিভাইস ব্যবহার করার জন্য, এটি আইওটি হাব -এ রেজিস্ট্রেশন হওয়া প্রয়োজন। + +### Task - IoT Edge device রেজিস্টার করা + +1. `fruit-quality-detector` রিসোর্স গ্রুপে আইওটি হাব তৈরী করি। এটাকে ইউনিক একটা নাম দেয়া যেতে পারে, যেমনঃ `fruit-quality-detector` + +1. একটি IoT Edge device রেজিস্ট্রেশন করি, নাম দিই `fruit-quality-detector-edge`। এটি করার কমান্ডটি একটি non-edge ডিভাইস নিবন্ধনের জন্য ব্যবহৃত কমান্ডের অনুরূপ, তবে `--edge-enabled` ফ্ল্যাগটি পাস করা যাবেনা। + + ```sh + az iot hub device-identity create --edge-enabled \ + --device-id fruit-quality-detector-edge \ + --hub-name + ``` + + `` এর স্থলে আমাদের আইওটি হাবের নাম বসাই। + +1. নিম্নলিখিত কমান্ড ব্যবহার করে আমাদের ডিভাইসের জন্য সংযোগ স্ট্রিং নিই: + + ```sh + az iot hub device-identity connection-string show --device-id fruit-quality-detector-edge \ + --output table \ + --hub-name + ``` + + `` এর স্থলে আমাদের আইওটি হাবের নাম বসাই। + + আউটপুটে দেখানো কানেকশন স্ট্রিং এর কপি রাখি। + +## IoT Edge device সেটাপ করা + +একবার IoT হাব এ এজ ডিভাইস রেজিস্ট্রেশন তৈরি করে নিলে, আমরা এজ ডিভাইস সেট আপ করতে পারবো। + +### Task - Install and start the IoT Edge Runtime + +**IoT Edge runtime কেবল Linux container এ রান করে।** এটি লিনাক্সে চলবে অথবা লিনাক্স ভার্চুয়াল মেশিন ব্যবহার করে উইন্ডোজে চালানো যাবে। + +* আমরা যদি আমাদের আইওটি ডিভাইস হিসাবে রাস্পবেরি পাই ব্যবহার করি, তাহলে এটি লিনাক্সের একটি সাপোর্টেড সংস্করণ চালায় এবং আইওটি Edge রানটাইম হোস্ট করতে পারে। এক্ষেত্রে আমরা [Microsoft docs এর লিনাক্স গাইডের জন্য Azure আইওটি Edge ইনস্টলেশন](https://docs.microsoft.com/azure/iot-edge/how-to-install-iot-edge?WT.mc_id=academic-17441-jabenn) পড়ে দেখতে পারি। + + > 💁 মনে রাখতে হবে, রাস্পবেরি পাই ওএস ডেবিয়ান লিনাক্সের একটি রূপ। + +* আমরা যদি রাস্পবেরি পাই ব্যবহার না করি, কিন্তু একটি লিনাক্স কম্পিউটার থাকে, তাহলে আমরা IoT Edge রানটাইম চালাতে পারবো। এক্ষেত্রে আমরা [লিনাক্স গাইডের জন্য Azure আইওটি এজ ইনস্টলেশন](https://docs.microsoft.com/azure/iot-edge/how-to-install-iot-edge?WT.mc_id=academic-17441-jabenn) পড়ে দেখতে পারি। + +* উইন্ডোজে আমরা IoT Edge runtime ইন্সটল করতে পারি Linux Virtual Machine ব্যবহার করে, যার জন্য [উইন্ডোজে IoT Edge runtime পরিচালনা ](https://docs.microsoft.com/azure/iot-edge/quickstart?WT.mc_id=academic-17441-jabenn#install-and-start-the-iot-edge-runtime) পড়তে পারি। *Deploy a module* সেকশনে যাওয়ার পর কাজ বন্ধ করতে হবে। + +* macOS ব্যবহারকারী হল্র ক্লাউডে virtual machine (VM) তৈরী করতে পারি। IoT Edge িন্সটল করা লিনাক্স ভিএম আমরা ডেপ্লয় করতে পারি। এজন্য [IoT Edge এর জন্য ভার্চুয়াল মেশিন](vm-iotedge.md) পড়ে দেখতে পারি। + +## মডেল এক্সপোর্ট করা + +Edge এ ক্লাসিফায়ার চালানোর জন্য, এটি কাস্টম ভিশন থেকে এক্সপোর্ট করতে হবে। কাস্টম ভিশন দুই ধরণের মডেল তৈরি করতে পারে - স্ট্যান্ডার্ড মডেল এবং কমপ্যাক্ট মডেল। কম্প্যাক্ট মডেলগুলি মডেলের আকার কমাতে বিভিন্ন কৌশল ব্যবহার করে, এটি আইওটি ডিভাইসে ডাউনলোড এবং মোতায়েনের জন্য যথেষ্ট ছোট করে তোলে। + +যখন আমরা ইমেজ ক্লাসিফায়ার তৈরি করি, তখন আমরা *Food* ডোমেইন ব্যবহার করেছিলাম, মডেলটির একটি সংস্করণ যা Food ইমেজগুলিতে প্রশিক্ষণের জন্য অপ্টিমাইজ করা হয়েছে। কাস্টম ভিশনে, আমরা আমাদের প্রকল্পের ডোমেইন পরিবর্তন করতে, আমাদের প্রশিক্ষণ তথ্য ব্যবহার করে নতুন ডোমেনের সাথে একটি নতুন মডেলকে প্রশিক্ষণ দিতে হবে। কাস্টম ভিশন দ্বারা সমর্থিত সমস্ত ডোমেইন স্ট্যান্ডার্ড এবং কমপ্যাক্ট হিসাবে পাওয়া যায়। + +### কাজ - মডেলটিকে Food (compact) domain এ ট্রেইনিং প্রদান + +1. Custom Vision portal এ যাওয়ার জন্য [CustomVision.ai](https://customvision.ai) তে ক্লিক করি এবং সাইন ইন করে নিই যদি আগে থেকে সাইন ইন করা না থাকে। এখন `fruit-quality-detector` প্রজেক্টটি চালু করি। + +1. এখন **Settings** সিলেক্ট করি (এই ⚙ চিহ্ন) + +1. *Domains* লিস্ট থেকে, নির্বাচন করি *Food (compact)* + +1. তারপর *Export Capabilities* থেকে *Basic platforms (Tensorflow, CoreML, ONNX, ...)* সিলেক্ট করি। + +1. Settings পেইজের একদম নীচে থাকা **Save Changes** এ সিলেক্ট করি। + +1. এখন **Train** এ ক্লিক করে, *Quick training* অপশনটি নির্বাচন করে মডেলকে ট্রেইন করি। + +### Task - মডেল এক্সপোর্ট করা + +মডেলটি একবার ট্রেইন হয়ে গেলে কন্টেইনার সহ এক্সপোর্ট করতে হবে। + +1. **Performance** ট্যাবে গিয়ে কম্প্যাক্ট ডোমেইনের গত ইটারেশন টি তে যাই। + +1. সেখানে উপরের দিকে **Export** বাটনে ক্লিক করি। + +1. **DockerFile** সিলেক্ট করি, তারপর আমাদের Edge ডিভাইসের সাথে মিলে এমন একটি ভার্সন নির্বাচন করি: + + * Linux computer, Windows computer বা Virtual Machine এ IoT Edge ব্যবহার করলে, *Linux* ভার্সনটি সিলেক্ট করি। + * Raspberry Pi এ IoT Edge ব্যবহার করলে , *ARM (Raspberry Pi 3)* ভার্সনটি সিলেক্ট করি। + + > 🎓 Docker হলো কনটেইনার পরিচালনার জন্য সবচেয়ে জনপ্রিয় ট্যুলগুলির মধ্যে একটি এবং ডকার ফাইল হল কন্টেইনার সেট আপ করার জন্য নির্দেশাবলীর একটি সেট। + +1. এবার **Export** এ ক্লিক করলে Custom Vision এর প্রয়োজনীয় ফাইলগুলি তৈরী হয়ে যাবে। তারপর **Download** এ ক্লিক করে জিপ ফাইল আকারে এগুলো ডাউনলোড করি। + +1. কম্পিউটারে সেভ করার পর ফোল্ডারটি unzip করি। + +## ডেপ্লয়মেন্টের জন্য কন্টেইনার প্রস্তুতকরণ + +![Containers are built then pushed to a container registry, then deployed from the container registry to an edge device using IoT Edge](../../../../images/container-edge-flow.png) + +একবার মডেলটি ডাউনলোড করার পরে, এটি একটি কনটেইনার বিল্ড করা প্রয়োজন, তারপর একটি কনটেইনার রেজিস্ট্রিতে পুশ করতে হবে - যা একটি অনলাইন স্টোরেজ যেখানে আমরা তা সংরক্ষণ করতে পারি। IoT Edge তারপর রেজিস্ট্রি থেকে কন্টেইনারটি ডাউনলোড করে আমাদের ডিভাইসে পুশ করতে পারবে। + +![THe Azure Container Registry logo](../../../../images/azure-container-registry-logo.png) + +এই পাঠের জন্য যে কন্টেইনার রেজিস্ট্রি ব্যবহার করব তা হল Azure Container Registry। এটি কোন ফ্রী সার্ভিস নয়, তাই অর্থের অপচয় রোধ করার জন্য কাজ শেষ হওয়ার পর আমাদেরকে [clean up your project](../../../clean-up.md) অনুসরণ করে এটি বন্ধ করে দিতে হবে। + +> 💁 Azure Container Registry ব্যবহারের খরচ আমরা [Azure Container Registry pricing page](https://azure.microsoft.com/pricing/details/container-registry/?WT.mc_id=academic-17441-jabenn) থেকে দেখতে পারি । + +### কাজ - Docker ইন্সটল করা + +ক্লাসিফায়ার বিল্ড এবং ডেপলয় করার জন্য আমাদেরকে [Docker](https://www.docker.com/) ইন্সটল করে রাখতে হবে। + +1. [Docker install page](https://www.docker.com/products/docker-desktop) থেকে দেখে নিই কীভাবে এটি ইন্সটল করতে হবে। + +### কাজ - container registry resource তৈরী + +1. Azure Container Registry resource তৈরীর জন্য টার্মিনাল বা কমান্ড প্রম্পট থেকে নীচের কমান্ড রান দিই: + + ```sh + az acr create --resource-group fruit-quality-detector \ + --sku Basic \ + --name + ``` + + `` এর স্থলে একটি ইউনিক নাম দিই কেবল অক্ষর ও সংখ্যা ব্যবহার করে। এক্ষেত্রে `fruitqualitydetector`এর কাছাকাছি কোন নাম দেয়াই সমীচীন হবে। কন্টেইনার রেজিস্ট্রি তে একসেস করার জন্য URL এর একটি অংশে এই নাম ব্যবহৃত হবে। তাই নামটিকে ইউনিক হতে হবে। + +1. নিম্নের কমান্ড ব্যবহার করে Azure Container Registry তে লগিন করি: + + ```sh + az acr login --name + ``` + + `` এর স্থলে কন্টেনার রেজিস্ট্রি এর নাম বসাই + +1. Container registry টি admin mode এ সেট করি যাতে পাসওয়ার্ড সেট করা যায়ঃ + + ```sh + az acr update --admin-enabled true \ + --name + ``` + + `` এর স্থলে কন্টেনার রেজিস্ট্রি এর নাম বসাই। + +1. নিম্নের কমান্ড দিয়ে পাসওয়ার্ড সেট করি: + + ```sh + az acr credential renew --password-name password \ + --output table \ + --name + ``` + + `` এর স্থলে কন্টেনার রেজিস্ট্রি এর নাম বসাই + + `PASSWORD` এর ভ্যালুটি কপি করে কোথাও সংরক্ষণ করে রাখি কেননা পরে এটির প্রয়োজন হবে + +### কাজ - কন্টেইনার তৈরী করা + +আমরা কাস্টম ভিশন থেকে যা ডাউনলোড করেছিলাম তা একটি ডকারফাইল যা কন্টেইনারটি কীভাবে তৈরি করা উচিত তার নির্দেশাবলী, অ্যাপ্লিকেশন কোড সহ কাস্টম ভিশন মডেল হোস্ট করার প্রয়োজনীয় ফাইল এবং REST API রয়েছে। আমরা DockerFile থেকে একটি ট্যাগযুক্ত কন্টেইনার তৈরি করতে Docker ব্যবহার করতে পারি, তারপর কন্টেইনার রেজিস্ট্রিতে এটি পুশ করে দিই। + +> 🎓 কনটেইনারগুলিকে একটি ট্যাগ দেওয়া হয় যা তাদের জন্য একটি নাম এবং সংস্করণ নির্ধারণ করে। যখন একটি কন্টেইনার আপডেট করার প্রয়োজন তখন আমরা এটি একই ট্যাগ দিয়ে তৈরি করতে পারি কিন্তু ভিন্ন ভার্সনে। + +1. টার্মিনাল বা কমান্ড প্রম্পট থেকে ন্যাভিগেট করে কা্সটম ভিশনের unzipped model এ যাই। + +1. নিম্নের কমান্ড দিয়ে ইমেজগুলো বিল্ড এবং ট্যাগ করি: + + ```sh + docker build --platform -t .azurecr.io/classifier:v1 . + ``` + + এখন `` এর স্থলে যে প্লাটফর্মে কন্টেইনার রান করবে, সেটি দিই। রাস্পবেরি পাই হলে `linux/arm64`, য়ার অন্যসব কিছুতেই `linux/amd64` দিতে হবে। + + > 💁 একই ডিভাইস থেকে IoT Edge চালানো এবং এই কমান্ডঅগুলো রান করা হলে, `--platform ` অংশটি বাদ দেয়া যেতে পারে কেননা ডিফল্ট হিসেবে এটি কমান্ড চলমান ডিভাইস্টিকে সিলেক্ট করে রাখে। + + `` এর স্থলে কন্টেনার রেজিস্ট্রি এর নাম বসাই + + > 💁 লিনাক্স ব্যবহারকারী করে হলে, এই কমান্ড রান করার জন্য `sudo` যোগ করতে হতে পারে। + + Docker এখানে ইমেজ তৈরি করবে, প্রয়োজনীয় সব সফটওয়্যার কনফিগার করবে। তারপর ছবিটি `classifier:v1` হিসেবে ট্যাগ করা হবে। + + ```output + ➜ d4ccc45da0bb478bad287128e1274c3c.DockerFile.Linux docker build --platform linux/amd64 -t fruitqualitydetectorjimb.azurecr.io/classifier:v1 . + [+] Building 102.4s (11/11) FINISHED + => [internal] load build definition from Dockerfile + => => transferring dockerfile: 131B + => [internal] load .dockerignore + => => transferring context: 2B + => [internal] load metadata for docker.io/library/python:3.7-slim + => [internal] load build context + => => transferring context: 905B + => [1/6] FROM docker.io/library/python:3.7-slim@sha256:b21b91c9618e951a8cbca5b696424fa5e820800a88b7e7afd66bba0441a764d6 + => => resolve docker.io/library/python:3.7-slim@sha256:b21b91c9618e951a8cbca5b696424fa5e820800a88b7e7afd66bba0441a764d6 + => => sha256:b4d181a07f8025e00e0cb28f1cc14613da2ce26450b80c54aea537fa93cf3bda 27.15MB / 27.15MB + => => sha256:de8ecf497b753094723ccf9cea8a46076e7cb845f333df99a6f4f397c93c6ea9 2.77MB / 2.77MB + => => sha256:707b80804672b7c5d8f21e37c8396f319151e1298d976186b4f3b76ead9f10c8 10.06MB / 10.06MB + => => sha256:b21b91c9618e951a8cbca5b696424fa5e820800a88b7e7afd66bba0441a764d6 1.86kB / 1.86kB + => => sha256:44073386687709c437586676b572ff45128ff1f1570153c2f727140d4a9accad 1.37kB / 1.37kB + => => sha256:3d94f0f2ca798607808b771a7766f47ae62a26f820e871dd488baeccc69838d1 8.31kB / 8.31kB + => => sha256:283715715396fd56d0e90355125fd4ec57b4f0773f306fcd5fa353b998beeb41 233B / 233B + => => sha256:8353afd48f6b84c3603ea49d204bdcf2a1daada15f5d6cad9cc916e186610a9f 2.64MB / 2.64MB + => => extracting sha256:b4d181a07f8025e00e0cb28f1cc14613da2ce26450b80c54aea537fa93cf3bda + => => extracting sha256:de8ecf497b753094723ccf9cea8a46076e7cb845f333df99a6f4f397c93c6ea9 + => => extracting sha256:707b80804672b7c5d8f21e37c8396f319151e1298d976186b4f3b76ead9f10c8 + => => extracting sha256:283715715396fd56d0e90355125fd4ec57b4f0773f306fcd5fa353b998beeb41 + => => extracting sha256:8353afd48f6b84c3603ea49d204bdcf2a1daada15f5d6cad9cc916e186610a9f + => [2/6] RUN pip install -U pip + => [3/6] RUN pip install --no-cache-dir numpy~=1.17.5 tensorflow~=2.0.2 flask~=1.1.2 pillow~=7.2.0 + => [4/6] RUN pip install --no-cache-dir mscviplib==2.200731.16 + => [5/6] COPY app /app + => [6/6] WORKDIR /app + => exporting to image + => => exporting layers + => => writing image sha256:1846b6f134431f78507ba7c079358ed66d944c0e185ab53428276bd822400386 + => => naming to fruitqualitydetectorjimb.azurecr.io/classifier:v1 + ``` + +### কাজ - কন্টেইনারকে কন্টেইনার রেজিস্ট্রিতে পুশ করা + +1. কন্টেইনারকে কন্টেইনার রেজিস্ট্রিতে পুশ করার জন্য নিম্নের কমান্ড রান দিই: + + ```sh + docker push .azurecr.io/classifier:v1 + ``` + + `` এর স্থলে কন্টেনার রেজিস্ট্রি এর নাম বসাই + + > 💁 লিনাক্স ব্যবহারকারী করে হলে, এই কমান্ড রান করার জন্য `sudo` যোগ করতে হতে পারে। + + কন্টেইনারটি পুশ হয়ে যাবে। + + ```output + ➜ d4ccc45da0bb478bad287128e1274c3c.DockerFile.Linux docker push fruitqualitydetectorjimb.azurecr.io/classifier:v1 + The push refers to repository [fruitqualitydetectorjimb.azurecr.io/classifier] + 5f70bf18a086: Pushed + 8a1ba9294a22: Pushed + 56cf27184a76: Pushed + b32154f3f5dd: Pushed + 36103e9a3104: Pushed + e2abb3cacca0: Pushed + 4213fd357bbe: Pushed + 7ea163ba4dce: Pushed + 537313a13d90: Pushed + 764055ebc9a7: Pushed + v1: digest: sha256:ea7894652e610de83a5a9e429618e763b8904284253f4fa0c9f65f0df3a5ded8 size: 2423 + ``` + +1. Push ঠিকমত হয়েছে কিনা তা ভেরিফাই করার জন্য কন্টেইনারের লিস্ট দেখতে পারি: + + ```sh + az acr repository list --output table \ + --name + ``` + + `` এর স্থলে কন্টেনার রেজিস্ট্রি এর নাম বসাই + + ```output + ➜ d4ccc45da0bb478bad287128e1274c3c.DockerFile.Linux az acr repository list --name fruitqualitydetectorjimb --output table + Result + ---------- + classifier + ``` + + ক্লাসিফায়ারের লিস্ট চলে আসবে। + +## কন্টেইনার ডেপ্লয় করা + +কন্টেইনার এখন আইওটি এজ ডিভাইসে স্থাপন করা যেতে পারে। ডেপ্লয় করার জন্য একটি deployment manifest কে ডিফাইন করতে হবে - এটি একটি JSON ডকুমেন্ট যা Edgeডিভাইসে মডিউলগুলি তালিকাভুক্ত করে। + +### কাজ - deployment manifest তৈরী করা + +1. আমাদের কম্পিউটারে `deployment.json` নামে একটি ফাইল তৈরী করি। + +1. নিম্নের অংশটুকু সেই ফাইলে যোগ করি: + + ```json + { + "content": { + "modulesContent": { + "$edgeAgent": { + "properties.desired": { + "schemaVersion": "1.1", + "runtime": { + "type": "docker", + "settings": { + "minDockerVersion": "v1.25", + "loggingOptions": "", + "registryCredentials": { + "ClassifierRegistry": { + "username": "", + "password": "", + "address": ".azurecr.io" + } + } + } + }, + "systemModules": { + "edgeAgent": { + "type": "docker", + "settings": { + "image": "mcr.microsoft.com/azureiotedge-agent:1.1", + "createOptions": "{}" + } + }, + "edgeHub": { + "type": "docker", + "status": "running", + "restartPolicy": "always", + "settings": { + "image": "mcr.microsoft.com/azureiotedge-hub:1.1", + "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}" + } + } + }, + "modules": { + "ImageClassifier": { + "version": "1.0", + "type": "docker", + "status": "running", + "restartPolicy": "always", + "settings": { + "image": ".azurecr.io/classifier:v1", + "createOptions": "{\"ExposedPorts\": {\"80/tcp\": {}},\"HostConfig\": {\"PortBindings\": {\"80/tcp\": [{\"HostPort\": \"80\"}]}}}" + } + } + } + } + }, + "$edgeHub": { + "properties.desired": { + "schemaVersion": "1.1", + "routes": { + "upstream": "FROM /messages/* INTO $upstream" + }, + "storeAndForwardConfiguration": { + "timeToLiveSecs": 7200 + } + } + } + } + } + } + ``` + + > 💁 এই ফাইলটি [code-deployment/deployment](code-deployment/deployment) folder এ পাওয়া যাবে। + + ৩টি `` এর জায়গায় আমাদের ব্যবহৃত container registry এর নাম বসাই। ১টি `ImageClassifier` মডিউলে, বাকি ২টি `registryCredentials` অংশে রয়েছে। + + এখন `` অংশের `registryCredentials` সেকশনে পাসওয়ার্ড দিই। + +1. যে ফোল্ডারে deployment manifest রয়েছে সেখানে নিম্নের কমান্ড রান করি: + + ```sh + az iot edge set-modules --device-id fruit-quality-detector-edge \ + --content deployment.json \ + --hub-name + ``` + + `` এর স্থলে আমাদের IoT Hub এর নাম বসাই। + + Edge ডিভাইসে ইমেজ ক্লাসিফায়ার মডিউলটি ডেপ্লয় হয়ে যাবে। + +### কাজ - ক্লাসিফায়ারটি চলছে কিনা তা ভেরিফাই করা + +1. IoT edge device এ কানেক্ট করা: + + * Raspberry Pi ব্যবহারকারী হলে, কানেক্ট করতে হবে হয় ssh দিয়ে terminal থেকে থেকে অথবা কোন VS Code থেকে কোন remote SSH session ব্যবহার করে। + * উইন্ডোজে Linux container ব্যবহারকারী হলে, [verify successful configuration guide](https://docs.microsoft.com/azure/iot-edge/how-to-install-iot-edge-on-windows?WT.mc_id=academic-17441-jabenn&view=iotedge-2018-06&tabs=powershell#verify-successful-configuration) টি অনুসরণ করতে হবে। + * Virtual machine ব্যবহারকারী হলে, `adminUsername` এবং `password` সেট করার সময়ই SSH করে রাখা যায় + + ```sh + ssh @ + ``` + + অথবা: + + ```sh + ssh @ + ``` + + পাসওয়ার্ড চাইলে, তা প্রবেশ করাই। + +1. কানেক্ট হয়ে গেলে, IoT Edge module গুলো দেখার জন্য নিম্নের কমান্ড রান দিই : + + ```sh + iotedge list + ``` + + > 💁 এখানে `sudo` কমান্ড ব্যবহারের প্রয়োজন হতে পারে। + + রানিং মডিউলগুলো দেখা যাবে: + + ```output + jim@fruit-quality-detector-jimb:~$ iotedge list + NAME STATUS DESCRIPTION CONFIG + ImageClassifier running Up 42 minutes fruitqualitydetectorjimb.azurecr.io/classifier:v1 + edgeAgent running Up 42 minutes mcr.microsoft.com/azureiotedge-agent:1.1 + edgeHub running Up 42 minutes mcr.microsoft.com/azureiotedge-hub:1.1 + ``` + +1. Image classifier module এর লগ হিস্টোরি দেখতে নিম্নের কমান্ড রান দিই : + + ```sh + iotedge logs ImageClassifier + ``` + + > 💁 এই কমান্ড এর সাথে `sudo` ব্যবহারের প্রয়োজন হতে পারে। + + ```output + jim@fruit-quality-detector-jimb:~$ iotedge logs ImageClassifier + 2021-07-05 20:30:15.387144: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA + 2021-07-05 20:30:15.392185: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2394450000 Hz + 2021-07-05 20:30:15.392712: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55ed9ac83470 executing computations on platform Host. Devices: + 2021-07-05 20:30:15.392806: I tensorflow/compiler/xla/service/service.cc:175] StreamExecutor device (0): Host, Default Version + Loading model...Success! + Loading labels...2 found. Success! + * Serving Flask app "app" (lazy loading) + * Environment: production + WARNING: This is a development server. Do not use it in a production deployment. + Use a production WSGI server instead. + * Debug mode: off + * Running on http://0.0.0.0:80/ (Press CTRL+C to quit) + ``` + +### কাজ - ইমেজ ক্লাসিফায়ার টেস্ট করা + +1. CURL দিয়ে image classifier টেস্ট করা যায় যেখানে IP address বা আমাদের কম্পিউটারের হোস্ট নেইম ব্যবহার করা হবে যেটিতে IoT Edge agent চলমান রয়েছে। IP address খুজে বের করি: + + * IoT Edge যে মেশিনে রান হুচ্ছে সেটি থেকে কাজ করলে, হোস্ট নেম হবে `localhost` । + * VM (ভার্চুয়াল মেশিন) থেকে কাজ করলে IP address অথবা ভিএম এর DNS name দিতে হবে। + * অন্যথায় IoT Edge যে মেশিনে চলছে সেটির আইপি এড্রেস জানার অন্য, যা করতে হবে তা হলো: + * Windows 10 এ [find your IP address guide](https://support.microsoft.com/windows/find-your-ip-address-f21a9bbc-c582-55cd-35e0-73431160a1b9?WT.mc_id=academic-17441-jabenn) অনুসরণ করি। + * macOS হলে [how to find you IP address on a Mac guide](https://www.hellotech.com/guide/for/how-to-find-ip-address-on-mac) অনুসরণ করি। + * linux হলে, [how to find your IP address in Linux guide](https://opensource.com/article/18/5/how-find-ip-address-linux) থেকে প্রাইভেট এড্রেসের অংশটি অনুসরণ করি। + +1. কন্টেইনারকে লোকাল ফাইল দিয়ে টেস্ট করতে নীচের curl কমান্ড ব্যবহার করি: + + ```sh + curl --location \ + --request POST 'http:///image' \ + --header 'Content-Type: image/png' \ + --data-binary '@' + ``` + + `` এর জায়গায় আমাদের IP address বা host name দিই যেটি থেকে IoT Edge চলছে এবং `` ঙ্গের জায়গায় যে ফাইল দিয়ে টেস্ট করা হবে, সেটির নাম দিই। + + আউটপুটে প্রেডিকশন রেজাল্ট দেখা যাবে। + + ```output + { + "created": "2021-07-05T21:44:39.573181", + "id": "", + "iteration": "", + "predictions": [ + { + "boundingBox": null, + "probability": 0.9995615482330322, + "tagId": "", + "tagName": "ripe" + }, + { + "boundingBox": null, + "probability": 0.0004384400090202689, + "tagId": "", + "tagName": "unripe" + } + ], + "project": "" + } + ``` + + > 💁 এখানে একটি প্রেডিকশন কী (key) সরবরাহ করার প্রয়োজন নেই, কারণ এটি Azure রিসোর্স ব্যবহার করছে না। পাবলিক এন্ডপয়েন্ট এবং এপিআই কী (key) -এর উপর নির্ভর না করে, এর পরিবর্তে অভ্যন্তরীণ নিরাপত্তার প্রয়োজনের ভিত্তিতে অভ্যন্তরীণ নেটওয়ার্কে নিরাপত্তা কনফিগার করা হবে। + +## আমাদের IoT Edge device ব্যবহার করা + +এখন যেহেতু ইমেজ ক্লাসিফায়ার একটি আইওটি এজ ডিভাইসে স্থাপন করা হয়েছে, এটি আমাদের আইওটি ডিভাইস থেকে ব্যবহার করতে পারবো। + +### কাজ - আমাদের IoT Edge device ব্যবহার + +IoT Edge classifier দিয়ে ছবি ক্লাসিফাই করতে, নিম্নের গাইডগুলো অনুসরণ করি: + +* [Arduino - Wio Terminal](../wio-terminal.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](../single-board-computer.md) + +### Model retraining + +IoT Edge- এ ইমেজ ক্লাসিফায়ার চালানোর একটি সমস্যা হল এগুলি কাস্টম ভিশন প্রজেক্টের সাথে সংযুক্ত নয়। যদি কাস্টম ভিশনে **Predictions** ট্যাবটি দেখি, তবে এজ-ভিত্তিক ক্লাসিফায়ার ব্যবহার করে শ্রেণীবদ্ধ করা ছবিগুলি দেখতে পাব না। + +সত্যি বলতে গেলে এটি একেবারে প্রত্যাশিত একটি আচরণ - ছবিগুলি ক্লাউডে শ্রেণিবিন্যাসের জন্য পাঠানো হয় না, তাই সেগুলি ক্লাউডে পাওয়া যাবে না। আইওটি এজ ব্যবহার করার একটি সুবিধা হল গোপনীয়তা, নিশ্চিত করা যে ছবিগুলি আমাদের নেটওয়ার্ক এর বাইরে যাবেনা। আবার এটি অফলাইনে কাজ করতে সক্ষম হচ্ছে, তাই যখন ডিভাইসে ইন্টারনেট সংযোগ নেই তখন ছবি আপলোড করার উপর নির্ভর করে না। নেতিবাচক দিকটি হলো যে আমাদের মডেলের উন্নতি ঠিকমত হচ্ছেনা - আমাদেরকে ইমেজ ক্লাসিফায়ারের উন্নতি এবং পুনরায় প্রশিক্ষণের জন্য ম্যানুয়ালি পুনরায় ক্লাসিফাই করা যায় এমন ছবি সংরক্ষণের অন্য উপায় বাস্তবায়ন করতে হবে। + + +✅ ক্লাসিফায়ার পুনরায় প্রশিক্ষণ দেওয়ার জন্য ছবি আপলোড করার উপায় সম্পর্কে চিন্তা করি। + +--- + +## 🚀 চ্যালেঞ্জ + +Edge ডিভাইসে AI মডেল চালানো ক্লাউডের তুলনায় দ্রুততর হতে পারে - কারণ সেখানে network hop ছোট । তবে হার্ডওয়্যার এর ফলে তা ধীরও হতে পারে ,আর তাই মডেলটি ক্লাউডের মতো শক্তিশালী নাও হতে পারে। + +সময়ক্ষেপন এর নোট নিই এবং তুলনা করি আমাদের Edge ডিভাইসে কাজ, ক্লাউডে কাজ করার চেয়ে দ্রুত বা ধীর - কোনটি ঘটে? পার্থক্য এর কারণ, বা পার্থক্য না থাকলে সেটি সম্পর্কে চিন্তা করি। বিশেষ হার্ডওয়্যার ব্যবহার করে Edge ডিভাইসে এআই মডেলগুলি দ্রুত চালানোর উপায়গুলি গবেষণা করি। + + +## লেকচার-পরবর্তী কুইজ + +[লেকচার-পরবর্তী কুইজ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/34) + +## রিভিউ এবং স্ব-অধ্যয়ন + +* কন্টেইনার সম্পর্কে জানতে পড়তে পারি - [OS-level virtualization page on Wikipedia](https://wikipedia.org/wiki/OS-level_virtualization) +* Edge computing সম্পর্কে জানতে হলে, পড়তে পারি - [what is edge computing and why does it matter? article on NetworkWorld](https://www.networkworld.com/article/3224893/what-is-edge-computing-and-how-it-s-changing-the-network.html) +* IoT Edge এ চলমান AI service সম্পর্কে জানতে হলে, পড়তে পারি - [learn how to use Azure IoT Edge on a pre-built AI service on the Edge to do language detection episode of Learn Live on Microsoft Channel9](https://channel9.msdn.com/Shows/Learn-Live/Sharpen-Your-AI-Edge-Skills-Episode-4-Learn-How-to-Use-Azure-IoT-Edge-on-a-Pre-Built-AI-Service-on-t?WT.mc_id=academic-17441-jabenn) + +## এসাইনমেন্ট + +[Edge এ বিভিন্ন সার্ভিস পরিচালনা করা](assignment.bn.md) diff --git a/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/assignment.bn.md b/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/assignment.bn.md new file mode 100644 index 00000000..e5adf974 --- /dev/null +++ b/4-manufacturing/lessons/3-run-fruit-detector-edge/translations/assignment.bn.md @@ -0,0 +1,14 @@ +# Edge এ বিভিন্ন সার্ভিস পরিচালনা করা + +## নির্দেশাবলী + +Edge এ যে কেবল ইমেজ ক্লাসিফায়ার চালানো যায় তা কিন্তু নয়, বরং যেকোন কাজ যা একটি কন্টেইনারে প্যাকেজ করা যায় তা IoT Edge ডিভাইসে স্থাপন করা যেতে পারে। সার্ভারলেস কোড যা Azure Functions হিসাবে চলে, যেমন আগের লেসনগুলিতে তৈরি ট্রিগারগুলি কন্টেইনারে চালানো যেতে পারে এবং এর জন্য IoT Edge এও তা চলবে। + +পূর্ববর্তী পাঠগুলির মধ্যে একটি বেছে নিই এবং IoT Edge কন্টেইনারে Azure Functions অ্যাপটি চালানোর চেষ্টা করি। কিভাবে একটি ভিন্ন Functions App প্রজেক্ট ব্যবহার করে করা যায় তার জন্য [টিউটোরিয়াল: Azure Functions কে IoT Edge modules হিসেবে ডেপ্লয় করা](https://docs.microsoft.com/azure/iot-edge/tutorial-deploy-function?WT.mc_id=academic-17441-jabenn&view=iotedge-2020-11) দেখতে পারি। + + +## এসাইনমেন্ট মূল্যায়ন মানদন্ড + +| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | উন্নতি প্রয়োজন (নিম্নমান) | +| --------- | ------------------ | -------------- | -------------------- | +| Azure Functions কে IoT Edge এ ডেপ্লয় করা | IoT Edge এ একটি Azure Functions App ডেপ্লয় করে, আইওটি ডেটা থেকে ট্রিগার চালানোর জন্য আইওটি ডিভাইসের সাথে এটি ব্যবহার করতে সফল হয়েছিল | IoT Edge এ একটি Functions App স্থাপন করতে সক্ষম হয়েছিল, কিন্তু ট্রিগারটি দিয়ে কাজ সম্পন্ন করতে পারেনি | IoT Edge এ একটি Functions App স্থাপন করতে ব্যার্থ ছিল| From 3456c02ff15502e31fb65f25adfd1de3ad0cdbac Mon Sep 17 00:00:00 2001 From: Mirza Nihal Baig <53098259+nihalbaig0@users.noreply.github.com> Date: Thu, 21 Oct 2021 01:07:48 +0600 Subject: [PATCH 12/36] [BN Translation] Check Fruit from Device Assignment (#335) * [BN Translation] Check Fruit from Device * deleted dummy.md * check fruit from device changed based on review * removed the english sentence that was translated * [BN Translation] translated assignment and updated path in readme file Co-authored-by: Jim Bennett --- .../translations/README.bn.md | 2 +- .../translations/assignment.bn.md | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 4-manufacturing/lessons/2-check-fruit-from-device/translations/assignment.bn.md diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md b/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md index bfa11bdf..fff56fb2 100644 --- a/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md +++ b/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md @@ -205,4 +205,4 @@ model কে উন্নত করার জন্য, আমরা IoT ডি ## এসাইনমেন্ট -[ক্লাসিফিকেশন রেজাল্টের প্রতিক্রিয়া জানানো](../assignment.md) +[ক্লাসিফিকেশন রেজাল্টের প্রতিক্রিয়া জানানো](./assignment.bn.md) diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/translations/assignment.bn.md b/4-manufacturing/lessons/2-check-fruit-from-device/translations/assignment.bn.md new file mode 100644 index 00000000..268e610c --- /dev/null +++ b/4-manufacturing/lessons/2-check-fruit-from-device/translations/assignment.bn.md @@ -0,0 +1,13 @@ +# ক্লাসিফিকেশন রেজাল্টের প্রতিক্রিয়া জানানো + +## নির্দেশাবলী + +আমাদের ডিভাইস ইমেজ ক্লাসিফাই করেছে, এবং প্রেডিকশনের মান গুলো আছে। আমাদের ডিভাইস এই তথ্য গুলো দিয়ে কিছু করতে পারে - এটা প্রসেসিং এর জন্য IoT Hub এ পাঠাতে পারে অন্য সিস্টেম গুলো দিয়ে, অথবা এটা একটা actuator কন্ট্রোল করতে পারে যেমন LED আলোকিত হবে যখন ফল কাঁচা। + +আমাদের ডিভাইস এ আমাদের মত করে প্রতিক্রিয়া জানাতে পারে এমন ভাবে কোড করি - হয় IoT Hub এ ডাটা পাঠাবে , actuator কন্ট্রোল করবে, অথবা দুটো কে একত্রিত করবে এবং IoT Hub এ ডাটা পাঠাবে কিছু সার্ভারলেস কোড দিয়ে যেটা নির্ধারণ করবে ফল টা পাকা নাকি না এবং actuator কন্ট্রোল করার একটি কমান্ড ফেরত পাঠাবে। + +## এসাইনমেন্ট মূল্যায়ন মানদন্ড + +| ক্রাইটেরিয়া | দৃষ্টান্তমূলক (সর্বোত্তম) | পর্যাপ্ত (মাঝারি) | উন্নতি প্রয়োজন (নিম্নমান) | +| --------- | ------------------ | -------------- | -------------------- | +| প্রেডিকশনের প্রতিক্রিয়া জানানো | প্রেডিকশনের প্রতিক্রিয়া বাস্তবায়ন করতে পেরেছে যেটা একই মানের প্রেডিকশনের সাথে ধারাবাহিকভাবে ভাবে কাজ করতে পারে | প্রেডিকশনের উপর নির্ভরশীল না এমন প্রতিক্রিয়া বাস্তবায়ন করতে পেরেছে, যেমন IoT Hub এ মূল ডাটা প্রেরণ করতে পারে| ডিভাইস টাকে প্রেডিকশনের প্রতিক্রিয়া দেখানোর প্রোগ্রাম করতে পারে নাই | \ No newline at end of file From 48c96092b574164f3c247bb7fed19da9f4a9866f Mon Sep 17 00:00:00 2001 From: Jim Bennett Date: Wed, 20 Oct 2021 12:53:41 -0700 Subject: [PATCH 13/36] Update pi-text-to-speech.md --- .../3-spoken-feedback/pi-text-to-speech.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md b/6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md index 2447dc5d..f8e7befe 100644 --- a/6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md +++ b/6-consumer/lessons/3-spoken-feedback/pi-text-to-speech.md @@ -103,21 +103,21 @@ Each language supports a range of different voices, and you can make a REST requ ```python def play_speech(speech): - with wave.open(speech, 'rb') as wave_file: - stream = audio.open(format=audio.get_format_from_width(wave_file.getsampwidth()), - channels=wave_file.getnchannels(), - rate=wave_file.getframerate(), - output_device_index=speaker_card_number, - output=True) + with wave.open(speech, 'rb') as wave_file: + stream = audio.open(format=audio.get_format_from_width(wave_file.getsampwidth()), + channels=wave_file.getnchannels(), + rate=wave_file.getframerate(), + output_device_index=speaker_card_number, + output=True) - data = wave_file.readframes(4096) - - while len(data) > 0: - stream.write(data) data = wave_file.readframes(4096) - stream.stop_stream() - stream.close() + while len(data) > 0: + stream.write(data) + data = wave_file.readframes(4096) + + stream.stop_stream() + stream.close() ``` This code uses a PyAudio stream, the same as capturing audio. The difference here is the stream is set as an output stream, and data is read from the audio data and pushed to the stream. From 2bf8b24c6113cb7142a15dcc0ab28aa65f729ed8 Mon Sep 17 00:00:00 2001 From: "Mohammad Iftekher (Iftu) Ebne Jalal" Date: Tue, 26 Oct 2021 21:05:01 +0600 Subject: [PATCH 14/36] [Bn Translation] Fixes (#336) * Quick Fix BN Translation * Update README.bn.md * Update README.bn.md * Update BN check-fruit-from-device --- .../translations/README.bn.md | 87 ++++++------------- translations/README.bn.md | 2 +- 2 files changed, 28 insertions(+), 61 deletions(-) diff --git a/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md b/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md index fff56fb2..eb5ce53e 100644 --- a/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md +++ b/4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md @@ -10,123 +10,98 @@ ## সূচনা -পূর্ববর্তী লেসন এ আমরা ইমেজ ক্লাসিফায়ার নিয়ে জানলাম, এবং কিভাবে তাদের train করা যায় ভাল এবং খারাপ ফল সনাক্ত করার জন্য। এই ইমেজ ক্লাসিফায়ার টাকে IoT এপ্লিকেশন এ ব্যবহার করতে আমাদেরকে কোনো ধরনের ক্যামেরা দিয়ে ইমেজ ক্যাপচার করতে হবে এবং এই ইমেজ টাকে ক্লাউড এ পাঠাতে হবে। +পূর্ববর্তী লেসন এ আমরা ইমেজ ক্লাসিফায়ার নিয়ে জানলাম এবং আরো জেনেছি কিভাবে তাদেরকে প্রশিক্ষিত (train) করা যায় ভাল এবং খারাপ ফল সনাক্ত করার জন্য। এই ইমেজ ক্লাসিফায়ার IoT এপ্লিকেশন এ ব্যবহার করতে আমাদেরকে কোনো ধরনের ক্যামেরা দিয়ে ইমেজ ক্যাপচার করতে হবে এবং সেই ইমেজটি ক্লাউড এ পাঠাতে হবে। -এই লেসন এ আমরা ক্যামেরা সেন্সর নিয়ে জানবো , এবং কিভাবে এগুলোকে IoT ডিভাইস এর সাথে ব্যবহার করে ইমেজ ক্যাপচার করতে হয়। আমরা আরো জানবো কিভাবে ইমেজ ক্লাসিফায়ারটাকে IoT ডিভাইস থেকে কল করতে হয়। +এই লেসন এ আমরা ক্যামেরা সেন্সর নিয়ে জানবো এবং কিভাবে এগুলোকে IoT ডিভাইস এর সাথে ব্যবহার করে ইমেজ ক্যাপচার করতে হয় তা শিখবো। এছাড়াও আমরা দেখবো কিভাবে ইমেজ ক্লাসিফায়ারকে IoT ডিভাইস থেকে কল করতে হয়। এই লেসন এ আমরা কভার করবোঃ * [ক্যামেরা সেন্সর](#ক্যামেরা-সেন্সর) -* [IoT ডিভাইস ব্যবহার করে একটি ইমেজ ক্যাপচার করা](#IoT-ডিভাইস-ব্যাবহার-করে-একটি-ইমেজ-ক্যাপচার-করা) +* [IoT ডিভাইস ব্যবহার করে ইমেজ ক্যাপচার করা](#IoT-ডিভাইস-ব্যবহার-করে-ইমেজ-ক্যাপচার-করা) * [আমাদের ইমেজ ক্লাসিফায়ার পাবলিশ করি](#আমাদের-ইমেজ-ক্লাসিফায়ার-পাবলিশ-করি) * [IoT ডিভাইস থেকে ইমেজ ক্লাসিফাই করা](#IoT-ডিভাইস-থেকে-ইমেজ-ক্লাসিফাই-করা) * [Model উন্নত করা](#Model-উন্নত-করা) - - ## ক্যামেরা সেন্সর -ক্যামেরা সেন্সর, তার নামের মতই এমন ক্যামেরা যা IoT ডিভাইস এর সাথে কানেক্ট করা যায়। এগুলো স্থিরচিত্র অথবা স্ট্রিমিং ভিডিও ক্যাপচার করতে পারে, কিছু ডিভাইস গুলো মূল ইমেজ ডাটা ফেরত পাঠাই , বাকি গুলো ইমেজ ডাটা কমপ্রেস করে JPEG অথবা PNG টাইপ এর ইমেজ ফাইল বানাবে। সাধারণত যে কামেরা গুলো IoT ডিভাইস গুলোর সাথে ব্যবহার করা হয় আমরা যেগুলো ব্যবহার করে অভ্যস্ত সেগুলো থেকে অনেক ছোট সাইজ এর এবং কম রেজোলিউশান এর, কিন্তু আমরা হাই রেজোলিউশান এর ক্যামেরা নিতে পারি যেগুলো আধুনিক ফোন গুলার সাথে টেক্কা দেয়। আমরা সব ধরনের ইন্টারচেঞ্জেবল লেন্স , কয়েকটা ক্যামেরা সেটাপ , ইনফ্রারেড থার্মাল ক্যামেরা অথবা ইউভি ক্যামেরা নিতে পারি। +ক্যামেরা সেন্সর, তার নামের মতই এমন ক্যামেরা যা IoT ডিভাইস এর সাথে কানেক্ট করা যায়। এগুলো স্থিরচিত্র অথবা স্ট্রিমিং ভিডিও ক্যাপচার করতে পারে, কিছু ডিভাইস গুলো মূল ইমেজ ডাটা ফেরত পাঠাই , বাকি গুলো ইমেজ ডাটা কমপ্রেস করে JPEG অথবা PNG টাইপ এর ইমেজ ফাইল বানাবে। সাধারণত যে কামেরা গুলো IoT ডিভাইস গুলোর সাথে ব্যবহার করা হয় আমরা যেগুলো ব্যবহার করে অভ্যস্ত সেগুলো থেকে অনেক ছোট সাইজ এর এবং কম রেজোলিউশান এর, কিন্তু আমরা হাই রেজোলিউশান এর ক্যামেরা নিতে পারি যেগুলো আধুনিক ফোন গুলার সাথে টেক্কা দেয়। আমরা সব ধরনের ইন্টারচেঞ্জেবল লেন্স, কয়েকটা ক্যামেরা সেটাপ, ইনফ্রারেড থার্মাল ক্যামেরা অথবা ইউভি ক্যামেরা নিতে পারি। ![The light from a scene passes through a lens and is focused on a CMOS sensor](../../../../images/cmos-sensor.png) -বেশিরভাগ ক্যামেরা সেন্সর ইমেজ সেন্সর ব্যবহার করে যেখানে প্রত্যেক পিক্সেল হল ফটোডায়োড। একটা লেন্স ইমেজ সেন্সর এর উপর ইমেজ টাকে ফোকাস করে এবং হাজার অথবা লক্ষ লক্ষ ফটোডায়োড। প্রত্যেকের উপর পরা আলো ডিটেক্ট করে , এবং পিক্সেল ডাটা হিসাবে রেকর্ড করে। - - - -> 💁 লেন্স ইমেজ কে উল্টায়, পরে ক্যামেরা সেন্সর আবার ঠিক ভাবে ইমেজ টাকে উল্টায়। ঠিক একই রকম আমাদের চোখে হয় - আমরা যা দেখি তা চোখের পিছনে -উল্টো ভাবে ডিটেক্ট করে এবুং ব্রেন সেটাকে ঠিক করে। - +বেশিরভাগ ক্যামেরা সেন্সর ইমেজ সেন্সর ব্যবহার করে যেখানে প্রত্যেক পিক্সেল হল ফটোডায়োড। একটা লেন্স ইমেজ সেন্সর এর উপর ইমেজ টাকে ফোকাস করে এবং হাজার অথবা লক্ষ লক্ষ ফটোডায়োড প্রত্যেকে তার উপর আপতিত আলো ডিটেক্ট করে এবং পিক্সেল ডাটা হিসাবে রেকর্ড করে। +> 💁 লেন্স ইমেজ কে উল্টায়, পরে ক্যামেরা সেন্সর আবার ঠিক ভাবে ইমেজটাকে উল্টায়। ঠিক একই রকম আমাদের চোখে হয় - আমরা যা দেখি তা চোখের পিছনে উল্টো ভাবে ডিটেক্ট করে এবুং ব্রেন সেটাকে ঠিক করে। > 🎓 ইমেজ সেন্সরটা একটিভ-পিক্সেল সেন্সর (APS) হিসেবে পরিচিত, এবং সবচেয়ে জনপ্রিয় টাইপ এর APS হল কমপ্লিমেন্টারি মেটাল-অক্সাইড সেমিকন্ডাক্টর সেন্সর, অথবা CMOS। আমরা শুনে থাকতে পারি ক্যামেরা সেন্সর এ CMOS সেন্সর ব্যবহার এর টার্ম টা। - - ক্যামেরা সেন্সর হল ডিজিটাল সেন্সর , ইমেজ ডাটা কে ডিজিটাল ডাটা হিসেবে পাঠায়, সাধারণত যে লাইব্রেরি কমিউনিকেশন প্রদান করে তার সাহায্য নিয়ে, ক্যামেরা গুলো কানেক্ট করে SPI এর মত প্রোটকল ব্যবহার করে যা তাদের বড় পরিমাণে ডাটা পাঠাতে অনুমোদন দেয় - ইমেজ গুলো temperature সেন্সর এর মত সেন্সর থেকে পাওয়া সিংগেল নাম্বার থেকে যথেষ্ট পরিমাণে বড়। ✅ IoT ডিভাইস গুলোর ইমেজ সাইজ এর সীমাবদ্ধতা কি কি? সীমাবদ্ধতাগুলো চিন্তা করি বিশেষ করে মাইক্রোকন্ট্রোলার হার্ডওয়ার এর উপর। +## IoT ডিভাইস ব্যবহার করে ইমেজ ক্যাপচার করা -## IoT ডিভাইস ব্যবহার করে একটি ইমেজ ক্যাপচার করা - -আমরা আমাদের IoT ডিভাইস ক্যাপচার এবুং ইমেজ ক্লাসিফাই করতে ব্যবহার করতে পারি। +আমরা আমাদের IoT ডিভাইস ক্যাপচার এবং ইমেজ ক্লাসিফাই করতে ব্যবহার করতে পারি। ### কাজ - IoT ডিভাইস ব্যবহার করে ইমেজ ক্যাপচার করা নিম্নের কোন একটি প্রাসঙ্গিক গাইড এর মাধ্যমে IoT ডিভাইস ব্যবহার করে ইমেজ ক্যাপচার করিঃ -* [Arduino - Wio Terminal](wio-terminal-camera.md) -* [Single-board computer - Raspberry Pi](pi-camera.md) -* [Single-board computer - Virtual device](virtual-device-camera.md) - +* [Arduino - Wio Terminal](../wio-terminal-camera.md) +* [Single-board computer - Raspberry Pi](../pi-camera.md) +* [Single-board computer - Virtual device](../virtual-device-camera.md) ## আমাদের ইমেজ ক্লাসিফায়ার পাবলিশ করি আমরা শেষ লেসন এ ইমেজ ক্লাসিফায়ার ট্রেন করেছিলাম। IoT ডিভাইস এটা ব্যবহার করার আগে, আমাদের model তা পাবলিশ করতে হবে। - ### Model Iteration -যখন আমাদের model শেষ লেসন এ ট্রেন হচ্ছিলো, আমরা হয়ত খেয়াল করছিলাম যে **Performance** ট্যাব সাইড এ Iterationগুলো দেখায়। যখন আমরা প্রথম model টা ট্রেন করি তখন আমরা দেখে থাকতে পারি *Iteration 1* ট্রেইনিং এ। যখন আমরা model টাকে প্রেডিকশন ইমেজ ব্যবহার করে আরো উন্নত করি, তখন আমরা দেখে থাকতে পারি *Iteration 2* ট্রেইনিং এ। +যখন আমাদের মডেলে শেষ লেসন এ ট্রেনিং হচ্ছিলো, আমরা হয়ত খেয়াল করছিলাম যে **Performance** ট্যাব সাইড এ Iteration গুলো দেখায়। যখন আমরা প্রথম model টা ট্রেন করি তখন আমরা দেখে থাকতে পারি *Iteration 1* ট্রেইনিং এ। যখন আমরা model টাকে প্রেডিকশন ইমেজ ব্যবহার করে আরো উন্নত করি, তখন আমরা দেখে থাকতে পারি *Iteration 2* ট্রেইনিং এ। প্রতেকবার আমরা যখন model টাকে ট্রেইন করি, আমরা নতুন Iteration পাই। এভাবে আমরা বিভিন্ন ডাটাসেট এর উপর ট্রেইন করা আমাদের model এর বিভিন্ন ভার্সন ট্র্যাক করতে পারি। যখন আমরা **Quick Test** করি, এখানে আমরা Iteration সিলেক্ট করার একটি ড্রপডাউন মেনু পাই, যেন আমরা বিভিন্ন Iteration এর রেজাল্ট তুলনা করতে পারি। যখন আমরা একটি Iteration নিয়ে সন্তুষ্ট হই, আমরা এটাকে পাবলিশ করতে পারি এক্সটার্নাল এপ্লিকেশন থেকে ব্যবহার সহজলভ্য করার জন্য। এভাবে আমরা আমাদের ডিভাইস দিয়ে ব্যবহার করা একটি পাবলিক ভার্সন পেতে পারি, পরে আরো নতুন কিছু Iteration এর উপর নতুন ভার্সন নিয়ে কাজ করতে পারি, পরে যখন আমরা এটা নিয়ে সন্তুষ্ট হব তখন এটা পাবলিশ করতে পারি। - - - ### কাজ - Iteration পাবলিশ করা - -Iteration হল কাস্টম ভিসন পোর্টাল । - - +Iteration গুলো কাস্টম ভিসন পোর্টাল থেকে পাবলিশ করতে হয়। 1. [CustomVision.ai](https://customvision.ai) তে কাস্টম ভিসন পোর্টাল লঞ্চ করি এবং সাইন ইন করি যদি ইতিমধ্যে এটা খুলে না থাকি। পরে আমাদের `fruit-quality-detector` প্রোজেক্ট খুলি। - 1. উপরের অপশন থেকে **Performance** ট্যাব সিলেক্ট করি। - 1. সাইড এর *Iterations* লিস্ট থেকে সর্বশেষ Iteration সিলেক্ট করি। - - - 1. Iteration এর জন্য **Publish** বাটন সিলেক্ট করি। ![The publish button](../../../../images/custom-vision-publish-button.png) - - 1. *Publish Model* ডায়লগ এ, *Prediction resource* এ আগের লেসন এ আমাদের তৈরি রিসোর্স `fruit-quality-detector-prediction` সেট করি। নাম হিসেবে `Iteration2` রাখি, এবং **Publish** বাটন সিলেক্ট করি। -1. একবার পাবলিশ করা হলে, **Prediction URL** বাটন সিলেক্ট করি। এটা প্রেডিকশন এপিআই এর ডিটেলস দেখাবে, এবং আমাদের IoT ডিভাইস থেকে model কে কল করতে এগুলো দরকার হবে। নিচের সেকশন কে *If you have an image file* হিসেবে লেবেল করা , এবং এই ডিটেইল গুলো আমরা চাই। দেখানো URL এর কপি করি যেটা কিছু টা এরকম হবেঃ +1. একবার পাবলিশ করা হলে, **Prediction URL** বাটন সিলেক্ট করি। এটা প্রেডিকশন এপিআই এর ডিটেলস দেখাবে, এবং আমাদের IoT ডিভাইস থেকে model কে কল করতে এগুলো দরকার হবে। নিচের সেকশন কে *If you have an image file* হিসেবে লেবেল করা এবং এই ডিটেইল গুলো আমরা চাই। দেখানো URL এর কপি করি যেটা কিছু টা এরকম হবেঃ ```output https://.api.cognitive.microsoft.com/customvision/v3.0/Prediction//classify/iterations/Iteration2/image ``` যেখানে `` হবে কাস্টম ভিসন পোর্টাল রিসোর্স তৈরি করার সময় ব্যবহার করা লোকেশন, এবং `` হবে অনেকগুলো লেটার এবং নাম্বার দিয়ে তৈরি করা লম্বা আইডি। - এছাড়াও *Prediction-Key* ভ্যালু এর একটি কপি নিই। এটা একটি সিকিউরড কি যেটা model কে কল করার সময় পাস করা হয়। শুধুমাত্র যে আপ্লিকেশন গুলো এই কি পাস করবে তাদেরকে model টা ব্যবহার করতে দেয়া হবে, অন্য সব আপ্লিকেশন কে প্রত্যাখ্যান হবে। + এছাড়াও *Prediction-Key* ভ্যালু এর একটি কপি নিই। এটা একটি সিকিউরড কী (KEY) যেটা model কে কল করার সময় পাস করা হয়। শুধুমাত্র যে আপ্লিকেশন গুলো এই কি পাস করবে তাদেরকে model টা ব্যবহার করতে দেয়া হবে, অন্য সব আপ্লিকেশন কে প্রত্যাখ্যান হবে। ![The prediction API dialog showing the URL and key](../../../../images/custom-vision-prediction-key-endpoint.png) -✅ যখন একটি নতুন Iteration পাবলিশ করা হয়, তখন এটার অন্য নাম থাকে।ন IoT ডিভাইস এর ব্যবহার করা Iteration আমরা কিভাবে পরিবর্তন করা যায় সেটা আমরা কিভাবে চিন্তা করতে পারি। +✅ যখন একটি নতুন Iteration পাবলিশ করা হয়, তখন এটার অন্য নাম থাকে। IoT ডিভাইস এর ব্যবহার করা Iteration আমরা কিভাবে পরিবর্তন করা যায় সেটা আমরা কিভাবে চিন্তা করতে পারি। ## IoT ডিভাইস থেকে ইমেজ ক্লাসিফাই করা @@ -134,40 +109,32 @@ Iteration হল কাস্টম ভিসন পোর্টাল । ### কাজ - আমাদের IoT ডিভাইস থেকে ইমেজ ক্লাসিফাই করা - প্রাসঙ্গিক গাইড এর মাধ্যমে কাজ IoT ডিভাইস ব্যবহার করে ইমেজ ক্যাপচার করিঃ -* [Arduino - Wio Terminal](wio-terminal-classify-image.md) -* [Single-board computer - Raspberry Pi/Virtual IoT device](single-board-computer-classify-image.md) - +* [Arduino - Wio Terminal](../wio-terminal-classify-image.md) +* [Single-board computer - Raspberry Pi/Virtual IoT device](../single-board-computer-classify-image.md) ## Model উন্নত করা - - আমরা যেনে থাকতে পারি যে, IoT ডিভাইস এর সাথে কানেক্টেড থাকা ক্যামেরা থেকে আমরা আশানুরূপ রেজাল্ট নাও পেতে পারি। আমাদের কম্পিউটার থেকে আপলোড করা ইমেজ ব্যবহার করা প্রেডিকশন গুলো সবসময় সঠিক হয় না। এটার কারন হল Model যে ডাটার উপর ট্রেইন করা হয়েছে তার থেকে ভিন্ন ডাটা প্রেডিকশন এর জন্য ব্যবহার করা। - - ইমেজ ক্লাসিফায়ার থেকে সবচেয়ে ভাল রেজাল্ট এর জন্য, আমরা প্রেডিকশন এর জন্য ব্যবহার করা ইমেজ এর মত যথাসম্ভব অনুরূপ ইমেজ উপর আমাদের model ট্রেইন করতে চাবো। উদাহরণ স্বরূপ, আমরা যদি ট্রেইনিং এর ইমেজ ক্যাপচার এর জন্য ফোন ক্যামেরা ব্যবহার করি, সেটার ইমেজ কোয়ালিটি, শার্পনেস, এবং কালার একট IoT ডিভাইস এর সাথে কানেক্টেড ক্যামেরা থেকে ভিন্ন হবে। ![2 banana pictures, a low resolution one with poor lighting from an IoT device, and a high resolution one with good lighting from a phone](../../../../images/banana-picture-compare.png) - উপরের ইমেজ এ, বামের কলার ছবি একটি রাস্পবেরি পাই ক্যামেরা থেকে নেয়া হয়েছিল, ডানের টা একই কলার ছবি আইফোন ক্যামেরা থেকে নেয়া হয়েছিল। এখানের কোয়ালিটির দিক থেকে লক্ষণীয় ভিন্নতা আছে - আইফোন এর ছবি টা শার্পার, উজ্জ্বল কালার সহ এবং বেশি কন্ট্রাস্ট এর। ✅ আমাদের IoT ডিভাইস দিয়ে ক্যাপচার করা ইমেজ এর ভুল প্রেডিকশন এর জন্য আর কি কি কারন থাকতে পারে? একটা IoT ডিভাইস যে পরিবেশে ব্যবহার করা হতে পারে সেটা নিয়ে চিন্তা করি, কি কি ফ্যাক্টর ক্যাপচার করা ইমেজ কে প্রভাবিত করতে পারে। -model কে উন্নত করার জন্য, আমরা IoT ডিভাইস থেকে ক্যাপচার করা ইমেজ দিয়ে রিট্রেইন করতে পারি। - +মডেল কে উন্নত করার জন্য, আমরা IoT ডিভাইস থেকে ক্যাপচার করা ইমেজ দিয়ে রিট্রেইন করতে পারি। --- -### কাজ - model উন্নত করা +### কাজ - মডেল উন্নত করা -1. আমাদের IoT ডিভাইস দিয়ে পাকা এবং কাঁচা এর কিছু ইমেজ ক্লাসিফাই করি। +1. আমাদের IoT ডিভাইস দিয়ে পাকা এবং কাঁচা ফলের কিছু ইমেজ ক্লাসিফাই করি। 1. কাস্টম ভিসন পোর্টাল এ, *Predictions* ট্যাব এর ইমেজ ব্যবহার করে রিট্রেইন করি। @@ -187,22 +154,22 @@ model কে উন্নত করার জন্য, আমরা IoT ডি ## 🚀 চ্যালেঞ্জ -ইমেজ এর রেজোলিউশন অথবা আলো প্রেডিকশন কে কতটুকু প্রভাবিত করে? +ইমেজ এর রেজোলিউশন অথবা আলোর উপস্থিতি এখানে প্রেডিকশন কে কতটুকু প্রভাবিত করে? আমাদের ডিভাইস এর কোড এ ইমেজ এর রেজোলিউশন পরিবর্তন করার চেষ্টা করি এবং দেখি এটা ইমেজ এর কোয়ালিটি তে কোন পার্থক্য আনে কিনা। এছাড়াও আলো চেঞ্জ করেও চেষ্টা করে দেখতে পারি। -যদি আমরা এই প্রোডাকশন ডিভাইসটি কোন ফার্ম অথবা ফ্যাক্টরি তে বিক্রয়ের জন্য তৈরী করি, আমরা কিভাবে নিশ্চিত করতে পারি যে এটা সব সময় ধারাবাহিকভাবে ভালো ফলাফল দিবে। +যদি আমরা এই প্রোডাকশন ডিভাইসটি কোন ফার্ম অথবা ফ্যাক্টরি তে বিক্রয়ের জন্য তৈরী করি, আমরা কিভাবে নিশ্চিত করতে পারি যে এটা সব সময় ধারাবাহিকভাবে ভালো ফলাফল দিবে? -## ## লেকচার-পরবর্তী কুইজ +## লেকচার-পরবর্তী কুইজ [লেকচার-পরবর্তী কুইজ](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/32) ## রিভিউ ও স্ব-অধ্যয়ন -আমরা আমাদের কাস্টম ভিসন মডেল পোর্টাল ব্যবহার করে ট্রেইন করেছি। এটা ইমেজ এর সহজলভ্যতার উপর নির্ভর করে - এবং বাস্তব জগতে আমরা আমাদের ক্যামেরা ডিভাইস এর সাথে ম্যাচ করে এমন ট্রেইনিং ডাটা হয়ত পাবো না। আমরা এটার বদলে আমাদের ডিভাইস থেকে সরাসরি ট্রেইনিং করতে পারি করতে এপিআই ব্যবহার করে, IoT ডিভাইস থেকে ক্যাপচার করা ইমেজ দিয়ে মডেল ট্রেইন করার জন্য। +আমরা আমাদের কাস্টম ভিসন মডেল পোর্টাল ব্যবহার করে ট্রেইন করেছি। এটা ইমেজ এর সহজলভ্যতার উপর নির্ভর করে - এবং বাস্তব জগতে আমরা আমাদের ক্যামেরা ডিভাইস এর সাথে মিলে এমন ট্রেইনিং ডাটা হয়ত পাবো না। আমরা এটার বদলে আমাদের ডিভাইস থেকে সরাসরি ট্রেইনিং করতে পারি করতে এপিআই ব্যবহার করে, IoT ডিভাইস থেকে ক্যাপচার করা ইমেজ দিয়ে মডেল ট্রেইন করার জন্য। -* ট্রেইনিং এপিআই এর উপর পড়ুন [using the Custom Vision SDK quick start](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/quickstarts/image-classification?WT.mc_id=academic-17441-jabenn&tabs=visual-studio&pivots=programming-language-python) +* ট্রেইনিং এপিআই সম্পর্কে আরো জানতে [using the Custom Vision SDK quick start](https://docs.microsoft.com/azure/cognitive-services/custom-vision-service/quickstarts/image-classification?WT.mc_id=academic-17441-jabenn&tabs=visual-studio&pivots=programming-language-python) দেখতে পারি। ## এসাইনমেন্ট -[ক্লাসিফিকেশন রেজাল্টের প্রতিক্রিয়া জানানো](./assignment.bn.md) +[ক্লাসিফিকেশন রেজাল্টের প্রতিক্রিয়া জানানো](assignment.bn.md) diff --git a/translations/README.bn.md b/translations/README.bn.md index 3ce2f415..69772140 100644 --- a/translations/README.bn.md +++ b/translations/README.bn.md @@ -92,7 +92,7 @@ | 13 | [পরিবহন](../3-transport) | লোকেশন ডেটা প্রদর্শন |মানচিত্রে অবস্থানের ডেটা প্রদর্শন করা এবং মানচিত্রগুলি কীভাবে ২টি মাত্রায় বাস্তব ত্রিমাত্রিক বিশ্বের উপস্থাপন করে সে সম্পর্কে জ্ঞান অর্জন | [লোকেশন ডেটা প্রদর্শন](../3-transport/lessons/3-visualize-location-data/translations/README.bn.md) | | 14 | [পরিবহন](../3-transport) | Geofences | Geofences সম্পর্কে জানা এবং কীভাবে এটি ব্যবহার করে সাপ্লাই চেইনের বিভিন্ন পর্যায়ের বাহনগুলো যখন গন্তব্যের কাছাকাছি পৌঁছায় তখন এলার্ট দেয়া যায় তা শেখা | [Geofences](../3-transport/lessons/4-geofences/README.md) | | 15 | [উৎপাদন](../4-manufacturing) | খাদ্যপণ্যের গুণমান সনাক্তকারী মডেলকে ট্রেনিং প্রদান | ক্লাউডের ছবি শ্রেণিবদ্ধকরণ মডেলকে (Image Classifier) ফলের মান সনাক্ত করতে কীভাবে প্রশিক্ষিত করতে হবে সে সম্পর্কে জানা | [খাদ্যপণ্যের গুণমান সনাক্তকারী মডেলকে ট্রেনিং প্রদান](../4-manufacturing/lessons/1-train-fruit-detector/translations/README.bn.md) | -| 16 | [উৎপাদন](../4-manufacturing) | Check fruit quality from an IoT device | আইওটি ডিভাইসে ফলের গুণগত মান সনাক্তকারী ব্যবহার | [Check fruit quality from an IoT device](../4-manufacturing/lessons/2-check-fruit-from-device/README.md) | +| 16 | [উৎপাদন](../4-manufacturing) | IoT ডিভাইস ব্যবহার করে ফলের মান যাচাই | আইওটি ডিভাইসে ফলের গুণগত মান সনাক্তকারী ব্যবহার | [IoT ডিভাইস ব্যবহার করে ফলের মান যাচাই](../4-manufacturing/lessons/2-check-fruit-from-device/translations/README.bn.md) | | 17 | [উৎপাদন](../4-manufacturing) | Edge এ Fruit Detector পরিচালনা করা | ফলের গুণগত মান সনাক্তকারীকে Edge হিসেবে ব্যবহার | [Edge এ Fruit Detector পরিচালনা করা](../4-manufacturing/lessons/3-run-fruit-detector-edge/translations/README.bn.md) | | 18 | [উৎপাদন](../4-manufacturing) | Trigger fruit quality detection from a sensor | সেন্সর থেকে ফলের গুণাগুণ সনাক্তকরণ নিয়ন্ত্রণ করা শেখা| [Trigger fruit quality detection from a sensor](../4-manufacturing/lessons/4-trigger-fruit-detector/README.md) | | 19 | [খুচরাপর্যায়](../5-retail) | Train a stock detector | কোনও দোকানে স্টক গণনা করতে স্টক ডিটেক্টরকে প্রশিক্ষণ দেওয়ার জন্য কীভাবে অবজেক্ট সনাক্তকরণ ব্যবহার করা যায় তা শেখা | [Train a stock detector](../5-retail/lessons/1-train-stock-detector/README.md) | From 72ebf6b1aecacca60d78e6d11a6127f685e9df8d Mon Sep 17 00:00:00 2001 From: Dhanya Hegde <71935582+DhanyaHegde01@users.noreply.github.com> Date: Thu, 28 Oct 2021 21:38:04 +0530 Subject: [PATCH 15/36] Created Hindi translation for retail (#337) * Created Hindi translation for retail * Update 5-retail/translations/ReadME.hi.md Co-authored-by: Bhavesh Suneja <40915476+EliteWarrior315@users.noreply.github.com> * Update 5-retail/translations/ReadME.hi.md Co-authored-by: Bhavesh Suneja <40915476+EliteWarrior315@users.noreply.github.com> * Update 5-retail/translations/ReadME.hi.md Co-authored-by: Bhavesh Suneja <40915476+EliteWarrior315@users.noreply.github.com> Co-authored-by: Jim Bennett Co-authored-by: Bhavesh Suneja <40915476+EliteWarrior315@users.noreply.github.com> --- 5-retail/translations/ReadME.hi.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 5-retail/translations/ReadME.hi.md diff --git a/5-retail/translations/ReadME.hi.md b/5-retail/translations/ReadME.hi.md new file mode 100644 index 00000000..1ffc8967 --- /dev/null +++ b/5-retail/translations/ReadME.hi.md @@ -0,0 +1,19 @@ +# खुदरा - स्टॉक स्तरों को प्रबंधित करने के लिए IoT का उपयोग करना + +उपभोक्ताओं तक पहुंचने से पहले फ़ीड के लिए अंतिम चरण खुदरा है - बाजार, किराने का सामान, सुपरमार्केट और स्टोर जो उपभोक्ताओं को उत्पाद बेचते हैं। ये स्टोर यह सुनिश्चित करना चाहते हैं कि उपभोक्ताओं के देखने और खरीदने के लिए इनके पास अलमारियों पर उत्पादन हो। + +खाद्य भंडारों में, विशेष रूप से बड़े सुपरमार्केट में, सबसे अधिक मैनुअल, समय लेने वाले कार्यों में से एक यह सुनिश्चित करना है कि अलमारियों को स्टॉक किया गया है या नहीं और यह सुनिश्चित करने के लिए अलग-अलग अलमारियों की जाँच करना कि किसी भी अंतराल को स्टोर रूम से उपज से भरा गया है या नहीं। + +IoT इसमें मदद कर सकता है, स्टॉक गिनने के लिए IoT उपकरणों पर चलने वाले AI मॉडल का उपयोग करके, मशीन लर्निंग मॉडल का उपयोग करके जो न केवल छवियों को वर्गीकृत करते हैं, बल्कि व्यक्तिगत वस्तुओं का पता लगा सकते हैं और उन्हें गिन सकते हैं। + +इन 2 पाठों में आप सीखेंगे कि स्टॉक की गणना करने के लिए छवि-आधारित AI मॉडल को कैसे प्रशिक्षित किया जाए, और कैसे इन मॉडलों को IoT उपकरणों पर चलाया जाए। + +> 💁 ये पाठ कुछ क्लाउड संसाधनों का उपयोग करेंगे। यदि आप इस परियोजना के सभी पाठों को पूरा नहीं करते हैं, तो सुनिश्चित करें कि आप [अपना प्रोजेक्ट साफ़ करें](../clean-up.md)। +## विषय + +1. [स्टॉक डिटेक्टर को प्रशिक्षित करें](./lessons/1-train-stock-detector/README.md) +1. [IoT डिवाइस से स्टॉक की जांच करें](./lessons/2-check-stock-device/README.md) + +## क्रेडिट + +सभी पाठ [जिम बेनेट] द्वारा ️ के साथ लिखे गए थे (https://GitHub.com/JimBobBennett) From 5f2806490d8ddc005803dfad8c3bcd1a2a8496e3 Mon Sep 17 00:00:00 2001 From: Mohit Jaisal Date: Sat, 30 Oct 2021 04:30:55 +0530 Subject: [PATCH 16/36] Added iot.gif (#338) --- README.md | 4 +++- images/IOT.gif | Bin 0 -> 369307 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 images/IOT.gif diff --git a/README.md b/README.md index c7fb8eab..035db896 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,9 @@ The projects cover the journey of food from farm to table. This includes farming Meet the team! -[![Promo video](./images/iot-for-beginners.png)](https://youtu.be/-wippUJRi5k) +[![Promo video](./images/iot.gif)](https://youtu.be/-wippUJRi5k) + +**Gif by** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) > 🎥 Click the image above for a video about the project! diff --git a/images/IOT.gif b/images/IOT.gif new file mode 100644 index 0000000000000000000000000000000000000000..050adccd6b366ab3c54644921d644fec22965482 GIT binary patch literal 369307 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

K^xBlpE4?OJ9le%R8qVw}PWCqzKl0*{uE(87=ft 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

_h8wmT8`C@ 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/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%0D~)MYnh<>giPF$-9q% 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 Date: Fri, 29 Oct 2021 17:58:09 -0700 Subject: [PATCH 17/36] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 035db896..44139847 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ The projects cover the journey of food from farm to table. This includes farming Meet the team! -[![Promo video](./images/iot.gif)](https://youtu.be/-wippUJRi5k) +[![Promo video](./images/IOT.gif)](https://youtu.be/-wippUJRi5k) **Gif by** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) From 38a49e07e70dcad0630b5c89997a979a8dd2d93c Mon Sep 17 00:00:00 2001 From: Vianney Gall <41265342+IterateMe@users.noreply.github.com> Date: Tue, 2 Nov 2021 18:56:45 -0400 Subject: [PATCH 18/36] french translation Lesson 2-farm > 2-detect-soil-moisture (#310) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * - Added README.fr.md in the root folder - Translated the whole leçon 2.1 * just added the whole content * small updates in root folder * Unnecessary shields removed and some corrections have been made from Charles's review * Translation of all lessons of the root README * Translation of for-teachers.md * Translation of hardware.md * Translation of CODE_OF_CONDUCT.md * Translation of CODE_OF_CONDUCT.md * Implement suggested changes from the charles's PR review * Implement suggested changes from the charles's PR review * Implement suggested changes from the charles's PR review * Implement suggested changes from the charles's PR review * Changed the path to the translated README because they were not working from the translated ones * Small change * Resolved unworking links in hardware.fr.md * Removed the shields where it was not necessary as Jim suggested * small correction * Removed the shields and comments as requested by Jim * small update * Small correction on root README * farm > lesson 2 > assignement.fr.md * farm > 2 > README.fr.md * pi-soil-moisture.fr.md completed * farm > lesson 2 > virtual-device-soil-moisture.fr.md * farm > lesson 2 > wio-terminal-soil-moisture.fr.md * Update README.fr.md Co-authored-by: Jim Bennett --- .../translations/README.fr.md | 280 +++++++++--------- .../translations/assignment.fr.md | 47 +++ .../translations/pi-soil-moisture.fr.md | 94 ++++++ .../virtual-device-soil-moisture.fr.md | 109 +++++++ .../wio-terminal-soil-moisture.fr.md | 103 +++++++ .../virtual-device-soil-moisture.md | 2 +- 2-farm/translations/README.fr.md | 2 - translations/README.fr.md | 4 +- 8 files changed, 496 insertions(+), 145 deletions(-) create mode 100644 2-farm/lessons/2-detect-soil-moisture/translations/assignment.fr.md create mode 100644 2-farm/lessons/2-detect-soil-moisture/translations/pi-soil-moisture.fr.md create mode 100644 2-farm/lessons/2-detect-soil-moisture/translations/virtual-device-soil-moisture.fr.md create mode 100644 2-farm/lessons/2-detect-soil-moisture/translations/wio-terminal-soil-moisture.fr.md diff --git a/2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md b/2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md index 9b7605ec..74e0cdc9 100644 --- a/2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md +++ b/2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md @@ -1,262 +1,262 @@ -# Detect soil moisture +# Détecter l'humidité du sol -![A sketchnote overview of this lesson](../../../sketchnotes/lesson-6.jpg) +![Un aperçu de cette leçon sous forme d'illustré](../../../../sketchnotes/lesson-6.jpg) -> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. +> Illustré par [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. -## Pre-lecture quiz +## Quiz Pré-lecture -[Pre-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/11) +[Quiz Pré-lecture](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/11) ## Introduction -In the last lesson we looked at measuring an ambient property and using it to predict plant growth. Temperature can be controlled, but it is expensive to do so, requiring controlled environments. The easiest ambient property to control for plants is water - something that is controlled everyday from large-scale irrigation systems to young kids with watering cans watering their gardens. +Dans la dernière leçon, nous avons étudié la mesure d'une propriété ambiante ainsi que son utilisation afin de prédire la croissance des plantes. La température peut être contrôlée, mais cette opération est coûteuse et nécessite des environnements contrôlés. La propriété ambiante la plus facile à contrôler pour les plantes est l'eau - un élément qui est contrôlé tous les jours, depuis les systèmes d'irrigation à grande échelle jusqu'aux jeunes enfants qui arrosent leur jardin avec un arrosoir. -![A child watering a garden](../../../images/child-watering-garden.jpg) +![Un enfant arrosant un jardin](../../../../images/child-watering-garden.jpg) -In this lesson you will learn about measuring soil moisture, and in the next lesson you will learn how to control an automated watering system. This lesson introduces a third sensor, you've already used a light sensor, a temperature sensor, so in this lesson you will also learn more about how sensors and actuators communicate with IoT devices to understand more about how a soil moisture sensor can send data to an IoT device. +Dans cette leçon, vous apprendrez à mesurer l'humidité du sol, et dans la leçon suivante, vous apprendrez à contrôler un système d'arrosage automatisé. Cette leçon introduit un troisième capteur, vous avez déjà utilisé un capteur de lumière, un capteur de température, donc dans cette leçon vous allez également en apprendre plus sur la façon dont les capteurs et les actionneurs communiquent avec les dispositifs IoT pour comprendre davantage comment un capteur d'humidité du sol peut envoyer des données à un dispositif IoT. -In this lesson we'll cover: +Dans cette leçon, nous aborderons: -* [Soil moisture](#soil-moisture) -* [How sensors communicate with IoT devices](#how-sensors-communicate-with-iot-devices) -* [Measure the moisture levels in soil](#measure-the-moisture-levels-in-soil) -* [Sensor calibration](#sensor-calibration) +* [Humidité du sol](#humidité-du-sol) +* [Comment les senseurs communiquent avec les composants IoT](#comment-les-senseurs-communiquent-avec-les-composants-IoT) +* [Mesurer les niveaux d'humidité dans le sol](#mesurer-les-niveaux-d'humidité-dans-le-sol) +* [Étalonnage du capteur](#étalonnage-du-capteur) -## Soil moisture +## Humidité du sol -Plants require water to grow. They absorb water throughout the entire plant, with the majority being absorbed by the root system. Water is used by the plant for three things: +Les plantes ont besoin d'eau pour se développer. Elles absorbent l'eau dans toute la plante, la majorité étant absorbée par le système racinaire. L'eau est utilisée par la plante pour trois choses : -* [Photosynthesis](https://wikipedia.org/wiki/Photosynthesis) - plants creates a chemical reaction with water, carbon dioxide and light to produce carbohydrates and oxygen. -* [Transpiration](https://wikipedia.org/wiki/Transpiration) - plants use water for diffusion of carbon dioxide from the air into the plant via pores in the leaves. This process also carries nutrients around the plant, and cools the plant, similar to how humans sweat. -* Structure - plants also need water to maintain their structure - they are 90% water (as opposed to humans at only 60%), and this water keeps the cells rigid. If a plant doesn't have enough water it will wilt and eventually die. +* [Photosynthèse](https://wikipedia.org/wiki/Photosynthesis) - Les plantes créent une réaction chimique avec l'eau, le dioxyde de carbone et la lumière pour produire des hydrates de carbone et de l'oxygène. +* [Transpiration](https://wikipedia.org/wiki/Transpiration) - Les plantes utilisent l'eau pour diffuser le dioxyde de carbone de l'air dans la plante via les pores des feuilles. Ce processus permet également de transporter les nutriments autour de la plante et de la refroidir, comme la transpiration humaine. +* Structure - les plantes ont également besoin d'eau pour maintenir leur structure - elles sont composées à 90 % d'eau (contrairement aux humains qui n'en ont que 60 %), et cette eau maintient les cellules rigides. Si une plante n'a pas assez d'eau, elle se flétrit et finit par mourir. -![Water is absorbed through plant roots then carried around the plant, being used for photosynthesis and plant structure](../../../images/transpiration.png) +![L'eau est absorbée par les racines des plantes, puis transportée dans la plante, utilisée pour la photosynthèse et la structure de la plante.](../../../../images/transpiration.png) -✅ Do some research: how much water is lost through transpiration? +✅ Faites des recherches : quelle quantité d'eau est perdue par transpiration ? -The root system provides water from moisture in the soil where the plant grows. Too little water in the soil and the plant cannot absorb enough to grow, too much water and roots cannot absorb enough oxygen needed to function. This leads to roots dying and the plant unable to get enough nutrients to survive. +Le système racinaire fournit de l'eau à partir de l'humidité du sol où pousse la plante. Trop peu d'eau dans le sol et la plante ne peut pas en absorber suffisamment pour se développer, trop d'eau et les racines ne peuvent pas absorber suffisamment d'oxygène nécessaire à leur fonctionnement. Les racines meurent alors et la plante ne peut pas obtenir suffisamment de nutriments pour survivre. -For a farmer to get the best plant growth, the soil needs to be not too wet and not too dry. IoT devices can help with this by measuring soil moisture, allowing a farmer to only water when needed. +Pour qu'un agriculteur obtienne la meilleure croissance des plantes, le sol doit être ni trop humide ni trop sec. Les dispositifs IoT peuvent y contribuer en mesurant l'humidité du sol, ce qui permet à l'agriculteur de n'arroser que lorsque cela est nécessaire. -### Ways to measure soil moisture +### Comment les senseurs communiquent avec les composants IoT -There are a range of different types of sensor you can use to measure soil moisture: +Il existe différents types de capteurs que vous pouvez utiliser pour mesurer l'humidité du sol : -* Resistive - a resistive sensor has 2 probes that go into the soil. An electric current is sent to one probe, and received by the other. The sensor then measures the resistance of the soil - measuring how much the current drops at the second probe. Water is a good conductor of electricity, so the higher the water content of the soil, the lower the resistance. +* Résistif - un capteur résistif possède deux sondes qui pénètrent dans le sol. Un courant électrique est envoyé à une sonde et reçu par l'autre. Le capteur mesure alors la résistance du sol - en mesurant de combien le courant chute au niveau de la deuxième sonde. L'eau est un bon conducteur d'électricité, donc plus la teneur en eau du sol est élevée, plus la résistance est faible. - ![A resistive soil moisture sensor](../../../images/resistive-soil-moisture-sensor.png) + ![Un capteur d'humidité du sol résistif](../../../../images/resistive-soil-moisture-sensor.png) - > 💁 You can build a resistive soil moisture sensor using two pieces of metal, such as nails, separated by a couple of centimeters, and measuring the resistance between them using a multimeter. + > 💁 Vous pouvez construire un capteur d'humidité du sol résistif en utilisant deux morceaux de métal, comme des clous, séparés de quelques centimètres, et en mesurant la résistance entre eux à l'aide d'un multimètre. -* Capacitive - a capacitive moisture sensor measures the amount of electric charge that can be stored across a positive and a negative electrical plate, or [capacitance](https://wikipedia.org/wiki/Capacitance). The capacitance of soil changes as the moisture level changes, and this can be converted to a voltage that can be measured by an IoT device. The wetter the soil, the lower the voltage that comes out. +* Capacitif - un capteur d'humidité capacitif mesure la quantité de charge électrique qui peut être stockée entre une plaque électrique positive et une plaque négative, ou [capacitance](https://wikipedia.org/wiki/Capacitance). La capacitance du sol change en fonction du niveau d'humidité, et cela peut être converti en une tension qui peut être mesurée par un appareil IoT. Plus le sol est humide, plus la tension qui en ressort est faible. - ![A capacitive soil moisture sensor](../../../images/grove-capacitive-soil-moisture-sensor.png) + ![Un capteur capacitif d'humidité du sol](../../../../images/grove-capacitive-soil-moisture-sensor.png) -These are both analog sensors, returning a voltage to indicate soil moisture. So how does this voltage get to your code? Before going any further with these sensors, let's look at how sensors and actuators communicate with IoT devices. +Ce sont tous deux des capteurs analogiques, qui renvoient une tension pour indiquer l'humidité du sol. Comment cette tension arrive-t-elle dans votre code ? Avant d'aller plus loin avec ces capteurs, voyons comment les capteurs et les actionneurs communiquent avec les appareils IoT. -## How sensors communicate with IoT devices +## Comment les senseurs communiquent avec les composants IoT -So far in these lessons you've learned about a number of sensors and actuators, and these have been communicating with your IoT dev kit if you've been doing the physical hardware labs. But how does this communication work? How does a resistance measurement from a soil moisture sensor become a number you can use from code? +Jusqu'à présent, dans ces leçons, vous avez appris à connaître un certain nombre de capteurs et d'actionneurs, et ceux-ci ont communiqué avec votre kit de développement IoT si vous avez fait les laboratoires de matériel physique. Mais comment cette communication fonctionne-t-elle ? Comment une mesure de résistance d'un capteur d'humidité du sol devient-elle un nombre utilisable dans le code ? -To communicate with most sensors and actuators you need some hardware, and a communication protocol - that is a well defined way for data to be sent and received. Take for example a capacitive soil moisture sensor: +Pour communiquer avec la plupart des capteurs et des actionneurs, il faut du matériel et un protocole de communication, c'est-à-dire une méthode bien définie d'envoi et de réception des données. Prenons l'exemple d'un capteur capacitif d'humidité du sol : -* How is this sensor connected to the IoT device? -* If it measures a voltage that is an analog signal, it will need an ADC to create a digital representation of the value, and this value is sent as an alternating voltage to send 0s and 1s - but how long is each bit sent for? -* If the sensor returns a digital value, that will be a stream of 0s and 1s, again how long is each bit sent for? -* If the voltage is high for 0.1s is that a single 1 bit, or 2 consecutive 1 bits, or 10? -* At what point does the number start? Is `00001101` 25, or are the first 5 bits the end of the previous value? +* Comment ce capteur est-il connecté à l'appareil IoT ? +* S'il mesure une tension qui est un signal analogique, il aura besoin d'un "ADC" pour créer une représentation numérique de la valeur, et cette valeur est envoyée sous forme de tension alternative pour envoyer des 0 et des 1 - mais pendant combien de temps chaque bit est-il envoyé ? +* Si le capteur renvoie une valeur numérique, il s'agira d'un flux de 0 et de 1. Là encore, pendant combien de temps chaque bit est-il envoyé ? +* Si la tension est élevée pendant 0,1 s, s'agit-il d'un seul bit, de deux bits consécutifs ou de dix bits ? +* A quel moment le nombre commence-t-il ? Est-ce que `00001101` 25, ou est-ce que les 5 premiers bits sont la fin de la valeur précédente ? -The hardware provides the physical connectivity over which the data is sent, the different communication protocols ensure that the data is sent or received in the correct way so it can be interpreted. +Le matériel fournit la connectivité physique sur laquelle les données sont envoyées, les différents protocoles de communication garantissent que les données sont envoyées ou reçues de manière correcte pour pouvoir être interprétées. -### General Purpose Input Output (GPIO) pins +### Broches d'entrée-sortie à usage général (GPIO) -GPIO is a set of pins you can use to connect hardware to your IoT device, and are often available on IoT developer kits such as the Raspberry Pi or Wio Terminal. You can use the various communication protocols covered in this section over the GPIO pins. Some GPIO pins provide a voltage, usually 3.3V or 5V, some pins are ground, and others can be programmatically set to either send a voltage (output), or receive a voltage (input). +GPIO est un ensemble de broches que vous pouvez utiliser pour connecter du matériel à votre dispositif IoT, et qui sont souvent disponibles sur les kits de développement IoT tels que le Raspberry Pi ou le Terminal Wio. Vous pouvez utiliser les différents protocoles de communication abordés dans cette section sur les broches GPIO. Certaines broches GPIO fournissent une tension, généralement 3,3 V ou 5 V, certaines broches sont des masses, et d'autres peuvent être configurées par programmation pour envoyer une tension (sortie) ou recevoir une tension (entrée). -> 💁 An electrical circuit needs to connect a voltage to ground via whatever circuitry you are using. You can think of voltage as the positive (+ve) terminal of a battery and ground as the negative (-ve) terminal. +> 💁 Un circuit électrique doit relier une tension à la terre via le circuit que vous utilisez. Vous pouvez considérer la tension comme la borne positive (+ve) d'une batterie et la terre comme la borne négative (-ve). -You can use GPIO pins directly with some digital sensors and actuators when you only care about on or off values - on referred to as high, off as low. Some examples are: +Vous pouvez utiliser les broches GPIO directement avec certains capteurs et actionneurs numériques lorsque vous ne vous préoccupez que des valeurs de marche ou d'arrêt - marche étant désignée comme haute, arrêt comme basse. Voici quelques exemples : -* Button. You can connect a button between a 5V pin and a pin set to input. When you press the button it completes a circuit between the 5V pin, through the button to the input pin. From code you can read the voltage at the input pin, and if it is high (5V) then the button is pressed, if it is low (0v) then the button is not pressed. Remember the actual voltage itself is not read, instead you get a digital signal of 1 or 0 depending on if the voltage is above a threshold or not. +* Bouton. Vous pouvez connecter un bouton entre une broche 5V et une broche définie comme entrée. Lorsque vous appuyez sur le bouton, un circuit est créé entre la broche 5V, le bouton et la broche d'entrée. A partir du code, vous pouvez lire la tension sur la broche d'entrée, et si elle est élevée (5V), le bouton est enfoncé, si elle est basse (0V), le bouton n'est pas enfoncé. Rappelez-vous que la tension réelle elle-même n'est pas lue, mais que vous obtenez un signal numérique de 1 ou 0 selon que la tension est supérieure ou non à un seuil. - ![A button is sent 5 volts. When not pressed it returns 0 volts, or 0, when pressed it returns 5 volts, or 1](../../../images/button-with-digital.png) + ![On envoie 5 volts à un bouton. Lorsqu'il n'est pas enfoncé, il renvoie 0 volt, ou 0, lorsqu'il est enfoncé, il renvoie 5 volts, ou 1](../../../../images/button-with-digital.png) -* LED. You can connect an LED between an output pin and a ground pin (using a resistor otherwise you'll burn out the LED). From code you can set the output pin to high and it will send 3.3V, making a circuit from the 3.3V pin, through the LED, to the ground pin. This will light the LED. +* LED. Vous pouvez connecter une LED entre une broche de sortie et une broche de masse (en utilisant une résistance, sinon vous allez brûler la LED). À partir du code, vous pouvez mettre la broche de sortie à un niveau élevé et elle enverra 3,3 V, créant un circuit de la broche 3,3 V à la broche de terre en passant par la DEL. Ceci allumera la LED. - ![An LED is sent a signal of 0 (3.3V), which lights the LED. If it is sent 0 (0v), the LED is not lit.](../../../images/led-digital-control.png) + ![On envoie à une LED un signal de 0 (3,3V), qui allume la LED. Si on lui envoie 0 (0v), la LED ne s'allume pas.](../../../../images/led-digital-control.png) -For more advanced sensors, you can use GPIO pins to send and receive digital data directly with digital sensors and actuators, or via controller boards with ADCs and DACs to talk to analog sensors and actuators. +Pour les capteurs plus avancés, vous pouvez utiliser les broches GPIO pour envoyer et recevoir des données numériques directement avec des capteurs et des actionneurs numériques, ou via des cartes de contrôle avec des ADC et des DAC pour parler aux capteurs et actionneurs analogiques. -> 💁 if you are using a Raspberry Pi for these labs, the Grove Base Hat has hardware to convert analog sensor signals to digital to send over GPIO. +> 💁 Si vous utilisez un Raspberry Pi pour ces travaux pratiques, le Grove Base Hat dispose d'un matériel permettant de convertir les signaux analogiques des capteurs en signaux numériques à envoyer via GPIO. -✅ If you have an IoT device with GPIO pins, locate these pins and find a diagram indicating which pins are voltage, ground or programmable. +✅ Si vous avez un dispositif IoT avec des broches GPIO, localisez ces broches et trouvez un diagramme indiquant quelles broches sont sous tension, reliées à la masse (ground) ou programmables. -### Analog pins +### Broches analogiques -Some devices, such as Arduino devices, provide analog pins. These are the same as GPIO pins, but instead of only supporting a digital signal, they have an ADC to convert voltage ranges to numerical values. Usually the ADC has a 10-bit resolution, meaning it converts voltages to a value of 0-1,023. +Certains appareils, tels que les appareils Arduino, fournissent des broches analogiques. Elles sont identiques aux broches GPIO, mais au lieu de supporter uniquement un signal numérique, elles disposent d'un ADC pour convertir les plages de tension en valeurs numériques. En général, l'ADC a une résolution de 10 bits, ce qui signifie qu'il convertit les tensions en une valeur de 0-1,023. -For example, on a 3.3V board, if the sensor returns 3.3V, the value returned would be 1,023. If the voltage returned was 1.65v, the value returned will be 511. +Par exemple, sur une carte 3.3V, si le capteur renvoie 3.3V, la valeur renvoyée sera de 1,023. Si la tension renvoyée est de 1,65 V, la valeur renvoyée sera de 511. -![A soil moisture sensor sent 3.3V and returning 1.65v, or a reading of 511](../../../images/analog-sensor-voltage.png) +![Un capteur d'humidité du sol envoie 3.3V et retourne 1.65v, soit une lecture de 511](../../../../images/analog-sensor-voltage.png) -> 💁 Back in nightlight - lesson 3, the light sensor returned a value from 0-1,023. If you are using a Wio Terminal, the sensor was connected to an analog pin. If you are using a Raspberry Pi, then the sensor was connected to an analog pin on the base hat that has an integrated ADC to communicate over the GPIO pins. The virtual device was set to send a value from 0-1,023 to simulate an analog pin. +> 💁 Dans la leçon 3 de la veilleuse, le capteur de lumière renvoyait une valeur comprise entre 0 et 1,023. Si vous utilisez un terminal Wio, le capteur était connecté à une broche analogique. Si vous utilisez un Raspberry Pi, le capteur a été connecté à une broche analogique sur le chapeau de base qui a un ADC intégré pour communiquer sur les broches GPIO. Le dispositif virtuel a été configuré pour envoyer une valeur de 0-1,023 pour simuler une broche analogique. -Soil moisture sensors rely on voltages, so will use analog pins and give values from 0-1,023. +Les capteurs d'humidité du sol reposent sur des tensions, ils utilisent donc des broches analogiques et donnent des valeurs comprises entre 0 et 1 023. -### Inter Integrated Circuit (I2C) +### Protocol "Inter Integrated Circuit" (I2C) -I2C, pronounced *I-squared-C*, is a multi-controller, multi-peripheral protocol, with any connected device able to act as a controller or peripheral communicating over the I2C bus (the name for a communication system that transfers data). Data is sent as addressed packets, with each packet containing the address of the connected device it is intended for. +I2C, prononcé *I-squared-C*, est un protocole multi-contrôleur, multi-périphérique, avec tout dispositif connecté capable d'agir comme un contrôleur ou un périphérique communiquant sur le bus I2C (le nom d'un système de communication qui transfère des données). Les données sont envoyées sous forme de paquets adressés, chaque paquet contenant l'adresse du périphérique connecté auquel il est destiné. -> 💁 This model used to be referred to as master/slave, but this terminology is being dropped due to its association with slavery. The [Open Source Hardware Association has adopted controller/peripheral](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/), but you may still see references to the old terminology. +> 💁 Ce modèle était autrefois appelé "maître/esclave", mais cette terminologie est abandonnée en raison de son association avec l'esclavage. L'association [Open Source Hardware Association a adopté un contrôleur/périphérique](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/), mais vous pouvez encore voir des références à l'ancienne terminologie. -Devices have an address that is used when they connect to the I2C bus, and is usually hard coded on the device. For example, each type of Grove sensor from Seeed has the same address, so all the light sensors have the same address, all the buttons have the same address that is different from the light sensor address. Some devices have ways to change the address, by changing jumper settings or soldering pins together. +Les dispositifs ont une adresse qui est utilisée lorsqu'ils se connectent au bus I2C, et qui est généralement écrite mot pour mot (hardcoded) sur le dispositif. Par exemple, chaque type de capteur Grove de Seeed a la même adresse, donc tous les capteurs de lumière ont la même adresse, tous les boutons ont la même adresse qui est différente de celle du capteur de lumière. Certains appareils permettent de modifier l'adresse, en changeant le réglage des cavaliers ou en soudant les broches ensemble. -I2C has a bus made of 2 main wires, along with 2 power wires: +I2C a un bus composé de 2 fils principaux, ainsi que de 2 fils d'alimentation : -| Wire | Name | Description | +| Fil | Nom | Description | | ---- | --------- | ----------- | -| SDA | Serial Data | This wire is for sending data between devices. | -| SCL | Serial Clock | This wire sends a clock signal at a rate set by the controller. | -| VCC | Voltage common collector | The power supply for the devices. This is connected to the SDA and SCL wires to provide their power via a pull-up resistor that switches the signal off when no device is the controller. | -| GND | Ground | This provides a common ground for the electrical circuit. | +| SDA | Serial Data | Ce fil sert à envoyer des données entre les appareils. | +| SCL | Serial Clock | Ce fil envoie un signal d'horloge à un rythme défini par le contrôleur. | +| VCC | Voltage common collector | L'alimentation des périphériques. Elle est connectée aux fils SDA et SCL pour fournir leur alimentation via une résistance pull-up qui coupe le signal lorsqu'aucun dispositif n'est le contrôleur. | +| GND | Ground | Cela fournit une masse commune pour le circuit électrique. | -![I2C bus with 3 devices connected to the SDA and SCL wires, sharing a common ground wire](../../../images/i2c.png) +![Bus I2C avec 3 dispositifs connectés aux fils SDA et SCL, partageant un fil de terre commun.](../../../../images/i2c.png) -To send data, one device will issue a start condition to show it is ready to send data. It will then become the controller. The controller then sends the address of the device that it wants to communicate with, along with if it wants to read or write data. After the data has been transmitted, the controller sends a stop condition to indicate that it has finished. After this another device can become the controller and send or receive data. +Pour envoyer des données, un dispositif émet une condition de démarrage pour montrer qu'il est prêt à envoyer des données. Il devient alors le contrôleur. Le contrôleur envoie alors l'adresse du dispositif avec lequel il veut communiquer, et indique s'il veut lire ou écrire des données. Une fois que les données ont été transmises, le contrôleur envoie une condition d'arrêt pour indiquer qu'il a terminé. Après cela, un autre dispositif peut devenir le contrôleur et envoyer ou recevoir des données. -I2C has speed limits, with 3 different modes running at fixed speeds. The fastest is High Speed mode with a maximum speed of 3.4Mbps (megabits per second), though very few devices support that speed. The Raspberry Pi for example, is limited to fast mode at 400Kbps (kilobits per second). Standard mode runs at 100Kbps. +I2C a des limites de vitesse, avec 3 modes différents fonctionnant à des vitesses fixes. Le plus rapide est le mode High Speed avec une vitesse maximale de 3,4Mbps (mégabits par seconde), bien que très peu d'appareils supportent cette vitesse. Le Raspberry Pi, par exemple, est limité au mode rapide à 400Kbps (kilobits par seconde). Le mode standard fonctionne à 100Kbps. -> 💁 If you are using a Raspberry Pi with a Grove Base hat as your IoT hardware, you will be able to see a number of I2C sockets on the board you can use to communicate with I2C sensors. Analog Grove sensors also use I2C with an ADC to send analog values as digital data, so the light sensor you used simulated an analog pin, with the value sent over I2C as the Raspberry Pi only supports digital pins. +> 💁 Si vous utilisez un Raspberry Pi avec un chapeau Grove Base comme matériel IoT, vous pourrez voir un certain nombre de prises I2C sur la carte que vous pouvez utiliser pour communiquer avec des capteurs I2C. Les capteurs Analog Grove utilisent également l'I2C avec un ADC pour envoyer des valeurs analogiques sous forme de données numériques, de sorte que le capteur de lumière que vous avez utilisé a simulé une broche analogique, avec la valeur envoyée sur I2C car le Raspberry Pi ne prend en charge que les broches numériques. -### Universal asynchronous receiver-transmitter (UART) +### Récepteur-émetteur asynchrone universel (UART) -UART involves physical circuitry that allows two devices to communicate. Each device has 2 communication pins - transmit (Tx) and receive (Rx), with the Tx pin of the first device connected to the Rx pin of the second, and with the Tx pin of the second device connected to the Rx pin of the first. This allows data to be sent in both directions. +UART est un circuit physique qui permet à deux appareils de communiquer. Chaque périphérique dispose de 2 broches de communication - transmission (Tx) et réception (Rx), la broche Tx du premier périphérique étant connectée à la broche Rx du second, et la broche Tx du second périphérique étant connectée à la broche Rx du premier. Cela permet d'envoyer des données dans les deux sens. -* Device 1 transmits data from its Tx pin, which is received by device 2 on it's Rx pin -* Device 1 receives data on its Rx pin that is transmitted by device 2 from its Tx pin +* Le dispositif 1 transmet des données depuis sa broche Tx, qui sont reçues par le dispositif 2 sur sa broche Rx. +* Le dispositif 1 reçoit des données sur sa broche Rx qui sont transmises par le dispositif 2 depuis sa broche Tx. -![UART with the Tx pin on one chip connected to the Rx pin on another, and vice versa](../../../images/uart.png) +![UART avec la broche Tx d'une puce connectée à la broche Rx d'une autre, et vice versa.](../../../../images/uart.png) -> 🎓 The data is sent one bit at a time, and this is known as *serial* communication. Most operating systems and microcontrollers have *serial ports*, that is connections that can send and receive serial data that are available to your code. +> 🎓 Les données sont envoyées un bit à la fois, c'est ce qu'on appelle la communication *série*. La plupart des systèmes d'exploitation et des microcontrôleurs ont des *ports série*, c'est-à-dire des connexions permettant d'envoyer et de recevoir des données série qui sont à la disposition de votre code. -UART devices have a [baud rate](https://wikipedia.org/wiki/Symbol_rate) (also known as Symbol rate), which is the speed that data will be sent and received in bits per second. A common baud rate is 9,600, meaning 9,600 bits (0s and 1s) of data are sent each second. +Les dispositifs UART ont un [débit en bauds](https://wikipedia.org/wiki/Symbol_rate) (également connu sous le nom de taux de symbole), qui est la vitesse à laquelle les données sont envoyées et reçues en bits par seconde. Une vitesse de transmission courante est de 9 600 bauds, ce qui signifie que 9 600 bits (0 et 1) de données sont envoyés chaque seconde. -UART uses start and stop bits - that is it sends a start bit to indicate that it's about to send a byte (8 bits) of data, then a stop bit after it sends the 8 bits. +UART utilise des bits de départ et d'arrêt, c'est-à-dire qu'il envoie un bit de départ pour indiquer qu'il est sur le point d'envoyer un octet (8 bits) de données, puis un bit d'arrêt après avoir envoyé les 8 bits. -UART speed is dependent on hardware, but even the fastest implementations don't exceed 6.5 Mbps (megabits per second, or millions of bits, 0 or 1, sent per second). +La vitesse de l'UART dépend du matériel, mais même les implémentations les plus rapides ne dépassent pas 6,5 Mbps (mégabits par seconde, ou millions de bits, 0 ou 1, envoyés par seconde). -You can use UART over GPIO pins - you can set one pin as Tx and another as Rx, then connect these to another device. +Vous pouvez utiliser UART sur les broches GPIO - vous pouvez définir une broche comme Tx et une autre comme Rx, puis les connecter à un autre appareil. -> 💁 If you are using a Raspberry Pi with a Grove Base hat as your IoT hardware, you will be able to see a UART socket on the board you can use to communicate with sensors that use the UART protocol. +> 💁 Si vous utilisez un Raspberry Pi avec un "hat" de base Grove comme matériel IoT, vous pourrez voir une prise UART sur la carte que vous pouvez utiliser pour communiquer avec des capteurs qui utilisent le protocole UART. ### Serial Peripheral Interface (SPI) -SPI is designed for communicating over short distances, such as on a microcontroller to talk to a storage device such as flash memory. It is based on a controller/peripheral model with a single controller (usually the processor of the IoT device) interacting with multiple peripherals. The controller controls everything by selecting a peripheral and sending or requesting data. +SPI est conçu pour communiquer sur de courtes distances, comme sur un microcontrôleur pour parler à un périphérique de stockage tel que la mémoire flash. Il est basé sur un modèle contrôleur/périphérique avec un seul contrôleur (généralement le processeur du dispositif IoT) interagissant avec plusieurs périphériques. Le contrôleur contrôle tout en sélectionnant un périphérique et en envoyant ou en demandant des données. -> 💁 Like I2C, the terms controller and peripheral are recent changes, so you may see the older terms still used. +> 💁 Comme pour l'I2C, les termes contrôleur et périphérique sont des changements récents, vous verrez donc peut-être les anciens termes encore utilisés. -SPI controllers use 3 wires, along with 1 extra wire per peripheral. Peripherals use 4 wires. These wires are: +Les contrôleurs SPI utilisent 3 fils, ainsi qu'un fil supplémentaire par périphérique. Les périphériques utilisent 4 fils. Ces fils sont : -| Wire | Name | Description | +| Fil | Nom | Description | | ---- | --------- | ----------- | -| COPI | Controller Output, Peripheral Input | This wire is for sending data from the controller to the peripheral. | -| CIPO | Controller Input, peripheral Output | This wire is for sending data from the peripheral to the controller. | -| SCLK | Serial Clock | This wire sends a clock signal at a rate set by the controller. | -| CS | Chip Select | The controller has multiple wires, one per peripheral, and each wire connects to the CS wire on the corresponding peripheral. | +| COPI | Controller Output, Peripheral Input | Ce fil sert à envoyer des données du contrôleur au périphérique. | +| CIPO | Controller Input, peripheral Output | Ce fil sert à envoyer des données du périphérique au contrôleur. | +| SCLK | Serial Clock | Ce fil envoie un signal d'horloge à un rythme défini par le contrôleur. | +| CS | Chip Select | Le contrôleur comporte plusieurs fils, un par périphérique, et chaque fil se connecte au fil CS du périphérique correspondant. | -![SPI with on controller and two peripherals](../../../images/spi.png) +![SPI avec un contrôleur et deux périphériques](../../../../images/spi.png) -The CS wire is used to activate one peripheral at a time, communicating over the COPI and CIPO wires. When the controller needs to change peripheral, it deactivates the CS wire connected to the currently active peripheral, then activates the wire connected to the peripheral it wants to communicate with next. +Le fil CS est utilisé pour activer un périphérique à la fois, en communiquant par les fils COPI et CIPO. Lorsque le contrôleur doit changer de périphérique, il désactive le fil CS connecté au périphérique actuellement actif, puis active le fil connecté au périphérique suivant avec lequel il veut communiquer. -SPI is *full-duplex*, meaning the controller can send and receive data at the same time from the same peripheral using the COPI and CIPO wires. SPI uses a clock signal on the SCLK wire to keep the devices in sync, so unlike sending directly over UART it doesn't need start and stop bits. +SPI est *full-duplex*, ce qui signifie que le contrôleur peut envoyer et recevoir des données en même temps depuis le même périphérique en utilisant les fils COPI et CIPO. SPI utilise un signal d'horloge sur le fil SCLK pour garder les périphériques synchronisés, donc contrairement à l'envoi direct sur UART, il n'a pas besoin de bits de départ et d'arrêt. -There are no defined speed limits for SPI, with implementations often able to transmit multiple megabytes of data per second. +Il n'y a pas de limites de vitesse définies pour SPI, les implémentations étant souvent capables de transmettre plusieurs mégaoctets de données par seconde. -IoT developer kits often support SPI over some of the GPIO pins. For example, on a Raspberry Pi you can use GPIO pins 19, 21, 23, 24 and 26 for SPI. +Les kits de développement IoT prennent souvent en charge SPI sur certaines des broches GPIO. Par exemple, sur un Raspberry Pi, vous pouvez utiliser les broches GPIO 19, 21, 23, 24 et 26 pour SPI. -### Wireless +### Sans fil -Some sensors can communicate over standard wireless protocols, such as Bluetooth (mainly Bluetooth Low Energy, or BLE), LoRaWAN (a **Lo**ng **Ra**nge low power networking protocol), or WiFi. These allow for remote sensors not physically connected to an IoT device. +Certains capteurs peuvent communiquer via des protocoles sans fil standard, tels que Bluetooth (principalement Bluetooth Low Energy, ou BLE), LoRaWAN (un protocole de réseau **Lo**ng **Ra**nge à faible consommation) ou WiFi. Ceux-ci permettent d'utiliser des capteurs distants qui ne sont pas physiquement connectés à un dispositif IoT. -One such example is in commercial soil moisture sensors. These will measure soil moisture in a field, then send the data over LoRaWan to a hub device, which will process the data or send it over the Internet. This allows the sensor to be away from the IoT device that manages the data, reducing power consumption and the need for large WiFi networks or long cables. +Les capteurs commerciaux d'humidité du sol en sont un exemple. Ceux-ci vont mesurer l'humidité du sol dans un champ, puis envoyer les données sur LoRaWan à un dispositif hub, qui va traiter les données ou les envoyer sur Internet. Cela permet au capteur d'être éloigné du dispositif IoT qui gère les données, ce qui réduit la consommation d'énergie et la nécessité de grands réseaux WiFi ou de longs câbles. -BLE is popular for advanced sensors such as fitness trackers work on the wrist. These combine multiple sensors and send the sensor data to an IoT device in the form of your phone via BLE. +BLE est populaire pour les capteurs avancés tels que les trackers de fitness fonctionnent au poignet. Ceux-ci combinent plusieurs capteurs et envoient les données du capteur à un dispositif IoT sous la forme de votre téléphone via BLE. -✅ Do you have any bluetooth sensors on your person, in your house or in your school? These might include temperature sensors, occupancy sensors, device trackers and fitness devices. +✅ Avez-vous des capteurs Bluetooth sur vous, dans votre maison ou dans votre école ? Il peut s'agir de capteurs de température, de capteurs d'occupation, de traqueurs d'appareils et d'appareils de fitness. -One popular way for commercial devices to connect is Zigbee. Zigbee uses WiFi to form mesh networks between devices, where each device connects to as many nearby devices as possible, forming a large number of connections like a spiders web. When one device wants to send a message to the Internet it can send it to the nearest devices, which then forward it on to other nearby devices and so on, until it reaches a coordinator and can be sent to the Internet. +Zigbee est un moyen populaire de connecter les appareils commerciaux. Zigbee utilise le WiFi pour former des réseaux maillés entre les appareils, où chaque appareil se connecte à autant d'appareils proches que possible, formant un grand nombre de connexions comme une toile d'araignée. Lorsqu'un appareil veut envoyer un message à l'internet, il peut l'envoyer aux appareils les plus proches, qui le transmettent ensuite à d'autres appareils proches et ainsi de suite, jusqu'à ce qu'il atteigne un coordinateur et puisse être envoyé à l'internet. -> 🐝 The name Zigbee refers to the waggle dance of honey bees after their return to the beehive. +> 🐝 Le nom Zigbee fait référence à la danse de l'agitation des abeilles à miel après leur retour à la ruche. -## Measure the moisture levels in soil +## Mesurer les niveaux d'humidité dans le sol -You can measure the moisture level in soil using a soil moisture sensor, an IoT device, and a house plant or nearby patch of soil. +Vous pouvez mesurer le niveau d'humidité du sol à l'aide d'un capteur d'humidité du sol, d'un dispositif IoT et d'une plante d'intérieur ou d'une parcelle de terre à proximité. -### Task - measure soil moisture +### Tâche - mesurer l'humidité du sol -Work through the relevant guide to measure soil moisture using your IoT device: +Suivez le guide correspondant pour mesurer l'humidité du sol à l'aide de votre appareil IoT : -* [Arduino - Wio Terminal](wio-terminal-soil-moisture.md) -* [Single-board computer - Raspberry Pi](pi-soil-moisture.md) -* [Single-board computer - Virtual device](virtual-device-soil-moisture.md) +* [Arduino - Terminal Wio](wio-terminal-soil-moisture.fr.md) +* [Ordinateur monocarte - Raspberry Pi](pi-soil-moisture.fr.md) +* [Ordinateur monocarte - Virtuel](virtual-device-soil-moisture.fr.md) -## Sensor calibration +## Étalonnage du capteur -Sensors rely on measuring electrical properties such as resistance or capacitance. +Les capteurs reposent sur la mesure de propriétés électriques telles que la résistance ou la capacité. -> 🎓 Resistance, measured in ohms (Ω) is how much opposition there is to the electric current travelling through something. When a voltage is applied to a material, the amount of current that passes through it is dependant on the resistance of the material. You can read more on the [electrical resistance page on Wikipedia](https://wikipedia.org/wiki/Electrical_resistance_and_conductance). +> 🎓 La résistance, mesurée en ohms (Ω), est la quantité d'opposition au courant électrique qui traverse quelque chose. Lorsqu'une tension est appliquée à un matériau, la quantité de courant qui le traverse dépend de la résistance du matériau. Vous pouvez en savoir plus sur la page [résistance électrique sur Wikipédia](https://wikipedia.org/wiki/Electrical_resistance_and_conductance). -> 🎓 Capacitance, measured in farads (F), is the ability of a component or circuit to collect and store electrical energy. You can read more on capacitance on the [capacitance page on Wikipedia](https://wikipedia.org/wiki/Capacitance). +> 🎓 La capacité, mesurée en farads (F), est la capacité d'un composant ou d'un circuit à collecter et à stocker l'énergie électrique. Pour en savoir plus sur la capacité, consultez la [page sur la capacité dans Wikipédia](https://wikipedia.org/wiki/Capacitance). -These measurements are not always useful - imagine a temperature sensor that gave you a measurement of 22.5KΩ! Instead the value measured needs to be converted into a useful unit by being calibrated - that is matching the values measured to the quantity measured to allow new measurements to be converted to the right unit. +Ces mesures ne sont pas toujours utiles - imaginez un capteur de température qui vous donne une mesure de 22.5KΩ ! Au lieu de cela, la valeur mesurée doit être convertie en une unité utile en étant étalonnée - c'est-à-dire en faisant correspondre les valeurs mesurées à la quantité mesurée pour permettre aux nouvelles mesures d'être converties dans la bonne unité. -Some sensors come pre-calibrated. For example the temperature sensor you used in the last lesson was already calibrated so that it can return a temperature measurement in °C. In the factory the first sensor created would be exposed to a range of known temperatures and the resistance measured. This would then be used to build a calculation that can convert from the value measured in Ω (the unit of resistance) to °C. +Certains capteurs sont livrés pré-calibrés. Par exemple, le capteur de température que vous avez utilisé dans la dernière leçon a déjà été calibré de façon à pouvoir fournir une mesure de température en °C. En usine, le premier capteur créé est exposé à une gamme de températures connues et la résistance est mesurée. Cette mesure est ensuite utilisée pour élaborer un calcul permettant de convertir la valeur mesurée en Ω (l'unité de résistance) en °C. -> 💁 The formula to calculate resistance from temperature is called the [Steinhart–Hart equation](https://wikipedia.org/wiki/Steinhart–Hart_equation). +> 💁 La formule permettant de calculer la résistance à partir de la température est appelée [équation de Steinhart-Hart](https://wikipedia.org/wiki/Steinhart–Hart_equation). -### Soil moisture sensor calibration +### Étalonnage du capteur d'humidité du sol -Soil moisture is measured using gravimetric or volumetric water content. +L'humidité du sol est mesurée par la teneur en eau gravimétrique ou volumétrique. -* Gravimetric is the weight of water in a unit weight of soil measured, as the number of kilograms of water per kilogram of dry soil -* Volumetric is the volume of water in a unit volume of soil measured, as the number of cubic metres of water per cubic metres of dry soil +* Gravimétrique : le poids de l'eau dans une unité de poids de sol mesurée, comme le nombre de kilogrammes d'eau par kilogramme de sol sec. +* Volumétrique : le volume d'eau dans une unité de volume de sol mesuré en nombre de mètres cubes d'eau par mètre cube de sol sec. -> 🇺🇸 For Americans, because of the consistency of the units, these can be measured in pounds instead of kilograms or cubic feet instead of cubic metres. +> 🇺🇸 Pour les Américains, en raison de la cohérence des unités, on peut les mesurer en livres au lieu de kilogrammes ou en pieds cubes au lieu de mètres cubes. -Soil moisture sensors measure electrical resistance or capacitance - this not only varies by soil moisture, but also soil type as the components in the soil can change its electrical characteristics. Ideally sensors should be calibrated - that is taking readings from the sensor and comparing them to measurements found using a more scientific approach. For example a lab can calculate the gravimetric soil moisture using samples of a specific field taken a few times a year, and these numbers used to calibrate the sensor, matching the sensor reading to the gravimetric soil moisture. +Les capteurs d'humidité du sol mesurent la résistance électrique ou la capacité - celle-ci varie non seulement en fonction de l'humidité du sol, mais aussi du type de sol, car les composants du sol peuvent modifier ses caractéristiques électriques. Idéalement, les capteurs doivent être étalonnés, c'est-à-dire qu'il faut prendre les lectures du capteur et les comparer aux mesures obtenues par une approche plus scientifique. Par exemple, un laboratoire peut calculer l'humidité gravimétrique du sol en utilisant des échantillons d'un champ spécifique prélevés plusieurs fois par an, et ces chiffres sont utilisés pour calibrer le capteur, en faisant correspondre la lecture du capteur à l'humidité gravimétrique du sol. -![A graph of voltage vs soil moisture content](../../../images/soil-moisture-to-voltage.png) +![Un graphique de la tension en fonction de la teneur en humidité du sol](../../../../images/soil-moisture-to-voltage.png) -The graph above shows how to calibrate a sensor . The voltage is captured for a soil sample that is then measured in a lab by comparing the moist weight to the dry weight (by measuring the weight wet, then drying in an oven and measuring dry). Once a few readings have been taken, this can be plotted on a graph and a line fitted to the points. This line can then be used to convert soil moisture sensor readings taken by an IoT device into actual soil moisture measurements. +Le graphique ci-dessus montre comment calibrer un capteur. La tension est capturée pour un échantillon de sol qui est ensuite mesuré dans un laboratoire en comparant le poids humide au poids sec (en mesurant le poids humide, puis en le séchant dans un four et en le mesurant sec). Une fois que quelques mesures ont été effectuées, elles peuvent être reportées sur un graphique et une ligne peut être ajustée aux points. Cette ligne peut ensuite être utilisée pour convertir les lectures du capteur d'humidité du sol prises par un dispositif IoT en mesures réelles de l'humidité du sol. -💁 For resistive soil moisture sensors, the voltage increases as soil moisture increases. For capacitive soil moisture sensors, the voltage decreases as soil moisture increases, so the graphs for these would slope downwards, not upwards. +💁 Pour les capteurs d'humidité du sol résistifs, la tension augmente avec l'humidité du sol. Dans le cas des capteurs d'humidité du sol capacitifs, la tension diminue lorsque l'humidité du sol augmente, de sorte que les graphiques de ces capteurs sont orientés vers le bas et non vers le haut. -![A soil moisture value interpolated from the graph](../../../images/soil-moisture-to-voltage-with-reading.png) +![Une valeur d'humidité du sol interpolée à partir du graphique](../../../../images/soil-moisture-to-voltage-with-reading.png) -The graph above shows a voltage reading from a soil moisture sensor, and by following that to the line on the graph, the actual soil moisture can be calculated. +Le graphique ci-dessus montre une lecture de tension d'un capteur d'humidité du sol, et en suivant cette lecture jusqu'à la ligne du graphique, l'humidité réelle du sol peut être calculée. -This approach means the farmer only needs to get a few lab measurements for a field, then they can use IoT devices to measure soil moisture - drastically speeding up the time to take measurements. +Cette approche signifie que l'agriculteur n'a besoin que d'obtenir quelques mesures de laboratoire pour un champ, puis il peut utiliser des dispositifs IoT pour mesurer l'humidité du sol - ce qui accélère considérablement le temps de prise de mesures. --- -## 🚀 Challenge +## 🚀 Défi -Resistive and capacitive soil moisture sensors have a number of differences. What are these differences, and which type (if any) is the best for a farmer to use? Does this answer change between developing and developed countries? +Les capteurs d'humidité du sol résistifs et capacitifs présentent un certain nombre de différences. Quelles sont ces différences, et quel type (le cas échéant) est le meilleur pour un agriculteur ? Cette réponse change-t-elle entre les pays en développement et les pays développés ? -## Post-lecture quiz +## Quiz post-lecture -[Post-lecture quiz](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/12) +[Quiz post-lecture](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/12) -## Review & Self Study +## Révision et étude personnelle -Read up on the hardware and protocols used by sensors and actuators: +Renseignez-vous sur le matériel et les protocoles utilisés par les capteurs et les actionneurs : -* [GPIO Wikipedia page](https://wikipedia.org/wiki/General-purpose_input/output) -* [UART Wikipedia page](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter) -* [SPI Wikipedia page](https://wikipedia.org/wiki/Serial_Peripheral_Interface) -* [I2C Wikipedia page](https://wikipedia.org/wiki/I²C) -* [Zigbee Wikipedia page](https://wikipedia.org/wiki/Zigbee) +* [GPIO - Wikipedia](https://wikipedia.org/wiki/General-purpose_input/output) +* [UART - Wikipedia](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter) +* [SPI - Wikipedia](https://wikipedia.org/wiki/Serial_Peripheral_Interface) +* [I2C - Wikipedia](https://wikipedia.org/wiki/I²C) +* [Zigbee - Wikipedia](https://wikipedia.org/wiki/Zigbee) -## Assignment +## Devoir -[Calibrate your sensor](assignment.md) +[Calibrez votre capteur](assignment.fr.md) \ No newline at end of file diff --git a/2-farm/lessons/2-detect-soil-moisture/translations/assignment.fr.md b/2-farm/lessons/2-detect-soil-moisture/translations/assignment.fr.md new file mode 100644 index 00000000..6a411f78 --- /dev/null +++ b/2-farm/lessons/2-detect-soil-moisture/translations/assignment.fr.md @@ -0,0 +1,47 @@ +# Calibrez votre capteur + +## Instructions + +Dans cette leçon, vous avez recueilli les lectures de la sonde d'humidité du sol mesurées sous forme de valeurs comprises entre 0 et 1023. Pour les convertir en valeurs réelles d'humidité du sol, vous devez étalonner votre capteur. Pour ce faire, vous pouvez effectuer des relevés sur des échantillons de sol, puis calculer la teneur en eau gravimétrique du sol à partir de ces échantillons. + +Vous devrez répéter ces étapes plusieurs fois pour obtenir les lectures nécessaires, avec une humidité différente du sol à chaque fois. + +1. Relevez l'humidité du sol à l'aide du capteur d'humidité du sol. Notez cette mesure. + +1. Prenez un échantillon du sol et pesez-le. Notez ce poids. + +1. Séchez la terre - un four chaud à 110°C (230°F) pendant quelques heures est le meilleur moyen, vous pouvez le faire à la lumière du soleil, ou le placer dans un endroit chaud et sec jusqu'à ce que la terre soit complètement sèche. Elle doit être poudreuse et meuble. + + > 💁 Dans un laboratoire, pour obtenir les résultats les plus précis, vous devez sécher dans un four pendant 48 à 72 heures. Si vous avez des étuves à votre école, voyez si vous pouvez les utiliser pour sécher plus longtemps. Plus le temps est long, plus l'échantillon est sec et plus les résultats sont précis. + +1. Pesez à nouveau la terre. + + > 🔥 Si vous l'avez séché dans un four, assurez-vous qu'il a d'abord refroidi ! + +L'humidité gravimétrique du sol est calculée comme suit : + +![Le pourcentage d'humidité du sol est le poids humide moins le poids sec, divisé par le poids sec, multiplié par 100](../../../../images/gsm-calculation.png) + +* Whumide - le poids de la terre humide +* Wsec - le poids du sol sec + +Par exemple, disons que vous avez un échantillon de sol qui pèse 212 g humide et 197 g sec. + +![Calcul rempli](../../../../images/gsm-calculation-example.png) + +* Whumide = 212g +* Wsec = 197g +* 212 - 197 = 15 +* 15 / 197 = 0.076 +* 0.076 * 100 = 7.6% + +Dans cet exemple, le sol a une humidité gravimétrique de 7,6 %. + +Une fois que vous avez les lectures d'au moins 3 échantillons, tracez un graphique du pourcentage d'humidité du sol par rapport à la lecture du capteur d'humidité du sol et ajoutez la ligne qui correspond le mieux aux points. Vous pouvez ensuite utiliser ce graphique pour calculer la teneur en eau gravimétrique du sol pour une lecture de capteur donnée en lisant la valeur de la ligne. + +## Grille d'évaluation + +| Critère | Exemple | Adéquat | Nécessite amélioration | +| -------- | --------- | -------- | ----------------- | +| Recueillir les données d'étalonnage | Capturez au moins 3 échantillons d'étalonnage | Capturez au moins 2 échantillons d'étalonnage | Capturez au moins un échantillon d'étalonnage | +| Effectuer une lecture calibrée | Tracez avec succès le graphique d'étalonnage, effectuez une lecture du capteur et convertissez-la en teneur en eau gravimétrique du sol | Tracer avec succès le graphique d'étalonnage | Impossible de tracer le graphique | diff --git a/2-farm/lessons/2-detect-soil-moisture/translations/pi-soil-moisture.fr.md b/2-farm/lessons/2-detect-soil-moisture/translations/pi-soil-moisture.fr.md new file mode 100644 index 00000000..dcb2644d --- /dev/null +++ b/2-farm/lessons/2-detect-soil-moisture/translations/pi-soil-moisture.fr.md @@ -0,0 +1,94 @@ +# Mesurer l'humidité du sol - Raspberry Pi + +Dans cette partie de la leçon, vous allez ajouter un capteur capacitif d'humidité du sol à votre Raspberry Pi, et lire des valeurs à partir de celui-ci. + +## Matériel + +Le Raspberry Pi a besoin d'un capteur capacitif d'humidité du sol. + +Le capteur que vous utiliserez est un [Capteur d'humidité du sol capacitif](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html). Ce dernier mesure l'humidité du sol en détectant la capacité du sol, une propriété qui change en fonction de l'humidité du sol. Plus l'humidité du sol augmente, plus la tension diminue. + +Il s'agit d'un capteur analogique, qui utilise donc une broche analogique et le ADC 10 bits du "Grove Base Hat" sur le Pi pour convertir la tension en un signal numérique de 1 à 1023. Celui-ci est ensuite envoyé sur I2C via les broches GPIO du Pi. + +### Connecter le capteur d'humidité du sol + +Le capteur d'humidité du sol Grove peut être connecté au Raspberry Pi. + +#### Tâche - connecter le capteur d'humidité du sol + +Connectez le capteur d'humidité du sol. + +![Capteur d'humidité du sol d'un bosquet](../../../../images/grove-capacitive-soil-moisture-sensor.png) + +1. Insérez une extrémité d'un câble Grove dans la prise du capteur d'humidité du sol. Il ne peut être inséré que dans un seul sens. + +1. Lorsque le Raspberry Pi est hors tension, connectez l'autre extrémité du câble Grove à la prise analogique marquée **A0** sur le "Grove Base Hat" fixé au Pi. Cette prise est la deuxième en partant de la droite, sur la rangée de prises à côté des broches GPIO. + +![Le capteur d'humidité du sol du bosquet connecté à la prise A0](../../../../images/pi-soil-moisture-sensor.png) + +1. Insérez le capteur d'humidité du sol dans le sol. Il est doté d'une " ligne de position la plus élevée ", une ligne blanche qui traverse le capteur. Insérez le capteur jusqu'à cette ligne mais sans la dépasser. + +![Le capteur d'humidité du sol The Grove dans le sol](../../../../images/soil-moisture-sensor-in-soil.png) + +## Programmer le capteur d'humidité du sol + +Le Raspberry Pi peut maintenant être programmé pour utiliser la sonde d'humidité du sol jointe. + +### Tâche - programmer le capteur d'humidité du sol + +Programmez l'appareil. + +1. Allumez le Pi et attendez qu'il démarre. + +1. Lancez VS Code, soit directement sur le Pi, soit en vous connectant via l'extension SSH à distance. + + > ⚠️ Vous pouvez vous référer [aux instructions pour configurer et lancer VS Code dans la veilleuse - leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/pi.fr.md). + +1. Depuis le terminal, créez un nouveau dossier dans le répertoire personnel de l'utilisateur `pi` appelé `soil-moisture-sensor`. Créez un fichier dans ce dossier appelé `app.py`. + +1. Ouvrez ce dossier dans VS Code + +1. Ajoutez le code suivant au fichier `app.py` pour importer certaines bibliothèques requises : + + ```python + import time + from grove.adc import ADC + ``` + + L'instruction `import time` importe le module `time` qui sera utilisé plus tard dans ce devoir. + + L'instruction `from grove.adc import ADC` importe le `ADC` des bibliothèques Python de Grove. Cette bibliothèque contient du code pour interagir avec le convertisseur analogique-numérique du chapeau de base Pi et lire les tensions des capteurs analogiques. + +1. Ajoutez le code suivant en dessous pour créer une instance de la classe `ADC` : + + ```python + adc = ADC() + ``` + +1. Ajoutez une boucle infinie qui lit depuis cet ADC sur la broche A0, et écrit le résultat sur la console. Cette boucle peut ensuite dormir pendant 10 secondes entre les lectures. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Exécutez l'application Python. Vous verrez les mesures d'humidité du sol écrites dans la console. Ajoutez de l'eau au sol ou retirez le capteur du sol et observez le changement de valeur. + + ```output + pi@raspberrypi:~/soil-moisture-sensor $ python3 app.py + Soil moisture: 615 + Soil moisture: 612 + Soil moisture: 498 + Soil moisture: 493 + Soil moisture: 490 + Soil Moisture: 388 + ``` + + Dans l'exemple de sortie ci-dessus, vous pouvez voir la chute de tension lorsque de l'eau est ajoutée. + +> 💁 Vous pouvez trouver ce code dans le dossier [code/pi](../code/pi). + +😀 Votre programme de capteurs d'humidité du sol a été un succès ! diff --git a/2-farm/lessons/2-detect-soil-moisture/translations/virtual-device-soil-moisture.fr.md b/2-farm/lessons/2-detect-soil-moisture/translations/virtual-device-soil-moisture.fr.md new file mode 100644 index 00000000..ae93eec5 --- /dev/null +++ b/2-farm/lessons/2-detect-soil-moisture/translations/virtual-device-soil-moisture.fr.md @@ -0,0 +1,109 @@ +# Mesurer l'humidité du sol - Matériel IoT Virtuel + +Dans cette partie de la leçon, vous allez ajouter un capteur capacitif d'humidité du sol à votre dispositif IoT virtuel, et lire des valeurs à partir de celui-ci. + +## Matériel virtuel + +Le dispositif IoT virtuel utilisera un capteur d'humidité du sol capacitif Grove simulé. Ainsi, ce laboratoire est identique à l'utilisation d'un Raspberry Pi avec un capteur d'humidité du sol capacitif Grove physique. + +Dans un dispositif IoT physique, le capteur d'humidité du sol serait un capteur capacitif qui mesure l'humidité du sol en détectant la capacité du sol, une propriété qui change en fonction de l'humidité du sol. Lorsque l'humidité du sol augmente, la tension diminue. + +Il s'agit d'un capteur analogique, qui utilise donc un ADC 10 bits simulé pour rapporter une valeur de 1 à 1023. + +### Ajouter le capteur d'humidité du sol à CounterFit + +Pour utiliser un capteur d'humidité du sol virtuel, vous devez l'ajouter à l'application CounterFit. + +#### Tâche - Ajout du capteur d'humidité du sol à CounterFit + +Ajoutez le capteur d'humidité du sol à l'application CounterFit. + +1. Créez une nouvelle application Python sur votre ordinateur dans un dossier appelé `soil-moisture-sensor` avec un seul fichier appelé `app.py` et un environnement virtuel Python, et ajoutez les paquets pip de CounterFit. + + > ⚠️ Vous pouvez vous référer [aux instructions pour créer et configurer un projet Python CounterFit dans la leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.fr.md). + +1. Assurez-vous que l'application web CounterFit est en cours d'exécution. + +1. Créez un capteur d'humidité du sol : + + 1. Dans la case *Create sensor* du volet *Sensors*, déroulez la case *Sensor type* et sélectionnez *Soil Moisture*. + + 1. Laissez le paramètre *Units* sur *NoUnits*. + + 1. Assurez-vous que le paramètre *Pin* est réglée sur *0*. + + 1. Sélectionnez le bouton **Add** pour créer le capteur d'humidité sur la broche 0. + + ![The soil moisture sensor settings](../../../../images/counterfit-create-soil-moisture-sensor.png) + + Le capteur d'humidité du sol sera créé et apparaîtra dans la liste des capteurs. + + ![Le capteur d'humidité du sol a créé](../../../../images/counterfit-soil-moisture-sensor.png) + +## Programmez l'application du capteur d'humidité du sol + +L'application du capteur d'humidité du sol peut maintenant être programmée en utilisant les capteurs CounterFit. + +### Tâche - programmer l'application du capteur d'humidité du sol + +Programmez l'application du capteur d'humidité du sol. + +1. Assurez-vous que l'application "Soil-Moisture-Sensor" est ouverte dans VS Code. + +1. Ouvrez le fichier `app.py`. + +1. Ajoutez le code suivant au début de `app.py` pour connecter l'application à CounterFit : + + ```python + from counterfit_connection import CounterFitConnection + CounterFitConnection.init('127.0.0.1', 5000) + ``` + +1. Ajoutez le code suivant au fichier `app.py` pour importer certaines bibliothèques requises : + + ```python + import time + from counterfit_shims_grove.adc import ADC + ``` + + L'instruction `import time` importe le module `time` qui sera utilisé plus tard dans ce devoir. + + L'instruction `from counterfit_shims_grove.adc import ADC` importe la classe `ADC` pour interagir avec un convertisseur analogique-numérique virtuel qui peut se connecter à un capteur CounterFit. + +1. Ajoutez le code suivant en dessous pour créer une instance de la classe `ADC` : + + ```python + adc = ADC() + ``` + +1. Ajoutez une boucle infinie qui lit à partir de cet ADC sur la broche 0 et écrit le résultat sur la console. Cette boucle peut ensuite dormir pendant 10 secondes entre les lectures. + + ```python + while True: + soil_moisture = adc.read(0) + print("Soil moisture:", soil_moisture) + + time.sleep(10) + ``` + +1. Depuis l'application CounterFit, modifiez la valeur de la sonde d'humidité du sol qui sera lue par l'application. Vous pouvez le faire de deux façons : + + * Saisissez un nombre dans la case *Value* pour le capteur d'humidité du sol, puis sélectionnez le bouton **Set**. Le nombre que vous saisissez sera la valeur renvoyée par le capteur. + + * Cochez la case *Random* et saisissez une valeur *Min* et *Max*, puis sélectionnez le bouton **Set**. Chaque fois que le capteur lit une valeur, il lit un nombre aléatoire entre *Min* et *Max*. + +1. Exécutez l'application Python. Vous verrez les mesures d'humidité du sol écrites dans la console. Changez les paramètres *Value* ou *Random* pour voir la valeur changer. + + ```output + (.venv) ➜ soil-moisture-sensor $ python app.py + Soil moisture: 615 + Soil moisture: 612 + Soil moisture: 498 + Soil moisture: 493 + Soil moisture: 490 + Soil Moisture: 388 + ``` + +> 💁 Vous pouvez trouver ce code dans le [code/virtual-device](../code/virtual-device) folder. + +😀 Votre programme de capteurs d'humidité du sol a été un succès ! diff --git a/2-farm/lessons/2-detect-soil-moisture/translations/wio-terminal-soil-moisture.fr.md b/2-farm/lessons/2-detect-soil-moisture/translations/wio-terminal-soil-moisture.fr.md new file mode 100644 index 00000000..0ffc3b5f --- /dev/null +++ b/2-farm/lessons/2-detect-soil-moisture/translations/wio-terminal-soil-moisture.fr.md @@ -0,0 +1,103 @@ +# Mesurer l'humidité du sol - Terminal Wio + +Dans cette partie de la leçon, vous allez ajouter un capteur capacitif d'humidité du sol à votre terminal Wio, et lire des valeurs à partir de celui-ci. + +## Matériel + +Le terminal Wio a besoin d'un capteur capacitif d'humidité du sol. + +Le capteur que vous utiliserez est un [Capteur d'humidité du sol capacitif](https://www.seeedstudio.com/Grove-Capacitive-Moisture-Sensor-Corrosion-Resistant.html), qui mesure l'humidité du sol en détectant la capacité du sol, une propriété qui change en fonction de l'humidité du sol. Plus l'humidité du sol augmente, plus la tension diminue. + +Il s'agit d'un capteur analogique, qui se connecte donc aux broches analogiques de la borne Wio, en utilisant un ADC intégré pour créer une valeur de 0-1,023. + +### Connecter le capteur d'humidité du sol + +Le capteur d'humidité du sol Grove peut être connecté au port analogique/numérique configurable des terminaux Wio. + +#### Tâche - connecter le capteur d'humidité du sol + +Connectez le capteur d'humidité du sol. + +![Capteur d'humidité du sol de type Groove](../../../../images/grove-capacitive-soil-moisture-sensor.png) + +1. Insérez une extrémité d'un câble Grove dans la prise du capteur d'humidité du sol. Il ne peut être inséré que dans un seul sens. + +1. Le terminal Wio étant déconnecté de votre ordinateur ou de toute autre source d'alimentation, connectez l'autre extrémité du câble Grove à la prise Grove de droite du terminal Wio lorsque vous regardez l'écran. Il s'agit de la prise la plus éloignée du bouton d'alimentation. + +![Le capteur d'humidité du sol du bosquet est connecté à la prise de droite](../../../../images/wio-soil-moisture-sensor.png) + +1. Insérez le capteur d'humidité du sol dans le sol. Il est doté d'une " ligne de position la plus élevée ", une ligne blanche qui traverse le capteur. Insérez le capteur jusqu'à cette ligne mais sans la dépasser. + +![Le capteur d'humidité du sol The Grove dans le sol](../../../../images/soil-moisture-sensor-in-soil.png) + +1. Vous pouvez maintenant connecter le terminal Wio à votre ordinateur. + +## Programmer le capteur d'humidité du sol + +Le terminal Wio peut maintenant être programmé pour utiliser la sonde d'humidité du sol jointe. + +### Tâche - programmer le capteur d'humidité du sol + +Programmez l'appareil. + +1. Créez un tout nouveau projet Wio Terminal en utilisant PlatformIO. Appelez ce projet `soil-moisture-sensor`. Ajoutez du code dans la fonction `setup` pour configurer le port série. + + > ⚠️ Vous pouvez vous référer [aux instructions pour créer un projet PlatformIO dans le projet 1, leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.fr.md). + +1. Il n'y a pas de bibliothèque pour ce capteur, à la place vous pouvez lire la broche analogique en utilisant la fonction Arduino intégré [`analogRead`](https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/). Commencez par configurer la broche analogique pour l'entrée afin que les valeurs puissent être lues en ajoutant ce qui suit à la fonction `setup`. + + ```cpp + pinMode(A0, INPUT); + ``` + + Ceci définit la broche `A0`, la broche combinée analogique/numérique, comme une broche d'entrée sur laquelle la tension peut être lue. + +1. Ajoutez ce qui suit à la fonction `loop` pour lire la tension de cette broche : + + ```cpp + int soil_moisture = analogRead(A0); + ``` + +1. Sous ce code, ajoutez le code suivant pour imprimer la valeur sur le port série : + + ```cpp + Serial.print("Soil Moisture: "); + Serial.println(soil_moisture); + ``` + +1. Enfin, ajoutez un délai à la fin de 10 secondes : + + ```cpp + delay(10000); + ``` + +1. Construisez et téléchargez le code sur le terminal Wio. + + > ⚠️ Vous pouvez vous référer [aux instructions pour créer un projet PlatformIO dans le projet 1, leçon 1 si nécessaire](../../../../1-getting-started/lessons/1-introduction-to-iot/wio-terminal.fr.md). + +1. Une fois téléchargé, vous pouvez surveiller l'humidité du sol à l'aide du moniteur série. Ajoutez un peu d'eau au sol, ou retirez le capteur du sol, et observez le changement de valeur. + + ```output + > Executing task: platformio device monitor < + + --- Available filters and text transformations: colorize, debug, default, direct, hexlify, log2file, nocontrol, printable, send_on_enter, time + --- More details at http://bit.ly/pio-monitor-filters + --- Miniterm on /dev/cu.usbmodem1201 9600,8,N,1 --- + --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- + Soil Moisture: 526 + Soil Moisture: 529 + Soil Moisture: 521 + Soil Moisture: 494 + Soil Moisture: 454 + Soil Moisture: 456 + Soil Moisture: 395 + Soil Moisture: 388 + Soil Moisture: 394 + Soil Moisture: 391 + ``` + + Dans l'exemple de sortie ci-dessus, vous pouvez voir la chute de tension lorsque de l'eau est ajoutée. + +> 💁 Vous pouvez trouver ce code dans le fichier [code/wio-terminal](../code/wio-terminal). + +😀 Votre programme de capteurs d'humidité du sol a été un succès ! diff --git a/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md b/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md index ddceaead..e2406961 100644 --- a/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md +++ b/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md @@ -14,7 +14,7 @@ This is an analog sensor, so uses a simulated 10-bit ADC to report a value from To use a virtual soil moisture sensor, you need to add it to the CounterFit app -#### Task - dd the soil moisture sensor to CounterFit +#### Task - Add the soil moisture sensor to CounterFit Add the soil moisture sensor to the CounterFit app. diff --git a/2-farm/translations/README.fr.md b/2-farm/translations/README.fr.md index 5bf905cd..7f2995b5 100644 --- a/2-farm/translations/README.fr.md +++ b/2-farm/translations/README.fr.md @@ -1,5 +1,3 @@ -[![French](https://img.shields.io/badge/-French-purple)](translations/README.fr.md) - # Agriculture et IoT Les besoins en agriculture augmentent avec la croissance de la popualtion. La quantité de terres disponible ne change pas, bien que le climat lui, change. Ceci amène des défits de plus en plus importants aux fermiers, plus particulièrement pour les 2 milliards de [fermiers de subsistance](https://wikipedia.org/wiki/Subsistence_agriculture) qui dépendent de cette production afin de se nourrir ainsi que leur famille. Les technologies des objets connectés ont le potentiel d'aider ces fermiers à faire de meilleures décisions sur la production, notemment quoi faire pousser, quand récolter, accroître les récoltes, réduire la main d'oeuvre ou encore détecter et gérer les parasites. diff --git a/translations/README.fr.md b/translations/README.fr.md index 0d3e128b..b4779338 100644 --- a/translations/README.fr.md +++ b/translations/README.fr.md @@ -23,9 +23,9 @@ L'ensemble des projets parlent du parcours que les aliments suivent, de la ferme > Illustré de [Nitya Narasimhan](https://github.com/nitya). Cliquez sur l'image pour l'agrandir. -**Un remerciements chaleureux à nos auteurs [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), and our sketchnote artist [Nitya Narasimhan](https://github.com/nitya).** +**Un remerciements chaleureux à nos auteurs [Jen Fox](https://github.com/jenfoxbot), [Jen Looper](https://github.com/jlooper), [Jim Bennett](https://github.com/jimbobbennett), et notre artiste de sketchs [Nitya Narasimhan](https://github.com/nitya).** -**Un grand merci aussi à notre équipe [Microsoft Learn Student Ambassadors](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn) qui ont révisés et traduit cette série de cours - [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), and [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).** +**Un grand merci aussi à notre équipe [Microsoft Learn Student Ambassadors](https://studentambassadors.microsoft.com?WT.mc_id=academic-17441-jabenn) qui ont révisés et traduit cette série de cours - [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), ainsi que [Zina Kamel](https://www.linkedin.com/in/zina-kamel/).** Rencontrez l'équipe! From 422fc48041024359e7621c30dd62e6b1dafc9675 Mon Sep 17 00:00:00 2001 From: Jim Bennett Date: Mon, 8 Nov 2021 08:57:17 -0800 Subject: [PATCH 19/36] Update hardware.md --- hardware.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardware.md b/hardware.md index 784c7858..0419fb0f 100644 --- a/hardware.md +++ b/hardware.md @@ -55,7 +55,7 @@ All the device code for Raspberry Pi is in Python. To complete all the assignmen ### Raspberry Pi hardware * [Raspberry Pi](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) - > 💁 Versions from the Pi 2B and above should work with the assignments in these lessons. + > 💁 Versions from the Pi 2B and above should work with the assignments in these lessons. If you are planning on running VS Code directly on the Pi, then a Pi 4 with 2GB or more of RAM is needed. If you are going to access the Pi remotely then any Pi 2B and above will work. * microSD Card (You can get Raspberry Pi kits that come with a microSD Card), along with a connector to use the SD card with your computer if you don't have one built-in. * USB power supply (You can get Raspberry Pi 4 kits that come with a power supply). If you are using a Raspberry Pi 4 you need a USB-C power supply, earlier devices need a micro-USB power supply. From d3ec15cfc305c7d96f8ab8c3f7227e113c8ccfe1 Mon Sep 17 00:00:00 2001 From: Ludovico Besana <35035423+ludovicobesana@users.noreply.github.com> Date: Mon, 8 Nov 2021 18:08:00 +0100 Subject: [PATCH 20/36] feat: Add new favicon and title (#341) Co-authored-by: Jim Bennett --- images/favicon.png | Bin 0 -> 4556 bytes index.html | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 images/favicon.png diff --git a/images/favicon.png b/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7e33f5aedba624bb20001cc044b0fdd9a8587a46 GIT binary patch literal 4556 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 9bc1032f..171bfa1c 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ - Document + IoT for beginners - \ No newline at end of file + From 458009a7141b0063241e57f6a687ef41ffd7b79d Mon Sep 17 00:00:00 2001 From: Ludovico Besana <35035423+ludovicobesana@users.noreply.github.com> Date: Wed, 10 Nov 2021 19:12:46 +0100 Subject: [PATCH 21/36] fix: Fixed missing link tag (#345) --- index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/index.html b/index.html index 171bfa1c..09c642d5 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,7 @@ + From 36ddcbd0d3a9200c4074aac0c998b53d41ba9289 Mon Sep 17 00:00:00 2001 From: Vianney Gall <41265342+IterateMe@users.noreply.github.com> Date: Wed, 10 Nov 2021 13:16:48 -0500 Subject: [PATCH 22/36] French translation - Missing changes from last PR - Lesson 2.2 (#340) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * - Added README.fr.md in the root folder - Translated the whole leçon 2.1 * just added the whole content * small updates in root folder * Unnecessary shields removed and some corrections have been made from Charles's review * Translation of all lessons of the root README * Translation of for-teachers.md * Translation of hardware.md * Translation of CODE_OF_CONDUCT.md * Translation of CODE_OF_CONDUCT.md * Implement suggested changes from the charles's PR review * Implement suggested changes from the charles's PR review * Implement suggested changes from the charles's PR review * Implement suggested changes from the charles's PR review * Changed the path to the translated README because they were not working from the translated ones * Small change * Resolved unworking links in hardware.fr.md * Removed the shields where it was not necessary as Jim suggested * small correction * Removed the shields and comments as requested by Jim * small update * Small correction on root README * farm > lesson 2 > assignement.fr.md * farm > 2 > README.fr.md * pi-soil-moisture.fr.md completed * farm > lesson 2 > virtual-device-soil-moisture.fr.md * farm > lesson 2 > wio-terminal-soil-moisture.fr.md * Update README.fr.md * Corrected a non functionnal .md link Co-authored-by: Jim Bennett --- 2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md b/2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md index 74e0cdc9..bd583946 100644 --- a/2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md +++ b/2-farm/lessons/2-detect-soil-moisture/translations/README.fr.md @@ -20,7 +20,7 @@ Dans cette leçon, nous aborderons: * [Humidité du sol](#humidité-du-sol) * [Comment les senseurs communiquent avec les composants IoT](#comment-les-senseurs-communiquent-avec-les-composants-IoT) -* [Mesurer les niveaux d'humidité dans le sol](#mesurer-les-niveaux-d'humidité-dans-le-sol) +* [Mesurer les niveaux d'humidité dans le sol](#mesurer-les-niveaux-d-humidité-dans-le-sol) * [Étalonnage du capteur](#étalonnage-du-capteur) ## Humidité du sol From 83dc16350ce1b1f7cba54ec40c69ddce2cd80bbb Mon Sep 17 00:00:00 2001 From: Ozora Ogino <63685461+ozora-ogino@users.noreply.github.com> Date: Wed, 1 Dec 2021 01:34:29 +0900 Subject: [PATCH 23/36] Trasnlate README.md to Japanese (#348) * Add ./lesson-template/translations/README.ja.md * Add a badge for japanese translation * Fix file location * Update README.md * Fix typo * Fix Co-authored-by: Jim Bennett --- README.md | 1 + translations/README.ja.md | 146 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 translations/README.ja.md diff --git a/README.md b/README.md index 44139847..f3918652 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) +[![Japanese](https://img.shields.io/badge/-Japanese-red)](translations/README.ja.md) # IoT for Beginners - A Curriculum diff --git a/translations/README.ja.md b/translations/README.ja.md new file mode 100644 index 00000000..fdb8e943 --- /dev/null +++ b/translations/README.ja.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) +[![English](https://img.shields.io/badge/-English-red)](../README.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) + +# IoT for Beginners - A Curriculum + +我々、Microsoft社のクラウドアドボケイトチームはIoTの基礎に関する12週間にわたる合計24のレッスンをご提供できることを心より嬉しく思います。 それぞれのレッスンには問題、解説、IoTのソリューションの紹介、課題などが用意されており、実践的な学習を通して効率的にIoTスキルの取得をすることができます。 + +このプロジェクトでは、農業、物流、製造業、小売、消費者などIoTが用いられる主要な業界全てを取り上げます。 + + +![A road map for the course showing 24 lessons covering intro, farming, transport, processing, retail and cooking](../sketchnotes/Roadmap.jpg) + +> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). Click the image for a larger version. + + +**著者である [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/))** + +Meet the team! + +[![Promo video](../images/IOT.gif)](https://youtu.be/-wippUJRi5k) + +**Gif by** [Mohit Jaisal](https://linkedin.com/in/mohitjaisal) + +> 🎥 上記の画像をクリックするとビデオが見れます。 + +> **教師の方々へ** : [こちら](../for-teachers.md)を参考にして講義をするめることをお勧めします。もしご自身で新しいレッスンを追加されたい場合は [こちら](../lesson-template/README.md)のテンプレートをご利用ください。 + +> **学習者の皆様へ** : こちらのカリキュラムを使うために、フォークを作成しご自身の環境でレッスンを進めてください。また、各レッスンのソリューションは/solutionフォルダから確認可能ですが、コードをコピー&ペーストするのではなくご自身で手を動かして実装することをお勧めします。学習をさらに進めるために友達と勉強会を開くのもいいかもしれません。さらに学習を進めるには[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") + +> 🎥 上記の画像をクリックするとビデオが見れます。 + +## 勉強方法  + +このプロジェクトではプロジェクトベースの学習方法を実現するための2つのルールを採用しました。1つ目は各シリーズの終わりに植物の水やり機や自動車追跡、食べ物を追跡するスマートファクトリーの設定、音声で操作できるキッチンタイマーなどを実践的に学習者が実装できるように各レッスンをデザインしました。これにより、IoTの基礎、組み込み向けのコードの書き方、クラウドとの連携方法、遠隔計測値の分析、エッジデバイスでAIを実行する方法などを包括的に学ぶことができ、より実践に近い学習を行うことができます。 + +2つ目に、それぞれのレッスンの前後に簡単な問題(quiz)を設けることで学習した内容がより定着するよにしています。また、このプロジェクトは全部で12週間と膨大なため、学びたい分野のみを選択して学習できるように設計されています。 + +それぞれのプロジェクトで用いられるハードウェアは誰もが利用できるように世界中で広く利用されているものを採用し、特定の分野における背景や課題を説明するようにしています。ある特定の業界、分野における背景を知ることは開発者として成功する上でとても重要です。背景を知ることで、実際の業務で問われるような課題や必要な知識、IoTソリューションの実装についてイメージしやすく、そのソリューションの”なぜ”を知ることでよりユーザ視点に立ったソリューションを提供できます。 + +## ハードウェア + +柔軟に自分に合った選択ができるように、IoTハードウェアに関して2つの選択肢を用意しました。それに加えてデバイスを購入したくない方や何らかの事情でハードウェアが購入できない方のために"仮想ハードウェア"を提供しています。 詳細に関しては[hardware page](../hardware.md)の'shopping list'から確認できます。 + +> 💁 意見などあればぜひIssueを用いて我々に伝えてください。Contributionするためには[Code of Conduct](../CODE_OF_CONDUCT.md), [Contributing](../CONTRIBUTING.md), [Translation](../TRANSLATIONS.md)に目を通しておいてください。 + +## それぞれのレッスンの内容 + +- スケッチノート +- ビデオ(任意) +- レッスン前に行う問題 (Quiz) +- レッスン +- プロジェクトを完成するための段階ごとの説明(プロジェクトベースのレッスンの場合) +- 知識確認 +- チャレンジ問題 +- 追加資料 +- 課題 +- レッスンの最後に行う問題(Quiz) + +> **問題に関して**: 全ての問題は[このアプリ](https://brave-island-0b7c7f50f.azurestaticapps.net)で利用可能です。問題はそれぞれのレッスン内でリンクが貼られています。もしローカルでアプリを起動したい場合は`quiz-app`フォルダーを参照してください。 + +## レッスン + +| | プロジェクト名 | コンセプト | 学習標 | 関連するレッスン Lesson | +|:--:|:------------------------------------------:|:------------------------------------------:|------------------------------------------------------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------:| +| 01 | [Getting started](../1-getting-started) | IoTの基本 | IoTの基礎知識、IoTソリューションで用いられているセンサーやクラウドサービスといった基本的な技術について学習し、最初のIoTデバイスの設定を行います。 | [Introduction to IoT](../1-getting-started/lessons/1-introduction-to-iot/README.md) | +| 02 | [Getting started](../1-getting-started) | IoTの世界へ | IoTシステムの構成、マイクロコントローラ、シングルボードコンピュータについて学びます。 | [A deeper dive into IoT](../1-getting-started/lessons/2-deeper-dive/README.md) | +| 03 | [Getting started](../1-getting-started) | センサーとアクチュエータを用いた実践 | センサーを用いてデータを集め、アクチュエータを用いてFeedbackを送信する方法について常夜灯の実装を通して学びます。 | [Interact with the physical world with sensors and actuators](../1-getting-started/lessons/3-sensors-and-actuators/README.md) | +| 04 | [Getting started](../1-getting-started) | デバイスのインターネットへの接続 | ナイトライトとMQTTブローカーを用いてIoTのインターネットへの接続方法とメッセージの送受信方法について学びます。 | [Connect your device to the Internet](../1-getting-started/lessons/4-connect-internet/README.md) | +| 05 | [Farm](../2-farm) | 植物の成長予測 | IoTデバイスで取得した温度データを用いて植物の成長を予測する方法について学びます。 | [Predict plant growth](../2-farm/lessons/1-predict-plant-growth/README.md) | +| 06 | [Farm](../2-farm) | 土の水分計測 | 土の水分の計測方法とセンサーの調整方法を学びます。 | [Detect soil moisture](../2-farm/lessons/2-detect-soil-moisture/README.md) | +| 07 | [Farm](../2-farm) | 自動水やり機 | MQTTと中継機を用いて水やりを自動化する方法を学びます。 | [Automated plant watering](../2-farm/lessons/3-automated-plant-watering/README.md) | +| 08 | [Farm](../2-farm) | クラウドへの移行 | クラウドとクラウドのIoTソリューション、MQTTブローカーの代わりにクラウドを用いる方法について学びます。 | [Migrate your plant to the cloud](../2-farm/lessons/4-migrate-your-plant-to-the-cloud/README.md) | +| 09 | [Farm](../2-farm) | 水やり機のアプケーションをクラウドへ移行 | IoTメッセージに対応するアプリケーションのクラウド上での実装方法について学びます。 | [Migrate your application logic to the cloud](../2-farm/lessons/5-migrate-application-to-the-cloud/README.md) | +| 10 | [Farm](../2-farm) | 水やり機のセキュリティ | IoTのセキュリティ、キーと証明書を用いて水やり機をセキュアに保つ方法を学びます。 | [Keep your plant secure](../2-farm/lessons/6-keep-your-plant-secure/README.md) | +| 11 | [Transport](../3-transport) | 位置追跡 | IoTデバイスでGPS位置情報を用いた追跡について学びます。 | [Location tracking](../3-transport/lessons/1-location-tracking/README.md) | +| 12 | [Transport](../3-transport) | 位置データの保存 | 分析や可視化のためにIoTデータを保存する方法を学びます。 | [Store location data](../3-transport/lessons/2-store-location-data/README.md) | +| 13 | [Transport](../3-transport) | 位置データの可視化 | 位置データをMap上で可視化し、Mapがどのように3次元データを2次元データとして表現しているのかについて学びます。 | [Visualize location data](../3-transport/lessons/3-visualize-location-data/README.md) | +| 14 | [Transport](../3-transport) | ジオフェンス | ジオフェンスとジオフェンスを用いてサプライチェーンにある車両が近くにきたらアラートを鳴らす方法を学びます。 | [Geofences](../3-transport/lessons/4-geofences/README.md) | +| 15 | [Manufacturing](../4-manufacturing) | フルーツの品質を識別するAIの学習 | フルーツの品質を識別する識別器をクラウド上で学習する方法を学びます。 | [Train a fruit quality detector](../4-manufacturing/lessons/1-train-fruit-detector/README.md) | +| 16 | [Manufacturing](../4-manufacturing) | IoTデバイスからフルーツの品質を確認する | フルーツの品質を識別するAIをIoTデバイスから利用する方法を学びます。 | [Check fruit quality from an IoT device](../4-manufacturing/lessons/2-check-fruit-from-device/README.md) | +| 17 | [Manufacturing](../4-manufacturing) | 識別器をEdgeで動かす | Edgeデバイス上で識別器を動かす方法を学びます。 | [Run your fruit detector on the edge](../4-manufacturing/lessons/3-run-fruit-detector-edge/README.md) | +| 18 | [Manufacturing](../4-manufacturing) | センサーでフルーツの品質識別を起動する | センサーを用いてフルーツ品質識別を起動する方法を学びます | [Trigger fruit quality detection from a sensor](../4-manufacturing/lessons/4-trigger-fruit-detector/README.md) | +| 19 | [Retail](../.-retail) | 在庫管理AIの学習 | 物体認識を用いて店舗の在庫を識別する方法を学びます。 | [Train a stock detector](../5-retail/lessons/1-train-stock-detector/README.md) | +| 20 | [Retail](../5-retail) | IoTデバイスから在庫を確認する | 物体認識モデルを用いてIoTデバイスから在庫を確認する豊富を学びます。 | [Check stock from an IoT device](../5-retail/lessons/2-check-stock-device/README.md) | +| 21 | [Consumer](../6-consumer) | IoTデバイスを用いた音声認識 | スマートタイマーを実装するためにIoTデバイスから音声認識を行う方法について学びます。 | [Recognize speech with an IoT device](../6-consumer/lessons/1-speech-recognition/README.md) | +| 22 | [Consumer](../6-consumer) | 発話内容を理解する | IoTデバイスで取得した発話内容を理解する方法を学びます。 | [Understand language](../6-consumer/lessons/2-language-understanding/README.md) | +| 23 | [Consumer](../6-consumer) | タイマーのセットと通知 | IoTデバイスでタイマーをセットし、タイマーの開始と終わりに音声で通知する方法を学びます。 | [Set a timer and provide spoken feedback](../6-consumer/lessons/3-spoken-feedback/README.md) | +| 24 | [Consumer](../6-consumer) | 複数言語のサポート | 複数の言語で音声認識、通知する方法を学びます。 | [Support multiple languages](../6-consumer/lessons/4-multiple-language-support/README.md) | | + +## オフラインアクセス + + +[Docsify](https://docsify.js.org/#/)を使えばオフラインでこのドキュメントを利用できます。フォークを作成して、[Docsifyをインストール](https://docsify.js.org/#/quickstart)してください。 インストールが完了したらプロジェクトのルートディレクトリで`docsify serve`を実行し、ブラウザで`localhost:3000`を開いてください。 + +### PDF + +必要であればPDFを作成することもできます。 [npmをインストール](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)し、プロジェクトのルートディレクトリから以下のコマンドを実行してください。 + +```sh +npm i +npm run convert +``` + +### スライド + +[slides](../slides)フォルダーからレッスンのスライドにアクセスできます。 + +## あなたの助けが必要です! + +翻訳に協力していただける方は [translation guidelines](../TRANSLATIONS.md) と [Translation issue](https://github.com/microsoft/IoT-For-Beginners/issues?q=is%3Aissue+is%3Aopen+label%3Atranslation)を確認してください。 もしまだ翻訳されていない言語の翻訳をしたい場合は、新しいIssueを作ってください。 + +## そのほかのカリキュラム + +私たちはIoT以外にも以下のカリキュラムも提供しています。 + +- [Web Dev for Beginners](https://aka.ms/webdev-beginners) +- [ML for Beginners](https://aka.ms/ml-beginners) +- [Data Science for Beginners](https://aka.ms/datascience-beginners) + +## 画像著作権 + +このカリキュラムで使用されている画像全ての著作権帰属先については、必要に応じて[Attributions](../attributions.md)を参照してください。 + +## 日本語翻訳について + +日本語の翻訳に関してFeedbackがあればこちらの[Issue](https://github.com/microsoft/IoT-For-Beginners/issues/195)でコメントする、もしくは新たなIssueを作成しTranslatorにメンションしてください。 \ No newline at end of file From 36373eb48d1715c08cdc51335d5d044bece211f3 Mon Sep 17 00:00:00 2001 From: Jim Bennett Date: Wed, 1 Dec 2021 12:29:28 -0800 Subject: [PATCH 24/36] Adding note on BUllseye camera support --- 1-getting-started/lessons/1-introduction-to-iot/pi.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/1-getting-started/lessons/1-introduction-to-iot/pi.md b/1-getting-started/lessons/1-introduction-to-iot/pi.md index 47a4ae56..184d7758 100644 --- a/1-getting-started/lessons/1-introduction-to-iot/pi.md +++ b/1-getting-started/lessons/1-introduction-to-iot/pi.md @@ -31,7 +31,14 @@ If you want to work directly on your Pi, you can use the desktop version of Rasp Set up your Pi for development. -1. Follow the instructions in the [Raspberry Pi setup guide](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) to set up your Pi, connect it to a keyboard/mouse/monitor, connect it to your WiFi or ethernet network, and update the software. The OS you want to install is **Raspberry Pi OS (32 bit)**, it is marked as the recommended OS when using the Raspberry Pi Imager to image your SD card. +1. Follow the instructions in the [Raspberry Pi setup guide](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up) to set up your Pi, connect it to a keyboard/mouse/monitor, connect it to your WiFi or ethernet network, and update the software. + + > IMPORTANT + > + > Currently the latest Raspberry Pi OS no longer suports accessing the camera via PiCamera or any other Python library. You can read about this change in this [Raspberry Pi blog post](https://www.raspberrypi.com/news/bullseye-camera-system/). + > You will need to install an older OS by downloading the Buster image from the here: + > + > [https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2021-05-28/](https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2021-05-28/) To program the Pi using the Grove sensors and actuators, you will need to install an editor to allow you to write the device code, and various libraries and tools that interact with the Grove hardware. From 0f56f8b7ed1422410b3ef0515761f21674a7b39e Mon Sep 17 00:00:00 2001 From: ehrqor39 <57606561+ehrqor39@users.noreply.github.com> Date: Fri, 3 Dec 2021 01:43:19 +0900 Subject: [PATCH 25/36] Translation of Getting Started Lesson 1 to Korean (#351) This is the Korean translation of 1-getting started. --- .../translations/README.ko.md | 230 ++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 1-getting-started/lessons/1-introduction-to-iot/translations/README.ko.md diff --git a/1-getting-started/lessons/1-introduction-to-iot/translations/README.ko.md b/1-getting-started/lessons/1-introduction-to-iot/translations/README.ko.md new file mode 100644 index 00000000..e4530b1b --- /dev/null +++ b/1-getting-started/lessons/1-introduction-to-iot/translations/README.ko.md @@ -0,0 +1,230 @@ +# IoT에 대한 소개 + +![이 강의의 개요](../../../../sketchnotes/lesson-1.jpg) + +> [Nitya Narasimhan](https://github.com/nitya) 의 스케치노트. 더 큰 이미지를 보고싶으면 클릭하세요. + +이 수업은 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn)의 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 일부로 진행되었습니다. 수업은 2개의 비디오로 진행되었는데, 1시간짜리 수업과 강의에 대한 집중탐구 및 질의 응답 1시간으로 구성되어있습니다. + +[![Lesson 1: Introduction to IoT](https://img.youtube.com/vi/bVFfcYh6UBw/0.jpg)](https://youtu.be/bVFfcYh6UBw) + +[![Lesson 1: Introduction to IoT - Office hours](https://img.youtube.com/vi/YI772q5v3yI/0.jpg)](https://youtu.be/YI772q5v3yI) + +> 🎥 비디오를 시청하고 싶으면 이미지를 클릭하세요 + +## 강의 전 퀴즈 + +[강의 전 퀴즈](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/1) + +## 개요 + +이 강의에서는 사물 인터넷과 관련된 몇 가지 소개용 항목에 대해 설명하고 하드웨어를 설정하는 방법에 대해 설명합니다. + +이 단원에서는 다음을 다룹니다: + +* ['사물 인터넷'이란?](#what-is-the-internet-of-things) +* [IoT 장치](#iot-devices) +* [디바이스 설정](#set-up-your-device) +* [IoT의 응용 프로그램](#applications-of-iot) +* [내 주변에서 IoT의 예시](#examples-of-iot-devices-you-may-have-around-you) + +## '사물 인터넷'이란 무엇인가? + +'사물 인터넷'이라는 용어는 1999년, [Kevin Ashton](https://wikipedia.org/wiki/Kevin_Ashton)이 센서를 통해 인터넷을 물리적 세계에 연결하는 것을 지칭하기 위해 만들었다. 그 이후로 이 용어는 센서로부터 데이터를 수집하거나 액츄에이터(스위치를 켜거나 LED를 켜거나 켜는 것과 같은 일을 하는 장치)를 통해 실제 상호작용을 제공함으로써 주변 물리 세계와 상호 작용하는 모든 장치를 기술하기 위해 사용되어 왔으며 일반적으로 다른 장치나 인터넷에 연결되어 있다. + +> **센서** 는 속도, 온도 또는 위치 와 같은 정보를 세상에서 수집합니다. +> +> **액츄에이터** 는 전기 신호를 스위치 트리거, 조명 켜기, 소리 내기 또는 전원 소켓 켜기와 같은 실제 상호 작용으로 변환합니다. + +IoT는 단순한 기기가 아니라 센서 데이터를 처리하거나 IoT 기기에 연결된 액츄에이터에 요청을 보낼 수 있는 클라우드 기반 서비스를 포함합니다. 또한 edge장치라고 종종 언급되는, 인터넷 연결이 없거나 필요하지 않은 장치도 포함됩니다. 이들은 센서 데이터를 자체적으로 처리하고 대응할 수 있는 장치들로, 대개 클라우드에서 훈련된 AI 모델을 사용합니다. + +IoT는 빠르게 성장하는 기술 분야입니다. 2020년 말까지, IoT 기기가 300억대 보급돼 인터넷에 연결된 것으로 추산됩니다. 미래를 내다보면 2025년에는, IoT 기기가 거의 80제타바이트 또는 80조 기가바이트의 데이터를 수집할 것으로 예상됩니다. 정말 많은 데이터양이죠! + +![2015년에 50억 미만에서 2025년에 300억 이상으로 증가하는 추세로 시간에 따른 활성 IoT 기기를 보여주는 그래프](../../../../images/connected-iot-devices.svg) + +✅ 약간의 조사를 해보세요: IoT 기기에서 생성된 데이터의 얼마가 실제로 사용되고 있고, 얼마나 많은 데이터가 낭비되고 있나요? 왜 이렇게 많은 데이터가 무시되는 것일까요? + +IoT 성공의 비결은 바로 이 데이터입니다. 성공적인 IoT 개발자가 되려면 수집해야 할 데이터, 수집 방법, 이를 어떻게 결정을 할지 및 필요한 경우 이러한 결정들을 물리 세계와 연동하기 위해 어떻게 이용해야하는지 이해해야 합니다. + +## IoT 장치 + +IoT에서 **T** 는 **Things** 을 의미합니다. - 센서로부터 데이터를 수집하거나 액추에이터를 통해 실세계의 상호작용을 제공하며 주변 물리적 세계와 상호 작용하는 장치입니다. + +소비자 피트니스 추적기 또는 산업용 기계 제어기와 같은 생산 또는 상업적 사용을 위한 장치는 일반적으로 맞춤 제작됩니다. 이들은 맞춤형 회로 기판, 심지어 맞춤형 프로세서를 사용하기도 하는데, 이 기판은 손목에 찰 정도로 작거나 고온, 고강도 또는 고진동 공장 환경에서 작동하기에 충분히 견고하거나, 손목에 잘 맞도록 설계되어 있습니다. + +개발자는 IoT에 대해 배우거나 기기 프로토타입을 만들 때 개발자 키트로 시작해야 합니다. 그것은 개발자가 사용할 수 있도록 설계된 범용 IoT 장치이며, 센서나 액추에이터를 연결할 수 있는 외부 핀 세트, 디버깅을 지원하는 하드웨어 또는 대규모 제조 실행 시 불필요한 비용을 추가하는 추가 리소스와 같은 운영 장치에는 없는 기능을 갖추고 있습니다. + +이러한 개발자 키트는 일반적으로 마이크로컨트롤러와 싱글보드 컴퓨터의 두 가지 범주로 나뉩니다. 이것들은 여기서 소개될 것이고, 다음 수업에서 더 자세히 다루도록 하겠습니다. + +> 💁 당신의 핸드폰 또한 센서와 액추에이터가 내장된 범용 IoT 기기로도 볼 수 있으며, 앱마다 센서와 액추에이터를 사용하는 방식이 다르고 클라우드 서비스도 다릅니다. 당신은 또한 휴대폰 앱을 IoT 기기로 사용하는 IoT 튜토리얼도 찾아볼 수 있습니다. + +### 마이크로컨트롤러 + +마이크로컨트롤러(줄여서 MCU라고도 함)는 다음과 같이 구성된 소형 컴퓨터입니다.: + +🧠 하나 이상의 CPU(중앙 처리 장치) - 당시의 프로그램을 실행하는 마이크로컨트롤러의 '두뇌' + +💾 메모리(RAM 및 프로그램 메모리) - 당신의 프로그램, 데이터 및 변수가 저장되는 위치 + +🔌 프로그래밍 가능한 입출력(I/O) 연결 - 센서 및 액추에이터와 같은 외부 주변 장치(연결 장치)와 통신 + +마이크로컨트롤러는 일반적으로 저렴한 컴퓨팅 장치이며, 사용자 지정 하드웨어에 사용되는 장치의 평균 가격은 약 0.50달러까지 떨어지며, 어떤 장치는 0.03달러만큼 저렴합니다. 개발자 키트는 미화 4달러부터 시작할 수 있으며, 기능을 추가할수록 비용도 증가합니다. [Wio Terminal](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 센서, 액츄에이터, WiFi, 스크린을 갖춘 [Seeed studios](https://www.seeedstudio.com) 의 마이크로컨트롤러 개발자 키트로 미화 약 30달러의 가격으로 형성되어 있습니다. + +![A Wio Terminal](../../../../images/wio-terminal.png) + +> 💁 인터넷에서 마이크로컨트롤러를 검색할 때 **MCU**라는 용어를 검색하면 마이크로컨트롤러가 아닌 Marvel Cinematic Universe에 대한 많은 결과를 얻을 수 있으므로 주의해야 합니다. + +마이크로컨트롤러는 PC나 맥과 같은 범용 컴퓨터가 아니라 제한된 수의 매우 특정한 작업을 수행하도록 프로그래밍되어 있습니다. 매우 구체적인 시나리오를 제외하고는 모니터, 키보드 및 마우스를 연결하여 범용 작업에 사용할 수 없습니다. + +마이크로컨트롤러 개발자 키트는 보통 추가적인 센서와 작동기가 탑재되어 있습니다. 대부분의 보드에는 프로그래밍할 수 있는 하나 이상의 LED와 다양한 제조업체의 에코시스템을 사용하여 더 많은 센서 또는 액추에이터를 추가하는 표준 플러그와 같은 다른 장치 또는 내장 센서(일반적으로 온도 센서 등 가장 인기 있는 센서)가 있습니다. 일부 마이크로컨트롤러는 Bluetooth 또는 WiFi와 같은 무선 연결이 내장되어 있거나 이 연결을 추가하기 위해 보드에 추가 마이크로컨트롤러가 있습니다. + +> 💁 마이크로컨트롤러는 보통 C/C++로 프로그래밍 됩니다. + +### 싱글보드 컴퓨터 + +단일 보드 컴퓨터(single-board computer)는 하나의 작은 보드에 포함된 완전한 컴퓨터의 모든 요소를 포함하는 소형 컴퓨팅 장치입니다. 데스크탑 또는 노트북 PC 또는 Mac에 가까운 사양을 갖추고 있으며 전체 운영 체제를 실행하지만 크기가 작고 전력 사용량이 적으며 가격이 상당히 저렴한 장치입니다. + +![A Raspberry Pi 4](../../../../images/raspberry-pi-4.jpg) + +라즈베리 파이는 가장 인기 있는 싱글보드 컴퓨터 중 하나입니다. + +마이크로컨트롤러와 마찬가지로 싱글보드 컴퓨터에는 CPU, 메모리, 입출력 핀이 있지만 모니터, 오디오 출력, USB 포트를 연결하여 키보드 마우스와 웹캠이나 외장 스토리지와 같은 표준 USB 장치를 연결할 수 있는 그래픽 칩과 같은 추가 기능이 있습니다. 프로그램은 메모리 칩 대신 운영 체제와 함께 SD 카드나 하드 드라이브에 저장됩니다. + +> 🎓 싱글보드 컴퓨터는 센서 및 액추에이터와 상호 작용할 GPIO(일반용 입력/출력) 핀을 추가하여 읽고 있는 PC 또는 Mac의 더 작고 저렴한 버전이라고 생각할 수 있습니다. + +싱글보드 컴퓨터는 모든 기능을 갖춘 컴퓨터이므로 모든 언어로 프로그래밍할 수 있습니다. IoT 장치는 일반적으로 파이썬으로 프로그래밍됩니다. + +### 남은 수업 동안의 하드웨어 선택 + +이후의 모든 과정에는 IoT 디바이스를 사용하여 물리적 세계와 상호 작용하고 클라우드와 통신하는 과제가 포함됩니다. 각 레슨은 Arduino(Seeed Studios Wio Terminal 사용) 또는 단일 보드 컴퓨터, 물리적 장치(Lasberry Pi 4), PC 또는 Mac에서 실행되는 가상 단일 보드 컴퓨터 등 3가지 장치를 지원합니다. + +모든 과제를 완료하는 데 필요한 하드웨어에 대한 자세한 내용은 [하드웨어 가이드](../../../hardware.md)에서 확인할 수 있습니다. + +> 💁 과제를 완료하기 위해 IoT 하드웨어를 구입할 필요가 없으며 가상 싱글보드 컴퓨터로 모든 작업을 수행할 수 있습니다. + +어떤 하드웨어를 선택할지는 여러분의 학교와 가정에서 사용할 수 있는 것과 여러분이 알고 있거나 배울 계획인 프로그래밍 언어에 달려 있습니다. 두 하드웨어 변형 모두 동일한 센서 생태계를 사용하기 때문에 한 경로에서 시작하면 대부분의 키트를 교체할 필요 없이 다른 경로로 변경할 수 있습니다. 가상 싱글보드 컴퓨터는 라즈베리 파이에서 학습하는 것과 같으며, 결국 장치와 센서를 얻게 되면 대부분의 코드를 파이로 전송할 수 있습니다. + +### 아두이노 개발자 키트 + +마이크로컨트롤러 개발에 관심이 있다면 아두이노 기기를 이용해 과제를 완료할 수 있습니다. 이 수업은 아두이노 프레임워크, 사용 중인 센서와 액추에이터, 클라우드와 상호 작용하는 라이브러리와 관련된 코드만 가르치기 때문에 C/C++ 프로그래밍에 대한 기본적인 이해가 필요합니다. + +과제는 [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn) 와 [PlatformIO extension for microcontroller development](https://platformio.org)를 이용할 것입니다. 또한 이 도구에 익숙한 경우, 지침이 제공되지 않는 Arduino IDE를 사용할 수도 있습니다. + +### Single-board 컴퓨터 개발자 키트 + +싱글보드 컴퓨터를 사용하여 IoT 개발을 배우는 데 관심이 있다면 PC 또는 Mac에서 실행 중인 가상 장치인 라즈베리 파이를 사용하여 과제를 완료할 수 있습니다. + +사용 중인 센서와 액추에이터, 클라우드와 상호 작용하는 라이브러리와 관련된 코드만 학습하므로 파이썬 프로그래밍에 대한 기본적인 이해가 필요합니다. + +> 💁 만약 당신이 Python으로 코드를 알기 원한다면 : 다음의 두개의 비디오 시리즈를 확인해보세요 : +> +> * [입문자를 위한 파이썬](https://channel9.msdn.com/Series/Intro-to-Python-Development?WT.mc_id=academic-17441-jabenn) +> * [입문자를 위한 더 많은 파이썬](https://channel9.msdn.com/Series/More-Python-for-Beginners?WT.mc_id=academic-7372-jabenn) + +과제에서는 [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-17441-jabenn)을 이용할 것입니다.. + +Rasberry Pi를 사용하는 경우 Rasberry Pi OS의 전체 데스크톱 버전을 사용하여 Pi를 실행하고 [Rasberry Pi OS 버전의 VS Code](https://code.visualstudio.com/docs/setup/raspberry-pi?WT.mc_id=academic-17441-jabenn)를 사용하여 Pi에서 직접 모든 코딩을 수행하거나 [원격 SSH 확장](https://code.visualstudio.com/docs/remote/ssh?WT.mc_id=academic-17441-jabenn)을 사용하여 PC 또는 Mac의 헤드리스 장치 및 코드로 Pi를 실행할 수 있습니다. 직접 코드를 코딩하는 것처럼 코드를 편집, 디버그 및 실행합니다. + +가상 디바이스 옵션을 사용하는 경우 컴퓨터에서 직접 코딩합니다. 센서와 액추에이터에 액세스하는 대신 도구를 사용하여 정의할 수 있는 센서 값을 제공하고 액추에이터의 결과를 화면에 표시합니다. + +## 장치 설정 + +IoT 장치 프로그래밍을 시작하려면 먼저 소량의 설정을 수행해야 합니다. 사용할 기기에 따라 아래의 관련 지침을 따라보세요. + +> 💁 아직 장치가 없는 경우 [하드웨어 가이드](../../../../hardware.md)를 참조하여 사용할 장치와 구입해야 할 추가 하드웨어를 결정해보세요. 모든 프로젝트를 가상 하드웨어에서 실행할 수 있으므로 하드웨어를 구입할 필요는 없습니다. + +이러한 지침에는 사용할 하드웨어 또는 도구를 만든 사람이 제공하는 타사 웹 사이트에 대한 링크가 포함됩니다. 이렇게 하면 다양한 도구 및 하드웨어에 대한 최신 지침을 항상 사용할 수 있습니다. + +관련 안내에 따라 장치를 설정하고 'Hello World' 프로젝트를 완료해보세요. 이것은 이 시작 부분의 4가지 레슨에 대한 IoT 야간조명을 만드는 첫 번째 단계가 될 것입니다. + +* [Arduino - Wio Terminal](wio-terminal.md) +* [Single-board computer - Raspberry Pi](pi.md) +* [Single-board computer - Virtual device](virtual-device.md) + +✅ 당신은 아두이노와 싱글보드 컴퓨터 모두에 VS code를 사용하게 될 것입니다. 사용해본적이 없다면 [VS Code site](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn)를 자세히 읽어보세요. + +## IoT의 응용 + +IoT는 몇 가지 광범위한 그룹에 걸쳐 광범위한 사용 사례를 다루고 있습니다 : + +* 소비자 IoT +* 상용 IoT +* 산업 IoT +* 사회 기반 시설 IoT + +✅ 약간의 조사를 해보세요: 아래에 설명된 각 영역에 대해, 본문에 나와 있지 않은 구체적인 예를 하나 찾아보세요. + +### 소비자 IoT + +컨슈머 IoT는 소비자가 가정 주변에서 구매해 사용할 IoT 기기를 말합니다. 스마트 스피커, 스마트 난방 시스템, 로봇 청소기와 같은 이 장치들 중 일부는 엄청나게 유용합니다. 음성 제어 수도꼭지와 같이 유용성이 의심되는 경우도 있는데, 이는 음성 제어가 흐르는 물 소리 때문에 당신의 목소리를 들을 수 없기 때문에 끌 수 없음을 의미합니다. + +소비자 IoT 기기들은 특히 장애를 가진 10억 명의 사람들에게 그들의 환경에서 더 많은 것을 성취할 수 있는 힘을 주고 있습니다. 로봇청소기는 스스로 진공청소기를 사용할 수 없는 거동이 불편한 사람들에게 깨끗한 바닥을 제공할 수 있고, 음성제어 오븐은 시력이 제한적이거나 운동기능이 있는 사람들이 목소리만으로 오븐을 데울 수 있게 하며, 건강 모니터는 환자들이 만성 상태를 그들의 상태에 대한 업데이트로 보다 규칙적이고 더 자세하게 스스로 모니터링할 수 있게 합니다. 예를 들어 COVID 대유행 기간 동안 가상 교육을 하는 학생들이 스마트 홈 장치에 타이머를 설정하여 학교 공부를 추적하거나 다가오는 학급 회의를 상기시키는 등 이러한 장치는 매우 보편화되고 있습니다. + +✅ 개인 또는 가정에 어떤 소비자 IoT 기기를 가지고 있나요? + +### 상용 IoT + +상용 IoT는 직장에서 IoT를 사용하는 것을 포함합니다. 사무실 환경에서는 조명과 난방을 관리하기 위한 거주 감지기와 동작 감지기가 있어 필요하지 않을 때만 조명을 유지하고 열을 차단하여 비용과 탄소 배출량을 줄일 수 있습니다. 공장에서 사물인터넷(IoT) 기기는 작업자가 안전모를 쓰지 않거나 위험 수위에 도달한 소음 등 안전상의 위험을 감시할 수 있습니다. 소매업체에서는 사물인터넷(IoT) 기기가 냉장·냉동고가 필요 온도 범위를 벗어나면 점주에게 알려 냉장·냉동고 보관 온도를 측정하거나, 선반에 있는 품목을 모니터링해 직원들에게 판매된 농산물을 리필하도록 지시할 수 있습니다. 운송업계는 차량 위치 모니터링, 도로 사용자 충전을 위한 온로드 마일리지 추적, 운전자 시간 및 고장 준수 여부 추적, 적재 또는 하역 준비를 위해 차량 입고지 접근 시 직원에게 알리는 등의 IoT 의존도가 높아지고 있습니다. + +✅ 당신의 학교나 직장에 어떤 상용 IoT 기기를 가지고 있나요? + +### 산업 IoT (IIoT) + +산업용 IoT 또는 IIoT는 대규모로 기계를 제어하고 관리하기 위해 IoT 장치를 사용하는 것입니다. 여기에는 공장에서 디지털 농업에 이르기까지 광범위한 사용 사례가 포함됩니다. + +공장들은 IoT 기기를 다양한 방식으로 사용합니다. 기계는 온도, 진동, 회전 속도와 같은 것들을 추적하기 위해 여러 센서로 모니터링될 수 있습니다. 그런 다음 이 데이터를 모니터링하여 특정 공차를 벗어날 경우 기계가 중지되도록 할 수 있습니다. 예를 들어, 너무 뜨거울 경우 기계가 종료됩니다. 이 데이터는 시간이 지남에 따라 수집 및 분석하여 예측 정비를 수행할 수 있으며, 여기서 AI 모델은 장애로 이어지는 데이터를 살펴보고 다른 장애가 발생하기 전에 예측에 사용할 수 있습니다. + +지구의 증가하는 인구, 특히 [지속 농업](https://wikipedia.org/wiki/Subsistence_agriculture)으로 생존하는 5억 가구 20억 인구의 경우 디지털 농업이 중요합니다. 디지털 농업은 몇 개의 한 자릿수 달러 센서에서 대규모 상업 설정에 이르기까지 다양합니다. 농부는 온도를 모니터링하고 [일별 성장 비율](https://wikipedia.org/wiki/Growing_degree-day) 을 사용하여 농작물이 언제 수확할 수 있는지 예측할 수 있습니다. 그들은 토양 수분 모니터링과 자동 식수 시스템을 연결하여 식물들에게 필요한 만큼의 물을 줄 수 있지만, 물을 낭비하지 않고 농작물이 마르지 않도록 더 이상 보장할 수는 없습니다. 농부들은 심지어 그것을 더 나아가서 드론, 위성 데이터, AI를 이용하여 거대한 농경지의 농작물 성장, 질병, 토양의 질 등을 감시하고 있습니다. + +✅ 농부들에게 도움이 될 수 있는 다른 사물인터넷 기기들은 무엇일까요? + +### 사회 기반 시설(인프라) IoT + +인프라 IoT는 사람들이 일상적으로 사용하는 지역적 인프라와 세계적 인프라를 감시하고 제어하는 것입니다. + +[Smart Cities](https://wikipedia.org/wiki/Smart_city) 는 IoT 기기를 사용하여 도시에 대한 데이터를 수집하고 도시 운영 방식을 개선하는 도시 지역입니다. 이 도시들은 보통 지방 정부, 학계, 지역 기업들 간의 협업으로 운영되며, 교통에서부터 주차, 오염에 이르기까지 다양한 것들을 추적하고 관리합니다. 예를 들어 덴마크 코펜하겐은 대기오염이 지역 주민들에게 중요하기 때문에 이를 측정해 데이터를 활용해 가장 깨끗한 자전거와 조깅 경로에 대한 정보를 제공합니다. + +[스마트 전력망](https://wikipedia.org/wiki/Smart_grid) 은 개별 가정 수준에서 사용 데이터를 수집하여 전력 수요를 더 잘 분석할 수 있도록 합니다. 이 데이터는 발전소를 새로 지을 장소를 포함한 국가 차원에서의 의사 결정을 안내할 수 있으며, 사용자가 얼마나 많은 전력을 사용하고 있는지, 언제 사용하는지에 대한 통찰력과 심지어 야간 전기차 충전과 같은 비용 절감 방법에 대한 제안까지 사용자에게 제공하여 개인 차원에서의 의사 결정을 안내할 수 있습니다. + +✅ 만약 당신이 살고 있는 곳의 사물인터넷 장치를 추가하여 무엇이든 측정할 수 있다면, 무엇을 하고 싶나요? + +## 주변에 있을 수 있는 IoT 장치의 예 + +주변에 IoT 기기가 얼마나 많은지 알면 놀라실거에요. 집에서 작성 중이며 앱 컨트롤, 음성 컨트롤 또는 전화기를 통해 데이터를 전송하는 기능과 같은 스마트 기능을 갖춘 다음과 같은 장치들이 인터넷에 연결되어 있습니다. + +* 다중 스마트 스피커 +* 냉장고, 식기세척기, 오븐 및 전자레인지 +* 태양 전지판용 전기 모니터 +* 스마트 플러그 +* 비디오 초인종 및 보안 카메라 +* 여러 개의 스마트 룸 센서가 장착된 스마트 온도 조절기 +* 차고 문 개폐기 +* 가정용 엔터테인먼트 시스템 및 음성 제어 TV +* 조명 +* 피트니스 및 건강 추적기 + +이러한 모든 유형의 장치에는 센서 및/또는 작동기가 있으며 인터넷과 통신합니다. 우리는 휴대폰으로 차고 문이 열려 있는지 알 수 있고, 스마트 스피커에게 문을 닫아달라고 부탁할 수 있습니다. 타이머도 설정할 수 있어서 밤에 열려 있으면 자동으로 닫힙니다. 초인종이 울리면 세계 어디에 있든 휴대폰으로 누가 있는지, 초인종 안에 내장된 스피커와 마이크를 통해 대화할 수 있습니다. 나는 내 혈당, 심박수, 수면 패턴을 모니터링 할 수 있고 내 건강을 증진시키기 위해 데이터에서 패턴을 찾을 수 있습니다. 우리는 클라우드를 통해 조명을 제어할 수 있고, 인터넷 연결이 끊어졌을 때 어둠 속에 앉아 있을 수 있습니다. + +--- + +## 🚀 도전 + +집, 학교 또는 직장에 있는 IoT 기기를 가능한 한 많이 나열해보세요 - 생각보다 많을 에요! + +## 강의 후 퀴즈 + +[강의 후 퀴즈](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/2) + +## 복습 & 자기주도 학습 + +소비자 IoT 프로젝트의 이점과 실패에 대해 읽어보세요. 뉴스 사이트에서 개인 정보 보호 문제, 하드웨어 문제 또는 연결 부족으로 인한 문제와 같은 잘못된 기사를 확인해보세요. + +예시 : + +* 트위터 계정 **[Internet of Sh*t](https://twitter.com/internetofshit)** *(profanity warning)* 에서 소비자 IoT의 실폐사례로 좋은 몇가지 예시들을 확인해보세요. +* [c|net - My Apple Watch saved my life: 5 people share their stories](https://www.cnet.com/news/apple-watch-lifesaving-health-features-read-5-peoples-stories/) +* [c|net - ADT technician pleads guilty to spying on customer camera feeds for years](https://www.cnet.com/news/adt-home-security-technician-pleads-guilty-to-spying-on-customer-camera-feeds-for-years/) *(trigger warning - non-consensual voyeurism)* + +## 과제 + +[IoT 프로젝트 조사](assignment.md) From fc9b5911740082409960eaf85ea43ef2f33ae685 Mon Sep 17 00:00:00 2001 From: Anurag Sharma <53372213+Anurag-0-1-A@users.noreply.github.com> Date: Tue, 7 Dec 2021 23:02:44 +0530 Subject: [PATCH 26/36] Create README.hi.md (#272) * Create README.hi.md * Update README.hi.md Co-authored-by: Jim Bennett --- .../2-deeper-dive/translations/README.hi.md | 266 ++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 1-getting-started/lessons/2-deeper-dive/translations/README.hi.md diff --git a/1-getting-started/lessons/2-deeper-dive/translations/README.hi.md b/1-getting-started/lessons/2-deeper-dive/translations/README.hi.md new file mode 100644 index 00000000..07521593 --- /dev/null +++ b/1-getting-started/lessons/2-deeper-dive/translations/README.hi.md @@ -0,0 +1,266 @@ +# IoT में गहराई से अध्ययन करें + +![इस पाठ का एक संक्षिप्त विवरण](https://github.com/microsoft/IoT-For-Beginners/blob/main/sketchnotes/lesson-2.jpg?raw=true) + +> स्केचनोट [नित्य नरसिम्हन](https://github.com/nitya) द्वारा बनाया गया है। एक बड़े संस्करण के लिए छवि पर क्लिक करें। + +यह पाठ [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) के हिस्से के रूप में [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=अकादमिक-17441-jabenn) से पढ़ाया गया था। पाठ को 2 वीडियो में पढ़ाया गया था - 1 घंटे का पाठ, और 1 घंटे का कार्यालय समय जिसमे पाठ के कुछ हिस्सों में गहराई से अध्ययन करते हैं और सवालों के जवाब देते हैं। + +[![पाठ 2: IoT में एक गहरी डुबकी](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M) + +[![पाठ 2: IoT - कार्यालय समय में एक गहरी गोता](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E) + +> वीडियो देखने के लिए ऊपर की छवियों पर क्लिक करें + +## पूर्व व्याख्यान प्रश्नोत्तरी + +[व्याख्यान पूर्व प्रश्नोत्तरी](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/3) + +## परिचय + +यह पाठ पिछले पाठ में शामिल कुछ अवधारणाओं में गहराई से अध्ययन करता है। + +इस पाठ में हम कवर करेंगे: + +* [एक IoT एप्लिकेशन के अंश](#एक-IoT-एप्लिकेशन-के-अंश) +* [माइक्रोकंट्रोलर्स में गहराई से अध्ययन करें](#माइक्रोकंट्रोलर-में-गहराई-से-अध्ययन-करें) +* [सिंगल-बोर्ड कंप्यूटरों में गहराई से अध्ययन करें](#सिंगल-बोर्ड-कंप्यूटर-में-गहराई-से-अध्ययन-करें) + +## एक IoT एप्लिकेशन के अंश + +IoT एप्लिकेशन के दो घटक हैं *इंटरनेट* और *थिंग*। आइए इन दो अंशों को थोड़ा और विस्तार से देखें। + +### थिंग + +![एक रास्पबेरी पाई 4](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/raspberry-pi-4.jpg) + +IoT का **थिंग** भाग एक ऐसे उपकरण को संदर्भित करता है जो भौतिक दुनिया के साथ इंटरैक्ट कर सकता है। ये उपकरण आमतौर पर छोटे, कम कीमत वाले कंप्यूटर होते हैं, जो कम गति पर चलते हैं और कम शक्ति का उपयोग करते हैं - उदाहरण के लिए, किलोबाइट रैम के साथ साधारण माइक्रोकंट्रोलर (पीसी में गीगाबाइट के विपरीत) केवल कुछ सौ मेगाहर्ट्ज़ पर चल रहे हैं (पीसी में गीगाहर्ट्ज़ के विपरीत), लेकिन कभी-कभी इतनी कम बिजली की खपत करते हुए कि वे बैटरी पर हफ्तों, महीनों या वर्षों तक चल सकते हैं। + +ये उपकरण भौतिक दुनिया के साथ बातचीत करते हैं, या तो सेंसर का उपयोग करके अपने आसपास से डेटा इकट्ठा करते हैं या भौतिक परिवर्तन करने के लिए आउटपुट या एक्चुएटर्स को नियंत्रित करते हैं। इसका विशिष्ट उदाहरण एक स्मार्ट थर्मोस्टेट है - एक उपकरण जिसमें एक तापमान सेंसर होता है, एक वांछित तापमान जैसे डायल या टचस्क्रीन सेट करने का साधन, और एक हीटिंग या कूलिंग सिस्टम से एक कनेक्शन जिसे तापमान का पता चलने पर चालू किया जा सकता है वांछित सीमा से बाहर है। तापमान संवेदक यह पता लगाता है कि कमरा बहुत ठंडा है और एक एक्चुएटर हीटिंग को चालू कर देता है। + +![एक IoT डिवाइस के इनपुट के रूप में तापमान और एक डायल, और आउटपुट के रूप में हीटर का नियंत्रण दिखाने वाला एक आरेख](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/basic-thermostat.png) + +विभिन्न चीजों की एक विशाल श्रृंखला है जो IoT उपकरणों के रूप में कार्य कर सकती है, समर्पित हार्डवेयर से जो एक चीज को समझती है, सामान्य प्रयोजन के उपकरणों तक, यहां तक ​​कि आपका स्मार्टफोन भी! एक स्मार्टफोन अपने आसपास की दुनिया का पता लगाने के लिए सेंसर का उपयोग कर सकता है, और दुनिया के साथ बातचीत करने के लिए एक्ट्यूएटर्स का उपयोग कर सकता है - उदाहरण के लिए आपके स्थान का पता लगाने के लिए एक जीपीएस सेंसर का उपयोग करना और एक स्पीकर का उपयोग करके आपको गंतव्य पर नेविगेशन निर्देश देना। + +✅अपने आस-पास मौजूद अन्य प्रणालियों के बारे में सोचें जो सेंसर से डेटा पढ़ती हैं और निर्णय लेने के लिए इसका उपयोग करती हैं। एक उदाहरण ओवन पर थर्मोस्टैट होगा। क्या आप और खोज सकते हैं? + +### इंटरनेट + +IoT एप्लिकेशन के **इंटरनेट** पक्ष में ऐसे एप्लिकेशन होते हैं जिन्हें IoT डिवाइस डेटा भेजने और प्राप्त करने के लिए कनेक्ट कर सकता है, साथ ही अन्य एप्लिकेशन जो IoT डिवाइस से डेटा को प्रोसेस कर सकते हैं और IoT डिवाइस एक्ट्यूएटर्स को कौन से अनुरोध भेजने के लिए निर्णय लेने में मदद करते हैं। + +एक विशिष्ट सेटअप में किसी प्रकार की क्लाउड सेवा होगी जिससे IoT डिवाइस कनेक्ट होता है, और यह क्लाउड सेवा सुरक्षा जैसी चीज़ों को संभालती है, साथ ही IoT डिवाइस से संदेश प्राप्त करती है, और डिवाइस पर संदेश वापस भेजती है। यह क्लाउड सेवा तब अन्य अनुप्रयोगों से कनेक्ट होगी जो सेंसर डेटा को संसाधित या संग्रहीत कर सकते हैं, या निर्णय लेने के लिए अन्य सिस्टम के डेटा के साथ सेंसर डेटा का उपयोग कर सकते हैं। + +डिवाइस हमेशा वाई-फ़ाई या वायर्ड कनेक्शन के माध्यम से सीधे इंटरनेट से कनेक्ट नहीं होते हैं। कुछ डिवाइस ब्लूटूथ जैसी तकनीकों पर एक-दूसरे से बात करने के लिए जाल नेटवर्किंग का उपयोग करते हैं, एक हब डिवाइस के माध्यम से जुड़ते हैं जिसमें इंटरनेट कनेक्शन होता है। + +एक स्मार्ट थर्मोस्टेट के उदाहरण के साथ, थर्मोस्टैट होम वाईफाई का उपयोग करके क्लाउड में चल रही क्लाउड सेवा से जुड़ जाएगा। यह इस क्लाउड सेवा को तापमान डेटा भेजेगा, और वहां से इसे किसी प्रकार के डेटाबेस में लिखा जाएगा जिससे मकान मालिक फोन ऐप का उपयोग करके वर्तमान और पिछले तापमान की जांच कर सके। क्लाउड में एक अन्य सेवा को पता होगा कि मकान मालिक को कौन सा तापमान चाहिए, और हीटिंग सिस्टम को चालू या बंद करने के लिए कहने के लिए क्लाउड सेवा के माध्यम से IoT डिवाइस पर संदेश वापस भेजें। + +![एक आईओटी डिवाइस के इनपुट के रूप में तापमान और एक डायल दिखाने वाला एक आरेख, आईओटी डिवाइस क्लाउड से 2 तरह से संचार करता है, जो बदले में एक फोन के लिए 2-तरफा संचार होता है, और आईओटी से आउटपुट के रूप में हीटर का नियंत्रण होता है। डिवाइस](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/mobile-controlled-thermostat.png) + +एक और भी स्मार्ट संस्करण क्लाउड में AI का उपयोग अन्य IoT उपकरणों से जुड़े अन्य सेंसर से डेटा के साथ कर सकता है जैसे कि ऑक्यूपेंसी सेंसर जो यह पता लगाते हैं कि कौन से कमरे उपयोग में हैं, साथ ही डेटा जैसे मौसम और यहां तक ​​​​कि आपका कैलेंडर, इस पर निर्णय लेने के लिए कि कैसे तापमान को स्मार्ट तरीके से सेट करें। उदाहरण के लिए, यदि यह आपके कैलेंडर से पढ़ता है कि आप छुट्टी पर हैं, तो यह आपके हीटिंग को बंद कर सकता है, या आपके द्वारा उपयोग किए जाने वाले कमरों के आधार पर कमरे-दर-कमरे के आधार पर हीटिंग को बंद कर सकता है, डेटा से अधिक से अधिक सटीक होना सीखता है अधिक समय तक। + +![एक आईओटी डिवाइस के इनपुट के रूप में कई तापमान सेंसर और एक डायल दिखाते हुए एक आरेख, क्लाउड के लिए 2-तरफा संचार वाला आईओटी डिवाइस, जिसके बदले में फोन, कैलेंडर और मौसम सेवा के लिए 2-तरफा संचार होता है, और IoT डिवाइस से आउटपुट के रूप में हीटर का नियंत्रण](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/smarter-thermostat.png) + +✅कौन सा अन्य डेटा इंटरनेट से जुड़े थर्मोस्टेट को स्मार्ट बनाने में मदद कर सकता है? + +### किनारे पर IoT + +हालाँकि IoT में I का अर्थ इंटरनेट है, इन उपकरणों को इंटरनेट से कनेक्ट करने की आवश्यकता नहीं है। कुछ मामलों में, डिवाइस 'एज' डिवाइस से कनेक्ट हो सकते हैं - गेटवे डिवाइस जो आपके स्थानीय नेटवर्क पर चलते हैं, जिसका अर्थ है कि आप इंटरनेट पर कॉल किए बिना डेटा को प्रोसेस कर सकते हैं। यह तब तेज हो सकता है जब आपके पास बहुत अधिक डेटा या धीमा इंटरनेट कनेक्शन हो, यह आपको ऑफ़लाइन चलाने की अनुमति देता है जहां इंटरनेट कनेक्टिविटी संभव नहीं है जैसे कि जहाज पर या आपदा क्षेत्र में मानवीय संकट का जवाब देते समय, और आपको डेटा को निजी रखें। कुछ उपकरणों में क्लाउड टूल्स का उपयोग करके बनाए गए प्रोसेसिंग कोड होंगे और निर्णय लेने के लिए इंटरनेट कनेक्शन का उपयोग किए बिना डेटा एकत्र करने और प्रतिक्रिया देने के लिए इसे स्थानीय रूप से चलाएंगे। + +इसका एक उदाहरण ऐप्पल होमपॉड, अमेज़ॅन एलेक्सा, या Google होम जैसे स्मार्ट होम डिवाइस हैं, जो क्लाउड में प्रशिक्षित एआई मॉडल का उपयोग करके आपकी आवाज सुनेंगे, लेकिन डिवाइस पर स्थानीय रूप से चल रहे हैं। जब कोई निश्चित शब्द या वाक्यांश बोला जाता है तो ये उपकरण 'जागृत' होंगे, और उसके बाद ही प्रसंस्करण के लिए इंटरनेट पर अपना भाषण भेजेंगे। डिवाइस उचित बिंदु पर भाषण भेजना बंद कर देगा जैसे कि जब यह आपके भाषण में विराम का पता लगाता है। वेक शब्द के साथ डिवाइस को जगाने से पहले आप जो कुछ भी कहते हैं, और डिवाइस के सुनना बंद करने के बाद आप जो कुछ भी कहते हैं वह इंटरनेट पर डिवाइस प्रदाता को नहीं भेजा जाएगा, और इसलिए निजी होगा। + +✅अन्य परिदृश्यों के बारे में सोचें जहां गोपनीयता महत्वपूर्ण है इसलिए डेटा का प्रसंस्करण क्लाउड के बजाय किनारे पर बेहतर ढंग से किया जाएगा। एक संकेत के रूप में - उन IoT उपकरणों के बारे में सोचें जिनमें कैमरे या अन्य इमेजिंग डिवाइस हैं। + +### आईओटी सुरक्षा + +किसी भी इंटरनेट कनेक्शन के साथ, सुरक्षा एक महत्वपूर्ण विचार है। एक पुराना मजाक है कि 'आईओटी में एस सुरक्षा के लिए खड़ा है' - आईओटी में कोई 'एस' नहीं है, जिसका अर्थ है कि यह सुरक्षित नहीं है। + +IoT डिवाइस क्लाउड सेवा से कनेक्ट होते हैं, और इसलिए केवल उस क्लाउड सेवा की तरह ही सुरक्षित होते हैं - यदि आपकी क्लाउड सेवा किसी डिवाइस को कनेक्ट करने की अनुमति देती है तो दुर्भावनापूर्ण डेटा भेजा जा सकता है, या वायरस के हमले हो सकते हैं। इसके बहुत ही वास्तविक दुनिया के परिणाम हो सकते हैं क्योंकि IoT डिवाइस अन्य उपकरणों को इंटरैक्ट और नियंत्रित करते हैं। उदाहरण के लिए, [स्टक्सनेट वर्म](https://wikipedia.org/wiki/Stuxnet) ने सेंट्रीफ्यूज में वाल्वों को खराब करने के लिए हेरफेर किया। हैकर्स ने [बेबी मॉनिटर तक पहुंचने के लिए खराब सुरक्षा](https://www.npr.org/sections/thetwo-way/2018/06/05/617196788/s-c-mom-says-baby-monitor-was-hacked-experts-say-many-devices-are-vulnerable) का भी फायदा उठाया है और अन्य घरेलू निगरानी उपकरण। + +> 💁कभी-कभी IoT डिवाइस और एज डिवाइस डेटा को निजी और सुरक्षित रखने के लिए इंटरनेट से पूरी तरह से अलग नेटवर्क पर चलते हैं। इसे [एयर-गैपिंग](https://wikipedia.org/wiki/Air_gap_(networking)) के नाम से जाना जाता है। + +## माइक्रोकंट्रोलर में गहराई से अध्ययन करें + +पिछले पाठ में, हमने माइक्रोकंट्रोलर पेश किए थे। आइए अब उनमें गहराई से देखें। + +### सी पी यू + +सीपीयू माइक्रोकंट्रोलर का 'दिमाग' है। यह प्रोसेसर है जो आपके कोड को चलाता है और किसी भी कनेक्टेड डिवाइस से डेटा भेज सकता है और डेटा प्राप्त कर सकता है। सीपीयू में एक या अधिक कोर हो सकते हैं - अनिवार्य रूप से एक या अधिक सीपीयू जो आपके कोड को चलाने के लिए एक साथ काम कर सकते हैं। + +सीपीयू एक सेकंड में कई लाख या अरबों बार टिक करने के लिए एक घड़ी पर भरोसा करते हैं। प्रत्येक टिक, या चक्र, सीपीयू द्वारा की जाने वाली क्रियाओं को सिंक्रनाइज़ करता है। प्रत्येक टिक के साथ, सीपीयू एक प्रोग्राम से एक निर्देश निष्पादित कर सकता है, जैसे बाहरी डिवाइस से डेटा पुनर्प्राप्त करना या गणितीय गणना करना। यह नियमित चक्र अगले निर्देश के संसाधित होने से पहले सभी कार्यों को पूरा करने की अनुमति देता है। + +घड़ी का चक्र जितना तेज़ होता है, उतने ही अधिक निर्देश जो प्रत्येक सेकंड में संसाधित किए जा सकते हैं, और इसलिए सीपीयू जितना तेज़ होता है। CPU की गति [Hertz (Hz)](https://wikipedia.org/wiki/Hertz) में मापी जाती है, एक मानक इकाई जहां 1 Hz का अर्थ है प्रति सेकंड एक चक्र या घड़ी का टिक। + +> 🎓CPU की गति अक्सर MHz या GHz में दी जाती है। 1MHz 1 मिलियन हर्ट्ज है, 1GHz 1 बिलियन हर्ट्ज है। + +> 💁 CPU [fetch-decode-execute cycle](https://wikipedia.org/wiki/Instruction_cycle) का उपयोग करके प्रोग्राम निष्पादित करते हैं। प्रत्येक घड़ी की टिक के लिए, सीपीयू मेमोरी से अगला निर्देश प्राप्त करेगा, इसे डीकोड करेगा, फिर इसे निष्पादित करेगा जैसे कि 2 नंबर जोड़ने के लिए अंकगणितीय तर्क इकाई (एएलयू) का उपयोग करना। कुछ निष्पादन चलाने के लिए कई टिक लगेंगे, इसलिए अगला चक्र निर्देश पूरा होने के बाद अगले टिक पर चलेगा। + +![फ़ेच डिकोड, रैम में संग्रहीत प्रोग्राम से फ़ेच लेने का निर्देश दिखाते हुए चक्रों को निष्पादित करता है, फिर इसे सीपीयू पर डिकोडिंग और निष्पादित करता है](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/fetch-decode-execute.png) + +माइक्रोकंट्रोलर की घड़ी की गति डेस्कटॉप या लैपटॉप कंप्यूटर, या यहां तक ​​कि अधिकांश स्मार्टफ़ोन की तुलना में बहुत कम होती है। उदाहरण के लिए वाईओ टर्मिनल में एक सीपीयू है जो 120 मेगाहट्र्ज या 120,000,000 चक्र प्रति सेकेंड पर चलता है। + +✅एक औसत पीसी या मैक में कई गीगाहर्ट्ज़ पर चलने वाले कई कोर के साथ एक सीपीयू होता है, जिसका अर्थ है कि घड़ी एक सेकंड में अरबों बार टिकती है। अपने कंप्यूटर की घड़ी की गति पर शोध करें और तुलना करें कि यह Wio टर्मिनल से कितनी बार तेज है। + +प्रत्येक घड़ी चक्र शक्ति खींचता है और गर्मी उत्पन्न करता है। जितनी तेजी से टिक होते हैं, उतनी ही अधिक बिजली की खपत होती है और अधिक गर्मी उत्पन्न होती है। पीसी में गर्मी को दूर करने के लिए हीट सिंक और पंखे होते हैं, जिसके बिना वे गर्म हो जाते हैं और सेकंड के भीतर बंद हो जाते हैं। माइक्रोकंट्रोलर के पास अक्सर न तो होता है क्योंकि वे अधिक कूलर चलाते हैं और इसलिए बहुत धीमे होते हैं। पीसी की रन ऑफ मेन पावर या बड़ी बैटरी कुछ घंटों के लिए, माइक्रोकंट्रोलर छोटी बैटरी से दिनों, महीनों या वर्षों तक चल सकते हैं। माइक्रोकंट्रोलर में कोर भी हो सकते हैं जो अलग-अलग गति से चलते हैं, जब बिजली की खपत कम करने के लिए सीपीयू की मांग कम होती है, तो धीमी कम पावर कोर पर स्विच किया जाता है। + +> 💁 कुछ पीसी और मैक तेज हाई पावर कोर और धीमी लो पावर कोर के समान मिश्रण को अपना रहे हैं, बैटरी बचाने के लिए स्विच कर रहे हैं। उदाहरण के लिए, नवीनतम Apple लैपटॉप में M1 चिप चल रहे कार्य के आधार पर बैटरी जीवन या गति को अनुकूलित करने के लिए 4 प्रदर्शन कोर और 4 दक्षता कोर के बीच स्विच कर सकती है। + +✅थोड़ा शोध करें: सीपीयू के बारे में [विकिपीडिया सीपीयू लेख](https://wikipedia.org/wiki/Central_processing_unit) पर पढ़ें। + +#### टास्क + +वाईओ टर्मिनल की जांच करें। + +यदि आप इन पाठों के लिए Wio Terminal का उपयोग कर रहे हैं, तो CPU खोजने का प्रयास करें। इंटर्नल की तस्वीर के लिए [Wio Terminal उत्पाद पृष्ठ](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) का *हार्डवेयर ओव्हरव्यू* अनुभाग ढूंढें और पीछे की ओर स्पष्ट प्लास्टिक विंडो के माध्यम से CPU को खोजने का प्रयास करें। + +### मेमरी + +माइक्रोकंट्रोलर में आमतौर पर दो प्रकार की मेमोरी होती है - प्रोग्राम मेमोरी और रैंडम-एक्सेस मेमोरी (RAM)। + +प्रोग्राम मेमोरी गैर-वाष्पशील होती है, जिसका अर्थ है कि इसमें जो कुछ भी लिखा जाता है वह तब रहता है जब डिवाइस में कोई शक्ति नहीं होती है। यह वह मेमोरी है जो आपके प्रोग्राम कोड को स्टोर करती है। + +RAM प्रोग्राम द्वारा चलाने के लिए उपयोग की जाने वाली मेमोरी है, जिसमें आपके प्रोग्राम द्वारा आवंटित चर और बाह्य उपकरणों से एकत्रित डेटा होता है। रैम अस्थिर है, जब बिजली चली जाती है तो सामग्री खो जाती है, प्रभावी रूप से आपके प्रोग्राम को रीसेट कर देती है। + +> 🎓प्रोग्राम मेमोरी आपके कोड को स्टोर करती है और पावर न होने पर रहती है। + +> 🎓RAM का उपयोग आपके प्रोग्राम को चलाने के लिए किया जाता है और बिजली न होने पर रीसेट हो जाता है + +सीपीयू की तरह, एक माइक्रोकंट्रोलर पर मेमोरी एक पीसी या मैक से छोटे परिमाण के आदेश हैं। एक सामान्य पीसी में 8 गीगाबाइट (GB) RAM, या 8,000,000,000 बाइट्स हो सकते हैं, प्रत्येक बाइट में एक अक्षर या 0-255 की संख्या को संग्रहीत करने के लिए पर्याप्त स्थान होता है। एक माइक्रोकंट्रोलर में केवल किलोबाइट (KB) RAM होगी, जिसमें एक किलोबाइट 1,000 बाइट्स होगा। ऊपर बताए गए Wio टर्मिनल में 192KB RAM या 192,000 बाइट्स हैं - एक औसत PC से 40,000 गुना कम! + +नीचे दिया गया चित्र 192KB और 8GB के बीच के सापेक्ष आकार के अंतर को दर्शाता है - केंद्र में छोटा बिंदु 192KB का प्रतिनिधित्व करता है। + +![192KB और 8GB के बीच की तुलना - 40,000 गुना से अधिक बड़ी](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/ram-comparison.png) + +प्रोग्राम स्टोरेज भी पीसी से छोटा होता है। एक विशिष्ट पीसी में प्रोग्राम स्टोरेज के लिए 500GB हार्ड ड्राइव हो सकती है, जबकि एक माइक्रोकंट्रोलर में केवल किलोबाइट्स या शायद कुछ मेगाबाइट्स (MB) स्टोरेज (1MB 1,000KB, या 1,000,000 बाइट्स) हो सकता है। Wio टर्मिनल में 4MB प्रोग्राम स्टोरेज है। + +✅ थोड़ा शोध करें: इसे पढ़ने के लिए आप जिस कंप्यूटर का उपयोग कर रहे हैं उसमें कितनी रैम और स्टोरेज है? यह एक माइक्रोकंट्रोलर से कैसे तुलना करता है? + +### इनपुट आउटपुट + +माइक्रोकंट्रोलर्स को सेंसर से डेटा पढ़ने और एक्चुएटर्स को कंट्रोल सिग्नल भेजने के लिए इनपुट और आउटपुट (I/O) कनेक्शन की जरूरत होती है। उनमें आमतौर पर कई सामान्य-उद्देश्य इनपुट/आउटपुट (GPIO) पिन होते हैं। इन पिनों को सॉफ्टवेयर में इनपुट के रूप में कॉन्फ़िगर किया जा सकता है (अर्थात वे एक संकेत प्राप्त करते हैं), या आउटपुट (वे एक संकेत भेजते हैं)। + +️🧠⬅️सेंसर से मूल्यों को पढ़ने के लिए इनपुट पिन का उपयोग किया जाता है + +️🧠➡️आउटपुट पिन एक्चुएटर्स को निर्देश भेजते हैं + +✅आप इसके बारे में अगले पाठ में और जानेंगे। + +#### टास्क + +वाईओ टर्मिनल की जांच करें। + +यदि आप इन पाठों के लिए Wio Terminal का उपयोग कर रहे हैं, तो GPIO पिन खोजें। यह जानने के लिए कि कौन से पिन कौन से हैं, [Wio Terminal उत्पाद पृष्ठ](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) के *पिनआउट डायग्राम* अनुभाग खोजें। Wio Terminal एक स्टिकर के साथ आता है जिसे आप पिन नंबर के साथ पीछे की तरफ माउंट कर सकते हैं, इसलिए इसे अभी जोड़ें यदि आपने पहले से नहीं किया है। + +### भौतिक माप + +माइक्रोकंट्रोलर आमतौर पर आकार में छोटे होते हैं, सबसे छोटे के साथ, [फ़्रीस्केल काइनेटिस KL03 MCU गोल्फ़ बॉल के डिंपल में फ़िट होने के लिए पर्याप्त छोटा होता है](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/)। बस एक पीसी में सीपीयू 40 मिमी x 40 मिमी माप सकता है, और इसमें हीट सिंक और पंखे शामिल नहीं हैं जो यह सुनिश्चित करने के लिए आवश्यक हैं कि सीपीयू बिना ओवरहीटिंग के कुछ सेकंड से अधिक समय तक चल सके, एक पूर्ण माइक्रोकंट्रोलर से काफी बड़ा। माइक्रोकंट्रोलर, केस, स्क्रीन, और कनेक्शन और घटकों की एक श्रृंखला के साथ Wio टर्मिनल डेवलपर किट एक खुला हुआ Intel i9 CPU से बहुत बड़ा नहीं है, और एक हीट सिंक और पंखे के साथ CPU से काफी छोटा है! + +| डिवाइस | आकार | +| ----------------------------- | --------------------- | +| फ्रीस्केल काइनेटिस KL03 | 1.6 मिमी x 2 मिमी x 1 मिमी | +| वाईओ टर्मिनल | 72मिमी x 57मिमी x 12मिमी | +| इंटेल i9 सीपीयू, हीट सिंक और पंखा | 136 मिमी x 145 मिमी x 103 मिमी | + +### फ्रेमवर्क और ऑपरेटिंग सिस्टम + +उनकी कम गति और स्मृति आकार के कारण, माइक्रोकंट्रोलर शब्द के डेस्कटॉप अर्थ में एक ऑपरेटिंग सिस्टम (OS) नहीं चलाते हैं। ऑपरेटिंग सिस्टम जो आपके कंप्यूटर को चलाता है (Windows, Linux, या macOS) को माइक्रोकंट्रोलर के लिए पूरी तरह से अनावश्यक कार्यों को चलाने के लिए बहुत अधिक मेमोरी और प्रोसेसिंग पावर की आवश्यकता होती है। याद रखें कि माइक्रोकंट्रोलर्स को आमतौर पर एक या अधिक विशिष्ट कार्यों को करने के लिए प्रोग्राम किया जाता है, पीसी या मैक जैसे सामान्य-उद्देश्य वाले कंप्यूटर के विपरीत, जिसे उपयोगकर्ता इंटरफ़ेस का समर्थन करने, संगीत या फिल्में चलाने, दस्तावेज़ या कोड लिखने, गेम खेलने के लिए उपकरण प्रदान करने की आवश्यकता होती है, या इंटरनेट ब्राउज़ करें। + +ओएस के बिना माइक्रोकंट्रोलर प्रोग्राम करने के लिए आपको कुछ टूलिंग की आवश्यकता होती है ताकि आप अपना कोड इस तरह से बना सकें कि माइक्रोकंट्रोलर चल सके, एपीआई का उपयोग करके जो किसी भी बाह्य उपकरणों से बात कर सके। प्रत्येक माइक्रोकंट्रोलर अलग होता है, इसलिए निर्माता सामान्य रूप से मानक ढांचे का समर्थन करते हैं जो आपको अपना कोड बनाने के लिए एक मानक 'नुस्खा' का पालन करने की अनुमति देते हैं और इसे किसी भी माइक्रोकंट्रोलर पर चलाते हैं जो उस ढांचे का समर्थन करता है। + +आप ओएस का उपयोग करके माइक्रोकंट्रोलर प्रोग्राम कर सकते हैं - जिसे अक्सर रीयल-टाइम ऑपरेटिंग सिस्टम (आरटीओएस) के रूप में संदर्भित किया जाता है, क्योंकि इन्हें रीयल-टाइम में बाह्य उपकरणों से डेटा भेजने के लिए डिज़ाइन किया गया है। ये ऑपरेटिंग सिस्टम बहुत हल्के होते हैं और इस तरह की सुविधाएँ प्रदान करते हैं: + +* मल्टी-थ्रेडिंग, आपके कोड को एक ही समय में कोड के एक से अधिक ब्लॉक चलाने की अनुमति देता है, या तो कई कोर पर या एक कोर को चालू करके +* इंटरनेट पर सुरक्षित रूप से संचार करने की अनुमति देने के लिए नेटवर्किंग +* स्क्रीन वाले उपकरणों पर यूजर इंटरफेस (यूआई) के निर्माण के लिए ग्राफिकल यूजर इंटरफेस (जीयूआई) घटक। + +✅ कुछ अलग RTOS के बारे में पढ़ें: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [ज़ेफिर](https://www.zephyrproject.org) + +#### अरुडिनो + +![Arduino logo](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/arduino-logo.svg) + +[Arduino](https://www.arduino.cc) शायद सबसे लोकप्रिय माइक्रोकंट्रोलर फ्रेमवर्क है, खासकर छात्रों, शौक़ीन लोगों और निर्माताओं के बीच। Arduino एक ओपन-सोर्स इलेक्ट्रॉनिक्स प्लेटफॉर्म है जो सॉफ्टवेयर और हार्डवेयर को मिलाता है। आप Arduino से स्वयं या अन्य निर्माताओं से Arduino संगत बोर्ड खरीद सकते हैं, फिर Arduino फ्रेमवर्क का उपयोग करके कोड कर सकते हैं। + +Arduino बोर्डों को C या C++ में कोड किया गया है। C या C++ का उपयोग करने से आपके कोड को बहुत छोटा संकलित किया जा सकता है और तेजी से चलाया जा सकता है, एक सीमित डिवाइस जैसे कि माइक्रोकंट्रोलर पर कुछ आवश्यक है। एक Arduino एप्लिकेशन के मूल को एक स्केच के रूप में संदर्भित किया जाता है और 2 कार्यों के साथ C/C++ कोड है - `setup` और `loop`। जब बोर्ड शुरू होता है, तो Arduino फ्रेमवर्क कोड एक बार `setup` फ़ंक्शन चलाएगा, फिर यह `loop` फ़ंक्शन को बार-बार चलाएगा, इसे तब तक लगातार चलाएगा जब तक कि बिजली बंद न हो जाए। + +आप अपना setup कोड `setup` फ़ंक्शन में लिखेंगे, जैसे कि वाईफाई और क्लाउड सेवाओं से कनेक्ट करना या इनपुट और आउटपुट के लिए पिन इनिशियलाइज़ करना। तब आपके लूप कोड में प्रोसेसिंग कोड होगा, जैसे सेंसर से पढ़ना और मान को क्लाउड पर भेजना। आप सामान्य रूप से प्रत्येक लूप में देरी शामिल करेंगे, उदाहरण के लिए, यदि आप चाहते हैं कि हर 10 सेकंड में केवल सेंसर डेटा भेजा जाए तो आप लूप के अंत में 10 सेकंड की देरी जोड़ देंगे ताकि माइक्रोकंट्रोलर सो सके, बिजली बचा सके, फिर 10 सेकंड बाद जरूरत पड़ने पर लूप को फिर से चला सकें। + +![पहले एक Arduino स्केच रनिंग सेटअप, फिर बार-बार लूप चलाना](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/arduino-sketch.png) + +✅इस प्रोग्राम के आर्किटेक्चर को *इवेंट लूप* या *मैसेज लूप* के रूप में जाना जाता है। कई एप्लिकेशन हुड के तहत इसका उपयोग करते हैं और अधिकांश डेस्कटॉप एप्लिकेशन के लिए मानक हैं जो विंडोज, मैकओएस या लिनक्स जैसे ओएस पर चलते हैं। `loop` उपयोगकर्ता इंटरफ़ेस घटकों जैसे बटन, या कीबोर्ड जैसे उपकरणों के संदेशों को सुनता है, और उनका जवाब देता है। आप इस [इवेंट लूप पर लेख](https://wikipedia.org/wiki/Event_loop) में और अधिक पढ़ सकते हैं। + +Arduino माइक्रोकंट्रोलर और I/O पिन के साथ इंटरैक्ट करने के लिए मानक पुस्तकालय प्रदान करता है, विभिन्न माइक्रोकंट्रोलर पर चलने के लिए हुड के तहत विभिन्न कार्यान्वयन के साथ। उदाहरण के लिए, [`delay` फ़ंक्शन](https://www.arduino.cc/reference/en/language/functions/time/delay/) एक निश्चित अवधि के लिए कार्यक्रम को रोक देगा, [`digitalRead` फ़ंक्शन](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/) दिए गए पिन से `HIGH` या `LOW` का मान पढ़ेगा, चाहे किसी भी बोर्ड पर कोड चालू है। इन मानक पुस्तकालयों का मतलब है कि एक बोर्ड के लिए लिखे गए Arduino कोड को किसी अन्य Arduino बोर्ड के लिए पुन: संकलित किया जा सकता है और यह मानते हुए चलेगा कि पिन समान हैं और बोर्ड समान सुविधाओं का समर्थन करते हैं। + +तृतीय-पक्ष Arduino पुस्तकालयों का एक बड़ा पारिस्थितिकी तंत्र है जो आपको अपने Arduino प्रोजेक्ट्स में अतिरिक्त सुविधाएँ जोड़ने की अनुमति देता है, जैसे सेंसर और एक्चुएटर्स का उपयोग करना या क्लाउड IoT सेवाओं से जुड़ना। + +##### टास्क + +वाईओ टर्मिनल की जांच करें। + +यदि आप इन पाठों के लिए Wio Terminal का उपयोग कर रहे हैं, तो पिछले पाठ में आपके द्वारा लिखे गए कोड को दोबारा पढ़ें। `setup` और `loop` फ़ंक्शन ढूंढें। लूप फ़ंक्शन को बार-बार कॉल करने के लिए सीरियल आउटपुट की निगरानी करें। सीरियल पोर्ट पर लिखने के लिए `setup` फ़ंक्शन में कोड जोड़ने का प्रयास करें और देखें कि यह कोड केवल एक बार रीबूट करने पर ही कॉल किया जाता है। अपने डिवाइस को साइड में पावर स्विच के साथ रीबूट करने का प्रयास करें यह दिखाने के लिए कि हर बार डिवाइस रीबूट होने पर इसे कहा जाता है। + +## सिंगल-बोर्ड कंप्यूटर में गहराई से अध्ययन करें + +पिछले पाठ में, हमने सिंगल-बोर्ड कंप्यूटर पेश किए थे। आइए अब उनमें गहराई से देखें। + +### रास्पबेरी पाई + +![रास्पबेरी पाई लोगो](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/raspberry-pi-logo.png) + +[रास्पबेरी पाई फाउंडेशन](https://www.raspberrypi.org) यूके की एक चैरिटी है जिसकी स्थापना 2009 में कंप्यूटर विज्ञान के अध्ययन को बढ़ावा देने के लिए की गई थी, खासकर स्कूल स्तर पर। इस मिशन के हिस्से के रूप में, उन्होंने एक सिंगल-बोर्ड कंप्यूटर विकसित किया, जिसे रास्पबेरी पाई कहा जाता है। रास्पबेरी पाई वर्तमान में 3 प्रकारों में उपलब्ध है - एक पूर्ण आकार का संस्करण, छोटा पाई ज़ीरो, और एक गणना मॉड्यूल जिसे आपके अंतिम IoT डिवाइस में बनाया जा सकता है। + +![एक रास्पबेरी पाई 4](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/raspberry-pi-4.jpg) + +पूर्ण आकार के रास्पबेरी पाई का नवीनतम पुनरावृत्ति रास्पबेरी पाई 4 बी है। इसमें एक क्वाड-कोर (4 कोर) सीपीयू है जो 1.5GHz, 2, 4, या 8GB RAM, गीगाबिट ईथरनेट, वाईफाई, 4k स्क्रीन को सपोर्ट करने वाले 2 HDMI पोर्ट, एक ऑडियो और कम्पोजिट वीडियो आउटपुट पोर्ट, USB पोर्ट (2 USB) पर चलता है। 2.0, 2 यूएसबी 3.0), 40 जीपीआईओ पिन, रास्पबेरी पाई कैमरा मॉड्यूल के लिए एक कैमरा कनेक्टर और एक एसडी कार्ड स्लॉट। यह सब एक बोर्ड पर है जो 88mm x 58mm x 19.5mm है और यह 3A USB-C बिजली की आपूर्ति द्वारा संचालित है। ये 35 अमेरिकी डॉलर से शुरू होते हैं, जो पीसी या मैक से काफी सस्ता है। + +> 💁एक कीबोर्ड में निर्मित Pi4 के साथ एक सभी कंप्यूटर में एक Pi400 भी है। + +![एक रास्पबेरी पाई ज़ीरो](https://github.com/microsoft/IoT-For-Beginners/raw/main/images/raspberry-pi-zero.jpg) + +पाई ज़ीरो बहुत छोटा है, कम शक्ति के साथ। इसमें सिंगल-कोर 1GHz CPU, 512MB RAM, WiFi (ज़ीरो W मॉडल में), एक सिंगल HDMI पोर्ट, एक माइक्रो-USB पोर्ट, 40 GPIO पिन, एक रास्पबेरी पाई कैमरा मॉड्यूल के लिए एक कैमरा कनेक्टर और एक SD है। कार्ड का स्थान। यह 65 मिमी x 30 मिमी x 5 मिमी मापता है, और बहुत कम शक्ति खींचता है। ज़ीरो यूएस $ 5 है, वाई-फाई यूएस $ 10 के साथ डब्ल्यू संस्करण के साथ। + +>🎓 इन दोनों में सीपीयू एआरएम प्रोसेसर हैं, इंटेल/एएमडी x86 या x64 प्रोसेसर के विपरीत जो आपको अधिकांश पीसी और मैक में मिलते हैं। ये कुछ माइक्रोकंट्रोलर्स के साथ-साथ लगभग सभी मोबाइल फोन, माइक्रोसॉफ्ट सर्फेस एक्स और नए ऐप्पल सिलिकॉन-आधारित ऐप्पल मैक में पाए जाने वाले सीपीयू के समान हैं। + +रास्पबेरी पाई के सभी वेरिएंट रास्पबेरी पाई ओएस नामक डेबियन लिनक्स का एक संस्करण चलाते हैं। यह बिना डेस्कटॉप के एक लाइट संस्करण के रूप में उपलब्ध है, जो 'हेडलेस' परियोजनाओं के लिए एकदम सही है, जहां आपको स्क्रीन की आवश्यकता नहीं है, या एक पूर्ण डेस्कटॉप वातावरण के साथ एक पूर्ण संस्करण, एक वेब ब्राउज़र, कार्यालय अनुप्रयोगों, कोडिंग टूल, और खेल चूंकि ओएस डेबियन लिनक्स का एक संस्करण है, आप डेबियन पर चलने वाले किसी भी एप्लिकेशन या टूल को इंस्टॉल कर सकते हैं और पीआई के अंदर एआरएम प्रोसेसर के लिए बनाया गया है। + +#### टास्क + +रास्पबेरी पाई की जांच करें। + +यदि आप इन पाठों के लिए रास्पबेरी पाई का उपयोग कर रहे हैं, तो बोर्ड पर विभिन्न हार्डवेयर घटकों के बारे में पढ़ें। + +* आप [रास्पबेरी पाई हार्डवेयर डॉक्यूमेंटेशन पेज](https://www.raspberrypi.org/documentation/hardware/raspberrypi/) पर इस्तेमाल किए गए प्रोसेसर के बारे में जानकारी पा सकते हैं। आप जिस पाई का उपयोग कर रहे हैं उसमें प्रयुक्त प्रोसेसर के बारे में पढ़ें। +* GPIO पिन का पता लगाएँ। [रास्पबेरी पाई GPIO दस्तावेज़ीकरण](https://www.raspberrypi.org/documentation/hardware/raspberrypi/gpio/README.md) पर उनके बारे में और पढ़ें। अपने पाई पर अलग-अलग पिन की पहचान करने के लिए [GPIO पिन यूसेज गाइड](https://www.raspberrypi.org/documentation/usage/gpio/README.md) का इस्तेमाल करें। + +### प्रोग्रामिंग सिंगल-बोर्ड कंप्यूटर + +सिंगल-बोर्ड कंप्यूटर पूर्ण कंप्यूटर हैं, जो एक पूर्ण OS चला रहे हैं। इसका मतलब यह है कि माइक्रोकंट्रोलर के विपरीत प्रोग्रामिंग भाषाओं, ढांचे और टूल की एक विस्तृत श्रृंखला है जिसका उपयोग आप उन्हें कोड करने के लिए कर सकते हैं, जो Arduino जैसे ढांचे में बोर्ड के समर्थन पर भरोसा करते हैं। अधिकांश प्रोग्रामिंग भाषाओं में पुस्तकालय होते हैं जो सेंसर और एक्चुएटर्स से डेटा भेजने और प्राप्त करने के लिए GPIO पिन तक पहुंच सकते हैं। + +✅ आप किन प्रोग्रामिंग भाषाओं से परिचित हैं? क्या वे लिनक्स पर समर्थित हैं? + +रास्पबेरी पाई पर IoT अनुप्रयोगों के निर्माण के लिए सबसे आम प्रोग्रामिंग भाषा पायथन है। पाई के लिए डिज़ाइन किए गए हार्डवेयर का एक विशाल पारिस्थितिकी तंत्र है, और इनमें से लगभग सभी में संबंधित कोड शामिल हैं जो उन्हें पायथन पुस्तकालयों के रूप में उपयोग करने के लिए आवश्यक हैं। इनमें से कुछ पारिस्थितिक तंत्र 'टोपी' पर आधारित होते हैं - तथाकथित क्योंकि वे एक टोपी की तरह पाई के ऊपर बैठते हैं और एक बड़े सॉकेट से 40 GPIO पिन से जुड़ते हैं। ये टोपियां अतिरिक्त क्षमताएं प्रदान करती हैं, जैसे स्क्रीन, सेंसर, रिमोट-नियंत्रित कार, या एडेप्टर आपको मानकीकृत केबल के साथ सेंसर प्लग-इन करने की अनुमति देते हैं + +### पेशेवर IoT परिनियोजन में सिंगल-बोर्ड कंप्यूटर का उपयोग + +एकल-बोर्ड कंप्यूटर का उपयोग पेशेवर IoT परिनियोजन के लिए किया जाता है, न कि केवल डेवलपर किट के रूप में। वे हार्डवेयर को नियंत्रित करने और मशीन लर्निंग मॉडल चलाने जैसे जटिल कार्यों को चलाने के लिए एक शक्तिशाली तरीका प्रदान कर सकते हैं। उदाहरण के लिए, एक [रास्पबेरी पाई 4 कंप्यूट मॉड्यूल](https://www.raspberrypi.org/blog/raspberry-pi-compute-module-4/) है जो रास्पबेरी पाई 4 की सारी शक्ति प्रदान करता है लेकिन एक में अधिकांश पोर्ट के बिना कॉम्पैक्ट और सस्ता फॉर्म फैक्टर, जिसे कस्टम हार्डवेयर में स्थापित करने के लिए डिज़ाइन किया गया है। + +--- + +## 🚀चुनौती + +पिछले पाठ में चुनौती थी कि आप अपने घर, स्कूल या कार्यस्थल में जितने हो सके उतने IoT उपकरणों को सूचीबद्ध करें। इस सूची में प्रत्येक डिवाइस के लिए, क्या आपको लगता है कि वे माइक्रोकंट्रोलर या सिंगल-बोर्ड कंप्यूटर, या यहां तक ​​कि दोनों के मिश्रण के आसपास बनाए गए हैं? + +## व्याख्यान के बाद प्रश्नोत्तरी + +[व्याख्यान के बाद प्रश्नोत्तरी](https://brave-island-0b7c7f50f.azurestaticapps.net/quiz/4) + +## समीक्षा और आत्म अध्ययन + +* Arduino प्लेटफॉर्म के बारे में अधिक समझने के लिए [Arduino गेटिंग स्टार्ट गाइड](https://www.arduino.cc/en/Guide/Introduction) पढ़ें। +* रास्पबेरी पाई के बारे में अधिक जानने के लिए [रास्पबेरी पाई 4 का परिचय](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) पढ़ें। +* [इलेक्ट्रिकल इंजीनियरिंग जर्नल में सीपीयू, एमपीयू, एमसीयू और जीपीयू के अक्सर पूछे जाने वाले सवाल क्या हैं](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/) में कुछ अवधारणाओं और शब्दों के बारे में और जानें। + +✅आप किस हार्डवेयर प्लेटफॉर्म का उपयोग करना चाहते हैं, या यदि आप इसके बजाय यह तय करने के लिए [हार्डवेयर गाइड](https://github.com/microsoft/IoT-For-Beginners/blob/main/hardware.md) में लिंक का पालन करके दिखाए गए लागतों के साथ इन गाइड का उपयोग करें वर्चुअल डिवाइस का उपयोग करें। + +## कार्यभार + +[माइक्रोकंट्रोलर और सिंगल-बोर्ड कंप्यूटरों की तुलना और तुलना करें](https://github.com/microsoft/IoT-For-Beginners/blob/main/1-getting-started/lessons/2-deeper-dive/assignment.md) From 157df73b4654994f19fd27de4f64461c729418ca Mon Sep 17 00:00:00 2001 From: Gabriel Borja Vergara <64596011+gabrielborja@users.noreply.github.com> Date: Fri, 10 Dec 2021 03:59:54 +0100 Subject: [PATCH 27/36] Change humidity to Soil Moisture sensor (#353) In line 35, is suggested to change the word "humidity" to "Soil Moisture" sensor. --- .../2-detect-soil-moisture/virtual-device-soil-moisture.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md b/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md index e2406961..edbbd1dc 100644 --- a/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md +++ b/2-farm/lessons/2-detect-soil-moisture/virtual-device-soil-moisture.md @@ -32,7 +32,7 @@ Add the soil moisture sensor to the CounterFit app. 1. Ensure the *Pin* is set to *0* - 1. Select the **Add** button to create the humidity sensor on Pin 0 + 1. Select the **Add** button to create the *Soil Moisture* sensor on Pin 0 ![The soil moisture sensor settings](../../../images/counterfit-create-soil-moisture-sensor.png) From 3b757ac77920db05b9b8c43a6edc1131c0632ef5 Mon Sep 17 00:00:00 2001 From: Jen Looper Date: Fri, 17 Dec 2021 21:55:21 -0500 Subject: [PATCH 28/36] replace thinglearn url with its new home as a subdomain --- 1-getting-started/lessons/3-sensors-and-actuators/README.md | 2 +- .../lessons/3-sensors-and-actuators/translations/README.ar.md | 2 +- .../lessons/3-sensors-and-actuators/translations/README.bn.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/1-getting-started/lessons/3-sensors-and-actuators/README.md b/1-getting-started/lessons/3-sensors-and-actuators/README.md index 9f7a1615..5ca8d156 100644 --- a/1-getting-started/lessons/3-sensors-and-actuators/README.md +++ b/1-getting-started/lessons/3-sensors-and-actuators/README.md @@ -207,7 +207,7 @@ For every device you listed, what sensors and actuators are they connected to? W ## Review & Self Study -* Read up on electricity and circuits on [ThingLearn](http://www.thinglearn.com/essentials/). +* Read up on electricity and circuits on [ThingLearn](http://thinglearn.jenlooper.com/curriculum/). * Read about the different types of temperature sensors on the [Seeed Studios Temperature Sensors guide](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/) * Read about LEDs on the [Wikipedia LED page](https://wikipedia.org/wiki/Light-emitting_diode) diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/README.ar.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/README.ar.md index 0f17d39c..2c03f2ee 100644 --- a/1-getting-started/lessons/3-sensors-and-actuators/translations/README.ar.md +++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/README.ar.md @@ -199,7 +199,7 @@ ## مراجعة ودراسة ذاتية -* اقرأ عن الكهرباء والدوائر على ThingLearn. +* اقرأ عن الكهرباء والدوائر على ThingLearn. * اقرأ عن الأنواع المختلفة من مستشعرات درجة الحرارة في دليل مستشعرات درجة الحرارة في الاستوديوها * اقرأ عن مصابيح LED على صفحة Wikipedia LED diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/README.bn.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/README.bn.md index af95115c..4e8700a3 100644 --- a/1-getting-started/lessons/3-sensors-and-actuators/translations/README.bn.md +++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/README.bn.md @@ -194,7 +194,7 @@ ## রিভিউ এবং স্ব-অধ্যয়ন -* [ThingLearn](http://www.thinglearn.com/essentials/) থেকে ইলেক্ট্রিসিটি ও সার্কিটের ব্যাপারে পড়া। +* [ThingLearn](http://thinglearn.jenlooper.com/curriculum/) থেকে ইলেক্ট্রিসিটি ও সার্কিটের ব্যাপারে পড়া। * [Seeed Studios Temperature Sensors guide](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/) থেকে বিভিন্ন ধরণের তাপমাত্রা সেন্সরের ব্যাপারে জানা। * এলইডি সম্পর্কে [Wikipedia LED page](https://wikipedia.org/wiki/Light-emitting_diode) থেকে আরো বিস্তারিত ধারণা লাভ করা। From 597d82c5db53b8b7a2de5b950af5bd606e1474b7 Mon Sep 17 00:00:00 2001 From: Marty Hummel <71525323+marty-optum@users.noreply.github.com> Date: Wed, 16 Feb 2022 15:58:07 -0500 Subject: [PATCH 29/36] Update README.md (#360) Add line to capture response_body --- 3-transport/lessons/4-geofences/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/3-transport/lessons/4-geofences/README.md b/3-transport/lessons/4-geofences/README.md index 2fdf1d2f..0891b67b 100644 --- a/3-transport/lessons/4-geofences/README.md +++ b/3-transport/lessons/4-geofences/README.md @@ -416,10 +416,11 @@ Earlier in this lesson you used curl to query a geofence to see if a point was l The items in the `params` dictionary will match the key value pairs you used when calling the web API via curl. -1. Add the following line of code to call the web API: +1. Add the following lines of code to call the web API: ```python response = requests.get(url, params=params) + response_body = json.loads(response.text) ``` This calls the URL with the parameters, and gets back a response object. From 33f7e3c297e12a3dcdde976dca6c38bdce86e399 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Feb 2022 12:58:43 -0800 Subject: [PATCH 30/36] Bump follow-redirects from 1.13.1 to 1.14.8 in /quiz-app (#361) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.13.1 to 1.14.8. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.13.1...v1.14.8) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jim Bennett --- quiz-app/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/quiz-app/package-lock.json b/quiz-app/package-lock.json index ba15a276..97e40630 100644 --- a/quiz-app/package-lock.json +++ b/quiz-app/package-lock.json @@ -6673,9 +6673,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "dev": true, "funding": [ { @@ -20466,9 +20466,9 @@ } }, "follow-redirects": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", - "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "dev": true }, "for-in": { From 27dfac9813354347c530482379e8b834637ff1c0 Mon Sep 17 00:00:00 2001 From: "Charles Emmanuel S. Ndiaye" Date: Fri, 4 Mar 2022 19:12:44 +0000 Subject: [PATCH 31/36] add missing translated text (#367) [fr] add missing translated text --- translations/TRANSLATIONS.fr.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/translations/TRANSLATIONS.fr.md b/translations/TRANSLATIONS.fr.md index 3afe7579..32aebdc0 100644 --- a/translations/TRANSLATIONS.fr.md +++ b/translations/TRANSLATIONS.fr.md @@ -17,6 +17,12 @@ Lorsque vous traduisez le Readme initial, reliez les autres traductions à votre Dans la mesure ou _[language]_ est une abréviation linguistique de deux lettres suivant la norme ISO 639-1 (par exemple `README.es.md` pour l'espagnol et `README.nl.md` pour l'allemand). +> Important: lorsque vous traduisez du texte dans ce dépôt, assurez vous de ne pas utiliser de traduction automatique. Nous vérifierons les traductions via la communauté, veuillez donc vous porter volontaire uniquement pour les traductions dans les langues que vous maîtrisez. + +## Liens + +Lors de la traduction, veuillez mettre à jour les liens vers les fichiers traduits. Si un fichier n'a pas été traduit, conservez le lien vers la version anglaise. Comme chaque fichier se trouve dans un dossier `translations`, vous devrez également mettre à jour le chemin des liens pour les hyperliens et les images. + ## Questionnaires Ajoutez votre traduction au quiz-app en ajoutant un fichier ici : https://github.com/microsoft/IoT-For-Beginners/tree/main/quiz-app/src/assets/translations. Veuillez ne pas localiser les mots 'true' ou 'false'. Merci ! From f26a30f24f8a63aa6df19934e49e7aecc5892bc2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 16:00:13 -0800 Subject: [PATCH 32/36] Bump url-parse from 1.5.1 to 1.5.10 in /quiz-app (#366) Bumps [url-parse](https://github.com/unshiftio/url-parse) from 1.5.1 to 1.5.10. - [Release notes](https://github.com/unshiftio/url-parse/releases) - [Commits](https://github.com/unshiftio/url-parse/compare/1.5.1...1.5.10) --- updated-dependencies: - dependency-name: url-parse dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jim Bennett --- quiz-app/package-lock.json | 540 +------------------------------------ 1 file changed, 6 insertions(+), 534 deletions(-) diff --git a/quiz-app/package-lock.json b/quiz-app/package-lock.json index 97e40630..48273b72 100644 --- a/quiz-app/package-lock.json +++ b/quiz-app/package-lock.json @@ -10219,45 +10219,6 @@ "node": ">=6.9.0" } }, - "node_modules/postcss-discard-comments/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-discard-comments/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-comments/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-discard-duplicates": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", @@ -10294,45 +10255,6 @@ "node": ">=6.9.0" } }, - "node_modules/postcss-discard-overridden/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-discard-overridden/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-discard-overridden/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-load-config": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", @@ -10394,51 +10316,12 @@ "node": ">=6.9.0" } }, - "node_modules/postcss-merge-longhand/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "node_modules/postcss-merge-longhand/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-merge-longhand/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-merge-rules": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", @@ -10504,51 +10387,12 @@ "node": ">=6.9.0" } }, - "node_modules/postcss-minify-gradients/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "node_modules/postcss-minify-gradients/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-gradients/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-minify-params": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", @@ -10566,51 +10410,12 @@ "node": ">=6.9.0" } }, - "node_modules/postcss-minify-params/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true }, - "node_modules/postcss-minify-params/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-params/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-minify-selectors": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", @@ -10626,24 +10431,6 @@ "node": ">=6.9.0" } }, - "node_modules/postcss-minify-selectors/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", @@ -10658,27 +10445,6 @@ "node": ">=8" } }, - "node_modules/postcss-minify-selectors/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-minify-selectors/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-modules-extract-imports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", @@ -10691,45 +10457,6 @@ "node": ">= 6" } }, - "node_modules/postcss-modules-extract-imports/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-modules-extract-imports/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-modules-extract-imports/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-modules-local-by-default": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", @@ -10758,45 +10485,6 @@ "node": ">= 6" } }, - "node_modules/postcss-modules-scope/node_modules/postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-modules-scope/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-modules-scope/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postcss-modules-values": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", @@ -13661,9 +13349,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "dependencies": { "querystringify": "^2.1.1", @@ -23283,34 +22971,6 @@ "dev": true, "requires": { "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "postcss-discard-duplicates": { @@ -23338,34 +22998,6 @@ "dev": true, "requires": { "postcss": "^7.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "postcss-load-config": { @@ -23415,37 +23047,11 @@ "stylehacks": "^4.0.0" }, "dependencies": { - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -23506,37 +23112,11 @@ "postcss-value-parser": "^3.0.0" }, "dependencies": { - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -23554,37 +23134,11 @@ "uniqs": "^2.0.0" }, "dependencies": { - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-value-parser": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -23600,17 +23154,6 @@ "postcss-selector-parser": "^3.0.0" }, "dependencies": { - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, "postcss-selector-parser": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", @@ -23621,21 +23164,6 @@ "indexes-of": "^1.0.1", "uniq": "^1.0.1" } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -23646,34 +23174,6 @@ "dev": true, "requires": { "postcss": "^7.0.5" - }, - "dependencies": { - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "postcss-modules-local-by-default": { @@ -23696,34 +23196,6 @@ "requires": { "postcss": "^7.0.6", "postcss-selector-parser": "^6.0.0" - }, - "dependencies": { - "postcss": { - "version": "7.0.36", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", - "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "postcss-modules-values": { @@ -26111,9 +25583,9 @@ } }, "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "requires": { "querystringify": "^2.1.1", From 2a27c8c61a252a7199109f9cbb959a9003045742 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 16:00:41 -0800 Subject: [PATCH 33/36] Bump prismjs from 1.23.0 to 1.27.0 (#365) Bumps [prismjs](https://github.com/PrismJS/prism) from 1.23.0 to 1.27.0. - [Release notes](https://github.com/PrismJS/prism/releases) - [Changelog](https://github.com/PrismJS/prism/blob/master/CHANGELOG.md) - [Commits](https://github.com/PrismJS/prism/compare/v1.23.0...v1.27.0) --- updated-dependencies: - dependency-name: prismjs dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jim Bennett --- package-lock.json | 107 ++++------------------------------------------ 1 file changed, 9 insertions(+), 98 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29bec53a..9e30ae3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -380,18 +380,6 @@ "node": ">=6" } }, - "node_modules/clipboard": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", - "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", - "dev": true, - "optional": true, - "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, "node_modules/cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -587,13 +575,6 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true, - "optional": true - }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1031,16 +1012,6 @@ "node": ">=8" } }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, - "optional": true, - "dependencies": { - "delegate": "^3.1.2" - } - }, "node_modules/got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -1841,12 +1812,12 @@ } }, "node_modules/prismjs": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", - "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", "dev": true, - "optionalDependencies": { - "clipboard": "^2.0.0" + "engines": { + "node": ">=6" } }, "node_modules/process-nextick-args": { @@ -2126,13 +2097,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true, - "optional": true - }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -2345,13 +2309,6 @@ "node": ">=8" } }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true, - "optional": true - }, "node_modules/tinydate": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", @@ -3081,18 +3038,6 @@ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true }, - "clipboard": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", - "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", - "dev": true, - "optional": true, - "requires": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" - } - }, "cliui": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", @@ -3257,13 +3202,6 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, - "delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", - "dev": true, - "optional": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -3615,16 +3553,6 @@ "ini": "1.3.7" } }, - "good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", - "dev": true, - "optional": true, - "requires": { - "delegate": "^3.1.2" - } - }, "got": { "version": "9.6.0", "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", @@ -4245,13 +4173,10 @@ "dev": true }, "prismjs": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", - "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", - "dev": true, - "requires": { - "clipboard": "^2.0.0" - } + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "dev": true }, "process-nextick-args": { "version": "2.0.1", @@ -4482,13 +4407,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", - "dev": true, - "optional": true - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -4663,13 +4581,6 @@ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", - "dev": true, - "optional": true - }, "tinydate": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", From 89e9d55d3a01e1d322d57cc9bcc2c737c21c5f00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 16:00:55 -0800 Subject: [PATCH 34/36] Bump node-fetch from 2.6.1 to 2.6.7 (#363) Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.1 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.1...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jim Bennett --- package-lock.json | 72 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 65 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e30ae3d..f9403080 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1548,12 +1548,23 @@ "dev": true }, "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, "engines": { "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, "node_modules/normalize-path": { @@ -2348,6 +2359,12 @@ "node": ">=0.6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, "node_modules/tweezer.js": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/tweezer.js/-/tweezer.js-1.5.0.tgz", @@ -2523,6 +2540,22 @@ "node": ">= 0.4.0" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -3981,10 +4014,13 @@ "dev": true }, "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "dev": true + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } }, "normalize-path": { "version": "3.0.0", @@ -4608,6 +4644,12 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, "tweezer.js": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/tweezer.js/-/tweezer.js-1.5.0.tgz", @@ -4749,6 +4791,22 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", From b22fc04e792daeba026fffcfcc9684279eed0eee Mon Sep 17 00:00:00 2001 From: Jen Looper Date: Tue, 8 Mar 2022 15:24:52 -0500 Subject: [PATCH 35/36] adding student page link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3918652..a6484c9a 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Meet the team! > **Teachers**, we have [included some suggestions](for-teachers.md) on how to use this curriculum. If you would like to create your own lessons, we have also included a [lesson template](lesson-template/README.md). -> **Students**, to use this curriculum on your own, fork the entire repo and complete the exercises on your own, starting with a pre-lecture quiz, then reading the lecture and completing the rest of the activities. Try to create the projects by comprehending the lessons rather than copying the solution code; however that code is available in the /solutions folders in each project-oriented lesson. Another idea would be to form a study group with friends and go through the content together. For further study, we recommend [Microsoft Learn](https://docs.microsoft.com/users/jimbobbennett/collections/ke2ehd351jopwr?WT.mc_id=academic-17441-jabenn). +> **[Students](https://aka.ms/student-page)**, to use this curriculum on your own, fork the entire repo and complete the exercises on your own, starting with a pre-lecture quiz, then reading the lecture and completing the rest of the activities. Try to create the projects by comprehending the lessons rather than copying the solution code; however that code is available in the /solutions folders in each project-oriented lesson. Another idea would be to form a study group with friends and go through the content together. For further study, we recommend [Microsoft Learn](https://docs.microsoft.com/users/jimbobbennett/collections/ke2ehd351jopwr?WT.mc_id=academic-17441-jabenn). For a video overview of this course, check out this video: From 50d9e2cb7151e8b45e94ed0ae49406c426506b7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Mar 2022 19:07:39 -0700 Subject: [PATCH 36/36] Bump minimist from 1.2.5 to 1.2.6 in /quiz-app (#369) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- quiz-app/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/quiz-app/package-lock.json b/quiz-app/package-lock.json index 48273b72..5721ddd1 100644 --- a/quiz-app/package-lock.json +++ b/quiz-app/package-lock.json @@ -9055,9 +9055,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/minipass": { @@ -22005,9 +22005,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": {