From 07da8a707ea4372a2a8d9982e9b130cff95a9a12 Mon Sep 17 00:00:00 2001
From: WoKough <17927461+WoKough@users.noreply.github.com>
Date: Wed, 11 Jan 2023 22:40:07 +0800
Subject: [PATCH 1/8] Add Chinese Translation for Lesson 2
---
.../translations/README.zh-cn.md | 267 ++++++++++++++++++
1 file changed, 267 insertions(+)
create mode 100644 1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
diff --git a/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md b/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
new file mode 100644
index 00000000..de7a5f80
--- /dev/null
+++ b/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
@@ -0,0 +1,267 @@
+# 深入了解物联网
+
+![本课程概述草图](../../../sketchnotes/lesson-2.jpg)
+
+> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 单击图像可查看大图。
+本课程是 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 是由 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 制作。 该课程以 2 个视频的形式授课 - 1小时的课程时间和1小时的答疑时间,使您能更深入地了解课程的各个部分并答疑解惑。
+
+[![课程 2: 深入了解物联网](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M)
+
+[![课程 2: 深入了解物联网 - 答疑解惑](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E)
+
+> 🎥 点击以上图片观看视频教程
+
+## 课前小测试
+
+[课前小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
+
+## 介绍
+
+本课程将深入探讨上一课程中介绍的一些概念。
+
+在本课程中,我们将介绍:
+
+* [物联网应用程序组件](#components-of-an-iot-application)
+* [深入了解微控制器](#deeper-dive-into-microcontrollers)
+* [深入了解单板计算机](#deeper-dive-into-single-board-computers)
+
+## 物联网应用程序组件
+
+物联网应用程序的两个组成部分是 *网络* 和 *物* 。现在让我们更详细地探讨这两个组件。
+
+### 物
+
+![树莓派 4](../../../images/raspberry-pi-4.jpg)
+
+物联网的 **物** 部分是指可以与物理世界交互的设备。这些设备通常是小型,低价的计算机,它们使用低功耗并以低速运行 - 例如,只有千字节RAM(与PC中的千兆字节对比鲜明)的简单微控制器,仅以几百兆赫兹运行(与PC中的千兆赫对比鲜明),但其消耗的功率非常小,它们可以仅通过电池供电就运行数周,数月甚至数年。
+
+这些设备与物理世界进行交互,通过使用传感器从周围环境收集数据,或者通过反馈输出或控制执行器改变物理世界。典型的例子是智能恒温器 - 一种具有温度传感器的设备,可通过表盘或触摸屏设置所需温度,该设备与加热或冷却系统的连接,当检测到的温度超出所需范围时进行调节。当温度传感器检测到房间太冷,就会触发执行器打开暖气。
+
+![该图图显示了作为物联网设备输入的温度和刻度盘,以及作为输出的加热控制器](../../../images/basic-thermostat.png)
+
+有各种各样的东西可以充当物联网设备,从感知状态的专用硬件到通用设备,甚至是您的智能手机!智能手机可以使用传感器来检测周围的世界,并使用执行器与世界进行交互 - 例如,使用GPS传感器来检测您的位置,并使用扬声器为您提供前往目的地的导航指令。
+
+✅ 想想你周围的其他系统,它们从传感器读取数据并做出决策。一个例子是烤箱上的恒温器。你能找到更多吗?
+
+### 网络
+
+物联网应用程序的 **网络** 由可以连接以发送和接收数据的应用,以及其它负责处理设备数据并帮助决定向执行器发送哪些请求的应用组成。
+
+一种典型的场景是拥有物联网设备连接的云服务,此云服务可处理安全性等事项,并从物联网设备收发消息。然后,此云服务将连接到可以处理或存储传感器数据的其他应用程序,或者综合其他系统的数据一起来做出决策。
+
+设备也并不总是通过WiFi或有线连接直连到互联网。一些设备使用蓝牙等技术通过 mesh(网状)网络的相互通信,再通过集线器连接到互联网。
+
+以智能恒温器为例,恒温器将使用家庭 WiFi 连接到在云端服务器。它将温度数据发送到云服务并写入数据库,房主便可使用手机应用程序查询当前和历史温度。云服务还可获取房主预设的温度,并将其发送给物联网设备,以控制供暖系统的开关。
+
+![该图显示了温度和表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话有两条通路,物联网设备的输出则是对加热器的控制](../../../images/mobile-controlled-thermostat.png)
+
+更智能的版本可以在云服务中使用 AI (人工智能),将连接到其他物联网设备的传感器数据,例如检测到传感器的房间位置占用信息,以及天气或日历信息等,以决定如何更智能地设置温度。例如它从你的日历中读取到你正在度假,它将关闭暖气,或者根据使用房间情况关闭特定房间的暖气,从数据中学习的准确性将随时间推移逐步提高。
+
+![该图表显示了多个温度传感器和一个表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话、日历和天气服务有两条通路,并控制加热器作为物联网设备的输出](../../../images/smarter-thermostat.png)
+
+✅ 还有哪些数据可以帮助连接互联网的恒温器更智能?
+
+### 边缘物联网
+
+虽然物联网中的 I 代表网络,但这些设备不是必须连接到互联网。在某些情况下,设备可以连接到“边缘”设备 - 即在本地网络上运行的网关设备,这意味着你无需通过互联网进行即可处理数据。当有大量数据或网络连接速度较慢时,这可能会更快,它允许你在无法连接互联网的地方离线运行,例如在船上或在灾区应对危机时,还可保持数据的私密性。某些设备将云上创建的工具代码下发至本地运行以收集和响应数据,而无需使用互联网传输到云端再做出决策。
+
+这方面的一个例子是智能家居设备,如 Apple HomePod,Amazon Alexa 或 Google Home,它们将在云上训练 AI 辨别你的声音,但在设备本地运行训练好的程序。当你说出某个单词或短语时,这些设备将被“唤醒”,然后通过互联网发送语音进行处理。设备将在适当的时间点停止发送语音,例如当它检测到语音暂停时。你在使用唤醒词唤醒设备之前说的内容,和在设备停止监听后说的内容都不会通过互联网发送给设备提供商,因此这些数据是私密的。
+
+✅ 想想侧重隐私性的其他场景,这些场景下数据处理最好在边缘而非云中完成。作为提示 - 考虑带有摄像头或其他成像设备的物联网设备。
+
+### 物联网安全
+
+对于任何互联网连接,安全性都是一个重要的考虑因素。有一个古老的笑话“物联网中的S代表安全” - 当然,物联网中没有“S”,这意味着它并不安全。
+
+物联网设备会连接到云服务,因此安全性与该云服务一致 - 如果你的云服务允许任意设备连接,那么有可能收到恶意数据或者被病毒攻击。当物联网设备交互和控制其他设备时,则会产生非常严重的后果。例如,震网病毒通过操纵离心机中的阀门来实施破坏。黑客还会攻击婴儿监视器或其他家庭监控等安全防护薄弱的设备。
+
+> 💁 有时物联网设备和边缘设备会运行在物理隔离网络上,以保持数据的私密性和安全性。这称为 [air-gapping](https://wikipedia.org/wiki/Air_gap_(networking))。
+
+
+## 深入了解微控制器
+
+在上一课中,我们介绍了微控制器。现在让我们更深入地介绍它们。
+
+### CPU
+
+CPU 是微控制器的“大脑”。它是运行代码的处理器,可以向任何连接的设备收发数据。CPU 可以包含一个或多个内核 - 实质上是一个或多个 CPU 可以协同工作运行代码。
+
+CPU 依靠时钟每秒滴答数百万或数十亿次。每个时钟周期都会同步 CPU 可以执行的操作。每次时钟滴答时,CPU 都可以执行来自程序的指令,例如从外部设备检索数据或执行数学计算。此常规循环会在处理下一条指令之前完成所有操作。
+
+时钟周期越快,每秒可以处理的指令就越多,CPU 的速度就越快。 CPU 速度以赫兹 [Hertz (Hz)](https://wikipedia.org/wiki/Hertz) 为单位, 这是一个标准单位,其中 1 Hz 表示每秒一个时钟周期。
+
+> 🎓 CPU速度通常以MHz或GHz为单位,1MHz是100万Hz,1GHz是10亿Hz。
+
+> 💁 CPU 使用 [获取-解码-执行周期](https://wikipedia.org/wiki/Instruction_cycle) 执行程序。 对于每个时钟滴答,CPU 将从内存中获取下一条指令,对其进行解码,然后执行它,例如使用算术逻辑单元 (ALU) 将 2 个数字相加。某些执行需要多次滴答才能运行,因此下一个周期将在指令完成后的下一个时钟滴答运行。
+
+![该取码解码执行周期图显示了从存储在RAM中的程序中获取指令,然后在CPU上解码执行](../../../images/fetch-decode-execute.png)
+
+微控制器的时钟速度比台式机或笔记本,甚至大多数智能手机低得多。例如,Wio 终端的 CPU 以120MHz或每秒 120,000,000个周期运行。
+
+✅ 普通的 PC 或 Mac 的 CPU 具有多个内核,以多千兆赫兹运行,这意味着时钟每秒滴答数十亿次。研究计算机的时钟速度,并比较它比 Wio 终端快多少倍。
+
+每个时钟周期都会消耗功率并产生热量。滴答声越快,消耗的功率和产生的热量就越多。PC 具有散热器和风扇来散热,否则它们会在几秒钟内因过热而关闭。微控制器通常两者都没有,因为运行温度低得多,因此速度也慢得多。PC 使用主电源或大电池运行几个小时,微控制器可以使用小型电池运行数天,数月甚至数年。微控制器还能以不同速率运行内核,当对 CPU 的需求较低时,将切换到较慢的低功耗模式。
+
+> 💁 一些 PC 和 Mac 采用相同的快速高功率和较慢低功耗模式组合以节省电量。例如,最新的 Apple 笔记本电脑中的 M1 芯片可以在4个性能核心和4个效率核心之间切换,以根据正在运行的任务优化电池寿命或速度。
+
+✅ 做点研究:阅读[维基百科上的CPU文章](https://wikipedia.org/wiki/Central_processing_unit)
+
+#### 任务
+
+查阅 Wio 终端资料。
+
+如果你使用 Wio 终端实现此课程开发,可尝试寻找其 CPU 位置。找到 [Wio 终端产品页面](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 的 *硬件概述* 部分以获取内部结构的图片,并尝试通过背面的透明塑料窗口找到 CPU。
+
+### 内存
+
+微控制器通常有两种类型的存储器 - 程序存储器和随机存取存储器(RAM)。
+
+程序存储器具有非易失性,这意味着当设备断电时,写入它的内容都会被保留。这是存储程序代码的内存。
+
+RAM (随机存取存储器)是程序用于运行时的内存,包含程序分配的变量和从外围设备收集的数据。RAM 具有易失性,当断电时内容会丢失,状态会被重置。
+
+> 🎓 程序存储器存储你的代码,并在断电时保留。
+
+> 🎓 RAM 用于运行程序,并在断电时重置。
+
+与 CPU 一样,微控制器上的内存比 PC 或 Mac 小几个数量级。一台典型的电脑可能有 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之间的比较-差距超过40000倍](../../../images/ram-comparison.png)
+
+程序存储也比 PC 小。典型的 PC 可能具有用于程序存储的500GB硬盘驱动器,而微控制器可能只有千字节或几兆字节(MB)的存储空间(1MB是1,000KB或1,000,000字节)。Wio 终端有4MB的程序存储空间。
+
+✅ 做点研究:你的计算机有多少 RAM 和存储空间?与微控制器相比如何?
+
+### 输入/输出
+
+微控制器需要输入和输出(I/O)连接,从传感器读取数据并将控制信号发送到执行器。它们通常包含多个通用输入/输出 (GPIO) 引脚。这些引脚可以在软件中配置为输入(即接收信号)或输出(发送信号)。
+
+🧠⬅️ 输入引脚用于读取传感器值
+
+🧠➡️ 输出引脚向执行器发送指令
+
+✅ 你将在后续课程中了解此内容的更多信息。
+
+#### 任务
+
+查阅 Wio 终端资料。
+
+如果你使用 Wio 终端实现此课程开发,可尝试寻找其GPIO引脚。找到 [Wio 终端产品页面](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 的 *引脚排列图* 部分,了解引脚用途。Wio 终端带有一个贴纸,你可以将引脚号贴在背面,如果没有,请立即添加。
+
+### 物理尺寸
+
+微控制器通常尺寸较小,[Freescale Kinetis KL03 MCU 可以藏入高尔夫球中](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/)。PC 中仅CPU就有 40毫米 x 40毫米,这还不包括散热所需的散热器和风扇,这比完整的微控制器尺寸大得多。带有微控制器、外壳、屏幕以及一系列连接和组件的 Wio 终端开发套件并不比裸露的英特尔 i9 CPU 大多少,更比带有散热器和风扇的 CPU 小得多!
+
+| 设备 | 尺寸 |
+| ------------------------------- | -------------------------- |
+| Freescale Kinetis KL03 | 1.6 毫米 x 2 毫米 x 1 毫米 |
+| Wio 终端 | 72 毫米 x 57 毫米 x 12 毫米 |
+| Intel i9 CPU, 散热器和风扇 | 136毫米 x 145毫米 x 103毫米 |
+
+### 架构和操作系统
+
+由于其低速度和内存限制,微控制器不能运行桌面意义上的操作系统(OS)。PC 运行的操作系统(Windows,Linux或macOS)需要大量的内存和处理能力来运行微控制器完全不需要的任务。请记住,微控制器通常被编程来完成一个或多个特定任务,这与 PC 或 Mac 等通用计算机不同,后者需要支持用户界面、播放音乐或电影、提供编写文档或代码的工具、玩游戏或浏览互联网。
+
+在没有操作系统的情况下对微控制器进行编程,确实需要一些工具,这些工具通过 API 来与外设通信,以达到构建代码的目的。每个微控制器都是不同的,因此制造商通常需支持标准架构,这些架构遵循标准“配方”来构建代码,并实现在支持该架构的任何微控制器上运行。
+
+You can program microcontrollers using an OS - often referred to as a real-time operating system (RTOS), as these are designed to handle sending data to and from peripherals in real time. These operating systems are very lightweight and provide features such as:
+你可以使用操作系统(通常称为实时操作系统 (RTOS) )对微控制器进行编程,因为它们旨在实时处理与外设间的数据收发。这些操作系统是轻量级的,可提供以下功能:
+
+* 多线程,允许你的代码同时运行多个代码块,无论是在多个内核上还是在一个内核上轮流执行
+* 允许通过互联网地进行安全通信
+* 图形用户界面 (GUI) 组件,用于在具有屏幕的设备上构建用户界面 (UI)。
+
+✅ 了解一些不同的RTOS: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org)
+
+#### Arduino
+
+![Arduino 的 logo](../../../images/arduino-logo.svg)
+
+[Arduino](https://www.arduino.cc) 可能是最受欢迎的微控制器框架,尤其是在学生,业余爱好者和创客中。Arduino 是一个结合软件和硬件的开源电子平台。您可以从 Arduino 官方或其他制造商处购买 Arduino 兼容板,然后使用 Arduino 框架进行开发。
+
+Arduino 开发板使用 C 或 C++ 编码。使用 C/C++ 可以编译教小的代码且运行速度快,这是在资源受限设备(如微控制器)上所需要的。Arduino 应用程序的核归纳为两个功能模块 - `setup` 和 `loop`,当开发板启动时,Arduino 框架代码将运行 `setup` 功能模块,然后循环运行 `loop` 直到断电。
+
+你可以将启动代码写在 `setup` 函数中,例如连接到 WiFi 和云服务或初始化输入和输出引脚。然后,将处理代码写入 `loop` 循环,例如从传感器读取数据并发送到云。通常会在每次循环中包含一个延迟,例如,如果只希望传感器数据每 10 秒发送一次,则可以在环路结束时添加 10 秒的延迟,以便微控制器休眠节省功耗,10 秒后再次循环。
+
+![Arduino 开机首先执行 setup 函数, 然后循环执行 loop 函数](../../../images/arduino-sketch.png)
+
+✅ 此程序体系结构称为 *事件循环* 或 *消息循环*。许多应用程序在后台使用该结构,该结构也是 Windows,macOS 或 Linux 等操作系统上大多数桌面应用的标准。监听来自用户界面组件(如按钮)或设备(如键盘)的消息,并对其进行响应。可以在[这篇文章](https://wikipedia.org/wiki/Event_loop)中阅读有关事件循环的更多信息。
+
+Arduino 提供了用于与微控制器和 I/O 引脚交互的标准库,在不同的微控制器上有不同的实现。例如,延迟函数将暂停程序一段时间,[`digitalRead` 函数](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/)将从给定引脚读取数据,而无论代码在哪个板上运行。这些标准库意味着在一个 Arduino 开发板编写的代码可以在其他 Arduino 开发板上重新编译运行,只要引脚正确且开发板支持相同功能。
+
+有一个庞大的第三方 Arduino 库生态系统,可为 Arduino 项目添加额外的功能,例如使用传感器和执行器或连接到云物联网服务。
+
+##### 任务
+
+查阅 Wio 终端资料。
+
+如果使用 Wio 终端进行课程开发,请重新阅读你在上一课程中编写的代码。找到 `setup` 和 `loop` 函数,观察重复调用循环函数的串口输出。尝试向 `setup` 函数添加代码在串口输出,并观察是否每次重启时会重新执行一次此代码。使用侧面的电源开关重启设备,并观察此代码是否在每次重启时调用。
+
+## 深入了解单板计算机
+
+在上一课程中,我们介绍了单板计算机。现在让我们更深入地研究它们。
+
+### 树莓派
+
+![树莓派 logo](../../../images/raspberry-pi-logo.png)
+
+树莓派基金会是来自英国的慈善机构,成立于2009年,旨在促进计算机科学研究,特别是学校层面。作为这项任务的一部分,他们开发了一种单板计算机,称为Raspberry Pi (树莓派)。树莓派目前有 3 种版本 - 全尺寸版本、尺寸较小的树莓派 Zero 和可以内置到物联网终端设备中的计算模块。
+
+![树莓派 4](../../../images/raspberry-pi-4.jpg)
+
+截至目前全尺寸树莓派最新版本是树莓派 4B。它有一个四核(4 核)CPU,运行在 1.5GHz、2、4 或 8GB RAM、千兆以太网、WiFi、2 个支持 4k 屏幕的 HDMI 端口、一个音频和复合视频输出端口、USB 端口(2 个 USB 2.0、2 个 USB 3.0)、40 个 GPIO 引脚、一个用于树莓派相机模块的相机连接器和一个 SD 卡插槽。所有这些都在一块 88毫米 x 58毫米 x 19.5毫米 的开发板上,由 3A USB-C 电源供电。起价为35美元,比 PC 或 Mac 便宜得多。
+
+> 💁 还有一个 Pi 400 一体机,键盘内置 Pi 4。
+
+![树莓派 Zero](../../../images/raspberry-pi-zero.jpg)
+
+树莓派 Zero要小得多,功耗更低。它具有单核1GHz CPU,512MB内存,WiFi(在Zero W型号中),单个HDMI端口,微型USB端口,40个GPIO引脚,树莓派相机模块的相机连接器和SD卡插槽。它的尺寸为 65毫米 x 30毫米 x 5毫米,功耗极低。Zero是5美元,WiFi版本是10美元。
+
+> 🎓 这两种开发板中的 CPU 都是 ARM 架构,而不是大多数 PC 和 Mac 中的 Intel / AMD x86 或 x64 架构。这类似于某些微控制器,以及几乎所有手机,微软Surface X 和 基于Apple Silicon 的新 Apple Mac 中的 CPU。
+
+树莓派的所有版本都可运行一个名为树莓派 OS 的 Debian Linux 分支系统。这是没有桌面的精简版,非常适合不需要屏幕的“无头”项目,也可运行具有完整桌面环境的版本,其带有Web浏览器,办公应用程序,编码工具和游戏。由于该操作系统基于 Debian Linux,你可以安装任何 ARM 架构下 Debian 的应用程序或工具。
+
+#### 任务
+
+查询树莓派相关资料。
+
+如果你在此课程中使用树莓派作开发,请研究开发板上的不同硬件组件。
+
+* 可以在[树莓派硬件文档页面](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)来识别树莓派上的不同引脚。
+
+### 单板计算机开发
+
+单板计算机是运行完整操作系统的完整计算机。这意味着你可以使用多种编程语言、框架和工具来编写程序,这与 Arduino 一类的微控制器需要开发板架构支持不同。大多数编程语言都有可以访问 GPIO 引脚以收发来自传感器和执行器的数据。
+
+✅ 你熟悉哪些编程语言?在 Linux 上受支持吗?
+
+在树莓派上编写物联网应用程序的最常用语言是Python。在一个专为树莓派设计的庞大硬件生态中,几乎所有硬件包括相关代码都会使用Python库。其中一些生态系统基于“帽子”扩展 - 之所以这样称呼,是因为它们像帽子一样扩展在树莓派的顶部,并通过一个大插座连接到40个GPIO引脚。“帽子”提供额外的功能,如屏幕、传感器、遥控汽车或适配器,通过其使用标准化接口扩展传感器。
+
+### 在专业物联网部署中使用单板计算机
+
+单板计算机用于专业的物联网部署,而不仅仅是作为开发人员套件。它们提供一种有效的方法来控制硬件和运行复杂的任务,比如运行机器学习模型。举个例子,有一个树莓派4计算模块,它可提供树莓派4的所有功能,但外形紧凑且更便宜,没有大多数端口,旨在安装到定制硬件中。
+
+---
+
+## 🚀 挑战
+
+上一课的挑战是列出尽可能多的物联网设备,这些设备位于你的家庭、学校或工作场所。对于此列表中的每个设备,你认为它们是围绕微控制器或单板计算机构建的,还是两者的混合?
+
+## 课后小测试
+
+[课后小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
+
+## 复习与自学
+
+* 阅读 [Arduino 入门指南](https://www.arduino.cc/en/Guide/Introduction) 了解有关 Arduino 平台的更多信息。
+* 阅读 [树莓派 4 介绍](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 了解更多关于树莓派的信息。
+* 一些概念和首字母缩略词的信息可参阅《电气工程杂志》中[CPU、MPU、MCU 和 GPU 常见问题解答](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/)一文。
+
+✅ 使用本文和 [硬件指南](../../../hardware.md) 中的成本信息来决定你所需的硬件平台,或者使用虚拟设备。
+
+## 作业
+
+[比较与对比微控制器和单板计算机](assignment.zh-cn.md)
From de1a077d3525e1f50623260e679d98c77eee7a45 Mon Sep 17 00:00:00 2001
From: WoKough <17927461+WoKough@users.noreply.github.com>
Date: Wed, 1 Feb 2023 19:49:06 +0800
Subject: [PATCH 2/8] Update README.zh-cn.md
---
.../\347\277\273\350\257\221/README.zh-cn.md" | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
rename 1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md => "1 \345\205\245\351\227\250/\350\257\276/2-\346\233\264\346\267\261\345\205\245\347\232\204\346\275\234\346\260\264/\347\277\273\350\257\221/README.zh-cn.md" (95%)
diff --git a/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md "b/1 \345\205\245\351\227\250/\350\257\276/2-\346\233\264\346\267\261\345\205\245\347\232\204\346\275\234\346\260\264/\347\277\273\350\257\221/README.zh-cn.md"
similarity index 95%
rename from 1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
rename to "1 \345\205\245\351\227\250/\350\257\276/2-\346\233\264\346\267\261\345\205\245\347\232\204\346\275\234\346\260\264/\347\277\273\350\257\221/README.zh-cn.md"
index de7a5f80..1f45db32 100644
--- a/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
+++ "b/1 \345\205\245\351\227\250/\350\257\276/2-\346\233\264\346\267\261\345\205\245\347\232\204\346\275\234\346\260\264/\347\277\273\350\257\221/README.zh-cn.md"
@@ -41,7 +41,7 @@
有各种各样的东西可以充当物联网设备,从感知状态的专用硬件到通用设备,甚至是您的智能手机!智能手机可以使用传感器来检测周围的世界,并使用执行器与世界进行交互 - 例如,使用GPS传感器来检测您的位置,并使用扬声器为您提供前往目的地的导航指令。
-✅ 想想你周围的其他系统,它们从传感器读取数据并做出决策。一个例子是烤箱上的恒温器。你能找到更多吗?
+✅ 想想你周围的其他系统,它们从传感器读取数据并做出决策。比如烤箱上的恒温器。你能找到更多吗?
### 网络
@@ -55,7 +55,7 @@
![该图显示了温度和表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话有两条通路,物联网设备的输出则是对加热器的控制](../../../images/mobile-controlled-thermostat.png)
-更智能的版本可以在云服务中使用 AI (人工智能),将连接到其他物联网设备的传感器数据,例如检测到传感器的房间位置占用信息,以及天气或日历信息等,以决定如何更智能地设置温度。例如它从你的日历中读取到你正在度假,它将关闭暖气,或者根据使用房间情况关闭特定房间的暖气,从数据中学习的准确性将随时间推移逐步提高。
+更智能的版本可以在云服务中使用 AI (人工智能),将连接到其他物联网设备的传感器数据,例如探测哪些房间正在使用的占用传感器,以及天气或日历信息等,以决定如何更智能地设置温度。例如它从你的日历中读取到你正在度假,它将关闭暖气,或者根据使用房间情况关闭特定房间的暖气,从数据中学习的准确性将随时间推移逐步提高。
![该图表显示了多个温度传感器和一个表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话、日历和天气服务有两条通路,并控制加热器作为物联网设备的输出](../../../images/smarter-thermostat.png)
@@ -67,7 +67,7 @@
这方面的一个例子是智能家居设备,如 Apple HomePod,Amazon Alexa 或 Google Home,它们将在云上训练 AI 辨别你的声音,但在设备本地运行训练好的程序。当你说出某个单词或短语时,这些设备将被“唤醒”,然后通过互联网发送语音进行处理。设备将在适当的时间点停止发送语音,例如当它检测到语音暂停时。你在使用唤醒词唤醒设备之前说的内容,和在设备停止监听后说的内容都不会通过互联网发送给设备提供商,因此这些数据是私密的。
-✅ 想想侧重隐私性的其他场景,这些场景下数据处理最好在边缘而非云中完成。作为提示 - 考虑带有摄像头或其他成像设备的物联网设备。
+✅ 想想侧重隐私性的其他场景,这些场景下数据处理最好在边缘而非云中完成。提示 - 考虑带有摄像头或其他成像设备的物联网设备。
### 物联网安全
@@ -166,7 +166,6 @@ RAM (随机存取存储器)是程序用于运行时的内存,包含程序
在没有操作系统的情况下对微控制器进行编程,确实需要一些工具,这些工具通过 API 来与外设通信,以达到构建代码的目的。每个微控制器都是不同的,因此制造商通常需支持标准架构,这些架构遵循标准“配方”来构建代码,并实现在支持该架构的任何微控制器上运行。
-You can program microcontrollers using an OS - often referred to as a real-time operating system (RTOS), as these are designed to handle sending data to and from peripherals in real time. These operating systems are very lightweight and provide features such as:
你可以使用操作系统(通常称为实时操作系统 (RTOS) )对微控制器进行编程,因为它们旨在实时处理与外设间的数据收发。这些操作系统是轻量级的,可提供以下功能:
* 多线程,允许你的代码同时运行多个代码块,无论是在多个内核上还是在一个内核上轮流执行
From 8d45726c5156200af966c39af0f673f8a51b1c13 Mon Sep 17 00:00:00 2001
From: WoKough <17927461+WoKough@users.noreply.github.com>
Date: Wed, 1 Feb 2023 20:00:13 +0800
Subject: [PATCH 3/8] Add files via upload
---
.../translations/README.zh-cn.md | 266 ++++++++++++++++++
1 file changed, 266 insertions(+)
create mode 100644 1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
diff --git a/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md b/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
new file mode 100644
index 00000000..1f45db32
--- /dev/null
+++ b/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
@@ -0,0 +1,266 @@
+# 深入了解物联网
+
+![本课程概述草图](../../../sketchnotes/lesson-2.jpg)
+
+> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 单击图像可查看大图。
+本课程是 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 是由 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 制作。 该课程以 2 个视频的形式授课 - 1小时的课程时间和1小时的答疑时间,使您能更深入地了解课程的各个部分并答疑解惑。
+
+[![课程 2: 深入了解物联网](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M)
+
+[![课程 2: 深入了解物联网 - 答疑解惑](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E)
+
+> 🎥 点击以上图片观看视频教程
+
+## 课前小测试
+
+[课前小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
+
+## 介绍
+
+本课程将深入探讨上一课程中介绍的一些概念。
+
+在本课程中,我们将介绍:
+
+* [物联网应用程序组件](#components-of-an-iot-application)
+* [深入了解微控制器](#deeper-dive-into-microcontrollers)
+* [深入了解单板计算机](#deeper-dive-into-single-board-computers)
+
+## 物联网应用程序组件
+
+物联网应用程序的两个组成部分是 *网络* 和 *物* 。现在让我们更详细地探讨这两个组件。
+
+### 物
+
+![树莓派 4](../../../images/raspberry-pi-4.jpg)
+
+物联网的 **物** 部分是指可以与物理世界交互的设备。这些设备通常是小型,低价的计算机,它们使用低功耗并以低速运行 - 例如,只有千字节RAM(与PC中的千兆字节对比鲜明)的简单微控制器,仅以几百兆赫兹运行(与PC中的千兆赫对比鲜明),但其消耗的功率非常小,它们可以仅通过电池供电就运行数周,数月甚至数年。
+
+这些设备与物理世界进行交互,通过使用传感器从周围环境收集数据,或者通过反馈输出或控制执行器改变物理世界。典型的例子是智能恒温器 - 一种具有温度传感器的设备,可通过表盘或触摸屏设置所需温度,该设备与加热或冷却系统的连接,当检测到的温度超出所需范围时进行调节。当温度传感器检测到房间太冷,就会触发执行器打开暖气。
+
+![该图图显示了作为物联网设备输入的温度和刻度盘,以及作为输出的加热控制器](../../../images/basic-thermostat.png)
+
+有各种各样的东西可以充当物联网设备,从感知状态的专用硬件到通用设备,甚至是您的智能手机!智能手机可以使用传感器来检测周围的世界,并使用执行器与世界进行交互 - 例如,使用GPS传感器来检测您的位置,并使用扬声器为您提供前往目的地的导航指令。
+
+✅ 想想你周围的其他系统,它们从传感器读取数据并做出决策。比如烤箱上的恒温器。你能找到更多吗?
+
+### 网络
+
+物联网应用程序的 **网络** 由可以连接以发送和接收数据的应用,以及其它负责处理设备数据并帮助决定向执行器发送哪些请求的应用组成。
+
+一种典型的场景是拥有物联网设备连接的云服务,此云服务可处理安全性等事项,并从物联网设备收发消息。然后,此云服务将连接到可以处理或存储传感器数据的其他应用程序,或者综合其他系统的数据一起来做出决策。
+
+设备也并不总是通过WiFi或有线连接直连到互联网。一些设备使用蓝牙等技术通过 mesh(网状)网络的相互通信,再通过集线器连接到互联网。
+
+以智能恒温器为例,恒温器将使用家庭 WiFi 连接到在云端服务器。它将温度数据发送到云服务并写入数据库,房主便可使用手机应用程序查询当前和历史温度。云服务还可获取房主预设的温度,并将其发送给物联网设备,以控制供暖系统的开关。
+
+![该图显示了温度和表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话有两条通路,物联网设备的输出则是对加热器的控制](../../../images/mobile-controlled-thermostat.png)
+
+更智能的版本可以在云服务中使用 AI (人工智能),将连接到其他物联网设备的传感器数据,例如探测哪些房间正在使用的占用传感器,以及天气或日历信息等,以决定如何更智能地设置温度。例如它从你的日历中读取到你正在度假,它将关闭暖气,或者根据使用房间情况关闭特定房间的暖气,从数据中学习的准确性将随时间推移逐步提高。
+
+![该图表显示了多个温度传感器和一个表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话、日历和天气服务有两条通路,并控制加热器作为物联网设备的输出](../../../images/smarter-thermostat.png)
+
+✅ 还有哪些数据可以帮助连接互联网的恒温器更智能?
+
+### 边缘物联网
+
+虽然物联网中的 I 代表网络,但这些设备不是必须连接到互联网。在某些情况下,设备可以连接到“边缘”设备 - 即在本地网络上运行的网关设备,这意味着你无需通过互联网进行即可处理数据。当有大量数据或网络连接速度较慢时,这可能会更快,它允许你在无法连接互联网的地方离线运行,例如在船上或在灾区应对危机时,还可保持数据的私密性。某些设备将云上创建的工具代码下发至本地运行以收集和响应数据,而无需使用互联网传输到云端再做出决策。
+
+这方面的一个例子是智能家居设备,如 Apple HomePod,Amazon Alexa 或 Google Home,它们将在云上训练 AI 辨别你的声音,但在设备本地运行训练好的程序。当你说出某个单词或短语时,这些设备将被“唤醒”,然后通过互联网发送语音进行处理。设备将在适当的时间点停止发送语音,例如当它检测到语音暂停时。你在使用唤醒词唤醒设备之前说的内容,和在设备停止监听后说的内容都不会通过互联网发送给设备提供商,因此这些数据是私密的。
+
+✅ 想想侧重隐私性的其他场景,这些场景下数据处理最好在边缘而非云中完成。提示 - 考虑带有摄像头或其他成像设备的物联网设备。
+
+### 物联网安全
+
+对于任何互联网连接,安全性都是一个重要的考虑因素。有一个古老的笑话“物联网中的S代表安全” - 当然,物联网中没有“S”,这意味着它并不安全。
+
+物联网设备会连接到云服务,因此安全性与该云服务一致 - 如果你的云服务允许任意设备连接,那么有可能收到恶意数据或者被病毒攻击。当物联网设备交互和控制其他设备时,则会产生非常严重的后果。例如,震网病毒通过操纵离心机中的阀门来实施破坏。黑客还会攻击婴儿监视器或其他家庭监控等安全防护薄弱的设备。
+
+> 💁 有时物联网设备和边缘设备会运行在物理隔离网络上,以保持数据的私密性和安全性。这称为 [air-gapping](https://wikipedia.org/wiki/Air_gap_(networking))。
+
+
+## 深入了解微控制器
+
+在上一课中,我们介绍了微控制器。现在让我们更深入地介绍它们。
+
+### CPU
+
+CPU 是微控制器的“大脑”。它是运行代码的处理器,可以向任何连接的设备收发数据。CPU 可以包含一个或多个内核 - 实质上是一个或多个 CPU 可以协同工作运行代码。
+
+CPU 依靠时钟每秒滴答数百万或数十亿次。每个时钟周期都会同步 CPU 可以执行的操作。每次时钟滴答时,CPU 都可以执行来自程序的指令,例如从外部设备检索数据或执行数学计算。此常规循环会在处理下一条指令之前完成所有操作。
+
+时钟周期越快,每秒可以处理的指令就越多,CPU 的速度就越快。 CPU 速度以赫兹 [Hertz (Hz)](https://wikipedia.org/wiki/Hertz) 为单位, 这是一个标准单位,其中 1 Hz 表示每秒一个时钟周期。
+
+> 🎓 CPU速度通常以MHz或GHz为单位,1MHz是100万Hz,1GHz是10亿Hz。
+
+> 💁 CPU 使用 [获取-解码-执行周期](https://wikipedia.org/wiki/Instruction_cycle) 执行程序。 对于每个时钟滴答,CPU 将从内存中获取下一条指令,对其进行解码,然后执行它,例如使用算术逻辑单元 (ALU) 将 2 个数字相加。某些执行需要多次滴答才能运行,因此下一个周期将在指令完成后的下一个时钟滴答运行。
+
+![该取码解码执行周期图显示了从存储在RAM中的程序中获取指令,然后在CPU上解码执行](../../../images/fetch-decode-execute.png)
+
+微控制器的时钟速度比台式机或笔记本,甚至大多数智能手机低得多。例如,Wio 终端的 CPU 以120MHz或每秒 120,000,000个周期运行。
+
+✅ 普通的 PC 或 Mac 的 CPU 具有多个内核,以多千兆赫兹运行,这意味着时钟每秒滴答数十亿次。研究计算机的时钟速度,并比较它比 Wio 终端快多少倍。
+
+每个时钟周期都会消耗功率并产生热量。滴答声越快,消耗的功率和产生的热量就越多。PC 具有散热器和风扇来散热,否则它们会在几秒钟内因过热而关闭。微控制器通常两者都没有,因为运行温度低得多,因此速度也慢得多。PC 使用主电源或大电池运行几个小时,微控制器可以使用小型电池运行数天,数月甚至数年。微控制器还能以不同速率运行内核,当对 CPU 的需求较低时,将切换到较慢的低功耗模式。
+
+> 💁 一些 PC 和 Mac 采用相同的快速高功率和较慢低功耗模式组合以节省电量。例如,最新的 Apple 笔记本电脑中的 M1 芯片可以在4个性能核心和4个效率核心之间切换,以根据正在运行的任务优化电池寿命或速度。
+
+✅ 做点研究:阅读[维基百科上的CPU文章](https://wikipedia.org/wiki/Central_processing_unit)
+
+#### 任务
+
+查阅 Wio 终端资料。
+
+如果你使用 Wio 终端实现此课程开发,可尝试寻找其 CPU 位置。找到 [Wio 终端产品页面](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 的 *硬件概述* 部分以获取内部结构的图片,并尝试通过背面的透明塑料窗口找到 CPU。
+
+### 内存
+
+微控制器通常有两种类型的存储器 - 程序存储器和随机存取存储器(RAM)。
+
+程序存储器具有非易失性,这意味着当设备断电时,写入它的内容都会被保留。这是存储程序代码的内存。
+
+RAM (随机存取存储器)是程序用于运行时的内存,包含程序分配的变量和从外围设备收集的数据。RAM 具有易失性,当断电时内容会丢失,状态会被重置。
+
+> 🎓 程序存储器存储你的代码,并在断电时保留。
+
+> 🎓 RAM 用于运行程序,并在断电时重置。
+
+与 CPU 一样,微控制器上的内存比 PC 或 Mac 小几个数量级。一台典型的电脑可能有 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之间的比较-差距超过40000倍](../../../images/ram-comparison.png)
+
+程序存储也比 PC 小。典型的 PC 可能具有用于程序存储的500GB硬盘驱动器,而微控制器可能只有千字节或几兆字节(MB)的存储空间(1MB是1,000KB或1,000,000字节)。Wio 终端有4MB的程序存储空间。
+
+✅ 做点研究:你的计算机有多少 RAM 和存储空间?与微控制器相比如何?
+
+### 输入/输出
+
+微控制器需要输入和输出(I/O)连接,从传感器读取数据并将控制信号发送到执行器。它们通常包含多个通用输入/输出 (GPIO) 引脚。这些引脚可以在软件中配置为输入(即接收信号)或输出(发送信号)。
+
+🧠⬅️ 输入引脚用于读取传感器值
+
+🧠➡️ 输出引脚向执行器发送指令
+
+✅ 你将在后续课程中了解此内容的更多信息。
+
+#### 任务
+
+查阅 Wio 终端资料。
+
+如果你使用 Wio 终端实现此课程开发,可尝试寻找其GPIO引脚。找到 [Wio 终端产品页面](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 的 *引脚排列图* 部分,了解引脚用途。Wio 终端带有一个贴纸,你可以将引脚号贴在背面,如果没有,请立即添加。
+
+### 物理尺寸
+
+微控制器通常尺寸较小,[Freescale Kinetis KL03 MCU 可以藏入高尔夫球中](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/)。PC 中仅CPU就有 40毫米 x 40毫米,这还不包括散热所需的散热器和风扇,这比完整的微控制器尺寸大得多。带有微控制器、外壳、屏幕以及一系列连接和组件的 Wio 终端开发套件并不比裸露的英特尔 i9 CPU 大多少,更比带有散热器和风扇的 CPU 小得多!
+
+| 设备 | 尺寸 |
+| ------------------------------- | -------------------------- |
+| Freescale Kinetis KL03 | 1.6 毫米 x 2 毫米 x 1 毫米 |
+| Wio 终端 | 72 毫米 x 57 毫米 x 12 毫米 |
+| Intel i9 CPU, 散热器和风扇 | 136毫米 x 145毫米 x 103毫米 |
+
+### 架构和操作系统
+
+由于其低速度和内存限制,微控制器不能运行桌面意义上的操作系统(OS)。PC 运行的操作系统(Windows,Linux或macOS)需要大量的内存和处理能力来运行微控制器完全不需要的任务。请记住,微控制器通常被编程来完成一个或多个特定任务,这与 PC 或 Mac 等通用计算机不同,后者需要支持用户界面、播放音乐或电影、提供编写文档或代码的工具、玩游戏或浏览互联网。
+
+在没有操作系统的情况下对微控制器进行编程,确实需要一些工具,这些工具通过 API 来与外设通信,以达到构建代码的目的。每个微控制器都是不同的,因此制造商通常需支持标准架构,这些架构遵循标准“配方”来构建代码,并实现在支持该架构的任何微控制器上运行。
+
+你可以使用操作系统(通常称为实时操作系统 (RTOS) )对微控制器进行编程,因为它们旨在实时处理与外设间的数据收发。这些操作系统是轻量级的,可提供以下功能:
+
+* 多线程,允许你的代码同时运行多个代码块,无论是在多个内核上还是在一个内核上轮流执行
+* 允许通过互联网地进行安全通信
+* 图形用户界面 (GUI) 组件,用于在具有屏幕的设备上构建用户界面 (UI)。
+
+✅ 了解一些不同的RTOS: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org)
+
+#### Arduino
+
+![Arduino 的 logo](../../../images/arduino-logo.svg)
+
+[Arduino](https://www.arduino.cc) 可能是最受欢迎的微控制器框架,尤其是在学生,业余爱好者和创客中。Arduino 是一个结合软件和硬件的开源电子平台。您可以从 Arduino 官方或其他制造商处购买 Arduino 兼容板,然后使用 Arduino 框架进行开发。
+
+Arduino 开发板使用 C 或 C++ 编码。使用 C/C++ 可以编译教小的代码且运行速度快,这是在资源受限设备(如微控制器)上所需要的。Arduino 应用程序的核归纳为两个功能模块 - `setup` 和 `loop`,当开发板启动时,Arduino 框架代码将运行 `setup` 功能模块,然后循环运行 `loop` 直到断电。
+
+你可以将启动代码写在 `setup` 函数中,例如连接到 WiFi 和云服务或初始化输入和输出引脚。然后,将处理代码写入 `loop` 循环,例如从传感器读取数据并发送到云。通常会在每次循环中包含一个延迟,例如,如果只希望传感器数据每 10 秒发送一次,则可以在环路结束时添加 10 秒的延迟,以便微控制器休眠节省功耗,10 秒后再次循环。
+
+![Arduino 开机首先执行 setup 函数, 然后循环执行 loop 函数](../../../images/arduino-sketch.png)
+
+✅ 此程序体系结构称为 *事件循环* 或 *消息循环*。许多应用程序在后台使用该结构,该结构也是 Windows,macOS 或 Linux 等操作系统上大多数桌面应用的标准。监听来自用户界面组件(如按钮)或设备(如键盘)的消息,并对其进行响应。可以在[这篇文章](https://wikipedia.org/wiki/Event_loop)中阅读有关事件循环的更多信息。
+
+Arduino 提供了用于与微控制器和 I/O 引脚交互的标准库,在不同的微控制器上有不同的实现。例如,延迟函数将暂停程序一段时间,[`digitalRead` 函数](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/)将从给定引脚读取数据,而无论代码在哪个板上运行。这些标准库意味着在一个 Arduino 开发板编写的代码可以在其他 Arduino 开发板上重新编译运行,只要引脚正确且开发板支持相同功能。
+
+有一个庞大的第三方 Arduino 库生态系统,可为 Arduino 项目添加额外的功能,例如使用传感器和执行器或连接到云物联网服务。
+
+##### 任务
+
+查阅 Wio 终端资料。
+
+如果使用 Wio 终端进行课程开发,请重新阅读你在上一课程中编写的代码。找到 `setup` 和 `loop` 函数,观察重复调用循环函数的串口输出。尝试向 `setup` 函数添加代码在串口输出,并观察是否每次重启时会重新执行一次此代码。使用侧面的电源开关重启设备,并观察此代码是否在每次重启时调用。
+
+## 深入了解单板计算机
+
+在上一课程中,我们介绍了单板计算机。现在让我们更深入地研究它们。
+
+### 树莓派
+
+![树莓派 logo](../../../images/raspberry-pi-logo.png)
+
+树莓派基金会是来自英国的慈善机构,成立于2009年,旨在促进计算机科学研究,特别是学校层面。作为这项任务的一部分,他们开发了一种单板计算机,称为Raspberry Pi (树莓派)。树莓派目前有 3 种版本 - 全尺寸版本、尺寸较小的树莓派 Zero 和可以内置到物联网终端设备中的计算模块。
+
+![树莓派 4](../../../images/raspberry-pi-4.jpg)
+
+截至目前全尺寸树莓派最新版本是树莓派 4B。它有一个四核(4 核)CPU,运行在 1.5GHz、2、4 或 8GB RAM、千兆以太网、WiFi、2 个支持 4k 屏幕的 HDMI 端口、一个音频和复合视频输出端口、USB 端口(2 个 USB 2.0、2 个 USB 3.0)、40 个 GPIO 引脚、一个用于树莓派相机模块的相机连接器和一个 SD 卡插槽。所有这些都在一块 88毫米 x 58毫米 x 19.5毫米 的开发板上,由 3A USB-C 电源供电。起价为35美元,比 PC 或 Mac 便宜得多。
+
+> 💁 还有一个 Pi 400 一体机,键盘内置 Pi 4。
+
+![树莓派 Zero](../../../images/raspberry-pi-zero.jpg)
+
+树莓派 Zero要小得多,功耗更低。它具有单核1GHz CPU,512MB内存,WiFi(在Zero W型号中),单个HDMI端口,微型USB端口,40个GPIO引脚,树莓派相机模块的相机连接器和SD卡插槽。它的尺寸为 65毫米 x 30毫米 x 5毫米,功耗极低。Zero是5美元,WiFi版本是10美元。
+
+> 🎓 这两种开发板中的 CPU 都是 ARM 架构,而不是大多数 PC 和 Mac 中的 Intel / AMD x86 或 x64 架构。这类似于某些微控制器,以及几乎所有手机,微软Surface X 和 基于Apple Silicon 的新 Apple Mac 中的 CPU。
+
+树莓派的所有版本都可运行一个名为树莓派 OS 的 Debian Linux 分支系统。这是没有桌面的精简版,非常适合不需要屏幕的“无头”项目,也可运行具有完整桌面环境的版本,其带有Web浏览器,办公应用程序,编码工具和游戏。由于该操作系统基于 Debian Linux,你可以安装任何 ARM 架构下 Debian 的应用程序或工具。
+
+#### 任务
+
+查询树莓派相关资料。
+
+如果你在此课程中使用树莓派作开发,请研究开发板上的不同硬件组件。
+
+* 可以在[树莓派硬件文档页面](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)来识别树莓派上的不同引脚。
+
+### 单板计算机开发
+
+单板计算机是运行完整操作系统的完整计算机。这意味着你可以使用多种编程语言、框架和工具来编写程序,这与 Arduino 一类的微控制器需要开发板架构支持不同。大多数编程语言都有可以访问 GPIO 引脚以收发来自传感器和执行器的数据。
+
+✅ 你熟悉哪些编程语言?在 Linux 上受支持吗?
+
+在树莓派上编写物联网应用程序的最常用语言是Python。在一个专为树莓派设计的庞大硬件生态中,几乎所有硬件包括相关代码都会使用Python库。其中一些生态系统基于“帽子”扩展 - 之所以这样称呼,是因为它们像帽子一样扩展在树莓派的顶部,并通过一个大插座连接到40个GPIO引脚。“帽子”提供额外的功能,如屏幕、传感器、遥控汽车或适配器,通过其使用标准化接口扩展传感器。
+
+### 在专业物联网部署中使用单板计算机
+
+单板计算机用于专业的物联网部署,而不仅仅是作为开发人员套件。它们提供一种有效的方法来控制硬件和运行复杂的任务,比如运行机器学习模型。举个例子,有一个树莓派4计算模块,它可提供树莓派4的所有功能,但外形紧凑且更便宜,没有大多数端口,旨在安装到定制硬件中。
+
+---
+
+## 🚀 挑战
+
+上一课的挑战是列出尽可能多的物联网设备,这些设备位于你的家庭、学校或工作场所。对于此列表中的每个设备,你认为它们是围绕微控制器或单板计算机构建的,还是两者的混合?
+
+## 课后小测试
+
+[课后小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
+
+## 复习与自学
+
+* 阅读 [Arduino 入门指南](https://www.arduino.cc/en/Guide/Introduction) 了解有关 Arduino 平台的更多信息。
+* 阅读 [树莓派 4 介绍](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 了解更多关于树莓派的信息。
+* 一些概念和首字母缩略词的信息可参阅《电气工程杂志》中[CPU、MPU、MCU 和 GPU 常见问题解答](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/)一文。
+
+✅ 使用本文和 [硬件指南](../../../hardware.md) 中的成本信息来决定你所需的硬件平台,或者使用虚拟设备。
+
+## 作业
+
+[比较与对比微控制器和单板计算机](assignment.zh-cn.md)
From b1c7ccb7c81821cbbd46253bffd437403cb66d98 Mon Sep 17 00:00:00 2001
From: WoKough <17927461+WoKough@users.noreply.github.com>
Date: Wed, 1 Feb 2023 20:01:48 +0800
Subject: [PATCH 4/8] Delete README.zh-cn.md
---
.../\347\277\273\350\257\221/README.zh-cn.md" | 266 ------------------
1 file changed, 266 deletions(-)
delete mode 100644 "1 \345\205\245\351\227\250/\350\257\276/2-\346\233\264\346\267\261\345\205\245\347\232\204\346\275\234\346\260\264/\347\277\273\350\257\221/README.zh-cn.md"
diff --git "a/1 \345\205\245\351\227\250/\350\257\276/2-\346\233\264\346\267\261\345\205\245\347\232\204\346\275\234\346\260\264/\347\277\273\350\257\221/README.zh-cn.md" "b/1 \345\205\245\351\227\250/\350\257\276/2-\346\233\264\346\267\261\345\205\245\347\232\204\346\275\234\346\260\264/\347\277\273\350\257\221/README.zh-cn.md"
deleted file mode 100644
index 1f45db32..00000000
--- "a/1 \345\205\245\351\227\250/\350\257\276/2-\346\233\264\346\267\261\345\205\245\347\232\204\346\275\234\346\260\264/\347\277\273\350\257\221/README.zh-cn.md"
+++ /dev/null
@@ -1,266 +0,0 @@
-# 深入了解物联网
-
-![本课程概述草图](../../../sketchnotes/lesson-2.jpg)
-
-> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 单击图像可查看大图。
-本课程是 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 是由 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 制作。 该课程以 2 个视频的形式授课 - 1小时的课程时间和1小时的答疑时间,使您能更深入地了解课程的各个部分并答疑解惑。
-
-[![课程 2: 深入了解物联网](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M)
-
-[![课程 2: 深入了解物联网 - 答疑解惑](https://img.youtube.com/vi/tTZYf9EST1E/0.jpg)](https://youtu.be/tTZYf9EST1E)
-
-> 🎥 点击以上图片观看视频教程
-
-## 课前小测试
-
-[课前小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/3)
-
-## 介绍
-
-本课程将深入探讨上一课程中介绍的一些概念。
-
-在本课程中,我们将介绍:
-
-* [物联网应用程序组件](#components-of-an-iot-application)
-* [深入了解微控制器](#deeper-dive-into-microcontrollers)
-* [深入了解单板计算机](#deeper-dive-into-single-board-computers)
-
-## 物联网应用程序组件
-
-物联网应用程序的两个组成部分是 *网络* 和 *物* 。现在让我们更详细地探讨这两个组件。
-
-### 物
-
-![树莓派 4](../../../images/raspberry-pi-4.jpg)
-
-物联网的 **物** 部分是指可以与物理世界交互的设备。这些设备通常是小型,低价的计算机,它们使用低功耗并以低速运行 - 例如,只有千字节RAM(与PC中的千兆字节对比鲜明)的简单微控制器,仅以几百兆赫兹运行(与PC中的千兆赫对比鲜明),但其消耗的功率非常小,它们可以仅通过电池供电就运行数周,数月甚至数年。
-
-这些设备与物理世界进行交互,通过使用传感器从周围环境收集数据,或者通过反馈输出或控制执行器改变物理世界。典型的例子是智能恒温器 - 一种具有温度传感器的设备,可通过表盘或触摸屏设置所需温度,该设备与加热或冷却系统的连接,当检测到的温度超出所需范围时进行调节。当温度传感器检测到房间太冷,就会触发执行器打开暖气。
-
-![该图图显示了作为物联网设备输入的温度和刻度盘,以及作为输出的加热控制器](../../../images/basic-thermostat.png)
-
-有各种各样的东西可以充当物联网设备,从感知状态的专用硬件到通用设备,甚至是您的智能手机!智能手机可以使用传感器来检测周围的世界,并使用执行器与世界进行交互 - 例如,使用GPS传感器来检测您的位置,并使用扬声器为您提供前往目的地的导航指令。
-
-✅ 想想你周围的其他系统,它们从传感器读取数据并做出决策。比如烤箱上的恒温器。你能找到更多吗?
-
-### 网络
-
-物联网应用程序的 **网络** 由可以连接以发送和接收数据的应用,以及其它负责处理设备数据并帮助决定向执行器发送哪些请求的应用组成。
-
-一种典型的场景是拥有物联网设备连接的云服务,此云服务可处理安全性等事项,并从物联网设备收发消息。然后,此云服务将连接到可以处理或存储传感器数据的其他应用程序,或者综合其他系统的数据一起来做出决策。
-
-设备也并不总是通过WiFi或有线连接直连到互联网。一些设备使用蓝牙等技术通过 mesh(网状)网络的相互通信,再通过集线器连接到互联网。
-
-以智能恒温器为例,恒温器将使用家庭 WiFi 连接到在云端服务器。它将温度数据发送到云服务并写入数据库,房主便可使用手机应用程序查询当前和历史温度。云服务还可获取房主预设的温度,并将其发送给物联网设备,以控制供暖系统的开关。
-
-![该图显示了温度和表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话有两条通路,物联网设备的输出则是对加热器的控制](../../../images/mobile-controlled-thermostat.png)
-
-更智能的版本可以在云服务中使用 AI (人工智能),将连接到其他物联网设备的传感器数据,例如探测哪些房间正在使用的占用传感器,以及天气或日历信息等,以决定如何更智能地设置温度。例如它从你的日历中读取到你正在度假,它将关闭暖气,或者根据使用房间情况关闭特定房间的暖气,从数据中学习的准确性将随时间推移逐步提高。
-
-![该图表显示了多个温度传感器和一个表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话、日历和天气服务有两条通路,并控制加热器作为物联网设备的输出](../../../images/smarter-thermostat.png)
-
-✅ 还有哪些数据可以帮助连接互联网的恒温器更智能?
-
-### 边缘物联网
-
-虽然物联网中的 I 代表网络,但这些设备不是必须连接到互联网。在某些情况下,设备可以连接到“边缘”设备 - 即在本地网络上运行的网关设备,这意味着你无需通过互联网进行即可处理数据。当有大量数据或网络连接速度较慢时,这可能会更快,它允许你在无法连接互联网的地方离线运行,例如在船上或在灾区应对危机时,还可保持数据的私密性。某些设备将云上创建的工具代码下发至本地运行以收集和响应数据,而无需使用互联网传输到云端再做出决策。
-
-这方面的一个例子是智能家居设备,如 Apple HomePod,Amazon Alexa 或 Google Home,它们将在云上训练 AI 辨别你的声音,但在设备本地运行训练好的程序。当你说出某个单词或短语时,这些设备将被“唤醒”,然后通过互联网发送语音进行处理。设备将在适当的时间点停止发送语音,例如当它检测到语音暂停时。你在使用唤醒词唤醒设备之前说的内容,和在设备停止监听后说的内容都不会通过互联网发送给设备提供商,因此这些数据是私密的。
-
-✅ 想想侧重隐私性的其他场景,这些场景下数据处理最好在边缘而非云中完成。提示 - 考虑带有摄像头或其他成像设备的物联网设备。
-
-### 物联网安全
-
-对于任何互联网连接,安全性都是一个重要的考虑因素。有一个古老的笑话“物联网中的S代表安全” - 当然,物联网中没有“S”,这意味着它并不安全。
-
-物联网设备会连接到云服务,因此安全性与该云服务一致 - 如果你的云服务允许任意设备连接,那么有可能收到恶意数据或者被病毒攻击。当物联网设备交互和控制其他设备时,则会产生非常严重的后果。例如,震网病毒通过操纵离心机中的阀门来实施破坏。黑客还会攻击婴儿监视器或其他家庭监控等安全防护薄弱的设备。
-
-> 💁 有时物联网设备和边缘设备会运行在物理隔离网络上,以保持数据的私密性和安全性。这称为 [air-gapping](https://wikipedia.org/wiki/Air_gap_(networking))。
-
-
-## 深入了解微控制器
-
-在上一课中,我们介绍了微控制器。现在让我们更深入地介绍它们。
-
-### CPU
-
-CPU 是微控制器的“大脑”。它是运行代码的处理器,可以向任何连接的设备收发数据。CPU 可以包含一个或多个内核 - 实质上是一个或多个 CPU 可以协同工作运行代码。
-
-CPU 依靠时钟每秒滴答数百万或数十亿次。每个时钟周期都会同步 CPU 可以执行的操作。每次时钟滴答时,CPU 都可以执行来自程序的指令,例如从外部设备检索数据或执行数学计算。此常规循环会在处理下一条指令之前完成所有操作。
-
-时钟周期越快,每秒可以处理的指令就越多,CPU 的速度就越快。 CPU 速度以赫兹 [Hertz (Hz)](https://wikipedia.org/wiki/Hertz) 为单位, 这是一个标准单位,其中 1 Hz 表示每秒一个时钟周期。
-
-> 🎓 CPU速度通常以MHz或GHz为单位,1MHz是100万Hz,1GHz是10亿Hz。
-
-> 💁 CPU 使用 [获取-解码-执行周期](https://wikipedia.org/wiki/Instruction_cycle) 执行程序。 对于每个时钟滴答,CPU 将从内存中获取下一条指令,对其进行解码,然后执行它,例如使用算术逻辑单元 (ALU) 将 2 个数字相加。某些执行需要多次滴答才能运行,因此下一个周期将在指令完成后的下一个时钟滴答运行。
-
-![该取码解码执行周期图显示了从存储在RAM中的程序中获取指令,然后在CPU上解码执行](../../../images/fetch-decode-execute.png)
-
-微控制器的时钟速度比台式机或笔记本,甚至大多数智能手机低得多。例如,Wio 终端的 CPU 以120MHz或每秒 120,000,000个周期运行。
-
-✅ 普通的 PC 或 Mac 的 CPU 具有多个内核,以多千兆赫兹运行,这意味着时钟每秒滴答数十亿次。研究计算机的时钟速度,并比较它比 Wio 终端快多少倍。
-
-每个时钟周期都会消耗功率并产生热量。滴答声越快,消耗的功率和产生的热量就越多。PC 具有散热器和风扇来散热,否则它们会在几秒钟内因过热而关闭。微控制器通常两者都没有,因为运行温度低得多,因此速度也慢得多。PC 使用主电源或大电池运行几个小时,微控制器可以使用小型电池运行数天,数月甚至数年。微控制器还能以不同速率运行内核,当对 CPU 的需求较低时,将切换到较慢的低功耗模式。
-
-> 💁 一些 PC 和 Mac 采用相同的快速高功率和较慢低功耗模式组合以节省电量。例如,最新的 Apple 笔记本电脑中的 M1 芯片可以在4个性能核心和4个效率核心之间切换,以根据正在运行的任务优化电池寿命或速度。
-
-✅ 做点研究:阅读[维基百科上的CPU文章](https://wikipedia.org/wiki/Central_processing_unit)
-
-#### 任务
-
-查阅 Wio 终端资料。
-
-如果你使用 Wio 终端实现此课程开发,可尝试寻找其 CPU 位置。找到 [Wio 终端产品页面](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 的 *硬件概述* 部分以获取内部结构的图片,并尝试通过背面的透明塑料窗口找到 CPU。
-
-### 内存
-
-微控制器通常有两种类型的存储器 - 程序存储器和随机存取存储器(RAM)。
-
-程序存储器具有非易失性,这意味着当设备断电时,写入它的内容都会被保留。这是存储程序代码的内存。
-
-RAM (随机存取存储器)是程序用于运行时的内存,包含程序分配的变量和从外围设备收集的数据。RAM 具有易失性,当断电时内容会丢失,状态会被重置。
-
-> 🎓 程序存储器存储你的代码,并在断电时保留。
-
-> 🎓 RAM 用于运行程序,并在断电时重置。
-
-与 CPU 一样,微控制器上的内存比 PC 或 Mac 小几个数量级。一台典型的电脑可能有 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之间的比较-差距超过40000倍](../../../images/ram-comparison.png)
-
-程序存储也比 PC 小。典型的 PC 可能具有用于程序存储的500GB硬盘驱动器,而微控制器可能只有千字节或几兆字节(MB)的存储空间(1MB是1,000KB或1,000,000字节)。Wio 终端有4MB的程序存储空间。
-
-✅ 做点研究:你的计算机有多少 RAM 和存储空间?与微控制器相比如何?
-
-### 输入/输出
-
-微控制器需要输入和输出(I/O)连接,从传感器读取数据并将控制信号发送到执行器。它们通常包含多个通用输入/输出 (GPIO) 引脚。这些引脚可以在软件中配置为输入(即接收信号)或输出(发送信号)。
-
-🧠⬅️ 输入引脚用于读取传感器值
-
-🧠➡️ 输出引脚向执行器发送指令
-
-✅ 你将在后续课程中了解此内容的更多信息。
-
-#### 任务
-
-查阅 Wio 终端资料。
-
-如果你使用 Wio 终端实现此课程开发,可尝试寻找其GPIO引脚。找到 [Wio 终端产品页面](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) 的 *引脚排列图* 部分,了解引脚用途。Wio 终端带有一个贴纸,你可以将引脚号贴在背面,如果没有,请立即添加。
-
-### 物理尺寸
-
-微控制器通常尺寸较小,[Freescale Kinetis KL03 MCU 可以藏入高尔夫球中](https://www.edn.com/tiny-arm-cortex-m0-based-mcu-shrinks-package/)。PC 中仅CPU就有 40毫米 x 40毫米,这还不包括散热所需的散热器和风扇,这比完整的微控制器尺寸大得多。带有微控制器、外壳、屏幕以及一系列连接和组件的 Wio 终端开发套件并不比裸露的英特尔 i9 CPU 大多少,更比带有散热器和风扇的 CPU 小得多!
-
-| 设备 | 尺寸 |
-| ------------------------------- | -------------------------- |
-| Freescale Kinetis KL03 | 1.6 毫米 x 2 毫米 x 1 毫米 |
-| Wio 终端 | 72 毫米 x 57 毫米 x 12 毫米 |
-| Intel i9 CPU, 散热器和风扇 | 136毫米 x 145毫米 x 103毫米 |
-
-### 架构和操作系统
-
-由于其低速度和内存限制,微控制器不能运行桌面意义上的操作系统(OS)。PC 运行的操作系统(Windows,Linux或macOS)需要大量的内存和处理能力来运行微控制器完全不需要的任务。请记住,微控制器通常被编程来完成一个或多个特定任务,这与 PC 或 Mac 等通用计算机不同,后者需要支持用户界面、播放音乐或电影、提供编写文档或代码的工具、玩游戏或浏览互联网。
-
-在没有操作系统的情况下对微控制器进行编程,确实需要一些工具,这些工具通过 API 来与外设通信,以达到构建代码的目的。每个微控制器都是不同的,因此制造商通常需支持标准架构,这些架构遵循标准“配方”来构建代码,并实现在支持该架构的任何微控制器上运行。
-
-你可以使用操作系统(通常称为实时操作系统 (RTOS) )对微控制器进行编程,因为它们旨在实时处理与外设间的数据收发。这些操作系统是轻量级的,可提供以下功能:
-
-* 多线程,允许你的代码同时运行多个代码块,无论是在多个内核上还是在一个内核上轮流执行
-* 允许通过互联网地进行安全通信
-* 图形用户界面 (GUI) 组件,用于在具有屏幕的设备上构建用户界面 (UI)。
-
-✅ 了解一些不同的RTOS: [Azure RTOS](https://azure.microsoft.com/services/rtos/?WT.mc_id=academic-17441-jabenn), [FreeRTOS](https://www.freertos.org), [Zephyr](https://www.zephyrproject.org)
-
-#### Arduino
-
-![Arduino 的 logo](../../../images/arduino-logo.svg)
-
-[Arduino](https://www.arduino.cc) 可能是最受欢迎的微控制器框架,尤其是在学生,业余爱好者和创客中。Arduino 是一个结合软件和硬件的开源电子平台。您可以从 Arduino 官方或其他制造商处购买 Arduino 兼容板,然后使用 Arduino 框架进行开发。
-
-Arduino 开发板使用 C 或 C++ 编码。使用 C/C++ 可以编译教小的代码且运行速度快,这是在资源受限设备(如微控制器)上所需要的。Arduino 应用程序的核归纳为两个功能模块 - `setup` 和 `loop`,当开发板启动时,Arduino 框架代码将运行 `setup` 功能模块,然后循环运行 `loop` 直到断电。
-
-你可以将启动代码写在 `setup` 函数中,例如连接到 WiFi 和云服务或初始化输入和输出引脚。然后,将处理代码写入 `loop` 循环,例如从传感器读取数据并发送到云。通常会在每次循环中包含一个延迟,例如,如果只希望传感器数据每 10 秒发送一次,则可以在环路结束时添加 10 秒的延迟,以便微控制器休眠节省功耗,10 秒后再次循环。
-
-![Arduino 开机首先执行 setup 函数, 然后循环执行 loop 函数](../../../images/arduino-sketch.png)
-
-✅ 此程序体系结构称为 *事件循环* 或 *消息循环*。许多应用程序在后台使用该结构,该结构也是 Windows,macOS 或 Linux 等操作系统上大多数桌面应用的标准。监听来自用户界面组件(如按钮)或设备(如键盘)的消息,并对其进行响应。可以在[这篇文章](https://wikipedia.org/wiki/Event_loop)中阅读有关事件循环的更多信息。
-
-Arduino 提供了用于与微控制器和 I/O 引脚交互的标准库,在不同的微控制器上有不同的实现。例如,延迟函数将暂停程序一段时间,[`digitalRead` 函数](https://www.arduino.cc/reference/en/language/functions/digital-io/digitalread/)将从给定引脚读取数据,而无论代码在哪个板上运行。这些标准库意味着在一个 Arduino 开发板编写的代码可以在其他 Arduino 开发板上重新编译运行,只要引脚正确且开发板支持相同功能。
-
-有一个庞大的第三方 Arduino 库生态系统,可为 Arduino 项目添加额外的功能,例如使用传感器和执行器或连接到云物联网服务。
-
-##### 任务
-
-查阅 Wio 终端资料。
-
-如果使用 Wio 终端进行课程开发,请重新阅读你在上一课程中编写的代码。找到 `setup` 和 `loop` 函数,观察重复调用循环函数的串口输出。尝试向 `setup` 函数添加代码在串口输出,并观察是否每次重启时会重新执行一次此代码。使用侧面的电源开关重启设备,并观察此代码是否在每次重启时调用。
-
-## 深入了解单板计算机
-
-在上一课程中,我们介绍了单板计算机。现在让我们更深入地研究它们。
-
-### 树莓派
-
-![树莓派 logo](../../../images/raspberry-pi-logo.png)
-
-树莓派基金会是来自英国的慈善机构,成立于2009年,旨在促进计算机科学研究,特别是学校层面。作为这项任务的一部分,他们开发了一种单板计算机,称为Raspberry Pi (树莓派)。树莓派目前有 3 种版本 - 全尺寸版本、尺寸较小的树莓派 Zero 和可以内置到物联网终端设备中的计算模块。
-
-![树莓派 4](../../../images/raspberry-pi-4.jpg)
-
-截至目前全尺寸树莓派最新版本是树莓派 4B。它有一个四核(4 核)CPU,运行在 1.5GHz、2、4 或 8GB RAM、千兆以太网、WiFi、2 个支持 4k 屏幕的 HDMI 端口、一个音频和复合视频输出端口、USB 端口(2 个 USB 2.0、2 个 USB 3.0)、40 个 GPIO 引脚、一个用于树莓派相机模块的相机连接器和一个 SD 卡插槽。所有这些都在一块 88毫米 x 58毫米 x 19.5毫米 的开发板上,由 3A USB-C 电源供电。起价为35美元,比 PC 或 Mac 便宜得多。
-
-> 💁 还有一个 Pi 400 一体机,键盘内置 Pi 4。
-
-![树莓派 Zero](../../../images/raspberry-pi-zero.jpg)
-
-树莓派 Zero要小得多,功耗更低。它具有单核1GHz CPU,512MB内存,WiFi(在Zero W型号中),单个HDMI端口,微型USB端口,40个GPIO引脚,树莓派相机模块的相机连接器和SD卡插槽。它的尺寸为 65毫米 x 30毫米 x 5毫米,功耗极低。Zero是5美元,WiFi版本是10美元。
-
-> 🎓 这两种开发板中的 CPU 都是 ARM 架构,而不是大多数 PC 和 Mac 中的 Intel / AMD x86 或 x64 架构。这类似于某些微控制器,以及几乎所有手机,微软Surface X 和 基于Apple Silicon 的新 Apple Mac 中的 CPU。
-
-树莓派的所有版本都可运行一个名为树莓派 OS 的 Debian Linux 分支系统。这是没有桌面的精简版,非常适合不需要屏幕的“无头”项目,也可运行具有完整桌面环境的版本,其带有Web浏览器,办公应用程序,编码工具和游戏。由于该操作系统基于 Debian Linux,你可以安装任何 ARM 架构下 Debian 的应用程序或工具。
-
-#### 任务
-
-查询树莓派相关资料。
-
-如果你在此课程中使用树莓派作开发,请研究开发板上的不同硬件组件。
-
-* 可以在[树莓派硬件文档页面](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)来识别树莓派上的不同引脚。
-
-### 单板计算机开发
-
-单板计算机是运行完整操作系统的完整计算机。这意味着你可以使用多种编程语言、框架和工具来编写程序,这与 Arduino 一类的微控制器需要开发板架构支持不同。大多数编程语言都有可以访问 GPIO 引脚以收发来自传感器和执行器的数据。
-
-✅ 你熟悉哪些编程语言?在 Linux 上受支持吗?
-
-在树莓派上编写物联网应用程序的最常用语言是Python。在一个专为树莓派设计的庞大硬件生态中,几乎所有硬件包括相关代码都会使用Python库。其中一些生态系统基于“帽子”扩展 - 之所以这样称呼,是因为它们像帽子一样扩展在树莓派的顶部,并通过一个大插座连接到40个GPIO引脚。“帽子”提供额外的功能,如屏幕、传感器、遥控汽车或适配器,通过其使用标准化接口扩展传感器。
-
-### 在专业物联网部署中使用单板计算机
-
-单板计算机用于专业的物联网部署,而不仅仅是作为开发人员套件。它们提供一种有效的方法来控制硬件和运行复杂的任务,比如运行机器学习模型。举个例子,有一个树莓派4计算模块,它可提供树莓派4的所有功能,但外形紧凑且更便宜,没有大多数端口,旨在安装到定制硬件中。
-
----
-
-## 🚀 挑战
-
-上一课的挑战是列出尽可能多的物联网设备,这些设备位于你的家庭、学校或工作场所。对于此列表中的每个设备,你认为它们是围绕微控制器或单板计算机构建的,还是两者的混合?
-
-## 课后小测试
-
-[课后小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/4)
-
-## 复习与自学
-
-* 阅读 [Arduino 入门指南](https://www.arduino.cc/en/Guide/Introduction) 了解有关 Arduino 平台的更多信息。
-* 阅读 [树莓派 4 介绍](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 了解更多关于树莓派的信息。
-* 一些概念和首字母缩略词的信息可参阅《电气工程杂志》中[CPU、MPU、MCU 和 GPU 常见问题解答](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/)一文。
-
-✅ 使用本文和 [硬件指南](../../../hardware.md) 中的成本信息来决定你所需的硬件平台,或者使用虚拟设备。
-
-## 作业
-
-[比较与对比微控制器和单板计算机](assignment.zh-cn.md)
From cb3cc2030b53eba4af48683c8777cac132f3ca1f Mon Sep 17 00:00:00 2001
From: WoKough <17927461+WoKough@users.noreply.github.com>
Date: Sat, 11 Feb 2023 19:06:09 +0800
Subject: [PATCH 5/8] Add files via upload
---
.../translations/README.zh-cn.md | 220 ++++++++++++++++++
.../virtual-device-actuator.zh-cn.md | 110 +++++++++
.../virtual-device-sensor.zh-cn.md | 110 +++++++++
.../wio-terminal-actuator.zh-cn.md | 111 +++++++++
.../translations/wio-terminal-sensor.zh-cn.md | 73 ++++++
5 files changed, 624 insertions(+)
create mode 100644 1-getting-started/lessons/3-sensors-and-actuators/translations/README.zh-cn.md
create mode 100644 1-getting-started/lessons/3-sensors-and-actuators/translations/virtual-device-actuator.zh-cn.md
create mode 100644 1-getting-started/lessons/3-sensors-and-actuators/translations/virtual-device-sensor.zh-cn.md
create mode 100644 1-getting-started/lessons/3-sensors-and-actuators/translations/wio-terminal-actuator.zh-cn.md
create mode 100644 1-getting-started/lessons/3-sensors-and-actuators/translations/wio-terminal-sensor.zh-cn.md
diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/README.zh-cn.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/README.zh-cn.md
new file mode 100644
index 00000000..79222f0e
--- /dev/null
+++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/README.zh-cn.md
@@ -0,0 +1,220 @@
+# 通过传感器和执行器与物理世界交互
+
+![课程概览](../../../sketchnotes/lesson-3.jpg)
+
+> 由 [Nitya Narasimhan](https://github.com/nitya) 绘制。 单击图像可查看大图。
+
+本课程是 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 。由 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 制作。 该课程以 2 个视频的形式授课 - 1小时的课程时间和1小时的答疑时间,使您能更深入地了解课程的各个部分并答疑解惑。
+
+[![课程3: 通过传感器和执行器与物理世界交互](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4)
+
+[![课程 3: 通过传感器和执行器与物理世界交互 - 答疑解惑](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA)
+
+> 🎥 点击以上图片观看视频教程
+
+## 课前小测试
+
+[课前小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5)
+
+## 介绍
+
+本节课程介绍了物联网设备的两个重要概念 - 传感器和执行器。你将亲自实践,为物联网项目添加一个光传感器,并通过获取光线亮度控制 LED 的开关,即制作一个夜灯。
+
+在本课程中,我们将介绍:
+
+* [传感器是什么?](#传感器是什么?)
+* [怎样使用传感器](#怎样使用传感器)
+* [传感器的类型](#传感器的类型)
+* [执行器是什么?](#执行器是什么?)
+* [怎样使用执行器](#怎样使用执行器)
+* [执行器的类型](#执行器的类型)
+
+## 传感器是什么?
+
+传感器是感知物理世界的硬件设备 - 它们测量环境中的一个或多个属性并发送给物联网设备。鉴于物理世界可测量的东西很多,传感器也多种多样,从自然属性(如空气温度)到物理相互作用(如运动)。
+
+一些常见的传感器包括:
+
+* 温度传感器 - 这类传感器可感知空气温度或周围介质的温度。对于爱好者和开发人员来说,此类传感器通常集成气压和湿度的测量功能。
+* 按钮 - 这些按键在按下时会反馈。
+* 光传感器 - 这类传感器检测光的特性,可用于特定颜色、紫外线、红外光或一般可见光。
+* 摄像头 - 这类传感器检通过拍摄照片或视频来感知世界的视觉表现。
+* 加速度计 - 这类传感器可感测多个方向的运动。
+* 麦克风 - 这类传感器可感知声音,无论是一般声级或定向声音。
+
+✅ 做个研究。看看你的手机中有哪些传感器?
+
+所有传感器都有一个共同点 - 它们将感知到的任何信息转换为可以被物联网设备解释的电信号。如何解释此电信号取决于传感器,以及与物联网设备通信的协议。
+
+## 怎样使用传感器
+
+按照以下指南将传感器添加到物联网设备:
+
+* [Arduino - Wio 终端](wio-terminal-sensor.zh-cn.md)
+* [单板计算机 - 树莓派](pi-sensor.zh-cn.md)
+* [单板计算机 - 虚拟设备](virtual-device-sensor.zh-cn.md)
+
+## 传感器的类型
+
+传感器可以是模拟的,也可以是数字的。
+
+### 模拟传感器
+
+最基本的传感器是模拟传感器。这些传感器从物联网设备获取电压,传感器组件调整电压,并测量从传感器返回的电压给出传感器值。
+
+> 🎓 电压是衡量将电流从一端移动到另一端的推力度量,例如从电池的正极到负极。例如,标准AA电池为1.5V(V是伏特的符号),即能够以1.5V的力将电流从其正极推到负极。不同的电气硬件需要不同的电压才能工作,例如,LED可以点亮2-3V,但100W灯丝灯泡需要240V。你可以在 [Voltage page on Wikipedia](https://wikipedia.org/wiki/Voltage) 上了解更多有关电压的信息。
+
+比如电位计。是可以在两个位置间旋转的刻度盘,传感器会测量旋转角度。
+
+![A potentiometer set to a mid point being sent 5 volts returning 3.8 volts](../../../images/potentiometer.png)
+
+物联网设备将以电压(例如 5V)向电位计发送电信号。当电位计调整时,它会改变从另一侧发出的电压。假设电位计标有从 0 到 [11](https://wikipedia.org/wiki/Up_to_eleven) 的刻度盘,如放大器上的音量旋钮。当电位计处于完全关闭位置 (0) 时,即输出 0V。当处于完全打开位置 (11) 时,即输出 5V。
+
+> 🎓 这是个简单例子,你可以在 [potentiometer Wikipedia page](https://wikipedia.org/wiki/Potentiometer) 了解更多有关电位计和可变电阻器的信息。
+
+
+之后,物联网设备读取来自传感器的电压,并对其响应。根据传感器的不同,该电压可以是任意值或映射到标准单位。例如,基于 [热敏电阻](https://wikipedia.org/wiki/Thermistor) 的温度传感器会根据温度改变其电阻。输出电压将被转换为温度单位开尔文(Kelvin),也可使用°C或°F,这些都可通过程序实现。
+
+✅ 如果传感器返回的电压高于发送的电压(如来自外部电源)会发生什么? ⛔️ 不要测试这个。
+
+#### 模数转换
+
+物联网设备是数字的 - 其不能使用模拟值,只能使用 0 和 1。这意味着模拟传感器值需要先转换为数字信号后,才能进行处理。许多物联网设备具有模数转换器(ADC),用于将模拟输入转换为数字数值。传感器还可以通过连接器板与 ADC 配合使用。例如,在使用树莓派的Seeed Grove生态系统中,模拟传感器连接到Pi的“帽子”(扩展版)上的特定接口,“帽子”连接到Pi的GPIO引脚上,该“帽子”具有 ADC,可将电压转换为数字信号,并通过Pi的GPIO引脚发送。
+
+假设你有一个光传感器连接到使用 3.3V 并返回 1V 的 IoT 设备。1V 在数字世界中毫无意义,因此需要转换。该电如何使用刻度转换为模拟值,取决于具体设备和传感器。比如 Seeed Grove 光传感器,它输出的值从 0 到 1,023。对于以 3.3V 运行的传感器,1V 即输出 300。物联网设备无法将 300 作为输入值处理,该值将被Grove “帽子” 转换为300的二进制表示`0000000100101100`。之后再由物联网设备处理。
+
+✅ 如果你不了解二进制,请研究了解数字如何用 0 和 1 表示。[BBC Bitesize 二进制课程](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1) 是一个很好的开始。
+
+从编码的角度看,这通常由传感器附带的代码库实现,因此无需自己担心转换问题。Grove 光传感器可调用 Python 库的 `light` 属性,使用 Arduino 库可调用 `analogRead` 方法转换。
+
+### 数字传感器
+
+数字传感器,和模拟传感器类似,可利用电压的变化来检测周围的世界。不同之处在于它们输出数字信号,要么仅测量两种状态,要么使用内置ADC。数字传感器变得越来越普遍,以减少物联网设备对连接板或ADC的需求。
+
+最简单的数字传感器是按钮或开关。一个具有两种状态(开或关)的传感器。
+
+![A button is sent 5 volts. When not pressed it returns 0 volts, when pressed it returns 5 volts](../../../images/button.png)
+
+物联网设备上的引脚(如 GPIO)可直接将此信号测量为 0 或 1。如果发送的电压与返回的电压相同,则读取的值为 1,否则值为 0。其无需信号转换,只会是 1 或 0。
+
+> 💁 电压测量不会精确,尤其是传感器组件中存在一些电阻,因此通常有误差。例如,树莓派的 GPIO 引脚在 3.3V 下工作,会将高于 1.8V 的返回信号读为 1,将低于 1.8V 的返回读为 0。
+
+* 3.3V 输入按钮。按钮关闭,输出 0V,值为 0
+* 3.3V 输入按钮。按钮打开,输出 3.3V,值为 1
+
+更先进的数字传感器先读取模拟值,然后使用板载ADC将其转换为数字信号。例如,数字温度传感器使用与模拟传感器相同的热电偶方式,测量热电偶在当前温度下的电阻引起的电压变化。传感器内置的ADC不返回模拟值,也不依靠设备/连接器板转换为数字信号,而是直接将其转换为一系列 0 和 1 的编码发送给物联网设备。这些 0 和 1 的解析方式与数字信号相同,1 表示全电压,0 表示 0v。
+
+![A digital temperature sensor converting an analog reading to binary data with 0 as 0 volts and 1 as 5 volts before sending it to an IoT device](../../../images/temperature-as-digital.png)
+
+发送数字信号数据让传感器变得更加复杂,同时也更详细,甚至在安全传感器上使用加密数据。比如摄像头,该传感器捕获图像并发送其数字化信息,信息通常采用标准压缩格式,如JPEG,以便于物联网设备读取。甚至可以通过逐帧发送捕获的图像或压缩的视频流来传输视频。
+
+## 执行器是什么?
+
+执行器与传感器相反 - 它们将来自物联网设备的电信号转换为与物理世界的交互,例如发出光或声音,或移动电机。
+
+一些常见的执行器包括:
+
+* LED - 打开时会发光
+* 扬声器 - 根据接受到的信号发出声音,包括从基本的蜂鸣器到播放音乐的音频扬声器
+* 步进电机 - 将信号转换为定义的旋转量,例如将拨盘旋转 90°
+* 继电器 - 通过电信号打开或关闭的开关。可让物联网小电压设备打开较大的电压的设备。
+* 屏幕 - 更复杂的执行器,可在多段显示器上显示信息。包括从简单的LED显示屏到高分辨率视频监视器。
+
+✅ 做个研究。看看你的手机中有哪些执行器?
+
+## 怎样使用执行器
+
+按照下面的指南将执行器添加到物联网设备中,它们由传感器控制,共同制作物联网夜灯。夜灯将从光传感器接收光线亮度,在检测到的亮度较低时打开作为执行器的 LED。
+
+![A flow chart of the assignment showing light levels being read and checked, and the LED begin controlled](../../../images/assignment-1-flow.png)
+
+* [Arduino - Wio 终端](wio-terminal-actuator.zh-cn.md)
+* [单板计算机 - 树莓派](pi-actuator.zh-cn.md)
+* [单板计算机 - 虚拟设备](virtual-device-actuator.zh-cn.md)
+
+## 执行器的类型
+
+与传感器一样,执行器也可是模拟或数字的。
+
+### 模拟执行器
+
+模拟执行器获取模拟信号并将其转换为某种交互操作,该操作根据提供的电压不同而变化。
+
+例如家中可能有的调光灯。提供给灯的电压强度决定了它的亮度。
+
+
+![A light dimmed at a low voltage and brighter at a higher voltage](../../../images/dimmable-light.png)
+
+与传感器一样,物联网设备在数字信号上工作,而非模拟信号。这意味着要发送模拟信号,设备需要数模转换器(DAC),无论是自身具备或使用连接器板。这将来自物联网设备的 0 和 1 转换为执行器可以使用的模拟电压。
+
+✅ 如果物联网设备发送高于执行器能承受的电压会发生什么?
+⛔️ 不要测试这个。
+
+
+#### 脉宽调制
+
+将从设备获取的数字信号转换为模拟信号的另一种选择是脉宽调制。这需要发送大量短数字脉冲,就好像是模拟信号一样。
+
+例如,可使用 PWM(脉宽调制) 来控制电机的速度。
+
+假设你在使用一个 5V 的电机,你向电机发送短脉冲,将电压切换到高电平(5V)持续 0.02 秒。此时间内,电机可旋转十分之一,即 36°。接着信号暂停 0.02 秒后,发送低电平信号(0V)。每个开关周期持续 0.04 秒,并不断重复该循环。
+
+![Pule width modulation rotation of a motor at 150 RPM](../../../images/pwm-motor-150rpm.png)
+
+这意味着在 1 秒钟内,有 25 次 5V 脉冲使电机每次旋转 0.02 秒,每个脉冲之后有 0.02 秒的 0V 暂停电机旋转。每次脉冲使电机旋转十分之一,电机每秒将完成 2.5 转。即使用数字信号以每秒 2.5 转或 [每分钟 150 转](https://wikipedia.org/wiki/Revolutions_per_minute) (旋转速度的非标准度量) 的速度旋转电机。
+
+```output
+每秒 25 次脉冲 x 每次脉冲 0.1 转 = 每秒 2.5 转
+每秒 2.5 转 x 60 秒 = 150rpm (Revolutions Per Minute)
+```
+
+> 🎓 当 PWM 信号导通一半时间,关断一半时间时,称为[50%占空比](https://wikipedia.org/wiki/Duty_cycle)。占空比以信号处于导通与关断状态的时间百分比来衡量。
+
+![Pule width modulation rotation of a motor at 75 RPM](../../../images/pwm-motor-75rpm.png)
+
+可以通过更改脉冲的大小来更改电机速度。例如,使用相同的电机,可保持相同的 0.04 秒循环时间,导通脉冲减半至 0.01 秒,关断脉冲增加到 0.03 秒。每秒具有相同数量的脉冲 (25),但每个脉冲的长度只有之前的一半。半长脉冲仅使电机旋转二十分之一,每秒 25 个脉冲将完成每秒 1.25 转或 75rpm。即通过改变数字信号的脉冲速度,可将电机的速度减半。
+
+```output
+每秒 25 次脉冲 x 每次脉冲 0.05 转 = 每秒 1.25 转
+每秒 1.25 转 x 60 秒 = 75rpm (Revolutions Per Minute)
+```
+
+✅ 如何保持电机平稳旋转,尤其是在低速运行时?你会使用少量具有长停顿的长脉冲,还是使用大量具有非常短停顿的短脉冲?
+
+> 💁 一些传感器还使用PWM将模拟信号转换为数字信号。
+
+> 🎓 可在 [pulse-width modulation page on Wikipedia](https://wikipedia.org/wiki/Pulse-width_modulation) 了解更多有关脉宽调制的信息。
+
+### 数字执行器
+
+数字执行器与数字传感器一样,具有由高电压或低压控制的两种状态,或内置DAC,因此可将数字信号转换为模拟信号。
+
+例如 LED 就是简单的数字执行器。当设备发送数字信号 1 时,会发送高电压点亮 LED。当发送 0 时,电压降至 0V,LED 熄灭。
+
+![A LED is off at 0 volts and on at 5V](../../../images/led.png)
+
+✅ 你还能想到哪些简单的具备2种状态的执行器?例如螺线管,它是一种电磁铁,可通电激活磁性来执行某些操作,如移动门栓来锁定/解锁门。
+
+更先进的数字执行器,例如屏幕,需要以特定格式发送数字信息。通常利用代码库实现,以更方便准确地发送控制信息。
+
+---
+
+## 🚀 挑战
+
+最后两节课的挑战是列出尽可能多的物联网设备,这些设备可能在你家,学校或工作场所中,确定它们使用微控制器还是单板计算机,或者是两者的混合。
+
+对于列出的每个设备,它们连接到哪些传感器和执行器?连接到这些设备的每个传感器和执行器的用途是什么?
+
+## 课后小测试
+
+[课后小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6)
+
+## 复习与自学
+
+* 在[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) 阅读有关 LED 的信息。
+
+## 作业
+
+[研究传感器和执行器](assignment.md)
diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/virtual-device-actuator.zh-cn.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/virtual-device-actuator.zh-cn.md
new file mode 100644
index 00000000..496a532e
--- /dev/null
+++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/virtual-device-actuator.zh-cn.md
@@ -0,0 +1,110 @@
+# 制作夜灯 - 利用虚拟 IOT 硬件
+
+在这部分课程里,你将向虚拟 IOT 硬件添加 LED 灯,并使用其制作夜灯。
+
+## 虚拟硬件
+
+制作夜灯需要在 CounterFit 应用程序中添加一个执行器。
+
+该执行器就是 **LED**。 在实际的 IOT 设备中,它是 [发光二极管](https://wikipedia.org/wiki/Light-emitting_diode), 通电时会发光。这是一个具有 2 种状态的数字执行器,分别为打开和关闭。发送 1 将打开 LED,发送 0 将其关闭。
+
+夜灯的伪代码逻辑如下:
+
+```output
+检查当前光线强度
+如果光线强度低于 300
+ 打开 LED
+否则
+ 关闭 LED
+```
+
+### 添加执行器到 CounterFit
+
+要使用虚拟 LED,需将其添加到 CounterFit 应用程序中
+
+#### 任务 - 在 CounterFit 中添加执行器
+
+在 CounterFit 应用程序中添加 LED。
+
+1. 请确保 CounterFit web 应用接着上一部分的任务继续运行。否则,开启应用程序并重新添加光传感器。
+
+2. 添加 LED:
+
+ 1. 在 *Actuator* 窗格的 *Create actuator* 框中,下拉 *Actuator type* 并选择 *LED*
+
+ 1. 将 *pin* 设置为 **5**
+
+ 1. 选择 **Add** 按钮以在 *pin 5* 上添加 LED
+
+ ![LED 设置](../../../images/counterfit-create-led.png)
+
+ LED 将被添加并显示在执行器列表中。
+
+ ![LED 成功添加](../../../images/counterfit-led.png)
+
+ 成功添加 LED 后,你可使颜色选择器修改颜色。选择 **Set** 按钮来修改颜色。
+
+### 对夜灯进行编程
+
+现在可使用 CounterFit 光传感器和 LED 对夜灯进行编程。
+
+#### 任务 - 对夜灯进行编程
+
+对夜灯进行编程。
+
+1. 在 VS Code 中打开上一部分创建的夜灯项目。如有必要,重启终端以确保它使用虚拟环境运行。
+
+1. 打开 `app.py`
+
+1. 将以下代码添加到 `app.py` 以添加依赖库。该代码需添加在开头,`import` 后。
+
+ ```python
+ from counterfit_shims_grove.grove_led import GroveLed
+ ```
+
+ `from counterfit_shims_grove.grove_led import GroveLed` 语句从 CounterFit Grove shim Python 库导入 `GroveLed` 模块。其作用是在 CounterFit 应用中与 LED 进行交互。
+
+1. 在 `light_sensor` 被声明后添加以下代码,以初始化管理 LED 的实例:
+
+ ```python
+ led = GroveLed(5)
+ ```
+
+ `led = GroveLed(5)` 语句创建 `GroveLed` 实例 - 并将 LED 连接到 CounterFit Grove 的引脚 **5** 上。
+
+1. 在 `while` 循环中添加判断, 在执行 `time.sleep` 前检查光线亮度来开关 LED:
+
+ ```python
+ if light < 300:
+ led.on()
+ else:
+ led.off()
+ ```
+
+ 此代码检查 `light` 的值。若光线亮度小于 300 调用 `GroveLed` 的 `on` 方法向 LED 发送 1, 即将其打开。若亮度大于等于 300 则调用 `off` 方法向 LED 发送 0,将其关闭。
+
+ > 💁 此代码应与 while 循环内 `print('Light level:', light)` 语句缩进相同!
+
+1. 在 VS 代码终端中,执行以下 Python 程序:
+
+ ```sh
+ python3 app.py
+ ```
+
+ 光线亮度值将在控制台显示。
+
+ ```output
+ (.venv) ➜ GroveTest python3 app.py
+ Light level: 143
+ Light level: 244
+ Light level: 246
+ Light level: 253
+ ```
+
+1. 修改 *Value* 或 *Random* 选项来控制光线亮度在 300 上下波动, LED 将打开或关闭。
+
+![CounterFit 中的 LED 将根据光线强度打开或关闭](../../../images/virtual-device-running-assignment-1-1.gif)
+
+> 💁 你可以在 [code-actuator/virtual-device](code-actuator/virtual-device) 文件夹中找到此代码。
+
+😀 你的夜灯程序很成功!
diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/virtual-device-sensor.zh-cn.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/virtual-device-sensor.zh-cn.md
new file mode 100644
index 00000000..541f6c7a
--- /dev/null
+++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/virtual-device-sensor.zh-cn.md
@@ -0,0 +1,110 @@
+# 制作夜灯 - 利用虚拟 IOT 硬件
+
+在这部分课程里,你将向虚拟 IOT 硬件添加光传感器。
+
+## 虚拟硬件
+
+制作夜灯需要在 CounterFit 应用程序中添加一个传感器。
+
+这就是 **光传感器**。 在实际的 IOT 设备中,它是可将光转换为电信号的 [光电二极管](https://wikipedia.org/wiki/Photodiode)。 光传感器是模拟信号传感器,可感知光的强度并发送对应数值,但其并使用任何标准测量单位,如[lux](https://wikipedia.org/wiki/Lux)。
+
+### 添加传感器到 CounterFit
+
+要使用虚拟光传感器,需将其添加到 CounterFit 应用程序中
+
+#### 任务 - 在 CounterFit 中添加传感器
+
+在 CounterFit 应用程序中添加传感器。
+
+1. 请确保 CounterFit web 应用接着上一部分的任务继续运行。否则,重启app。
+
+1. 添加光传感器:
+
+ 1. 在 *Sensors* 窗格的 *Create sensor* 框中,下拉 *Sensor type* 并选择 *light*
+
+ 1. 将 *Units* 设置为 *NoUnits*
+
+ 1. 确保*Pin* 设置为 *0*
+
+ 1. 点击 **Add** 按钮在 *pin 0* 添加光传感器
+
+ ![光传感器设置](../../../images/counterfit-create-light-sensor.png)
+
+ The light sensor will be created and appear in the sensors list.
+
+ ![成功添加光传感器](../../../images/counterfit-light-sensor.png)
+
+## 对光传感器进行编程
+
+该设备现在可作为内置光传感器编程使用。
+
+### 任务 - 对光传感器进行编程
+
+对设备进行编程。
+
+1. 在 VS Code 中打开上一部分创建的夜灯项目。如有必要,重启终端以确保它使用虚拟环境运行。
+
+1. 打开 `app.py`
+
+1. 将以下代码添加到 `app.py` 中的 `import` 关键字后以添加依赖库。
+
+ ```python
+ import time
+ from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor
+ ```
+
+ `import time` 语句添加了 Python的 `time` 模块,此模块将在后续代码中使用。
+
+ `from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor` 语句从 CounterFit Grove shim Python 库导入 `GroveLightSensor` 模块。其作用是在 CounterFit 应用中与光传感器交互。
+
+1. 将以下代码添加到代码底部,以初始化管理光传感器的实例:
+
+ ```python
+ light_sensor = GroveLightSensor(0)
+ ```
+
+ `light_sensor = GroveLightSensor(0)` 语句创建 `GroveLightSensor` 实例 - 并将光传感器连接到 CounterFit Grove 的引脚 **0** 上。
+
+1. 在以上代码后添加一个无限循环,以轮询光传感器值并在控制台显示:
+
+ ```python
+ while True:
+ light = light_sensor.light
+ print('Light level:', light)
+ ```
+
+ 使用 `GroveLightSensor` 类中的 `light` 属性获取当前光线强度。该属性从引脚读取模拟信号值,此值将被在控制台显示。
+
+1. 鉴于光线强度无需持续获取,可在 `while` 循环结尾处添加 1 秒的睡眠。睡眠可降低设备功耗。
+
+ ```python
+ time.sleep(1)
+ ```
+
+1. 在 VS 终端运行 Python 程序:
+
+ ```sh
+ python3 app.py
+ ```
+
+ 光线值将输出到控制台。此值初始为 0。
+
+1. 在 CounterFit 应用中可修改光传感的值。可通过如下方法:
+
+ * 在光传感器的 *Value* 框中输入所需数值,然后点击 **Set** 按钮。该数值将被传感器返回。
+
+ * 点击 *Random* 选项, 在 *Min* 和 *Max* 中分别输入数值,然后点击 **Set** 按钮。每次的传感器数值将在 *Min* and *Max* 之间波动。
+
+ 设置的值将在控制台显示。通过选择 *Value* 或 *Random* 方式来改变数值。
+
+ ```output
+ (.venv) ➜ GroveTest python3 app.py
+ Light level: 143
+ Light level: 244
+ Light level: 246
+ Light level: 253
+ ```
+
+> 💁 你可以在 [code-sensor/virtual-device](code-sensor/virtual-device) 文件夹中找到此代码。
+
+😀 你的夜灯程序很成功!
diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/wio-terminal-actuator.zh-cn.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/wio-terminal-actuator.zh-cn.md
new file mode 100644
index 00000000..70e566fb
--- /dev/null
+++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/wio-terminal-actuator.zh-cn.md
@@ -0,0 +1,111 @@
+# # 制作夜灯 - 利用 Wio 终端
+
+在这部分课程里,你将向 Wio 终端添加 LED 灯,并使用其制作夜灯。
+
+## 硬件
+
+夜灯需要添加执行器。
+
+该执行器就是 **LED**。 它是 [发光二极管](https://wikipedia.org/wiki/Light-emitting_diode), 通电时会发光。这是一个具有 2 种状态的数字执行器,分别为打开和关闭。发送 1 将打开 LED,发送 0 将其关闭。这是一个外部 Grove 执行器,需要连接到 Wio 终端。
+
+夜灯的伪代码逻辑如下:
+
+```output
+检查当前光线强度
+如果光线强度低于 300
+ 打开 LED
+否则
+ 关闭 LED
+```
+
+### 连接 LED
+
+Grove LED 作为模块提供,其带有多种 LED,可供选择颜色。
+
+#### 任务 - 连接 LED
+
+连接 LED。
+
+![A grove LED](../../../images/grove-led.png)
+
+1. 选择喜欢的 LED 并将针脚插入 LED 模块上的两个孔中。
+
+ LED 是发光二极管,二极管只能单向承载电流。这意味着 LED 需要以正确的针脚顺序连接,否则将无法工作。
+
+ LED 的一个针脚是正极,另一个是负极。LED 不是完美的圆形,一侧略微平坦。稍平坦的一面是负极。将 LED 连接到模块时,请确保圆角边的针脚连接到模块外部标记为 **+** 的插座,平坦的一面连接到靠近模块中间的插座。
+
+2. LED 模块有一个旋转按钮,可用其控制亮度。使用小型十字头螺丝刀逆时针旋转它到最亮。
+
+3. 将 Grove 电缆的一端插入 LED 模块上的插座。此操作只有一种方式。
+
+4. 断开 Wio 终端与计算机或其他电源的连接,在查看屏幕时将 Grove 线缆的另一端连接到 Wio 终端右侧 Grove 插座。这是离电源按钮最远的插座。
+
+ > 💁 右侧的 Grove 插座可与模拟或数字传感器和执行器一起使用。左边的插座是 I2C 和数字传感器和执行器。 I2C 将在后续课程中介绍。
+
+![The grove LED connected to the right hand socket](../../../images/wio-led.png)
+
+## 对夜灯进行编程
+
+The nightlight can now be programmed using the built in light sensor and the Grove LED.
+现在可使用内置光传感器和 Grove LED 对夜灯进行编程。
+
+### 任务 - 对夜灯进行编程
+
+对夜灯进行编程。
+
+1. 在 VS Code 中打开上一部分创建的夜灯项目。
+
+1. 将以下代码添加到 `setup` 函数的尾部:
+
+ ```cpp
+ pinMode(D0, OUTPUT);
+ ```
+
+ 此行代码用于初始化与传感器通信的引脚。
+
+ `D0` 引脚是右侧 Grove 插座的数字引脚。此引脚设置为 `OUTPUT`,表示将其连接到执行器,数据将写入引脚。
+
+2. 将以下代码直接添加到 loop 循环的 `delay` 函数前:
+
+ ```cpp
+ if (light < 300)
+ {
+ digitalWrite(D0, HIGH);
+ }
+ else
+ {
+ digitalWrite(D0, LOW);
+ }
+ ```
+
+ 此代码检查 `light` 的值。如果小于 300,则向引脚发送 1,打开 LED。如果指示灯大于或等于 300,则会向引脚发送 0,从而关闭 LED。
+
+ > 💁 向执行器发送数字值时,低压值为 0v,高压值为器件的最大电压。对于 Wio 终端,高压值为 3.3V。
+
+3. 将 Wio 终端重新连接到计算机,然后像之前一样上传此代码。
+
+4. 连接串行监视器。光线值将在终端输出。
+
+ ```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.usbmodem101 9600,8,N,1 ---
+ --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
+ Light value: 4
+ Light value: 5
+ Light value: 4
+ Light value: 158
+ Light value: 343
+ Light value: 348
+ Light value: 344
+ ```
+
+5. 盖上或揭开 Wio 终端背面的光传感器。可以看到当光线亮度值小于等于 300 时 LED 灯打开,亮度值高于 300 时 LED 灯关闭。
+
+![The LED connected to the WIO turning on and off as the light level changes](../../../images/wio-running-assignment-1-1.gif)
+
+> 💁 你可以在 [code-actuator/wio-terminal](code-actuator/wio-terminal) 文件夹中找到此代码。
+
+😀 你的夜灯程序很成功!
diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/wio-terminal-sensor.zh-cn.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/wio-terminal-sensor.zh-cn.md
new file mode 100644
index 00000000..05389c3f
--- /dev/null
+++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/wio-terminal-sensor.zh-cn.md
@@ -0,0 +1,73 @@
+# 添加传感器 - Wio 终端
+
+在这部分课程里,你将向 Wio 终端添加光传感器。
+
+## 硬件
+
+本课程的传感器是使用 [光电二极管](https://wikipedia.org/wiki/Photodiode) 将光转换为电信号的 **光传感器**。这是一个模拟传感器,它发送一个从 0 到 1,023 的整数值,表示光照值的相对量而不对应任何比如[勒克斯(lux)](https://wikipedia.org/wiki/Lux)的标准计量单位。
+
+光传感器内置于Wio终端中,可通过背面的透明塑料窗口看到。
+
+![The light sensor on the back of the Wio Terminal](../../../images/wio-light-sensor.png)
+
+## 对光传感器进行编程
+
+现在设备可以用光照传感器来编程了。
+
+### 任务
+
+对设备进行编程。
+
+1. 在 VS Code 中打开上一部分创建的夜灯项目。
+
+2. 将以下代码添加到 `setup` 函数的尾部:
+
+ ```cpp
+ pinMode(WIO_LIGHT, INPUT);
+ ```
+
+ 此行代码用于初始化与传感器通信的引脚。
+
+ `WIO_LIGHT` 是连接到板载光传感器的 GPIO 引脚的编号。此引脚设置为 `INPUT`,表示将其连接到传感器后,从此引脚读取数据。
+
+3. 删除 `loop` 函数的内容。
+
+4. 将以下代码添加到 `loop` 函数中。
+
+ ```cpp
+ int light = analogRead(WIO_LIGHT);
+ Serial.print("Light value: ");
+ Serial.println(light);
+ ```
+
+ 此代码从 `WIO_LIGHT` 引脚读取模拟值。即从板载光传感器读取 0-1,023 之间的值。然后此值将被发送到串口,以便代码运行时在串行监视器查看。 `Serial.print` 写入文本时并不回车换行,因此每行将以 `Light value:` 开头,实际光线值结尾。
+
+5. 鉴于光线强度无需持续获取,可在 `loop` 结尾处添加一秒(1,000ms)的延迟。该延迟可降低设备功耗。
+
+ ```cpp
+ delay(1000);
+ ```
+
+1. 将 Wio 终端重新连接到计算机,然后像之前一样上传此代码。
+
+1. 连接串行监视器。光线值将在终端输出。盖上或揭开 Wio 终端背面的光传感器,数值将发生变化。
+
+ ```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.usbmodem101 9600,8,N,1 ---
+ --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
+ Light value: 4
+ Light value: 5
+ Light value: 4
+ Light value: 158
+ Light value: 343
+ Light value: 348
+ Light value: 344
+ ```
+
+> 💁 你可以在 [code-sensor/wio-terminal](code-sensor/wio-terminal) 文件夹中找到此代码。
+
+😀 你已成功向夜灯添加了传感器!
From 8ceeb152193ce4d12ee1197d74c2a4184cde8991 Mon Sep 17 00:00:00 2001
From: WoKough <17927461+WoKough@users.noreply.github.com>
Date: Sun, 23 Apr 2023 19:45:22 +0800
Subject: [PATCH 6/8] Update README.zh-cn.md
---
.../translations/README.zh-cn.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/1-getting-started/lessons/3-sensors-and-actuators/translations/README.zh-cn.md b/1-getting-started/lessons/3-sensors-and-actuators/translations/README.zh-cn.md
index 79222f0e..5a167cb7 100644
--- a/1-getting-started/lessons/3-sensors-and-actuators/translations/README.zh-cn.md
+++ b/1-getting-started/lessons/3-sensors-and-actuators/translations/README.zh-cn.md
@@ -1,6 +1,6 @@
# 通过传感器和执行器与物理世界交互
-![课程概览](../../../sketchnotes/lesson-3.jpg)
+![课程概览](../../../../sketchnotes/lesson-3.jpg)
> 由 [Nitya Narasimhan](https://github.com/nitya) 绘制。 单击图像可查看大图。
@@ -66,7 +66,7 @@
比如电位计。是可以在两个位置间旋转的刻度盘,传感器会测量旋转角度。
-![A potentiometer set to a mid point being sent 5 volts returning 3.8 volts](../../../images/potentiometer.png)
+![A potentiometer set to a mid point being sent 5 volts returning 3.8 volts](../../../../images/potentiometer.png)
物联网设备将以电压(例如 5V)向电位计发送电信号。当电位计调整时,它会改变从另一侧发出的电压。假设电位计标有从 0 到 [11](https://wikipedia.org/wiki/Up_to_eleven) 的刻度盘,如放大器上的音量旋钮。当电位计处于完全关闭位置 (0) 时,即输出 0V。当处于完全打开位置 (11) 时,即输出 5V。
@@ -93,7 +93,7 @@
最简单的数字传感器是按钮或开关。一个具有两种状态(开或关)的传感器。
-![A button is sent 5 volts. When not pressed it returns 0 volts, when pressed it returns 5 volts](../../../images/button.png)
+![A button is sent 5 volts. When not pressed it returns 0 volts, when pressed it returns 5 volts](../../../../images/button.png)
物联网设备上的引脚(如 GPIO)可直接将此信号测量为 0 或 1。如果发送的电压与返回的电压相同,则读取的值为 1,否则值为 0。其无需信号转换,只会是 1 或 0。
@@ -143,7 +143,7 @@
例如家中可能有的调光灯。提供给灯的电压强度决定了它的亮度。
-![A light dimmed at a low voltage and brighter at a higher voltage](../../../images/dimmable-light.png)
+![A light dimmed at a low voltage and brighter at a higher voltage](../../../../images/dimmable-light.png)
与传感器一样,物联网设备在数字信号上工作,而非模拟信号。这意味着要发送模拟信号,设备需要数模转换器(DAC),无论是自身具备或使用连接器板。这将来自物联网设备的 0 和 1 转换为执行器可以使用的模拟电压。
@@ -159,7 +159,7 @@
假设你在使用一个 5V 的电机,你向电机发送短脉冲,将电压切换到高电平(5V)持续 0.02 秒。此时间内,电机可旋转十分之一,即 36°。接着信号暂停 0.02 秒后,发送低电平信号(0V)。每个开关周期持续 0.04 秒,并不断重复该循环。
-![Pule width modulation rotation of a motor at 150 RPM](../../../images/pwm-motor-150rpm.png)
+![Pule width modulation rotation of a motor at 150 RPM](../../../../images/pwm-motor-150rpm.png)
这意味着在 1 秒钟内,有 25 次 5V 脉冲使电机每次旋转 0.02 秒,每个脉冲之后有 0.02 秒的 0V 暂停电机旋转。每次脉冲使电机旋转十分之一,电机每秒将完成 2.5 转。即使用数字信号以每秒 2.5 转或 [每分钟 150 转](https://wikipedia.org/wiki/Revolutions_per_minute) (旋转速度的非标准度量) 的速度旋转电机。
@@ -170,7 +170,7 @@
> 🎓 当 PWM 信号导通一半时间,关断一半时间时,称为[50%占空比](https://wikipedia.org/wiki/Duty_cycle)。占空比以信号处于导通与关断状态的时间百分比来衡量。
-![Pule width modulation rotation of a motor at 75 RPM](../../../images/pwm-motor-75rpm.png)
+![Pule width modulation rotation of a motor at 75 RPM](../../../../images/pwm-motor-75rpm.png)
可以通过更改脉冲的大小来更改电机速度。例如,使用相同的电机,可保持相同的 0.04 秒循环时间,导通脉冲减半至 0.01 秒,关断脉冲增加到 0.03 秒。每秒具有相同数量的脉冲 (25),但每个脉冲的长度只有之前的一半。半长脉冲仅使电机旋转二十分之一,每秒 25 个脉冲将完成每秒 1.25 转或 75rpm。即通过改变数字信号的脉冲速度,可将电机的速度减半。
@@ -191,7 +191,7 @@
例如 LED 就是简单的数字执行器。当设备发送数字信号 1 时,会发送高电压点亮 LED。当发送 0 时,电压降至 0V,LED 熄灭。
-![A LED is off at 0 volts and on at 5V](../../../images/led.png)
+![A LED is off at 0 volts and on at 5V](../../../../images/led.png)
✅ 你还能想到哪些简单的具备2种状态的执行器?例如螺线管,它是一种电磁铁,可通电激活磁性来执行某些操作,如移动门栓来锁定/解锁门。
From 86097c2a1288131545dbe2ad30bfbb91dc31589f Mon Sep 17 00:00:00 2001
From: WoKough <17927461+WoKough@users.noreply.github.com>
Date: Sun, 23 Apr 2023 19:47:22 +0800
Subject: [PATCH 7/8] Update README.zh-cn.md
---
.../translations/README.zh-cn.md | 26 +++++++++----------
1 file changed, 13 insertions(+), 13 deletions(-)
diff --git a/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md b/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
index 1f45db32..972ddc4f 100644
--- a/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
+++ b/1-getting-started/lessons/2-deeper-dive/translations/README.zh-cn.md
@@ -1,9 +1,9 @@
# 深入了解物联网
-![本课程概述草图](../../../sketchnotes/lesson-2.jpg)
+![本课程概述草图](../../../../sketchnotes/lesson-2.jpg)
> Sketchnote by [Nitya Narasimhan](https://github.com/nitya). 单击图像可查看大图。
-本课程是 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 是由 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 制作。 该课程以 2 个视频的形式授课 - 1小时的课程时间和1小时的答疑时间,使您能更深入地了解课程的各个部分并答疑解惑。
+本课程是 [Hello IoT series](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-), 由 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 制作。 该课程以 2 个视频的形式授课 - 1小时的课程时间和1小时的答疑时间,使您能更深入地了解课程的各个部分并答疑解惑。
[![课程 2: 深入了解物联网](https://img.youtube.com/vi/t0SySWw3z9M/0.jpg)](https://youtu.be/t0SySWw3z9M)
@@ -31,13 +31,13 @@
### 物
-![树莓派 4](../../../images/raspberry-pi-4.jpg)
+![树莓派 4](../../../../images/raspberry-pi-4.jpg)
物联网的 **物** 部分是指可以与物理世界交互的设备。这些设备通常是小型,低价的计算机,它们使用低功耗并以低速运行 - 例如,只有千字节RAM(与PC中的千兆字节对比鲜明)的简单微控制器,仅以几百兆赫兹运行(与PC中的千兆赫对比鲜明),但其消耗的功率非常小,它们可以仅通过电池供电就运行数周,数月甚至数年。
这些设备与物理世界进行交互,通过使用传感器从周围环境收集数据,或者通过反馈输出或控制执行器改变物理世界。典型的例子是智能恒温器 - 一种具有温度传感器的设备,可通过表盘或触摸屏设置所需温度,该设备与加热或冷却系统的连接,当检测到的温度超出所需范围时进行调节。当温度传感器检测到房间太冷,就会触发执行器打开暖气。
-![该图图显示了作为物联网设备输入的温度和刻度盘,以及作为输出的加热控制器](../../../images/basic-thermostat.png)
+![该图图显示了作为物联网设备输入的温度和刻度盘,以及作为输出的加热控制器](../../../../images/basic-thermostat.png)
有各种各样的东西可以充当物联网设备,从感知状态的专用硬件到通用设备,甚至是您的智能手机!智能手机可以使用传感器来检测周围的世界,并使用执行器与世界进行交互 - 例如,使用GPS传感器来检测您的位置,并使用扬声器为您提供前往目的地的导航指令。
@@ -53,11 +53,11 @@
以智能恒温器为例,恒温器将使用家庭 WiFi 连接到在云端服务器。它将温度数据发送到云服务并写入数据库,房主便可使用手机应用程序查询当前和历史温度。云服务还可获取房主预设的温度,并将其发送给物联网设备,以控制供暖系统的开关。
-![该图显示了温度和表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话有两条通路,物联网设备的输出则是对加热器的控制](../../../images/mobile-controlled-thermostat.png)
+![该图显示了温度和表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话有两条通路,物联网设备的输出则是对加热器的控制](../../../../images/mobile-controlled-thermostat.png)
更智能的版本可以在云服务中使用 AI (人工智能),将连接到其他物联网设备的传感器数据,例如探测哪些房间正在使用的占用传感器,以及天气或日历信息等,以决定如何更智能地设置温度。例如它从你的日历中读取到你正在度假,它将关闭暖气,或者根据使用房间情况关闭特定房间的暖气,从数据中学习的准确性将随时间推移逐步提高。
-![该图表显示了多个温度传感器和一个表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话、日历和天气服务有两条通路,并控制加热器作为物联网设备的输出](../../../images/smarter-thermostat.png)
+![该图表显示了多个温度传感器和一个表盘作为物联网设备的输入,物联网设备与云有两条通路,云又与电话、日历和天气服务有两条通路,并控制加热器作为物联网设备的输出](../../../../images/smarter-thermostat.png)
✅ 还有哪些数据可以帮助连接互联网的恒温器更智能?
@@ -128,7 +128,7 @@ RAM (随机存取存储器)是程序用于运行时的内存,包含程序
下图显示了 192KB 和 8GB 之间的相对大小差异 - 中间的点表示 192KB。
-![192KB和8GB之间的比较-差距超过40000倍](../../../images/ram-comparison.png)
+![192KB和8GB之间的比较-差距超过40000倍](../../../../images/ram-comparison.png)
程序存储也比 PC 小。典型的 PC 可能具有用于程序存储的500GB硬盘驱动器,而微控制器可能只有千字节或几兆字节(MB)的存储空间(1MB是1,000KB或1,000,000字节)。Wio 终端有4MB的程序存储空间。
@@ -176,7 +176,7 @@ RAM (随机存取存储器)是程序用于运行时的内存,包含程序
#### Arduino
-![Arduino 的 logo](../../../images/arduino-logo.svg)
+![Arduino 的 logo](../../../../images/arduino-logo.svg)
[Arduino](https://www.arduino.cc) 可能是最受欢迎的微控制器框架,尤其是在学生,业余爱好者和创客中。Arduino 是一个结合软件和硬件的开源电子平台。您可以从 Arduino 官方或其他制造商处购买 Arduino 兼容板,然后使用 Arduino 框架进行开发。
@@ -184,7 +184,7 @@ Arduino 开发板使用 C 或 C++ 编码。使用 C/C++ 可以编译教小的代
你可以将启动代码写在 `setup` 函数中,例如连接到 WiFi 和云服务或初始化输入和输出引脚。然后,将处理代码写入 `loop` 循环,例如从传感器读取数据并发送到云。通常会在每次循环中包含一个延迟,例如,如果只希望传感器数据每 10 秒发送一次,则可以在环路结束时添加 10 秒的延迟,以便微控制器休眠节省功耗,10 秒后再次循环。
-![Arduino 开机首先执行 setup 函数, 然后循环执行 loop 函数](../../../images/arduino-sketch.png)
+![Arduino 开机首先执行 setup 函数, 然后循环执行 loop 函数](../../../../images/arduino-sketch.png)
✅ 此程序体系结构称为 *事件循环* 或 *消息循环*。许多应用程序在后台使用该结构,该结构也是 Windows,macOS 或 Linux 等操作系统上大多数桌面应用的标准。监听来自用户界面组件(如按钮)或设备(如键盘)的消息,并对其进行响应。可以在[这篇文章](https://wikipedia.org/wiki/Event_loop)中阅读有关事件循环的更多信息。
@@ -204,17 +204,17 @@ Arduino 提供了用于与微控制器和 I/O 引脚交互的标准库,在不
### 树莓派
-![树莓派 logo](../../../images/raspberry-pi-logo.png)
+![树莓派 logo](../../../../images/raspberry-pi-logo.png)
树莓派基金会是来自英国的慈善机构,成立于2009年,旨在促进计算机科学研究,特别是学校层面。作为这项任务的一部分,他们开发了一种单板计算机,称为Raspberry Pi (树莓派)。树莓派目前有 3 种版本 - 全尺寸版本、尺寸较小的树莓派 Zero 和可以内置到物联网终端设备中的计算模块。
-![树莓派 4](../../../images/raspberry-pi-4.jpg)
+![树莓派 4](../../../../images/raspberry-pi-4.jpg)
截至目前全尺寸树莓派最新版本是树莓派 4B。它有一个四核(4 核)CPU,运行在 1.5GHz、2、4 或 8GB RAM、千兆以太网、WiFi、2 个支持 4k 屏幕的 HDMI 端口、一个音频和复合视频输出端口、USB 端口(2 个 USB 2.0、2 个 USB 3.0)、40 个 GPIO 引脚、一个用于树莓派相机模块的相机连接器和一个 SD 卡插槽。所有这些都在一块 88毫米 x 58毫米 x 19.5毫米 的开发板上,由 3A USB-C 电源供电。起价为35美元,比 PC 或 Mac 便宜得多。
> 💁 还有一个 Pi 400 一体机,键盘内置 Pi 4。
-![树莓派 Zero](../../../images/raspberry-pi-zero.jpg)
+![树莓派 Zero](../../../../images/raspberry-pi-zero.jpg)
树莓派 Zero要小得多,功耗更低。它具有单核1GHz CPU,512MB内存,WiFi(在Zero W型号中),单个HDMI端口,微型USB端口,40个GPIO引脚,树莓派相机模块的相机连接器和SD卡插槽。它的尺寸为 65毫米 x 30毫米 x 5毫米,功耗极低。Zero是5美元,WiFi版本是10美元。
@@ -259,7 +259,7 @@ Arduino 提供了用于与微控制器和 I/O 引脚交互的标准库,在不
* 阅读 [树莓派 4 介绍](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) 了解更多关于树莓派的信息。
* 一些概念和首字母缩略词的信息可参阅《电气工程杂志》中[CPU、MPU、MCU 和 GPU 常见问题解答](https://www.eejournal.com/article/what-the-faq-are-cpus-mpus-mcus-and-gpus/)一文。
-✅ 使用本文和 [硬件指南](../../../hardware.md) 中的成本信息来决定你所需的硬件平台,或者使用虚拟设备。
+✅ 使用本文和 [硬件指南](../../../../hardware.md) 中的成本信息来决定你所需的硬件平台,或者使用虚拟设备。
## 作业
From a9ac5870964a2d4a4918df146d9370a311a55032 Mon Sep 17 00:00:00 2001
From: WoKough <17927461+WoKough@users.noreply.github.com>
Date: Sun, 23 Apr 2023 19:49:16 +0800
Subject: [PATCH 8/8] Add files via upload
lesson 4 connect to internet chinese translation.
---
.../translations/README.zh-cn.md | 456 ++++++++++++++++++
1 file changed, 456 insertions(+)
create mode 100644 1-getting-started/lessons/4-connect-internet/translations/README.zh-cn.md
diff --git a/1-getting-started/lessons/4-connect-internet/translations/README.zh-cn.md b/1-getting-started/lessons/4-connect-internet/translations/README.zh-cn.md
new file mode 100644
index 00000000..95dc1486
--- /dev/null
+++ b/1-getting-started/lessons/4-connect-internet/translations/README.zh-cn.md
@@ -0,0 +1,456 @@
+# 将你的设备连接到互联网
+
+![本课程概述草图](../../../../sketchnotes/lesson-4.jpg)
+
+> 由 [Nitya Narasimhan](https://github.com/nitya) 创作。 单击图像可查看大图。
+
+本课程是 [Hello IoT 系列](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) ,由 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn)制作。该课程以 2 个视频的形式授课 - 1小时的课程时间和1小时的答疑时间,使您能更深入地了解课程的各个部分并答疑解惑。
+
+[![课程4: 将你的设备连接到互联网](https://img.youtube.com/vi/O4dd172mZhs/0.jpg)](https://youtu.be/O4dd172mZhs)
+
+[![课程4: 将你的设备连接到互联网 - 答疑解惑](https://img.youtube.com/vi/j-cVCzRDE2Q/0.jpg)](https://youtu.be/j-cVCzRDE2Q)
+
+> 🎥 点击以上图片观看视频教程
+
+## 课前小测试
+
+[课前小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/7)
+
+## 介绍
+
+物联网中的 **I** 代表互联网 - 可提供云连接和实现物联网设备的许多功能服务,比如从设备传感器收集测量值,或者发送指令以控制执行器。物联网设备通常使用标准通信协议连接到单个云 服务,再由该服务与设备的其他应用程序通信,比如通过数据做出智能判断的 AI 服务,或者用于控制或报告的 Web 应用程序。
+
+> 🎓 从传感器收集数据并发送到云端称为遥测。
+
+物联网设备可以从云端接收消息数据。通常数据中包含命令,该命令中可能是内部操作指令(例如重启或固件升级),或控制执行器(例如打开灯)执行某种操作。
+
+本节课介绍了一些物联网设备可用于连接云端的通信协议,以及收发时使用的数据类型。你将亲自动手实践,把联网控制模块添加到夜灯中,即将本地的 LED 控制逻辑移动到云端。
+
+在本课中,我们将介绍:
+
+* [通信协议](#通信协议)
+* [消息队列遥测传输(MQTT)](#消息队列遥测传输)
+* [遥测](#遥测)
+* [命令](#命令)
+
+## 通信协议
+
+物联网设备使用许多流行的通信协议与互联网进行通信。其中最受欢迎的是使用代理发布/订阅消息的协议。物联网设备连接到代理并发布遥测数据,同时订阅命令。云服务也连接到代理并订阅所有遥测消息,之后向特定设备或设备组发布命令。
+
+![IoT devices connect to a broker and publish telemetry and subscribe to commands. Cloud services connect to the broker and subscribe to all telemetry and send commands to specific devices.](../../../../images/pub-sub.png)
+
+本课程将介绍的 MQTT 协议是物联网设备最流行的通信协议,其他协议还包括 AMQP 和 HTTP / HTTPS。
+
+## 消息队列遥测传输
+
+[MQTT](http://mqtt.org) 是一种轻量级、开放的标准消息传递协议,可以在设备之间发送消息。它于1999年设计并用于监控石油管道,15年后由IBM作为开放标准发布。
+
+MQTT 有一个代理和多个客户端。所有客户端都连接到代理,代理将消息选择发送到相关客户端。消息使用命名主题进行选择发送,而不是直接发送到单个客户端。客户端可以通过主题发布,所有订阅该主题的客户端都将收到该消息。
+
+![IoT device publishing telemetry on the /telemetry topic, and the cloud service subscribing to that topic](../../../../images/mqtt.png)
+
+✅ 做一些研究。如果你有很多物联网设备,如何确保你的 MQTT 代理能够处理所有消息?
+
+### 将物联网设备连接到 MQTT
+
+将联网控制模块添加到夜灯的第一部分是将其连接到 MQTT 代理。
+
+#### 任务
+
+将设备连接到 MQTT 代理。
+
+在本部分课程中,会将夜灯连接到互联网,以便对其进行远程控制。在后半部分,设备将通过 MQTT 协议发送消息到轻型公共 MQTT 代理,并需要编写一些服务端代码处理该消息。此代码会检查光线亮度水平,并将命令回传设备,控制其打开或关闭 LED。
+
+这种设置可能的使用场景是在具有较多照明灯的环境中,需要通过多个光传感器收集的数据判断是否开灯,例如体育场。如果只有一个传感器被云或鸟覆盖,但其他传感器检测到足够的光线水平,将不会开灯。
+
+✅ 还有哪些情况需要在发送命令之前评估来自多个传感器的数据?
+
+为避免搭建复杂的 MQTT 代理,可以直接使用开源 MQTT 代理 [Eclipse Mosquitto](https://www.mosquitto.org) 的公共测试服务器。该测试代理在 [test.mosquitto.org](https://test.mosquitto.org) 上公开,且不需要设置帐户,是测试 MQTT 代码的绝佳工具。
+
+> 💁 此测试代理是公共的,并不安全。任何人都可以接收到你发布的内容,因此不应用于保密数据的传递
+
+![A flow chart of the assignment showing light levels being read and checked, and the LED begin controlled](../../../../images/assignment-1-internet-flow.png)
+
+按照以下步骤将设备连接到 MQTT 代理:
+
+* [Arduino终端](../wio-terminal-mqtt.md)
+* [单板计算机 - 树莓派/虚拟设备](../single-board-computer-mqtt.md)
+
+### 深入了解 MQTT
+
+主题可具有层次结构,客户端可以使用通配符订阅主题结构的不同层级。例如,可以向 `/telemetry/temperature` 发送温度消息,向 `/telemetry/humidity` 发送湿度消息,然后在云应用中订阅 `/telemetry/*` 以接收温度和湿度消息。
+
+消息可以使用服务质量 (QoS) 发送,服务质量决定消息的可靠性。
+
+* 最多一次 - 消息仅发送一次,客户端和代理不采取其他步骤来确认传递(触发并忘记)。
+* 至少一次 - 发送方多次重发消息,直到收到确认(确认传递)。
+* 恰好一次 - 发送方和接收方进行两级握手,以确保只收到消息的一个副本(保证传递)。
+
+✅ 在哪些情况下可能需要通过触发并忘记的方式传递消息?
+
+虽然名称是消息队列(MQTT 中的首字母缩写),但它实际上并不支持消息队列。这意味着,如果客户端断开连接,然后重新连接,则它不会收到断开连接期间发送的消息,除非是使用 QoS 进程处理的消息。但消息可以设置保留标志,如果设置此选项,MQTT 代理将存储在该主题上的最后一条消息,并将其发送给稍后订阅所有客户端。这样,客户端将始终获取最新消息。
+
+MQTT 还支持保心跳包功能,该功能在消息的长间隔时间检查连接是否仍处于活动状态。
+
+> 🦟 Eclipse 基金会的 [Mosquitto](https://mosquitto.org) 包含免费的 MQTT 代理,可自行搭建用于测试 MQTT,也可使用其搭建的公共 MQTT 代理,该代理托管在 [test.mosquitto.org](https://test.mosquitto.org)。
+
+MQTT 连接可以是公开的,也可使用用户名和密码或证书加密保护。
+
+> 💁 MQTT 通过 TCP/IP(与 HTTP 使用相同的底层网络协议)进行通信,但端口不同。也可使用 websocket 与浏览器 Web 应用,或防火墙等网络规则阻止标准 MQTT 连接的情况下进行通信。
+
+## 遥测
+
+遥测一词源自希腊词根,意思是远程测量。这里的遥测是指从传感器收集数据并将其发送到云端的行为。
+
+> 💁 最早的遥测设备之一是1874年在法国发明的,它将实时天气和积雪厚度从勃朗峰发送到巴黎。当时使用的是物理电线,因为还没有无线技术。
+
+让我们回顾一下第 1 课中的智能恒温器示例。
+
+![An Internet connected thermostat using multiple room sensors](../../../../images/telemetry.png)
+
+恒温器使用温度传感器来收集遥测数据。它可能内置了一个温度传感器,并通过[低功耗蓝牙](https://wikipedia.org/wiki/Bluetooth_Low_Energy)(BLE)等无线协议连接到多个外部温度传感器。
+
+例如遥测数据可能如下:
+
+| 名字 | 值 | 描述 |
+| ---- | ----- | ----------- |
+| `恒温器温度` | 18°C | 恒温器内置传感器测量的温度 |
+| `起居室温度` | 19°C | 远程测量的起居室内传感器温度 |
+| `卧室温度` | 21°C | 远程测量的卧室内传感器温度 |
+
+然后,云服务可以使用此遥测数据来决定发送哪些命令来控制加热。
+
+### 从物联网设备发送遥测数据
+
+接下来将光线强度的遥测数据发送到相应主题的 MQTT 代理,以进一步完成夜灯网络控制模块的添加。
+
+#### 任务 - 从物联网设备发送遥测数据
+
+将光线遥测数据发送到 MQTT 代理。
+
+数据以 JSON 编码方式发送 - JSON是JavaScript 对象表示法的缩写,一种使用键/值对文本数据进行编码的标准。
+
+✅ 如果之前没了解过 JSON,可以在 [JSON.org 的文档](https://www.json.org/) 中了解更多信息。
+
+按照以下步骤将遥测数据发送到 MQTT 代理:
+
+* [Arduino终端](../wio-terminal-telemetry.md)
+* [单板计算机 - 树莓派/虚拟设备](../single-board-computer-telemetry.md)
+
+### 从 MQTT 代理接收遥测数据
+
+如果在另一端没有服务监听,那么发送这些遥测数据毫无意义。光线强度的遥测数据需要在另一端监听和处理。此“服务器”代码可作为更大的物联网应用程序的一部分部署到云端,但这里将部署在本地计算机(如果使用树莓配开发也可直接部署在树莓派上)。服务器代码由使用 python 应用程序通过 MQTT 监听包含光线强度信息的遥测数据。在后半部分课程中将展示如何回复消息,该消息中包含打开或关闭 LED 的指令。
+
+✅ 做一些研究:如果没有服务监听,MQTT 消息会被如何处理?
+
+#### 安装 Python 和 VScode
+
+如果未在本地安装 Python 和 VS Code,则需同时安装以对服务器编程。如果使用的是虚拟物联网设备,或是树莓派,说明安装和配置已完成,可跳过此步骤。
+
+##### 任务 - 安装 Python 和 VScode
+
+安装 Python 和 VS Code。
+
+1. 安装 Python。有关安装最新版本的 Python 的说明,请参阅 [Python 下载页](https://www.python.org/downloads/)。
+
+2. 安装 Visual Studio Code (VS Code)。用于在虚拟设备中编写Python代码的编辑器。有关安装 VS Code 的说明,请参阅 [VS Code 文档](https://code.visualstudio.com?WT.mc_id=academic-17441-jabenn)。
+
+ > 💁 你可以使用任何 Python IDE 或习惯的编辑器,但此课程将基于 VS Code 提供说明。
+
+3. 安装 VS Code Pylance 扩展。这是提供 Python 语言支持的 VS Code 的扩展。有关在 VS Code 中安装此扩展的说明,请参阅 [Pylance 扩展文档](https://marketplace.visualstudio.com/items?WT.mc_id=academic-17441-jabenn&itemName=ms-python.vscode-pylance)。
+
+#### 配置 Python 虚拟环境
+
+Python 的强大功能之一是能够安装 [pip 包](https://pypi.org) - 这是由第三方编写并发布到的代码包。可使用 pip 命令安装后使用。接下来将使用 pip 安装 MQTT 通信模块。
+
+默认情况下,当安装软件包时,在本机任意环境下都可使用,这可能导致版本兼容问题 - 比如一个应用依赖于软件包的某个版本,当为另一个应用安装新版本时就会报错。可以用 Python 虚拟环境解决此问题,本质上是 Python 的指定文件夹副本,当安装 pip 包时,只会安装到指定文件夹中。
+
+##### 任务 - 配置 Python 虚拟环境
+
+配置 Python 虚拟环境并通过 pip 安装 MQTT 模块。
+
+1. 从终端或命令行中,运行以下命令以创建并进入到新目录:
+
+ ```sh
+ mkdir nightlight-server
+ cd nightlight-server
+ ```
+
+2. 在 `.venv` 文件夹中运行以下命令以创建虚拟环境:
+
+ ```sh
+ python3 -m venv .venv
+ ```
+
+ > 💁 需要指定使用 `python3` 创建虚拟环境,以防可能安装的 Python 2 对 Python 3 (最新版本)的影响。如果安装了 Python2,那么调用 `python` 命令时可能将使用的时 Python 2 而非 Python 3。
+
+3. 激活虚拟环境:
+
+ * 在 Windows 上:
+ * If you are using the Command Prompt, or the Command Prompt through Windows Terminal, run:
+
+ ```cmd
+ .venv\Scripts\activate.bat
+ ```
+
+ * If you are using PowerShell, run:
+
+ ```powershell
+ .\.venv\Scripts\Activate.ps1
+ ```
+
+ * 在 macOS 或 Linux 上, 执行:
+
+ ```cmd
+ source ./.venv/bin/activate
+ ```
+
+ > 💁这些命令应在创建虚拟环境时的同一位置运行。无需手动进入 `.venv` 文件夹,在安装 pip 包时只需提前使用 activate 命令进入之前创建的虚拟环境。
+
+4. 激活虚拟环境后,`python` 命令将使用创建环境时使用的版本运行,可通过以下命令以查询 `python` 版本:
+
+ ```sh
+ python --version
+ ```
+
+ 将输出类似以下内容:
+
+ ```output
+ (.venv) ➜ nightlight-server python --version
+ Python 3.9.1
+ ```
+
+ > 💁 你的 Python 版本可能与上述不同 - 建议使用高于 3.6 的版本,如若不是,可重装更换。
+
+5. 运行以下命令,安装 [Paho-MQTT](https://pypi.org/project/paho-mqtt/)(一个流行的 MQTT 库) 的 pip 包。
+
+ ```sh
+ pip install paho-mqtt
+ ```
+
+ 此 pip 包将仅安装在虚拟环境中,此环境之外无法使用。
+
+#### 编写服务端代码
+
+服务端代码也可使用 python 语言编写。
+
+##### 任务 - 编写服务端代码
+
+编写服务端代码。
+
+1. 在虚拟环境终端中运行以下命令以创建一个名为 `app.py` 的 Python 文件:
+
+ * Windows 上运行:
+
+ ```cmd
+ type nul > app.py
+ ```
+
+ * 在 macOS 或 Linux 上运行:
+
+ ```cmd
+ touch app.py
+ ```
+
+2. 在 VS Code 中打开当前目录:
+
+ ```sh
+ code .
+ ```
+
+3. 当VS Code启动时,它将激活Python虚拟环境。在底部状态栏中会显示通知:
+
+ ![VS Code showing the selected virtual environment](../../../../images/vscode-virtual-env.png)
+
+4. 如果 VS Code 启动时 VS 代码终端已在运行,则不会激活虚拟环境。最简单的方法是使用 **终止活动终端实例** 按钮关闭终端:
+
+ ![VS Code Kill the active terminal instance button](../../../../images/vscode-kill-terminal.png)
+
+5. 通过选择终端 -> 新建终端或按 `` CTRL+` `` 来启动新终端。新终端将加载虚拟环境,激活调用会在终端显示。虚拟环境名 (`.venv`) 也将出现在提示符中:
+
+ ```output
+ ➜ nightlight-server source .venv/bin/activate
+ (.venv) ➜ nightlight
+ ```
+
+6. 使用 VS Code 打开 `app.py` 并添加以下代码:
+
+ ```python
+ import json
+ import time
+
+ import paho.mqtt.client as mqtt
+
+ id = ''
+
+ client_telemetry_topic = id + '/telemetry'
+ client_name = id + 'nightlight_server'
+
+ mqtt_client = mqtt.Client(client_name)
+ mqtt_client.connect('test.mosquitto.org')
+
+ mqtt_client.loop_start()
+
+ def handle_telemetry(client, userdata, message):
+ payload = json.loads(message.payload.decode())
+ print("Message received:", payload)
+
+ mqtt_client.subscribe(client_telemetry_topic)
+ mqtt_client.on_message = handle_telemetry
+
+ while True:
+ time.sleep(2)
+ ```
+
+ 将第 6 行的 `` 替换为创建设备时使用的唯一 ID。
+
+ ⚠️ 此 ID **必须** 与设备上使用的 ID 相同,否则服务器将无法订阅或发布到正确的主题。
+
+ 此代码创建具有唯一名称的 MQTT 客户端,并连接到 test.mosquitto.org 代理服务器。然后启动一个处理循环,该循环将在后台监听相关主题所有的订阅消息。
+
+ 客户端将订阅该遥测主题上的消息,并定义在收到消息时调用的函数。当收到遥测消息时,会调用该函数,并打印到控制台上。
+
+ 最后,无限循环确保应用程序持续运行。MQTT 客户端在后台监听消息,并和主应用程序同时保持运行。
+
+7. 在 VS Code 终端中,运行以下命令以打开 Python 应用:
+
+ ```sh
+ python app.py
+ ```
+
+ 该应用程序将开始监听来自设备的消息。
+
+8. 确保设备始终在运行并发送遥测消息。调整环境光线或虚拟设置来改变光照水平。收到的消息将打印在终端上。
+
+ ```output
+ (.venv) ➜ nightlight-server python app.py
+ Message received: {'light': 0}
+ Message received: {'light': 400}
+ ```
+
+ nightlight 虚拟环境中的 app.py 必须与 nightlight-server 虚拟环境相对应,才能接收正在发送的消息。
+
+> 💁 可在[code-server/server](../code-server/server)文件夹中查阅此代码。
+
+### 遥测应多久发送一次?
+
+遥测中的一个重要事项是测量和发送数据的频率,这视情况而定。测量频率高将更快的获取测量值的变化,但也更耗电,并占用更多带宽,产生更多数据,需要更多的云端资源。所以需要足够的测量频率,但不能过于频繁。
+
+对于恒温器,每隔几分钟测量一次可能绰绰有余,因为温度不会经常变化。如果每天只测量一次,则可能会在阳光明媚的中午却为房子供暖,如果你每秒测量一次,将产生诸多不必要的重复测量,这将延迟速度和消耗带宽(对于带宽有限的人是个问题),且更加耗电,这对于通过电池供电的远程传感器类设备来说是个问题,还将增加云计算资源处理和存储的成本。
+
+对于监控工厂中机器环境数据的情况而言,如果机器发生故障,可能会造成灾难性的损坏和数百万美元的损失,那么可能需要每秒多次测量。浪费带宽总比错过遥测数据要好,这样可在机器在坏掉之前及时获取故障数据以停止和修理。
+
+> 💁 在这种情况下,可以考虑先使用边缘设备来处理遥测数据,以减少对网络的依赖。
+
+### 连接中断
+
+互联网连接并不可靠,中断很常见。在此情况下,物联网设备应该丢弃数据,还是存储数据直到连接恢复?同样,答案也是视情况而定。
+
+对恒温器而言,一旦进行新的测量,旧数据将会丢失。供暖系统并不关心 20 分钟前测量的 20.5°C,只依据现有测量的 19°C 来决定打开或关闭暖气。
+
+而对一些希望保留数据的设备,尤其是想查询历史数据趋势的。一些机器学习模型可通过查看某段时间(例如过去一小时)的数据并检测数据流中的异常。这通常用于预测性维护,即寻找可能存在异常迹象,以在损坏之前及时修复或更换。这时就需要发送所有的遥测数据,以便更准确地进行异常检测,因此,一旦设备恢复联网,将发送在网络中断期间生成的数据。
+
+物联网设备设计人员还应考虑设备是否能在网络中断或由位置引起的信号丢失期间正常使用。如果智能恒温器由于网络中断而无法将数据发送到云端,则自身应该能够做出一些有限的决定来控制加热。
+
+[![This ferrari got bricked because someone tried to upgrade it underground where there's no cell reception](../../../../../images/bricked-car.png)](https://twitter.com/internetofshit/status/1315736960082808832)
+
+为了使 MQTT 能处理断网时消息,设备和服务器的代码需实现在按需可靠传输,比如要求所有发送的消息必须有回复确认,如果未收到确认信息就将原消息延时重传(类似TCP)。
+
+## 命令
+
+命令是云端发送到设备,用于指示其执行操作的消息。多数情况下会控制执行器提供某种输出,但也可以是控制设备本身的指令,例如重启或收集额外的遥测数据并回传。
+
+![An Internet connected thermostat receiving a command to turn on the heating](../../../../images/commands.png)
+
+恒温器可以从云端接收命令以打开暖气。根据所有传感器的遥测数据,云服务将加以判断,并在需要时发送相关命令打开暖气。
+
+### 向 MQTT 代理发送命令
+
+下一步将编写服务器代码将命令发送回物联网设备,以根据它感知的光线水平控制灯光。
+
+1. 在 VS code 中打开服务器代码:
+
+2. 在 `client_telemetry_topic` 的声明后添加以下行,以确定命令发送的主题:
+
+ ```python
+ server_command_topic = id + '/commands'
+ ```
+
+3. 在 `handle_telemetry` 函数后添加以下代码:
+
+ ```python
+ command = { 'led_on' : payload['light'] < 300 }
+ print("Sending message:", command)
+
+ client.publish(server_command_topic, json.dumps(command))
+ ```
+
+ 这会向命令主题发送一条 JSON 消息,包含 `led_on` 的值设置为 true 或 false,具体取决于光线水平是否小于 300。如果光线水平小于 300,则发送 true 以控制设备打开 LED。
+
+4. 用常规方式运行代码
+
+5. 调整环境光线或虚拟设置来改变光照水平。收到的消息将打印在终端上:
+
+ ```output
+ (.venv) ➜ nightlight-server python app.py
+ Message received: {'light': 0}
+ Sending message: {'led_on': True}
+ Message received: {'light': 400}
+ Sending message: {'led_on': False}
+ ```
+
+> 💁 遥测消息和命令将分别针对单个主题发送。这意味着来自多个设备的遥测将显示在同一遥测主题中,而对多个设备的命令将显示在同一命令主题中。如果要向特定设备发送命令,可以使用多个主题,并以唯一的设备 ID 命名,例如 `/commands/device1`、`/commands/device2`。这样设备就可以只监听与自身相关的消息。
+
+> 💁 可以在 [code-commands/server](../code-commands/server) 文件夹中找到此代码。
+
+### 处理物联网设备上的命令
+
+刚才已完成从服务器发送命令,现在可编写设备端代码来处理消息以控制 LED。
+
+按以下步骤监听来自 MQTT 代理的命令:
+
+* [Arduino终端](../wio-terminal-commands.md)
+* [Single-board computer - Raspberry Pi/Virtual IoT device](../single-board-computer-commands.md)
+
+编写并运行此代码,并尝试更改光照强度。观察服务器和设备输出,并在更改光照强度时观察 LED。
+
+### 连接中断
+
+如果云服务需要向离线设备发送命令,该怎么办?同样,答案是视情况而定。
+
+如果有新的命令覆盖,则可能会忽略较早的命令。例如云服务先发送命令打开加热器,然后发送命令将其关闭,则打开的命令将被忽略,且不会重发。
+
+如果需按顺序处理命令,例如向上移动机器人手臂,然后关闭抓取器,则需在连接恢复后按顺序发送命令。
+
+✅ 如果需要,设备或服务器代码如何确保 MQTT 始终按顺序发送和处理命令?
+
+
+---
+
+## 🚀 挑战
+
+最后三节的挑战是列出尽可能多的物联网设备,这些设备存在于你的家庭,学校或工作场所,并确定它们是围绕微控制器还是单板计算机构建的,或者是两者的混合,并考虑他们正在使用什么传感器和执行器。
+
+对于这些设备,请考虑其可能发送或接收哪些消息。发送什么遥测数据?可能会收到哪些消息或命令?你认为它们是安全的吗?
+
+## 课后小测试
+
+[课后小测试](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/8)
+
+## 复习 & 自学
+
+在 [MQTT Wikipedia page](https://wikipedia.org/wiki/MQTT) 上阅读更多相关内容。
+
+尝试使用 [Mosquitto](https://www.mosquitto.org) 搭建 MQTT 代理,并使用自己的物联网设备和服务器连接。
+
+> 💁 小贴士 - 默认情况下,Mosquitto 不允许匿名连接(即没有用户名和密码的连接),也不允许从运行计算机的外部连接。
+> 可以对 [`mosquitto.conf` 配置文件](https://www.mosquitto.org/man/mosquitto-conf-5.html) 作如下修改:
+>
+> ```sh
+> listener 1883 0.0.0.0
+> allow_anonymous true
+> ```
+
+## 作业
+
+[将MQTT与其他通信协议进行比较](../assignment.md)