WangShuXian6 / blog

FE-BLOG
https://wangshuxian6.github.io/blog/
MIT License
46 stars 10 forks source link

IoT 物联网 #143

Open WangShuXian6 opened 2 years ago

WangShuXian6 commented 2 years ago

IoT 物联网

面向初学者的物联网 - 课程 https://github.com/microsoft/IoT-For-Beginn

什么是“物联网”?

“物联网”一词由Kevin Ashton在 1999 年创造,指的是通过传感器将互联网连接到物理世界。从那时起,该术语就被用来描述与周围物理世界交互的任何设备,无论是通过从传感器收集数据,还是通过执行器提供真实世界的交互(例如打开开关或点亮 LED 的设备) ),一般连接到其他设备或互联网。

传感器收集来自世界各地的信息,例如测量速度、温度或位置。

执行器将电信号转换为真实世界的交互,例如触发开关、打开灯、发出声音或将控制信号发送到其他硬件,例如打开电源插座。

物联网作为一个技术领域不仅仅是设备——它包括基于云的服务,可以处理传感器数据,或向连接到物联网设备的执行器发送请求。它还包括没有或不需要互联网连接的设备,通常称为边缘设备。这些设备可以自行处理和响应传感器数据,通常使用在云端训练的 AI 模型。

物联网设备

物联网中的T代表事物——通过从传感器收集数据或通过执行器提供现实世界交互来与周围物理世界交互的设备。

用于生产或商业用途的设备,例如消费者健身追踪器或工业机器控制器,通常是定制的。他们使用定制电路板,甚至可能是定制处理器,旨在满足特定任务的需求,无论是小到可以戴在手腕上,还是坚固到可以在高温、高压力或高振动的工厂环境中工作。

作为一名了解 IoT 或创建设备原型的开发人员,您需要从开发人员工具包开始。这些是专为开发人员设计的通用物联网设备,通常具有生产设备上不具备的功能,例如用于连接传感器或执行器的一组外部引脚、支持调试的硬件或其他资源在进行大型制造运行时会增加不必要的成本。

这些开发工具包通常分为两类——微控制器和单板计算机。

微控制器

微控制器(也称为 MCU,微控制器单元的简称)是一种小型计算机,包括:

🧠 一个或多个中央处理单元 (CPU) - 运行程序的微控制器的“大脑”

💾 内存(RAM 和程序内存) - 存储程序、数据和变量的地方

🔌 可编程输入/输出 (I/O) 连接 - 与传感器和执行器等外部外围设备(连接的设备)通信

微控制器通常是低成本的计算设备,用于定制硬件的平均价格降至 0.50 美元左右,有些设备的价格低至 0.03 美元。开发工具包的起价低至 4 美元,随着您添加更多功能,成本也会上升。Wio Terminal是Seeed 工作室的微控制器开发套件,包含传感器、执行器、WiFi 和屏幕,售价约为 30 美元。

Wio终端 image

单板电脑

单板计算机是一种小型计算设备,它具有包含在单个小板上的完整计算机的所有元素。这些设备的规格接近台式机或笔记本电脑或 Mac,运行完整的操作系统,但体积小、功耗低且价格便宜。 image

树莓派 4

Raspberry Pi 是最受欢迎的单板计算机之一。

与微控制器一样,单板计算机具有 CPU、内存和输入/输出引脚,但它们具有附加功能,例如图形芯片,可让您连接显示器、音频输出和 USB 端口以连接键盘鼠标和其他标准 USB网络摄像头或外部存储设备等设备。程序与操作系统一起存储在 SD 卡或硬盘驱动器上,而不是板上内置的存储芯片。 可以将单板计算机视为您正在阅读本文的 PC 或 Mac 的更小、更便宜的版本,并添加了 GPIO(通用输入/输出)引脚以与传感器和执行器进行交互。 单板计算机是功能齐全的计算机,因此可以用任何语言进行编程。IoT 设备通常使用 Python 进行编程。

WangShuXian6 commented 2 years ago

硬件

物联网中的T是事物,指的是与我们周围的世界交互的设备。

物理硬件选择是 Arduino 或 Raspberry Pi。每个平台都有自己的优点和缺点

套件

image

Seeed Studios 非常友好地将所有硬件作为易于购买的套件提供:

Arduino - Wio 终端 使用 Seeed 和 Microsoft 的初学者物联网 - Wio 终端入门套件 image

树莓派 使用 Seeed 和 Microsoft 的初学者物联网 - Raspberry Pi 4 Starter Kit

image

虚拟硬件

虚拟硬件路线将为传感器和执行器提供模拟器,用 Python 实现。根据您的硬件可用性,您可以在您的普通开发设备(例如 Mac、PC)上运行它,或者在 Raspberry Pi 上运行它并仅模拟您没有的硬件。例如,如果您有 Raspberry Pi 摄像头但没有 Grove 传感器,您将能够在您的 Pi 上运行虚拟设备代码并模拟 Grove 传感器,但使用物理摄像头。

虚拟硬件将使用CounterFit 项目

WangShuXian6 commented 2 years ago

深入了解物联网

《电气工程杂志》中的 CPU、MPU、MCU 和 GPU 常见问题

IoT 应用程序的组件

IoT 应用程序的两个组成部分是Internet和事物。

事物

image

物联网的事物部分是指可以与物理世界交互的设备。这些设备通常是小型、低价计算机,以低速运行并使用低功耗 - 例如,具有千字节 RAM(与 PC 中的千兆字节相反)的简单微控制器仅以几百兆赫兹(而不是千兆赫兹)运行在 PC 中),但有时消耗的电量很少,它们可以靠电池运行数周、数月甚至数年。

这些设备与物理世界互动,或者通过使用传感器从周围环境收集数据,或者通过控制输出或执行器来进行物理变化。这方面的典型例子是智能恒温器--这种设备有一个温度传感器,一个设置所需温度的方法,如表盘或触摸屏,以及与加热或冷却系统的连接,当检测到的温度超出所需范围时,可以打开。温度传感器检测到房间太冷,执行器打开暖气。 image 有大量不同的东西可以充当物联网设备,从感知一件事的专用硬件到通用设备,甚至是您的智能手机!智能手机可以使用传感器来检测周围的世界,并使用执行器与世界交互——例如,使用 GPS 传感器来检测您的位置,并使用扬声器为您提供前往目的地的导航指令。

互联网

IoT 应用程序的Internet端包括 IoT 设备可以连接以发送和接收数据的应用程序,以及可以处理来自 IoT 设备的数据并帮助决定向 IoT 设备发送哪些请求的其他应用程序.

一种典型的设置是物联网设备连接到某种云服务,该云服务处理诸如安全性之类的事情,以及从物联网设备接收消息,并将消息发送回设备。然后,此云服务将连接到可以处理或存储传感器数据的其他应用程序,或者将传感器数据与来自其他系统的数据一起使用来做出决策。

设备本身也不总是通过 WiFi 或有线连接直接连接到 Internet。一些设备使用网状网络通过蓝牙等技术相互通信,通过具有 Internet 连接的集线器设备进行连接。

以智能恒温器为例,恒温器将使用家庭 WiFi 连接到在云中运行的云服务。它将温度数据发送到该云服务,然后从那里将其写入某种数据库,使房主可以使用手机应用程序检查当前和过去的温度。云中的另一项服务将知道房主想要的温度,并通过云服务将消息发送回物联网设备,以告知供暖系统打开或关闭。 image

显示温度和刻度盘作为物联网设备输入的图表,物联网设备与云进行 2 路通信,而云又与电话有 2 路通信,加热器控制作为物联网设备的输出

更智能的版本可以在云端使用 AI 以及来自连接到其他物联网设备的其他传感器的数据,例如检测正在使用的房间的占用传感器,以及天气甚至日历等数据,以决定如何使用以智能方式设置温度。例如,如果它从您的日历中读取您正在度假,它可能会关闭您的暖气,或者根据您使用的房间逐个房间关闭暖气,从数据中学习随着时间的推移越来越准确. image

显示多个温度传感器和刻度盘作为物联网设备输入的图表,物联网设备与云进行双向通信,而云又与电话、日历和天气服务进行双向通信,以及对加热器的控制作为物联网设备的输出

边缘物联网

尽管 IoT 中的 I 代表 Internet,但这些设备不必连接到 Internet。在某些情况下,设备可以连接到“边缘”设备——在本地网络上运行的网关设备,这意味着您无需通过 Internet 拨打电话即可处理数据。当您拥有大量数据或互联网连接速度较慢时,这可能会更快,它允许您在无法连接互联网的情况下离线运行,例如在应对人道主义危机时在船上或灾区,并允许您保持数据私密。一些设备将包含使用云工具创建的处理代码,并在本地运行以收集和响应数据,而无需使用 Internet 连接来做出决定。

物联网安全

对于任何 Internet 连接,安全性都是一个重要的考虑因素

物联网设备连接到云服务,因此仅与该云服务一样安全 - 如果您的云服务允许任何设备连接,则可以发送恶意数据,或者可能发生病毒攻击。当物联网设备交互和控制其他设备时,这可能会产生非常现实的后果。例如,Stuxnet 蠕虫会操纵离心机中的阀门来损坏它们。黑客还利用低安全性访问婴儿监视器和其他家庭监控设备。

有时物联网设备和边缘设备在与互联网完全隔离的网络上运行,以保持数据的私密性和安全性。这称为气隙

深入研究微控制器

中央处理器

CPU 是微控制器的“大脑”。它是运行您的代码并可以向任何连接的设备发送数据和从任何连接的设备接收数据的处理器。CPU 可以包含一个或多个内核 - 本质上是一个或多个 CPU,它们可以一起工作以运行您的代码。

CPU 依靠时钟每秒运行数百万或数十亿次。每个滴答声或循环都会同步 CPU 可以执行的操作。对于每个滴答声,CPU 可以执行来自程序的指令,例如从外部设备检索数据或执行数学计算。此常规周期允许在处理下一条指令之前完成所有操作。

时钟周期越快,每秒可以处理的指令越多,因此 CPU 也就越快。CPU 速度以赫兹 (Hz)为单位,这是一个标准单位,其中 1 Hz 表示每秒一个周期或时钟滴答。

🎓 CPU 速度通常以 MHz 或 GHz 为单位。1MHz 是 100 万赫兹,1GHz 是 10 亿赫兹。

💁 CPU 使用fetch-decode-execute 循环执行程序。对于每个时钟滴答,CPU 将从内存中获取下一条指令,对其进行解码,然后执行它,例如使用算术逻辑单元 (ALU) 将 2 个数字相加。一些执行将需要多个滴答来运行,因此下一个循环将在指令完成后的下一个滴答处运行。

image

微控制器的时钟速度远低于台式机或笔记本电脑,甚至大多数智能手机。例如,Wio Terminal 的 CPU 运行频率为 120MHz 或每秒 120,000,000 个周期。

普通 PC 或 Mac 的 CPU 具有以数 GigaHertz 运行的多核,这意味着时钟每秒运行数十亿次

每个时钟周期都会消耗功率并产生热量。滴答声越快,消耗的能量越多,产生的热量也越多。个人电脑有散热片和风扇来散热,否则它们会过热并在几秒钟内关闭。微控制器通常两者都没有,因为它们的运行温度要低得多,因此要慢得多。个人电脑的电源或大电池运行几个小时,微控制器可以运行数天、数月甚至数年的小电池。微控制器还可以具有以不同速度运行的内核,当对 CPU 的需求较低时切换到速度较慢的低功耗内核以降低功耗。

存储器

微控制器通常有两种类型的存储器——程序存储器和随机存取存储器 (RAM)。

程序存储器是非易失性的,这意味着当设备断电时,写入的任何内容都会保留。这是存储程序代码的内存。

RAM 是程序运行所使用的内存,包含程序分配的变量和从外围设备收集的数据。RAM 是易失性的,断电时内容会丢失,从而有效地重置您的程序。

🎓程序内存存储您的代码并在没有电源时保持。

🎓 RAM 用于运行您的程序,并在无电时重置

与 CPU 一样,微控制器上的内存比 PC 或 Mac 小几个数量级。典型的 PC 可能具有 8 GB 的 RAM,或 8,000,000,000 字节,每个字节的空间足以存储单个字母或 0-255 之间的数字。微控制器只有千字节 (KB) 的 RAM,一千字节为 1,000 字节。上面提到的 Wio 终端具有 192KB 的 RAM,即 192,000 字节 - 比普通 PC 少 40,000 多倍!

程序存储空间也比 PC 小。典型的 PC 可能有一个 500GB 的硬盘驱动器用于程序存储,而微控制器可能只有千字节或几兆字节 (MB) 的存储空间(1MB 是 1,000KB 或 1,000,000 字节)。Wio 终端有 4MB 的程序存储空间。

输入输出

微控制器需要输入和输出 (I/O) 连接来从传感器读取数据并将控制信号发送到执行器。 它们通常包含许多通用输入/输出 (GPIO) 引脚。这些引脚可以在软件中配置为输入(即它们接收信号)或输出(它们发送信号)。

🧠⬅️ 输入引脚用于从传感器读取值

🧠➡️ 输出引脚向执行器发送指令

物理尺寸

微控制器通常体积很小,最小的飞思卡尔 Kinetis KL03 MCU 小到足以放入高尔夫球的凹坑中

设备 尺寸
飞思卡尔 Kinetis KL03 1.6 毫米 x 2 毫米 x 1 毫米
Wio终端 72 毫米 x 57 毫米 x 12 毫米
Intel i9 CPU、散热器和风扇 136 毫米 x 145 毫米 x 103 毫米

框架和操作系统

由于它们的低速度和内存大小,微控制器不运行桌面意义上的操作系统 (OS)。

微控制器通常被编程为执行一项或多项非常特定的任务,不像 PC 或 Mac 等通用计算机需要支持用户界面、播放音乐或电影、提供编写文档或代码的工具、玩游戏或浏览网络。

可以使用操作系统(通常称为实时操作系统 (RTOS))对微控制器进行编程,因为这些操作系统旨在实时处理与外围设备之间的数据发送。这些操作系统非常轻量级,并提供以下功能:

多线程,允许您的代码在多个内核上或轮流在一个内核上同时运行多个代码块 联网以允许通过 Internet 安全地进行通信 图形用户界面 (GUI) 组件,用于在具有屏幕的设备上构建用户界面 (UI)。

RTOS:Azure RTOSFreeRTOSZephyr

Arduino

Arduino可能是最流行的微控制器框架,尤其是在学生、爱好者和创客中。 Arduino是一个结合软件和硬件的开源电子平台。您可以从 Arduino 自己或其他制造商处购买 Arduino 兼容板,然后使用 Arduino 框架进行编码。

Arduino 板用 C 或 C++ 编码。使用 C/C++ 可以让您的代码编译得非常小并且运行速度很快,这在受限设备(例如微控制器)上是必需的。 Arduino 应用程序的核心称为草图,是具有 2 个功能的 C/C++ 代码 -setup和loop. 板子启动时,Arduino框架代码会运行setup一次函数,然后会反复运行loop函数,一直运行到掉电为止。

您可以在setup函数中编写设置代码,例如连接到 WiFi 和云服务或初始化输入和输出引脚。然后,您的循环代码将包含处理代码,例如从传感器读取数据并将值发送到云端。您通常会在每个循环中包含一个延迟,例如,如果您只希望每 10 秒发送一次传感器数据,您可以在循环结束时添加 10 秒的延迟,以便微控制器可以休眠、省电,然后运行10 秒后需要时再次循环。 image

这种程序架构被称为事件循环或消息循环。许多应用程序在后台使用它,并且是在 Windows、macOS 或 Linux 等操作系统上运行的大多数桌面应用程序的标准。loop监听来自用户界面组件(如按钮)或设备(如键盘)的消息,并对其做出响应。您可以在这篇关于事件循环的文章中阅读更多内容。

Arduino 提供了用于与微控制器和 I/O 引脚交互的标准库,在不同的微控制器上运行不同的实现。例如,该delay函数将暂停程序一段给定的时间. digitalRead函数将从给定的引脚中读取一个HIGH或LOW的值,无论代码在哪个板上运行。这些标准库意味着为一个板子编写的Arduino代码可以为任何其他Arduino板子重新编译并运行,前提是引脚相同,板子支持同样的功能。 有一个庞大的第三方 Arduino 库生态系统,允许您向 Arduino 项目添加额外功能,例如使用传感器和执行器或连接到云 IoT 服务。

深入了解单板计算机

树莓派

Raspberry Pi Foundation是一个来自英国的慈善机构,成立于 2009 年,旨在促进计算机科学的研究,尤其是在学校层面。作为这项任务的一部分,他们开发了一种名为 Raspberry Pi 的单板计算机。Raspberry Pi 目前有 3 种变体 - 全尺寸版本、较小的 Pi Zero 以及可以内置到最终 IoT 设备中的计算模块。 image 全尺寸 Raspberry Pi 的最新版本是 Raspberry Pi 4B。它具有运行频率为 1.5GHz 的四核(4 核)CPU、2、4 或 8GB RAM、千兆以太网、WiFi、2 个支持 4k 屏幕的 HDMI 端口、一个音频和复合视频输出端口、USB 端口(2 个 USB 2.0、2 个 USB 3.0)、40 个 GPIO 引脚、一个用于 Raspberry Pi 摄像头模块的摄像头连接器和一个 SD 卡插槽。所有这些都在一块 88 毫米 x 58 毫米 x 19.5 毫米的板上,由 3A USB-C 电源供电。这些起价为 35 美元,比 PC 或 Mac 便宜得多。

Pi Zero 更小,功率更低。它有一个单核 1GHz CPU、512MB RAM、WiFi(在零 W 型号中)、一个 HDMI 端口、一个微型 USB 端口、40 个 GPIO 引脚、一个用于 Raspberry Pi 摄像头模块的摄像头连接器和一个 SD 卡投币口。它的尺寸为 65 毫米 x 30 毫米 x 5 毫米,耗电量非常小。零是 5 美元,带 WiFi 的 W 版本是 10 美元。 image

这两个中的 CPU 都是 ARM 处理器,而不是大多数 PC 和 Mac 中的 Intel/AMD x86 或 x64 处理器。这些类似于您在某些微控制器中发现的 CPU,以及几乎所有手机、Microsoft Surface X 和基于 Apple Silicon 的新 Apple Mac。

Raspberry Pi 的所有变体都运行名为 Raspberry Pi OS 的 Debian Linux 版本。这是一个没有桌面的精简版,非常适合您不需要屏幕的“无头”项目,或者具有完整桌面环境的完整版,带有网络浏览器、办公应用程序、编码工具和游戏。由于操作系统是 Debian Linux 的一个版本,您可以安装任何在 Debian 上运行并为 Pi 内的 ARM 处理器构建的应用程序或工具。

编程单板计算机

单板计算机是完整的计算机,运行完整的操作系统。这意味着您可以使用多种编程语言、框架和工具对其进行编码,这与依赖于 Arduino 等框架中的板支持的微控制器不同。大多数编程语言都有可以访问 GPIO 引脚以从传感器和执行器发送和接收数据的库。

在 Raspberry Pi 上构建 IoT 应用程序的最常用编程语言是 Python。有一个为 Pi 设计的庞大硬件生态系统,几乎所有这些都包括将它们用作 Python 库所需的相关代码。其中一些生态系统基于“帽子”——之所以这么称呼是因为它们像帽子一样位于 Pi 的顶部,并通过一个大插座连接到 40 个 GPIO 引脚。这些帽子提供了额外的功能,例如屏幕、传感器、遥控汽车或适配器,允许您使用标准化电缆插入传感器

在专业物联网部署中使用单板计算机

单板计算机用于专业的物联网部署,而不仅仅是作为开发工具包。它们可以提供一种强大的方式来控制硬件和运行复杂的任务,例如运行机器学习模型。例如,有一个Raspberry Pi 4 计算模块,它提供 Raspberry Pi 4 的所有功能,但外形紧凑且更便宜,没有大部分端口,旨在安装到定制硬件中。

WangShuXian6 commented 2 years ago

使用传感器和执行器与物理世界交互

Interact with the physical world with sensors and actuators

什么是传感器 sensors ?

传感器是感知物理世界的硬件设备——即它们测量周围的一个或多个属性并将信息发送到物联网设备。传感器涵盖了范围广泛的设备,因为可以测量的东西太多了,从空气温度等自然属性到运动等物理相互作用。

一些常见的传感器包括:

温度传感器——这些传感器可以感应空气温度或浸入其中的温度。对于业余爱好者和开发人员来说,这些传感器通常与气压和湿>度结合在一个传感器中。 按钮 - 当它们被按下时这些感觉。 光传感器 - 这些检测光水平,可以用于特定颜色、紫外光、红外光或一般可见光。 相机——这些相机通过拍摄照片或流媒体视频来感知世界的视觉表现。 加速度计——这些传感器可以感知多个方向的运动。 麦克风 - 这些感知声音,一般声级或定向声音。

所有传感器都有一个共同点——它们将感知到的任何东西都转换成可以被物联网设备解释的电信号。这种电信号的解释方式取决于传感器,以及用于与物联网设备通信的通信协议。

使用传感器

按照以下相关指南将传感器添加到您的 IoT 设备:

Arduino - Wio 终端 单板机——树莓派 单板机——虚拟设备

添加传感器 - Wio 终端

使用 Wio 终端上的光传感器

硬件

光传感器,它使用光电二极管将光转换为电信号。 这是一个模拟传感器,它发送一个从 0 到 1,023 的整数值,表示相对的光量,它不会映射到任何标准测量单位,例如勒克斯

光传感器内置在 Wio 终端中,可通过背面的透明塑料窗口看到。 image

对光传感器进行编程

将以下行添加到setup函数的底部:

pinMode(WIO_LIGHT, INPUT);

此行配置用于与传感器硬件通信的引脚。

WIO_LIGHTpin是连接到板载光传感器的GPIO pin的编号。此引脚设置为INPUT,表示它连接到传感器,将从引脚读取数据。

删除loop函数的内容。

将以下代码添加到现在为空的loop函数中。

int light = analogRead(WIO_LIGHT);
Serial.print("Light value: ");
Serial.println(light);

WIO_LIGHT此代码从引脚读取模拟值。 这会从板载光传感器读取 0-1,023 的值。然后将此值发送到串行端口,以便您可以在此代码运行时在串行监视器中读取它。Serial.print将文本写入末尾没有新行,因此每行将以Light value:实际光值开始和结束。

在结束时添加一秒(1,000 毫秒)的小延迟,loop因为不需要连续检查光照水平。延迟降低了设备的功耗。

delay(1000);

将 Wio 终端重新连接到您的计算机,然后像以前一样上传新代码。

连接串行监视器。Light 值将输出到终端。盖上并揭开 Wio 终端背面的光传感器,数值会发生变化。

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

构建夜灯 - Raspberry Pi

在 Raspberry Pi 中添加一个光传感器。

硬件 光传感器,它使用光电二极管将光转换为电信号。这是一个模拟传感器,它发送一个从 0 到 1,000 的整数值,表示相对的光量,它不映射到任何标准测量单位,例如勒克斯

光传感器是一个 Grove 传感器,需要连接到 Raspberry Pi 上的 Grove Base hat。 image

将 Grove 电缆的一端插入光传感器模块上的插座。它只会以一种方式循环。

在关闭 Raspberry Pi 电源的情况下,将 Grove 电缆的另一端连接到连接到 Pi 的 Grove Base 帽子上标记为A0的模拟插座。这个插座是右边第二个,在 GPIO 引脚旁边的插座行上。 image

对光传感器进行编程

启动 Pi 并等待它启动

在 VS Code 中打开您在本作业上一部分创建的 nightlight 项目,可以直接在 Pi 上运行,也可以使用远程 SSH 扩展连接。

打开app.py文件并从中删除所有代码

将以下代码添加到app.py文件中以导入一些所需的库:

import time
from grove.grove_light_sensor_v1_2 import GroveLightSensor

该import time语句导入time稍后将在此分配中使用的模块。

from grove.grove_light_sensor_v1_2 import GroveLightSensor语句从 Grove Python 库中导入GroveLightSensor 。 该库具有与 Grove 光传感器交互的代码,并在 Pi 设置期间全局安装。

在上面的代码之后添加以下代码以创建管理光传感器的类的实例:

light_sensor = GroveLightSensor(0)

该行light_sensor = GroveLightSensor(0)创建了一个GroveLightSensor连接到引脚A0的类的实例- 光传感器连接到的模拟 Grove 引脚。

在上面的代码之后添加一个无限循环来轮询光传感器值并将其打印到控制台:

while True:
light = light_sensor.light
print('Light level:', light)

light这将使用类的属性读取 0-1,023 范围内的当前光照水平GroveLightSensor。此属性从引脚读取模拟值。然后将该值打印到控制台。

在结束时添加一秒钟的小睡眠,loop因为不需要连续检查光照水平。睡眠会降低设备的功耗。

time.sleep(1)

在 VS Code 终端中,运行以下命令来运行您的 Python 应用程序:

python3 app.py

光照值将输出到控制台。盖上并揭开光传感器,数值会发生变化:

pi@raspberrypi:~/nightlight $ python3 app.py 
Light level: 634
Light level: 634
Light level: 634
Light level: 230
Light level: 104
Light level: 290

传感器类型

传感器是模拟的或数字的。Sensors are either analog or digital.

模拟传感器 Analog sensors

一些最基本的传感器是模拟传感器。这些传感器从物联网设备接收电压,传感器组件调整该电压,并测量从传感器返回的电压以提供传感器值。

🎓 电压是衡量将电力从一个地方转移到另一个地方的推动力的量度,例如从电池的正极端子到负极端子。例如,标准 AA 电池的电压为 1.5V(V 是伏特的符号),可以以 1.5V 的力将电流从其正极端子推到其负极端子。不同的电气硬件需要不同的电压才能工作,例如,一个 LED 可以在 2-3V 之间点亮,但一个 100W 的灯丝灯泡需要 240V。您可以在 Wikipedia 上的电压页面上阅读有关电压的更多信息。

一个例子是电位器。这是一个刻度盘,您可以在两个位置之间旋转,传感器测量旋转。

image

IoT 设备将以 5 伏 (5V) 等电压向电位器发送电信号。随着电位器的调整,它会改变从另一侧出来的电压。想象一下,您有一个标有刻度盘的电位器,从 0 到11,例如放大器上的音量旋钮。当电位器处于完全关闭位置 (0) 时,将输出 0V(0 伏)。当它处于全开位置 (11) 时,将输出 5V(5 伏)。

传感器输出的电压随后被物联网设备读取,设备可以对其做出响应。根据传感器的不同,该电压可以是任意值,也可以映射到标准单位。例如,基于热敏电阻的模拟温度传感器会根据温度改变其电阻。然后可以通过代码计算将输出电压转换为开尔文温度,并相应地转换为°C或°F。

模数转换

物联网设备是数字的——它们不能处理模拟值,只能处理 0 和 1。这意味着模拟传感器值需要先转换为数字信号才能进行处理。 许多物联网设备具有模数转换器 (ADC),可将模拟输入转换为其值的数字表示形式。传感器还可以通过连接器板与 ADC 一起工作。 例如,在带有 Raspberry Pi 的 Seeed Grove 生态系统中,模拟传感器连接到位于 Pi 上的“帽子”上的特定端口,该帽子连接到 Pi 的 GPIO 引脚,并且这个帽子有一个 ADC 将电压转换为数字信号可以从 Pi 的 GPIO 引脚发送出去。

想象一下,您有一个模拟光传感器连接到使用 3.3V 并返回 1V 值的 IoT 设备。这个 1V 在数字世界中没有任何意义,所以需要转换。 电压将根据设备和传感器使用比例转换为模拟值。 一个例子是 Seeed Grove 光传感器,它输出 0 到 1,023 之间的值。对于以 3.3V 运行的传感器,1V 输出的值为 300。物联网设备无法将 300 作为模拟值处理,因此该值将转换为0000000100101100300 的二进制表示,即 Grove hat 的二进制表示。然后,这将由 IoT 设备处理。

从编码的角度来看,所有这些通常由传感器附带的库处理,因此您不必自己担心这种转换。对于 Grove 光传感器,您可以使用 Python 库并调用light属性,或者使用 Arduino 库并调用analogRead以获取 300 的值。

数字传感器 Digital sensors

与模拟传感器一样,数字传感器使用电压变化来检测周围的世界。 不同之处在于它们输出数字信号,要么仅测量两种状态,要么使用内置 ADC。 数字传感器变得越来越普遍,以避免在连接器板或物联网设备本身上使用 ADC。

最简单的数字传感器是按钮或开关。这是一个有两种状态的传感器,开或关。

image

IoT 设备上的引脚如 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 发送到 IoT 设备,而不是返回模拟值并依靠设备或连接器板转换为数字信号。 这些 0 和 1 的发送方式与按钮的数字信号相同,其中 1 表示全电压,0 表示 0v。 image

发送数字数据使传感器变得更加复杂并发送更详细的数据,甚至是用于安全传感器的加密数据。一个例子是相机。这是一个传感器,它捕获图像并将其作为包含该图像的数字数据发送,通常采用压缩格式,例如 JPEG,以供物联网设备读取。它甚至可以通过捕获图像并逐帧发送完整图像或压缩视频流来传输视频。

什么是执行器 actuators ?

执行器与传感器相反——它们将来自 IoT 设备的电信号转换为与物理世界的交互,例如发射光或声音,或移动电机。

一些常见的执行器包括:

LED - 打开时会发光 扬声器 - 它们根据发送给它们的信号发出声音,从基本的蜂鸣器到可以播放音乐的音频扬声器 步进电机 - 这些将信号转换为定义的旋转量,例如将表盘转动 90° 继电器 - 这些是可以通过电信号打开或关闭的开关。它们允许来自物联网设备的小电压打开更大的电压。 屏幕 - 这些是更复杂的执行器,并在多段显示器上显示信息。屏幕从简单的 LED 显示屏到高分辨率视频监视器不等。

使用执行器

按照下面的相关指南将执行器添加到由传感器控制的 IoT 设备,以构建 IoT 夜灯。它将从光传感器收集光水平,并在检测到的光水平过低时使用 LED 形式的致动器发光。 image

Arduino - Wio 终端 单板机——树莓派 单板机——虚拟设备

打造夜灯 - Wio Terminal

向 Wio 终端添加一个 LED 并使用它来创建夜灯

硬件

夜灯现在需要一个执行器。

执行器是一个LED,一种发光二极管,当电流流过它时会发光。 这是一个数字执行器,具有开和关两种状态。 发送值 1 会打开 LED,发送值 0 会将其关闭。这是一个外部 Grove 执行器,需要连接到 Wio 终端。

伪代码中的夜灯逻辑是:

Check the light level.
If the light is less than 300
Turn the LED on
Otherwise
Turn the LED off
连接 LED

Grove LED 以模块形式提供,带有一系列 LED,您可以选择颜色。 image

选择您最喜欢的 LED 并将支腿插入 LED 模块上的两个孔中。

LED是发光二极管,而二极管是只能以一种方式承载电流的电子设备。这意味着 LED 需要以正确的方式连接,否则它将无法工作。

LED的一个脚是正极引脚,另一个是负极引脚。LED 不是完美的圆形,并且在一侧稍微平坦。稍平的一侧是负极引脚。将 LED 连接到模块时,请确保圆边的引脚连接到模块外侧标有+的插座,而扁平侧的引脚连接到靠近模块中间的插座。

LED 模块有一个旋转按钮,可让您控制亮度。使用小型十字头螺丝刀将其逆时针旋转到最远,将其一直向上转动。

将 Grove 电缆的一端插入 LED 模块上的插座。它只会以一种方式循环。

在 Wio 终端与计算机或其他电源断开连接的情况下,将 Grove 电缆的另一端连接到 Wio 终端右侧的 Grove 插座,同时查看屏幕。这是距离电源按钮最远的插座。

编程夜灯

现在可以使用内置的光传感器和 Grove LED 对夜灯进行编程。

打开夜灯项目

将以下行添加到setup函数的底部:

pinMode(D0, OUTPUT);

此行配置用于通过 Grove 端口与 LED 通信的引脚。

该D0引脚是右侧 Grove 插座的数字引脚。此引脚设置为OUTPUT,表示它连接到执行器,数据将写入引脚。

delay在循环函数之前添加以下代码:

if (light < 300)
{
digitalWrite(D0, HIGH);
}
else
{
digitalWrite(D0, LOW);
}

此代码检查light值。如果小于 300,它会向数字引脚发送一个HIGH值。 D0这HIGH是一个值 1,打开 LED。 如果光大于或等于 300,LOW则将 0 值发送到引脚,从而关闭 LED。

向执行器发送数字值时,LOW 值为 0v,HIGH 值为设备的最大电压。对于 Wio 终端,HIGH 电压为 3.3V。

将 Wio 终端重新连接到您的计算机,然后像以前一样上传新代码。

构建夜灯 - Raspberry Pi

在关闭 Raspberry Pi 电源的情况下,将 Grove 电缆的另一端连接到连接到 Pi 的 Grove Base 帽子上标记为D5的数字插座。这个插座是左起第二个,在 GPIO 引脚旁边的一排插座上。

image

编程夜灯

启动 Pi 并等待它启动

打开上一部分创建的 nightlight 项目,可以直接在 Pi 上运行,也可以使用远程 SSH 扩展连接。

将以下代码添加到app.py文件以连接以导入所需的库。这应该添加到顶部,在其他import行下方。

from grove.grove_led import GroveLed

该from grove.grove_led import GroveLed语句从 Grove Python 库中导入GroveLed 。该库具有与 Grove LED 交互的代码。

在声明后添加以下代码light_sensor以创建管理 LED 的类的实例:

led = GroveLed(5)

该行led = GroveLed(5)创建了一个GroveLed连接到引脚D5的类的实例- LED 连接到的数字 Grove 引脚。

所有插座都有唯一的引脚编号。引脚 0、2、4 和 6 是模拟引脚,引脚 5、16、18、22、24 和 26 是数字引脚。

在while循环内和time.sleep前添加一个检查,以检查光照度并打开或关闭LED。

if light < 300:
    led.on()
else:
    led.off()

此代码检查light值。如果小于 300,它会调用类的on方法,GroveLed将数字值 1 发送到 LED,将其打开。如果光值大于或等于 300,它会调用该off方法,向 LED 发送数字值 0,将其关闭。

向执行器发送数字值时,0 值是 0V,1 值是设备的最大电压。对于带有 Grove 传感器和执行器的 Raspberry Pi,1 电压为 3.3V。

执行器类型

与传感器一样,执行器既可以是模拟的,也可以是数字的。

模拟执行器

模拟执行器接收模拟信号并将其转换为某种交互,其中交互根据所提供的电压而变化。

一个例子是可调光的灯,比如你家里可能有的灯。提供给灯的电压量决定了它的亮度。模拟执行器 模拟执行器接收模拟信号并将其转换为某种交互,其中交互根据所提供的电压而变化。

image

与传感器一样,实际的物联网设备在数字信号上工作,而不是模拟信号。 这意味着要发送一个模拟信号,物联网设备需要一个数模转换器(DAC),可以直接在物联网设备上,也可以在一个连接器板上。 这将把物联网设备的0和1转换为执行器可以使用的模拟电压。

如果物联网设备发送的电压高于执行器可以处理的电压,将会损坏设备

脉冲宽度调制

将物联网设备中的数字信号转换为模拟信号的另一种选择是脉宽调制。这涉及发送大量短数字脉冲,就好像它是模拟信号一样。

例如,您可以使用 PWM 来控制电机的速度。

想象一下,您正在使用 5V 电源控制电机。您向电机发送一个短脉冲,将电压切换到高电平 (5V) 达百分之二秒 (0.02 秒)。在那个时候,您的电机可以旋转十分之一圈,即 36°。然后信号暂停百分之二秒 (0.02s),发送一个低信号 (0V)。每一个开关周期持续 0.04s。然后重复该循环。 image 这意味着在一秒钟内您有 25 个 0.02 秒的 5V 脉冲来旋转电机,每个脉冲之后是 0.02 秒的 0V 暂停而不旋转电机。每个脉冲使电机旋转十分之一转,这意味着电机每秒完成 2.5 转。您已使用数字信号以每秒 2.5 转或每分钟 150 转(旋转速度的非标准度量)旋转电机。

25 pulses per second x 0.1 rotations per pulse = 2.5 rotations per second 2.5 rotations per second x 60 seconds in a minute = 150rpm

当 PWM 信号打开一半时间,关闭一半时间时,称为50% 占空比。占空比测量为信号处于开启状态相对于关闭状态的时间百分比。

您可以通过更改脉冲大小来更改电机速度。例如,对于相同的电机,您可以保持相同的周期时间为 0.04 秒,开启脉冲减半为 0.01 秒,关闭脉冲增加至 0.03 秒。您每秒有相同数量的脉冲 (25),但每个脉冲的长度是一半。半长脉冲仅使电机转动二十分之一转,每秒 25 个脉冲将完成 1.25 转/秒或 75rpm。通过改变数字信号的脉冲速度,您可以将模拟电机的速度减半。

您如何保持电机旋转顺畅,尤其是在低速时?你会使用少量的长脉冲和长时间的停顿,还是使用大量非常短的脉冲和非常短的停顿?

一些传感器还使用 PWM 将模拟信号转换为数字信号。

数字执行器

数字执行器,如数字传感器,要么具有由高电压或低电压控制的两种状态,要么具有内置的 DAC,因此可以将数字信号转换为模拟信号。

一个简单的数字执行器是 LED。当设备发送数字信号 1 时,会发送一个点亮 LED 的高电压。当发送 0 的数字信号时,电压下降到 0V,LED 熄灭。

image

其他简单的 2 态执行器?一个例子是螺线管,它是一种电磁体,可以被激活以执行诸如移动门栓锁定/解锁门之类的操作。

更高级的数字执行器,例如屏幕,需要以特定格式发送数字数据。它们通常带有库,可以更轻松地发送正确的数据来控制它们。

WangShuXian6 commented 2 years ago

将您的设备连接到互联网

IoT 中的I代表Internet - 云连接和服务,支持 IoT 设备的许多功能,从连接到设备的传感器收集测量值,到发送消息以控制执行器。IoT 设备通常使用标准通信协议连接到单个云 IoT 服务,并且该服务连接到 IoT 应用程序的其余部分,从用于围绕数据做出智能决策的 AI 服务到用于控制或报告的 Web 应用程序。

🎓 从传感器收集并发送到云端的数据称为遥测。

物联网设备可以从云端接收消息。消息通常包含命令 - 即在内部(例如重新启动或更新固件)或使用执行器(例如打开灯)执行操作的指令。

通讯协议

物联网设备使用许多流行的通信协议与互联网通信。最流行的是基于通过某种代理发布/订阅消息。 IoT 设备连接到代理并发布遥测数据并订阅命令。云服务还连接到代理并订阅所有遥测消息并将命令发布到特定设备或设备组。 image

MQTT 是物联网设备最流​​行的通信协议。其他协议包括 AMQP 和 HTTP/HTTPS。

消息队列遥测传输 (MQTT)

MQTT是一种轻量级、开放的标准消息传递协议,可以在设备之间发送消息。它于 1999 年设计用于监控石油管道,15 年后由 IBM 作为开放标准发布。

MQTT 有一个代理和多个客户端。所有客户端都连接到代理,代理将消息路由到相关客户端。消息使用命名主题进行路由,而不是直接发送到单个客户端。客户端可以发布到主题,订阅该主题的任何客户端都将收到该消息。 image

将您的 IoT 设备连接到 MQTT

把您的物联网夜灯连接到互联网,以便对其进行远程控制。在本课程的稍后部分,您的 IoT 设备将通过 MQTT 将遥测消息发送到具有轻量级的公共 MQTT 代理,您将编写的一些服务器代码将在其中接收该消息。此代码将检查亮度并将命令消息发送回设备,告诉它打开或关闭 LED。

这种设置的实际用例可能是在决定打开灯之前从多个光传感器收集数据,在一个有很多灯光的地方,比如体育场。如果只有一个传感器被云或鸟覆盖,但其他传感器检测到足够的光,这可能会阻止灯被打开。

image

按照以下相关步骤将您的设备连接到 MQTT 代理:

Arduino - Wio 终端 单板机——树莓派/虚拟物联网设备

通过互联网控制您的夜灯 - Wio Terminal

物联网设备需要编码以使用 MQTT 与test.mosquitto.org通信,以发送带有光传感器读数的遥测值,并接收控制 LED 的命令。

安装 WiFi 和 MQTT Arduino 库

要与 MQTT 代理通信,您需要安装一些 Arduino 库以使用 Wio 终端中的 WiFi 芯片,并与 MQTT 通信。在为 Arduino 设备进行开发时,您可以使用包含开源代码并实现大量功能的各种库。Seeed 为 Wio 终端发布了库,允许其通过 WiFi 进行通信。其他开发人员已经发布了与 MQTT 代理通信的库,您将在您的设备上使用这些库。

这些库作为源代码提供,可以自动导入 PlatformIO 并为您的设备编译。这样 Arduino 库将在任何支持 Arduino 框架的设备上工作,假设设备具有该库所需的任何特定硬件。某些库(例如 Seeed WiFi 库)特定于某些硬件。

库可以全局安装并在需要时编译,也可以编译到特定项目中。对于此分配,库将安装到项目中。

任务 - 安装 WiFi 和 MQTT Arduino 库

安装 Arduino 库。

在 VS Code 中打开夜灯项目。

将以下内容添加到platformio.ini文件末尾:

lib_deps =
seeed-studio/Seeed Arduino rpcWiFi @ 1.0.5
seeed-studio/Seeed Arduino FS @ 2.1.1
seeed-studio/Seeed Arduino SFUD @ 2.0.2
seeed-studio/Seeed Arduino rpcUnified @ 2.1.3
seeed-studio/Seeed_Arduino_mbedtls @ 3.0.1

这将导入 Seeed WiFi 库。@ 语法是指库的特定版本号。

💁 您可以删除@ 以始终使用最新版本的库,但不能保证更高版本可以使用下面的代码。此处的代码已使用此版本的库进行了测试。

这就是添加库所需要做的一切。下次 PlatformIO 构建项目时,它将下载这些库的源代码并将其编译到您的项目中。

将以下内容添加到lib_deps:

knolleary/PubSubClient @ 2.8

这将导入PubSubClient,一个 Arduino MQTT 客户端

连接到 WiFi

Wio 终端现在可以连接到 WiFi。