锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-08-14 04:30:01 cs650土壤水分传感器cs系列速度传感器传感器电源插座k型插座连接器传感器固定阈值重量传感器f1814

本文是微软开源课程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,还是前五是前一值的结束?

通用输入输出(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,返回值为1023。如果返回电压为1.65V,返回值为511。

?? 回到nightlight—第三课,光传感器返回0-1023的值。假如你用的是Wio传感器连接到模拟引脚的终端。假如你用的是Raspberry Pi,然后传感器连接到基座上的一个模拟引脚上,这个引脚有一个集成的ADC,可以通过GPIO通信引脚。通过模拟模拟引脚,将虚拟设备设置为发送0-1023的值。

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

Inter Integrated Circuit (I2C)

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

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

当它们连接到设备时,有一个地址I2C通常在设备上硬编码总线。Seeed每个格罗夫传感器都有相同的地址,所以所有的光传感器都有相同的地址,所有的按钮都有相同的地址,不同于光传感器地址。有些设备可以通过改变跳线设置或焊接引脚来改变地址。

I2C有两条主线和两条电源线组成的总线:

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

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

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根线。这些线是:

Wire Name Description
COPI Controller Output, Peripheral Input 这条线用于从控制器向外围设备发送数据。
CIPO Controller Input, peripheral Output 这条线用于将数据从外围设备发送到控制器。
SCLK Serial Clock 这条线以控制器设定的速率发送一个时钟信号。
CS Chip 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在设备之间形成网状网络,每个设备尽可能多地连接到附近的设备,形成像蜘蛛网一样的大量连接。当一个设备想向互联网发送信息时,它可以将信息发送给最近的设备,然后由这些设备转发给附近的其他设备,以此类推,直到信息到达协调器,可以发送到互联网上。

测量土壤湿度

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

任务—测量土壤湿度

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

  • Arduino - Wio Terminal

  • Single-board computer - Raspberry Pi

  • Single-board computer - Virtual device

传感器校准

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

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

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

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

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

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

土壤湿度传感器校准

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

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

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

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

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

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

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

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

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


🚀 挑战

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

阅读后小测验

Post-lecture quiz

复习与自学

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

  • GPIO Wikipedia page

  • UART Wikipedia page

  • SPI Wikipedia page

  • I2C Wikipedia page

  • Zigbee Wikipedia page

任务

校准你的传感器


测量土壤湿度—使用虚拟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)

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章