C(读作 *I-squared-C*)是一种多控制器、多外围设备协议,任何连接的设备都可以作为控制器或外围设备,通过 I²C 总线(用于传输数据的通信系统名称)进行通信。数据以地址包的形式发送,每个包包含目标设备的地址。 > 💁 这种模型过去被称为主/从(master/slave),但由于其与奴隶制的关联,这种术语正在被弃用。[开源硬件协会已采用控制器/外围设备的术语](https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/),但您可能仍会看到旧术语的引用。 设备在连接到 I²C 总线时会有一个地址,通常硬编码在设备上。例如,Seeed 的每种 Grove 传感器都有相同的地址,因此所有光传感器都有相同的地址,所有按钮的地址与光传感器的地址不同。一些设备可以通过改变跳线设置或焊接引脚来更改地址。 I²C 总线由两根主要的通信线和两根电源线组成: | 线 | 名称 | 描述 | | ---- | --------- | ----------- | | SDA | 串行数据 | 这根线用于在设备之间发送数据。 | | SCL | 串行时钟 | 这根线以控制器设定的速率发送时钟信号。 | | VCC | 电压公共集电极 | 为设备提供电源。通过一个上拉电阻连接到 SDA 和 SCL 线,为它们提供电源,并在没有设备作为控制器时关闭信号。 | | GND | 地线 | 为电路提供公共地线。 | ![I2C 总线连接了 3 个设备,这些设备共享 SDA 和 SCL 线以及一个公共地线](../../../../../translated_images/i2c.83da845dde02256bdd462dbe0d5145461416b74930571b89d1ae142841eeb584.zh.png) 要发送数据,一个设备会发出启动条件,表明它准备好发送数据。它随后成为控制器。控制器接着发送它想要通信的设备地址,以及它是要读取还是写入数据。在数据传输完成后,控制器发送停止条件,表明它已完成。之后,另一个设备可以成为控制器并发送或接收数据。 2C 有速度限制,提供三种不同模式,运行在固定速度下。最快的模式是高速模式,最大速度为 3.4Mbps(每秒兆比特),但支持这种速度的设备非常少。例如,Raspberry Pi 的速度限制在 400Kbps(每秒千比特)的快速模式。标准模式的运行速度为 100Kbps。 > 💁 如果您使用的是带有 Grove Base 扩展板的 Raspberry Pi 作为物联网硬件,您会在板上看到多个 I2C 插座,可以用来与 I2C 传感器通信。模拟 Grove 传感器也使用 I2C 和 ADC(模数转换器)将模拟值作为数字数据发送,因此您使用的光传感器模拟了一个模拟引脚,而值通过 I2C 发送,因为 Raspberry Pi 仅支持数字引脚。 ### 通用异步收发器 (UART) UART 涉及允许两个设备通信的物理电路。每个设备有两个通信引脚——发送(Tx)和接收(Rx),第一个设备的 Tx 引脚连接到第二个设备的 Rx 引脚,第二个设备的 Tx 引脚连接到第一个设备的 Rx 引脚。这使得数据可以双向传输。 * 设备 1 从其 Tx 引脚发送数据,设备 2 在其 Rx 引脚接收数据 * 设备 1 在其 Rx 引脚接收设备 2 从其 Tx 引脚发送的数据 ![UART 中一个芯片的 Tx 引脚连接到另一个芯片的 Rx 引脚,反之亦然](../../../../../translated_images/uart.d0dbd3fb9e3728c6ee1995c8206f3cdb13cdfd208f13745e8ef6854cab75e421.zh.png) > 🎓 数据以一位一位的方式发送,这被称为*串行*通信。大多数操作系统和微控制器都有*串行端口*,即可以发送和接收串行数据的连接,供您的代码使用。 UART 设备有一个 [波特率](https://wikipedia.org/wiki/Symbol_rate)(也称为符号率),即数据以每秒比特数发送和接收的速度。常见的波特率是 9,600,这意味着每秒发送 9,600 比特(0 和 1)的数据。 UART 使用起始位和停止位——即它发送一个起始位来表示即将发送一个字节(8 位)数据,然后在发送完 8 位后发送一个停止位。 UART 的速度取决于硬件,但即使是最快的实现也不会超过 6.5 Mbps(每秒兆比特,即每秒发送的 0 或 1 的百万比特)。 您可以通过 GPIO 引脚使用 UART——可以将一个引脚设置为 Tx,另一个引脚设置为 Rx,然后将它们连接到另一个设备。 > 💁 如果您使用的是带有 Grove Base 扩展板的 Raspberry Pi 作为物联网硬件,您会在板上看到一个 UART 插座,可以用来与使用 UART 协议的传感器通信。 ### 串行外设接口 (SPI) SPI 设计用于短距离通信,例如在微控制器上与存储设备(如闪存)通信。它基于控制器/外设模型,单个控制器(通常是物联网设备的处理器)与多个外设交互。控制器通过选择一个外设并发送或请求数据来控制一切。 > 💁 与 I2C 类似,控制器和外设的术语是最近的变化,因此您可能会看到仍在使用的旧术语。 SPI 控制器使用 3 根线,以及每个外设额外的一根线。外设使用 4 根线。这些线包括: | 线 | 名称 | 描述 | | ---- | --------- | ----------- | | COPI | 控制器输出,外设输入 | 这根线用于将数据从控制器发送到外设。 | | CIPO | 控制器输入,外设输出 | 这根线用于将数据从外设发送到控制器。 | | SCLK | 串行时钟 | 这根线以控制器设置的速率发送时钟信号。 | | CS | 芯片选择 | 控制器有多根线,每根线连接到相应外设的 CS 线。 | ![一个控制器和两个外设的 SPI](../../../../../translated_images/spi.297431d6f98b386b4ff88aea44ce9c1e7acfb1ef69c7e4e388a7aa97b6948e24.zh.png) CS 线用于一次激活一个外设,通过 COPI 和 CIPO 线进行通信。当控制器需要更换外设时,它会停用当前激活外设的 CS 线,然后激活连接到下一个外设的线。 SPI 是*全双工*的,这意味着控制器可以同时通过 COPI 和 CIPO 线从同一个外设发送和接收数据。SPI 使用 SCLK 线上的时钟信号来保持设备同步,因此不像直接通过 UART 发送数据那样需要起始位和停止位。 SPI 没有定义的速度限制,通常的实现可以每秒传输多个兆字节的数据。 物联网开发套件通常支持通过一些 GPIO 引脚使用 SPI。例如,在 Raspberry Pi 上,您可以使用 GPIO 引脚 19、21、23、24 和 26 进行 SPI 通信。 ### 无线 一些传感器可以通过标准无线协议通信,例如蓝牙(主要是低功耗蓝牙,BLE)、LoRaWAN(**Lo**ng **Ra**nge 低功耗网络协议)或 WiFi。这些协议允许远程传感器无需物理连接到物联网设备。 一个例子是商业土壤湿度传感器。这些传感器会测量田地中的土壤湿度,然后通过 LoRaWAN 将数据发送到一个集线器设备,该设备会处理数据或通过互联网发送。这使得传感器可以远离管理数据的物联网设备,从而减少功耗和对大型 WiFi 网络或长电缆的需求。 BLE 在高级传感器中很受欢迎,例如手腕上的健身追踪器。这些设备结合了多个传感器,并通过 BLE 将传感器数据发送到物联网设备(如您的手机)。 ✅ 您身上、家中或学校里是否有任何蓝牙传感器?这些可能包括温度传感器、占用传感器、设备追踪器和健身设备。 一种流行的商业设备连接方式是 Zigbee。Zigbee 使用 WiFi 在设备之间形成网状网络,每个设备尽可能多地连接到附近的设备,形成像蜘蛛网一样的大量连接。当一个设备想要向互联网发送消息时,它可以将消息发送到最近的设备,然后由这些设备转发,直到到达协调器并发送到互联网。 > 🐝 Zigbee 的名字来源于蜜蜂返回蜂巢后的摇摆舞。 ## 测量土壤中的湿度水平 您可以使用土壤湿度传感器、物联网设备和一株室内植物或附近的一块土壤来测量土壤湿度水平。 ### 任务 - 测量土壤湿度 按照相关指南,使用您的物联网设备测量土壤湿度: * [Arduino - Wio Terminal](wio-terminal-soil-moisture.md) * [单板计算机 - Raspberry Pi](pi-soil-moisture.md) * [单板计算机 - 虚拟设备](virtual-device-soil-moisture.md) ## 传感器校准 传感器依赖于测量电气特性,例如电阻或电容。 > 🎓 电阻,以欧姆 (Ω) 为单位,是对电流通过某物的阻力。当电压施加到某种材料时,通过它的电流量取决于材料的电阻。您可以在 [电阻的维基百科页面](https://wikipedia.org/wiki/Electrical_resistance_and_conductance) 上阅读更多内容。 > 🎓 电容,以法拉 (F) 为单位,是组件或电路收集和存储电能的能力。您可以在 [电容的维基百科页面](https://wikipedia.org/wiki/Capacitance) 上阅读更多内容。 这些测量值并不总是有用的——想象一个温度传感器给您的测量值是 22.5KΩ!因此,测量值需要通过校准转换为有用的单位——即将测量值与测量的物理量匹配,以便将新测量值转换为正确的单位。 一些传感器是预校准的。例如,您在上一课中使用的温度传感器已经校准,可以返回以 °C 为单位的温度测量值。在工厂中,第一个传感器会暴露在一系列已知温度下,并测量电阻。这将用于构建一个计算公式,可以将以 Ω(电阻单位)为单位的测量值转换为 °C。 > 💁 计算电阻与温度的公式称为 [Steinhart–Hart 方程](https://wikipedia.org/wiki/Steinhart–Hart_equation)。 ### 土壤湿度传感器校准 土壤湿度通过重量含水量或体积含水量来测量。 * 重量含水量是单位重量土壤中的水的重量,以每千克干土中的千克水表示 * 体积含水量是单位体积土壤中的水的体积,以每立方米干土中的立方米水表示 > 🇺🇸 对于美国人,由于单位的一致性,这些可以用磅代替千克或立方英尺代替立方米来测量。 土壤湿度传感器测量电阻或电容——这不仅随土壤湿度变化,还随土壤类型变化,因为土壤中的成分会改变其电气特性。理想情况下,传感器应进行校准——即从传感器获取读数并与通过更科学的方法获得的测量值进行比较。例如,实验室可以通过对特定田地的样本进行一年几次的测量来计算重量含水量,然后使用这些数据校准传感器,将传感器读数与重量含水量匹配。 ![电压与土壤湿度含量的关系图](../../../../../translated_images/soil-moisture-to-voltage.df86d80cda1587008f312431ed5f79eb6c50c58d4fbc25a6763c5e9127c3106b.zh.png) 上图显示了如何校准传感器。通过对土壤样本进行电压测量,然后在实验室中通过比较湿重和干重(通过测量湿重,然后在烘箱中干燥并测量干重)来测量湿度。获取几个读数后,可以将其绘制在图表上,并拟合一条线。这条线可以用来将物联网设备获取的土壤湿度传感器读数转换为实际的土壤湿度测量值。 💁 对于电阻式土壤湿度传感器,电压随着土壤湿度的增加而增加。对于电容式土壤湿度传感器,电压随着土壤湿度的增加而减少,因此这些传感器的图表会向下倾斜,而不是向上。 ![从图表中插值的土壤湿度值](../../../../../translated_images/soil-moisture-to-voltage-with-reading.681cb3e1f8b68caf5547dbf1415851c82e201edfb78face16fc98da4051ed9b2.zh.png) 上图显示了土壤湿度传感器的电压读数,通过将其与图表上的线相交,可以计算出实际的土壤湿度。 这种方法意味着农民只需要为一个田地获取少量实验室测量值,然后可以使用物联网设备测量土壤湿度——大大加快了测量时间。 --- ## 🚀 挑战 电阻式和电容式土壤湿度传感器有许多不同之处。这些差异是什么?哪种类型(如果有的话)最适合农民使用?在发展中国家和发达国家之间,这个答案是否会有所不同? ## 课后测验 [课后测验](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/12) ## 复习与自学 阅读传感器和执行器使用的硬件和协议: * [GPIO 维基百科页面](https://wikipedia.org/wiki/General-purpose_input/output) * [UART 维基百科页面](https://wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter) * [SPI 维基百科页面](https://wikipedia.org/wiki/Serial_Peripheral_Interface) * [I2C 维基百科页面](https://wikipedia.org/wiki/I²C) * [Zigbee 维基百科页面](https://wikipedia.org/wiki/Zigbee) ## 作业 [校准您的传感器](assignment.md) **免责声明**: 本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们对因使用此翻译而产生的任何误解或误读不承担责任。