本篇文章简单介绍了如何在树莓派上配置土壤湿度传感器以读取土壤湿度及代码实现。
主要包含有以下4个模块:
一、土壤湿度传感器常见类型及介绍
二、实验所需设备
三、设备连线方式与Python代码实现
四、常见问题及注意事项
需要哪个模块的内容直接跳转去看即可~
一、土壤湿度传感器常见类型及介绍
土壤湿度传感器,又名土壤水分传感器、土壤墒情传感器、土壤含水量传感器等。顾名思义,主要用来测量土壤相对含水量,做土壤墒情监测。在智能农业,农业灌溉和林业防护等领域极广。该传感器价格低廉,如果想在家制作一个简易的智能自动化作物灌溉系统,有了它,再加上温湿度传感器、树莓派/Arduino就可以轻松完成。
常见的土壤传感器分为两类,电阻型和电容型土壤湿度传感器。但原理大同小异,都是测量土壤中水分的体积含量,并以电压表示水分值。
(一)电阻型土壤湿度传感器
常见的有传感器型号有YL-69(下图左)和FC-28(下图右)。这是一种低技术含量的传感器这类传感器由两部分组成,带探针的传感器,A to D(模拟信号转数字信号)电子板(校准灵敏度主板),两者用母对母杜邦线连接。
它根据土壤的介电常数(土壤的导电能力)来估计土壤体积水含量,工作时,使用两个探针让电流通过土壤,然后读取电阻来获得湿度水平。水分越多,土壤导电越容易(电阻越小),而土壤干燥,导电越差(电阻越大)。土壤中的湿度是一个连续变化的一系列值,为模拟信号,使用A to D接线板之后可以将从环境中得来的模拟信号转成数字信号,在该板上有两个指示灯,PWR-LED和DO-LED,前者检测是否插好电源,如果电源的正负极连接正确,则会亮起,如下图(左)所示。在这里我使用的是YL-69型号,灯为绿色,也有一些厂商生产的传感器指示灯为红色。该传感器在输出数字信号时,可以使用改锥调节板上的电位计(蓝色中间有十字架的部位)来提前设定阈值大小,一旦土壤湿度达到或大于阈值,则DO-LED亮起,如下图(中)所示。
电子板从左到右的标记为AO、DO、GND、VCC,如下图(右)所示。AO和DO为信号引脚,如果需要模拟信号,则连接AO,输出的模拟值是介于所提供的电压值到0V间的变化的电压值,如果输出0V,则代表土壤导电性不好,即水分含量低,可以用这个电压值来估计土壤湿度。如果需要数字信号输出则连接DO,简单的输出0和1,可直接通过信号灯判断土壤中水分是否低于阈值,高于则“开”,低则“关”。GND表示接地,VCC连接电源,但在这个项目中,我们将单独利用模拟输出。
该传感器的优点是价格低廉,且有指示灯,观察方便,但由于土壤环境是酸性的(acidic),随着时间的推移,土壤里的化学物质会使得探针氧化(oxidize)导致测量不准确,所以需要时不时的进行更换以保证测量的准确性。
(二)电容型传感器
相比较前一类型的传感器,这类传感器就显得“光秃秃”了,只有一个组件,没有指示灯,且只能输出模拟信号。它区别于电阻传感器,利用电容感应原理来检测土壤湿度,避免了电阻式传感器极易被腐蚀的问题,生命周期较长,缺点是不能用指示灯判断传感器是否正常工作,它同时只提供模拟信号。如图设计DF Robot的一款传感器,内置稳压芯片,支持3.3V-5.5V宽电压工作。DFRobot-Gravity接口具有兼容性,可直接和Gravity IO扩展板相连接。输出电压为0-3VDC。
在自动化浇灌系统中,湿度传感器用于测量土壤中水分,可以提前预设一个阈值,一旦土壤中的水分低于此阈值,则启动连接着蓄水池(家用拿矿泉水瓶装满水替代即可)的水泵喷水,等到水分值超过预设值,则水泵暂停工作。
二、实验所需设备
树莓派 3 b+/树莓 4 b/树莓派Zero W
MCP3008
面包板
跳线(公对母,母对母,最好多准备一些)
土壤传感器(电容式、电阻式均可)
一杯水(可以将传感器放入水中来观察湿度读数的变化,若没有条件也可直接用手握住传感器的探针)
MCP3008
由于树莓派没有模拟信号引脚,所以没有办法直接输出模拟信号数值,此时我们需要使用MCP3008集成电路。
MCP3008 IC(Integrated Circuit)是一个8通道,10位的具有SPI串行接口的A / D转换器(模拟-数字转换器),共有16个引脚,可以用来解决模拟引脚问题(MCP3004也是ADC,不过为4路,体型更小)。MCP3008使用SPI总线协议从树莓派接收模拟输入值。它有8个模拟输入(ch0-ch7),另外一列的8个引脚中有4个电源和地引脚和4个连接树莓派的引脚,它产生范围为0-1023的输出值(注意:0表示0V, 1023表示3.3V)。
三、设备连线方式与代码实现
在此实验中,主要介绍和使用的FC-28型号土壤湿度传感器,但其它型号的传感器使用,连线均与此相同。
(一)设备连线方式
1.电路图及说明
MCP3008共有16个引脚,其中8个用于记录模拟输入值,位于CH0-CH7(引脚1-8),4个通信引脚通过SPI协议方法与树莓派通信,还有2个电源引脚,2个接地引脚。
(二)代码实现
1. 启用树莓派的SPI接口
树莓派的SPI接口与SSH、VNC服务相同,是默认关闭的,需要我们在配置中打开此服务才可以使用。
按照以下步骤启动终端并输入以下命令:
(1)打开树莓派配置选项
sudo raspi-config
(2)导航到Interface选项,启用SPI接口。
(3)重启树莓派
reboot
2. 安装spidev库
光启用SPI接口,但是树莓派还是无法读取传感器传过来的值,spidev库将帮助通过SPI接口读取传感器值。
使用以下命令安装spidev库:
sudo apt-get install git python-dev git clone git://github.com/doceme/py-spidev cd py-spidev/ sudo python setup.py install
3. 安装numpy库
我们从传感器获得的值还是电压值而非土壤湿度值,土壤湿度需要使用百分比的形式体现,为了将输出值转换为百分比,还需要使用numpy库。我们从MCP3008 IC接收到的输出值是在前面提到的0-0123范围内的数值,仍需要将把这些值映射到0-100,以得到一个百分比。
使用以下命令安装numpy模块:
sudo apt-get install python-numpy
4. Python代码
# Importing modules import spidev # To communicate with SPI devices from numpy import interp # To scale values from time import sleep # To add delay # Start SPI connection spi = spidev.SpiDev() # Created an object spi.open(0,0) # Read MCP3008 data def analogInput(channel): spi.max_speed_hz = 1350000 adc = spi.xfer2([1,(8+channel)<<4,0]) data = ((adc[1]&3) << 8) + adc[2] return data while True: output = analogInput(0) # Reading from CH0 output = interp(output, [0, 1023], [100, 0]) output = int(output) print("Moisture:", output) sleep(0.1)
当从土壤湿度传感器读取模拟输出值时,它以百分比测量湿度,使用来自numpy库的特定interp模块进行映射得到从0-100的值。
四、常见问题及注意事项
(一)常见问题
1. 持续输出0或100,无论探针是否放入水中均没有变化
2. 没有操作探针,但读数呈有规律地变化
针对以上出现有以下几种解决方案
1.检查树莓派的SPI服务有无正确打开
2.先检查线有没有接稳,查看是不是线的连接顺序(传感器的正负极有没有接反,与树莓派的连线有没有串行)有误
3. 线是否有生锈或损坏(之前第一次做实验时,各种调试都出现不了正确结果,后来才发现是有几根线生锈了所以不通)
(二)注意事项
1. 尽量使用长线,便于看清连线位置
2. 尽量不要使用拼接线(一根公对公,一根母对母拼接成公对母的),这样需要照顾的线更多,也更容易出纰漏
3. 一定一定要有耐心,出现问题后按照顺序逐一排查。因为涉及到的连线较多,对硬件小白来说,很容易眼花缭乱想放弃,但是太简单的东西谁都能做,能攻破学习或者生活中一个个难关的人才能有所成长啊~
如果你在配置土壤湿度传感器时或使用树莓派时遇见了什么问题,欢迎在评论区写下,看到了会及时答复。期待与大家一起学习。
文字及图片部分来源:https://maker.pro/raspberry-pi/tutorial/interfacing-soil-moisture-sensor-with-raspberry-pi
转发请标明来源。祝大家学派happy!