物联网应用入门--利用虚拟硬件模拟土壤湿度传感器应用编写

本文为微软开源课程IoT-For-Beginners翻译,略有改动,首发于个人博客

探测土壤湿度

Sketchnote by Nitya Narasimhan. Click the image for a larger version.

阅读前小测验

Pre-lecture quiz

介绍在这里插入图片描述

在上一课中,我们研究了测量一个环境属性并利用它来预测植物的生长。温度是可以控制的,但这样做很昂贵,需要控制环境。对植物来说,最容易控制的环境属性是水—从大规模的灌溉系统到拿着浇水壶浇花园的年轻孩子,每天都在控制水。

在这节课中,我们将介绍:

  • 土壤湿度

  • 传感器如何与IOT设备通信

  • 测量土壤湿度

  • 传感器校准

土壤湿度

植物需要水来生长。它们在整个植物中吸收水分,其中大部分由根系吸收。水被植物用来做三件事:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

  • 光合作用—植物与水、二氧化碳和光产生化学反应,产生碳水化合物和氧气。

  • 透气—植物利用水将空气中的二氧化碳通过叶片中的孔隙扩散到植物体内。这一过程也将养分带到植物周围,并冷却植物,类似于人类出汗的方式。
    在这里插入图片描述

  • 结构–植物也需要水来维持其结构–它们90%是水(而人类只有60%),这些水可以保持细胞的刚性。如果植物没有足够的水,它就会枯萎并最终死亡。

✅ 做一些研究:有多少水是通过蒸腾作用流失的?

根系从植物生长的土壤中的水分提供水分。土壤中的水太少,植物无法吸收足够的水来生长,水太多,根部无法吸收足够的功能所需的氧气。这导致根部死亡,植物无法获得足够的营养物质来生存。

对于农民来说,要想获得最佳的植物生长,土壤需要不太湿,也不能太干。物联网设备可以通过测量土壤湿度来帮助解决这个问题,让农民只在需要时浇水。

测量土壤湿度的方式

有一系列不同类型的传感器,你可以用来测量土壤湿度:

  • 电阻式 - 电阻式传感器有两个进入土壤的探头。电流被发送到一个探头,并被另一个探头接收。然后,传感器测量土壤的电阻–测量电流在第二个探头处下降的程度。水是电的良好导体,所以土壤的含水量越高,电阻就越低。
    在这里插入图片描述

    💁 你可以用两块金属,如钉子,相隔几厘米,建立一个电阻式土壤湿度传感器,用万用表测量它们之间的电阻。

  • 电容式 - 电容式湿度传感器测量的是可储存在正负电板上的电荷量,或电容。土壤的电容随着湿度的变化而变化,这可以转化为物联网设备所能测量的电压。土壤越湿,出来的电压就越低。
    在这里插入图片描述

这些都是模拟传感器,返回一个电压来指示土壤湿度。那么,这个电压是如何进入你的代码的呢?在进一步了解这些传感器之前,让我们看看传感器和执行器如何与物联网设备进行通信。

传感器如何与物联网设备通信

到目前为止,在这些课程中,你已经了解了一些传感器和执行器,如果你一直在做物理硬件实验,这些传感器和执行器已经与你的物联网开发工具包进行了通信。但这种通信是如何进行的?来自土壤湿度传感器的电阻测量值如何变成一个你可以从代码中使用的数字?

要与大多数传感器和执行器进行通信,你需要一些硬件和通信协议–这是一种定义明确的数据发送和接收方式。以电容式土壤湿度传感器为例。

硬件提供了发送数据的物理连接,不同的通信协议确保了数据以正确的方式发送或接收,从而使其能够被解释。

  • 这个传感器是如何连接到物联网设备的?

  • 如果它测量的电压是一个模拟信号,它将需要一个ADC来创建一个数字表示的值,这个值作为一个交变的电压来发送0和1–但每个比特的发送时间是多长?

  • 如果传感器返回一个数字值,那将是一个0和1的数据流,同样,每个比特的发送时间是多长?

  • 如果电压在0.1s内处于高位,那是一个1比特,还是两个连续的1比特,还是10个?

  • 数字在什么时候开始?00001101是25,还是前5位是前一个值的结束?

通用输入输出(GPIO)引脚

GPIO是一组引脚,你可以用它来连接硬件到你的物联网设备,通常在物联网开发工具包上有,如Raspberry Pi或Wio Terminal。你可以通过GPIO引脚使用本节中涉及的各种通信协议。一些GPIO引脚提供电压,通常是3.3V或5V,一些引脚为地,其他引脚可以通过编程设置为发送电压(输出)或接收电压(输入)。

💁 一个电路需要通过你所使用的任何电路将电压连接到地。你可以把电压看作是电池的正极(+V),把地看作是负极(-V)。

当你只关心开或关的值时,你可以直接使用GPIO引脚与一些数字传感器和执行器–开指的是高,关是指低。一些例子如下:

  • 按钮。你可以在一个5V引脚和一个设置为输入的引脚之间连接一个按钮。当你按下按钮时,它在5V引脚之间完成了一个电路,通过按钮到输入引脚。从代码中你可以读取输入针脚的电压,如果它是高电平(5V),那么按钮就被按下了,如果它是低电平(0V),那么按钮就没有被按下。记住,实际的电压本身并没有被读取,相反,你得到的是一个1或0的数字信号,这取决于电压是否高于阈值。
    在这里插入图片描述
  • LED。你可以在一个输出引脚和一个接地引脚之间连接一个LED(使用一个电阻,否则你会烧LED)。在代码中,你可以将输出引脚设置为高电平,它将发送3.3V,形成一个从3.3V引脚通过LED到接地引脚的电路。这将点亮LED。
    在这里插入图片描述
    对于更高级的传感器,你可以使用GPIO引脚直接与数字传感器和执行器发送和接收数字数据,或通过带有ADC和DAC的控制器板与模拟传感器和执行器对话。

💁 如果你使用Raspberry Pi做这些实验,Grove Base Hat有硬件可以将模拟传感器信号转换成数字信号,通过GPIO发送。

✅ 如果你有一个带有GPIO引脚的物联网设备,找到这些引脚,并找到一个图表,说明哪些引脚是电压、接地或可编程的。

模拟引脚

一些设备,如Arduino设备,提供模拟引脚。这些与GPIO引脚相同,但与之相反的是,它们不是只支持数字信号,而是有一个ADC将电压范围转换为数值。通常ADC的分辨率为10位,这意味着它将电压转换为0-1023的数值。

例如,在一个3.3V的板子上,如果传感器返回的是3.3V,返回的值将是1,023。如果返回的电压是1.65V,返回的值将是511。
在这里插入图片描述

💁 回到nightlight—第3课,光照传感器返回一个0-1,023的数值。如果你使用的是Wio终端,传感器被连接到一个模拟引脚。如果你使用的是Raspberry Pi,那么传感器被连接到基座上的一个模拟引脚上,该引脚有一个集成的ADC,可以通过GPIO引脚进行通信。虚拟设备被设置为发送一个0-1,023的值,以模拟一个模拟引脚。

土壤湿度传感器依赖于电压,因此将使用模拟引脚,并给出0-1,023的数值。

Inter Integrated Circuit (I2C)

I2C,发音为I-squared-C,是一个多控制器、多外设协议,任何连接的设备都可以作为控制器或外设通过I2C总线(传输数据的通信系统名称)进行通信。数据以寻址数据包的形式发送,每个数据包都包含它所要连接的设备的地址。

💁 这种模式曾经被称为主/从模式,但由于与奴隶制有关,这个术语正在被放弃。开源硬件协会已经采用了控制器/外设,但你可能仍然会看到对旧术语的引用。

设备有一个地址,当它们连接到I2C总线时使用,通常在设备上硬编码。例如,Seeed公司的每种格罗夫传感器都有相同的地址,所以所有的光传感器都有相同的地址,所有的按钮都有相同的地址,与光传感器地址不同。有些设备有办法改变地址,通过改变跳线设置或将引脚焊接在一起。

I2C有一条由2条主线组成的总线,同时还有2条电源线:

WireNameDescription
SDASerial Data这条线用于在设备之间发送数据。
SCLSerial Clock这条线以控制器设定的速率发送一个时钟信号。
VCCVoltage common collector器件的电源。这条线与SDA和SCL线相连,通过一个上拉电阻为它们提供电源,当没有设备是控制器时,该信号将被关闭。
GNDGround这为电路提供了一个公共地线。

在这里插入图片描述

为了发送数据,一个设备将发出一个启动条件,表明它已准备好发送数据。然后,它将成为控制器。然后,控制器发送它想与之通信的设备的地址,以及它是否想读取或写入数据。数据传输完毕后,控制器发送一个停止条件,表示它已经完成。此后,另一个设备可以成为控制器,并发送或接收数据。

I2C有速度限制,有3种不同的模式以固定速度运行。最快的是高速模式,最高速度为3.4Mbps(兆位/秒),尽管很少有设备支持这个速度。例如,Raspberry Pi被限制在400Kbps(每秒千比特)的快速模式下。标准模式以100Kbps的速度运行。

💁 如果你使用带有Grove Base hat的Raspberry Pi作为你的物联网硬件,你会看到板子上有许多I2C插座,你可以用来与I2C传感器通信。模拟的Grove传感器也使用I2C与ADC,将模拟值作为数字数据发送,所以你使用的光传感器模拟了一个模拟引脚,其值通过I2C发送,因为Raspberry Pi只支持数字引脚。

通用异步接收器-发射器 (UART)

UART涉及物理电路,允许两个设备进行通信。每个设备有2个通信引脚–发送(Tx)和接收(Rx),第一个设备的Tx引脚与第二个设备的Rx引脚相连,第二个设备的Tx引脚与第一个设备的Rx引脚相连。这使得数据可以在两个方向上发送。

  • 设备1从它的Tx引脚传输数据,设备2从它的Rx引脚接收。

  • 设备1在其Rx引脚上接收数据,该数据由设备2从其Tx引脚传输。

在这里插入图片描述

🎓 数据是一个比特一个比特地发送,这就是所谓的串行通信。大多数操作系统和微控制器都有串行端口,也就是可以发送和接收串行数据的连接,可以供你的代码使用。

UART设备有一个波特率(也称为符号率),即以每秒比特为单位发送和接收数据的速度。一个常见的波特率是9600,意味着每秒发送9600比特(0和1)的数据。

UART使用起始位和停止位–也就是说,它发送一个起始位以表明它要发送一个字节(8位)的数据,然后在发送完8位后发送一个停止位。

UART的速度取决于硬件,但即使是最快的实现也不超过6.5 Mbps(兆位/秒,或每秒发送数百万位,0或1)。

你可以通过GPIO引脚使用UART–你可以将一个引脚设置为Tx,另一个设置为Rx,然后将这些引脚连接到另一个设备。

💁 如果你使用带有Grove Base hat的Raspberry Pi作为你的物联网硬件,你将能够看到板子上有一个UART插座,你可以用它与使用UART协议的传感器进行通信。

串行外设接口 (SPI)

SPI是为短距离通信而设计的,例如在微控制器上与闪存等存储设备对话。它基于一个控制器/外设模型,由一个控制器(通常是物联网设备的处理器)与多个外设互动。控制器通过选择一个外设并发送或请求数据来控制一切。

💁 像I2C一样,控制器和外设这两个术语是最近才改变的,所以你可能会看到仍在使用旧的术语。

SPI控制器使用3根线,同时每个外设使用1根额外的线。外围设备使用4根线。这些线是:

WireNameDescription
COPIController Output, Peripheral Input这条线用于从控制器向外围设备发送数据。
CIPOController Input, peripheral Output这条线用于将数据从外围设备发送到控制器。
SCLKSerial Clock这条线以控制器设定的速率发送一个时钟信号。
CSChip Select控制器有多条线,每个外设一条,每条线都与相应外设上的CS线相连。

在这里插入图片描述

CS线用于一次激活一个外设,通过COPI和CIPO线进行通信。当控制器需要改变外设时,它停用连接到当前活动外设的CS线,然后激活连接到下一个要通信的外设的线。

SPI是全双工的,这意味着控制器可以使用COPI和CIPO线从同一个外设同时发送和接收数据。SPI使用SCLK线上的时钟信号来保持设备的同步,因此与直接通过UART发送不同,它不需要启动和停止位。

SPI没有明确的速度限制,其实施方案通常能够每秒传输多兆字节的数据。

物联网开发工具包通常支持通过一些GPIO引脚进行SPI。例如,在Raspberry Pi上,你可以使用GPIO引脚19、21、23、24和26进行SPI。

无线(Wireless)

一些传感器可以通过标准的无线协议进行通信,如蓝牙(主要是蓝牙低功耗,或BLE)、LoRaWAN(一种长距离低功耗网络协议),或WiFi。这些都允许没有物理连接到物联网设备的远程传感器。

一个例子是商业土壤湿度传感器。这些传感器将测量田地里的土壤湿度,然后通过LoRaWan将数据发送到一个中心设备,该设备将处理数据或通过互联网发送数据。这使得传感器可以远离管理数据的物联网设备,减少功耗和对大型WiFi网络或长电缆的需求。

BLE在先进的传感器中很受欢迎,如健身追踪器在手腕上工作。这些结合了多个传感器,并通过BLE将传感器数据发送到你手机形式的物联网设备上。

🐝 Zigbee这个名字是指蜜蜂返回蜂巢后的摇摆舞。

✅你的身上、家里或学校里有任何蓝牙传感器吗?这些可能包括温度传感器、占用传感器、设备追踪器和健身设备。

商业设备连接的一种流行方式是Zigbee。Zigbee使用WiFi在设备之间形成网状网络,每个设备尽可能多地连接到附近的设备,形成像蜘蛛网一样的大量连接。当一个设备想向互联网发送信息时,它可以将信息发送给最近的设备,然后由这些设备转发给附近的其他设备,以此类推,直到信息到达协调器,可以发送到互联网上。

测量土壤湿度

你可以使用土壤湿度传感器、物联网设备和家庭植物或附近的一片土壤来测量土壤中的湿度水平。

任务—测量土壤湿度

通过相关指南,使用你的物联网设备测量土壤湿度。

传感器校准

传感器主要依靠测量电阻或电容等电气特性。

🎓 电阻,以欧姆(Ω)为单位,是指电流通过某物时有多少阻力。当电压施加在一种材料上时,通过它的电流大小取决于该材料的电阻。你可以在维基百科的电阻页面上阅读更多内容。

🎓 电容,以法拉(F)为单位,是指一个元件或电路收集和储存电能的能力。你可以在维基百科的电容页面上阅读更多关于电容的信息。

这些测量值并不总是有用的–想象一下,一个温度传感器给你的测量值是22.5KΩ! 相反,测量的数值需要通过校准转换成有用的单位–也就是将测量的数值与被测量的数量相匹配,以便将新的测量值转换为正确的单位。

一些传感器是预先校准的。例如,你在上一课中使用的温度传感器已经被校准,因此它可以返回以℃为单位的温度测量。在工厂里,创建的第一个传感器将被暴露在已知的温度范围内,并测量其电阻。然后,这将被用来建立一个计算,可以将以Ω(电阻单位)为单位的测量值转换为℃。

💁 根据温度计算电阻的公式被称为Steinhart-Hart方程。

土壤湿度传感器校准

土壤水分是用重量或体积含水量测量的。

  • 重量法是指测量单位重量的土壤中的水的重量,即每公斤干土中的水的数量。

  • 体积法是指在单位体积的土壤中所测量的水的体积,即每立方米干土的水的数量。

对于美国人来说,由于单位的一致性,这些可以用磅而不是公斤,或用立方英尺而不是立方米来衡量。

土壤水分传感器测量电阻或电容–这不仅因土壤水分而异,也因土壤类型而异,因为土壤中的成分可以改变其电气特性。理想情况下,应该对传感器进行校准–即从传感器上获取读数,并将其与使用更科学的方法发现的测量结果进行比较。例如,实验室可以通过每年在特定田地中采集几次样本来计算土壤湿度,这些数字用于校准传感器,将传感器的读数与土壤湿度的重量比对。

在这里插入图片描述

上图显示了如何校准一个传感器。采集土壤样品的电压,然后在实验室中通过比较湿重和干重(通过测量湿重,然后在烘箱中干燥并测量干重)进行测量。一旦采集了一些读数,就可以将其绘制在图表上,并在这些点上拟合出一条线。然后,这条直线可以用来将物联网设备采集的土壤水分传感器读数转换成实际的土壤水分测量值。

💁 对于电阻式土壤湿度传感器,电压随着土壤湿度的增加而增加。对于电容式土壤湿度传感器,电压随着土壤湿度的增加而降低,所以这些图表会向下倾斜,而不是向上倾斜。
在这里插入图片描述

上图显示的是土壤湿度传感器的电压读数,沿着这个读数到图上的线,可以计算出实际的土壤湿度。

这种方法意味着农民只需要对一块田地进行一些实验室测量,然后他们就可以使用物联网设备来测量土壤湿度–大大加快了测量的时间。


🚀 挑战

电阻式和电容式土壤湿度传感器有一些区别。这些差异是什么,哪种类型(如果有的话)最适合农民使用?这个答案在发展中国家和发达国家之间是否有变化?

阅读后小测验

Post-lecture quiz

复习与自学

阅读有关传感器和执行器所使用的硬件和协议。

任务

校准你的传感器


测量土壤湿度—使用虚拟IOT硬件

Virtual Hardware

虚拟物联网设备将使用一个模拟的格罗夫电容式土壤湿度传感器。这使本实验室与使用Raspberry Pi与物理Grove电容式土壤湿度传感器的情况相同。

在物理物联网设备中,土壤湿度传感器将是一个电容式传感器,通过检测土壤的电容来测量土壤湿度,这一特性随着土壤湿度的变化而变化。随着土壤湿度的增加,电压会下降。

这是一个模拟传感器,所以使用一个模拟的10位ADC来报告一个1-1023的数值。

将土壤湿度传感器添加到CounterFit中

要使用虚拟土壤湿度传感器,您需要将其添加到CounterFit应用程序中

任务—向CounterFit应用中添加土壤湿度传感器

向CounterFit应用中添加土壤湿度传感器

  1. 在你的电脑上创建一个新的Python应用程序,文件夹名为soil-moisture-sensor,有一个名为app.py的文件和一个Python虚拟环境,并添加CounterFit pip软件包。

    ⚠️ 你可以参考the instructions for creating and setting up a CounterFit Python project in lesson 1 if needed.

  2. 确保CounterFit网络应用程序正在运行

  3. 创建一个土壤湿度传感器:

    1. 在传感器窗格中的创建传感器框中,下拉传感器类型框,选择土壤湿度。

    2. 将单位设置为NoUnits

    3. 确保引脚被设置为0

    4. 选择 "添加 "按钮,在针脚0上创建土壤水分传感器。
      在这里插入图片描述

土壤湿度传感器将被创建并出现在传感器列表中。
在这里插入图片描述

对土壤湿度传感器应用程序进行编程

现在可以使用CounterFit传感器对土壤水分传感器应用程序进行编程。

任务 - 编写土壤湿度传感器应用

编写土壤湿度传感器应用。

  1. 确保soil-moisture-sensor 文件在 VS Code已打开

  2. 打开app.py文件

  3. app.py的顶部添加以下代码,将应用程序连接到CounterFit。

    from counterfit_connection import CounterFitConnection···
    CounterFitConnection.init('127.0.0.1', 5000)
    
  4. 在这下面添加以下代码,以创建ADC类的一个实例:

    adc = ADC()
    
  5. 添加一个无限循环,从这个ADC的0号引脚读取数据,并将结果写到控制台。然后这个循环可以在两次读取之间休眠10秒。

    while True:
        soil_moisture = adc.read(0)
    
        print("Soil moisture:", soil_moisture)
    
        time.sleep(10)
    
    
  6. 在CounterFit应用程序中,改变将由该应用程序读取的土壤水分传感器的值。你可以通过以下两种方式之一来做这件事。

    • 在土壤湿度传感器的框中输入一个数字,然后选择设置按钮。你输入的数字将是传感器返回的值。

    • 勾选随机复选框,并输入一个最小最大值,然后选择设置按钮。每次传感器读取数值时,它将读取MinMax之间的一个随机数字。

  7. 运行Python应用程序。你会看到土壤湿度的测量值被写入控制台。改变数值或随机设置以看到数值的变化。

    (.venv) ➜ soil-moisture-sensor $ python app.py 
    Soil moisture: 615
    Soil moisture: 612
    Soil moisture: 498
    Soil moisture: 493
    Soil moisture: 490
    Soil Moisture: 388
    

💁 app.py代码如下:

from counterfit_connection import CounterFitConnection
CounterFitConnection.init('127.0.0.1', 5000)

import time
from counterfit_shims_grove.adc import ADC

adc = ADC()

while True:
    soil_moisture = adc.read(0)
    print("Soil moisture:", soil_moisture)

    time.sleep(10)

😀 你的土壤湿度传感器项目已经成功了

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
I2C土壤水分传感器概述: 该电容式土壤湿度传感器通过I2C连接,并提供以下特性:土壤湿度检测、光感、温度感应、复位芯片、I2C地址更改,主要应用于植物浇水报警器等智能家居设备中。附件内容提供了该电容式土壤水分传感器的2个版本,主要包括用于精确测量温度的热敏电阻、增加水分读数分辨率(几乎是两倍!) 电容式土壤水分传感器实物展示: 电容式土壤水分传感器技术参数: 版本2.7.3 电源电压3.3V - 5V 电流消耗:1.1mA @ 5V,0.7mA @ 3.3V空闲时,14mA @ 5V,7.8mA @ 3.3V进行测量。当全速轮询传感器时,电流消耗平均为4.5mA @ 5V,2.8mA @ 3.3V 工作温度0°C - 85°C 湿度读数随温度变化 - 在全温度范围内<10% 不要忘记为SCL和SDA线提供上拉电阻 默认I2C地址为0x20(十六进制) 要读取土壤湿度,请从寄存器0读取2个字节 要读取光电平,通过将3写入设备I2C地址开始测量,等待3秒钟,从寄存器4读取2个字节 要读取温度,请从寄存器5读取2个字节 要更改传感器的I2C地址,请将新地址(一个字节[1..127])写入寄存器1; 新地址将在复位后生效 要复位传感器,请将6写入设备I2C地址。 不要将传感器热插入有源I2C总线 - 地址更改命令没有保护,这可能导致随机数设置为传感器的地址。如果传感器停止响应,使用I2C扫描草图找出地址。 如何读取土壤水分传感器数值? 光和湿度传感器都提供相对值。意思是,更多的水分会给你更高的阅读量,更轻,阅读更低。水分有些线性。我在运输前测试所有的传感器,并在5V供电的空闲空气中提供约290 - 310。我没有测量光传感器的线性度,它在距离台灯的黑暗的房间里有65535。当黑暗时,测量光需要更长时间,测量过程中读取光源寄存器将返回上一次读数。请注意,光传感器非常嘈杂。温度由传感器主体上的热敏电阻测量。计算的绝对测量精度优于2%。返回值在十分之一摄氏度。即,值252将意味着25.2°C。 附件内容截图:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值