介绍:
树莓派采用的是读取土壤传感器的DO口输出信号,由于树莓派的GPIO只支持数字输入,所以第一个教程我们AO口是没有接的,由于树莓派没有模拟信号引脚,所以没有办法直接输出模拟信号数值,此时我们在第二教程里面需要使用MCP3008集成电路,读取土壤湿度值可查看下面第二个教程。
教程一:
1.树莓派与土壤传感器接线
树莓派VCC —— VCC
树莓派GND —— GND
树莓派GPIO29 ——DO
我们将树莓派与传感器接好线以后,传感器的电源灯(红灯)会亮起,通过调节传感器上的阈值旋钮,使得在空气中绿灯不亮。此时如果将传感器触角伸入水中,可以看到绿灯亮起。此为正常状态!
2.程序代码
新建一个py文件。输入命令
sudo nano turang.py编辑程序
#!/usr/bin/python # -*- coding: UTF-8 -*- import RPi.GPIO as GPIO import time channel = 21 GPIO.setmode(GPIO.BCM) GPIO.setup(channel, GPIO.IN) while True: if GPIO.input(channel) == GPIO.LOW: print "土壤检测结果:潮湿" else: print "土壤检测结果:干燥" time.sleep(1)输入检测命令
sudo python turang.py
将传感器探头放入水中,就会发生变化。可参考下图
教程二,如何读取土壤湿度值?
1.原理:根据土壤的介电常数(土壤的导电能力)来估计土壤体积水含量,使用两个探针让电流通过土壤,然后读取电阻来获得湿度水平。水分越多,土壤导电越容易(电阻越小),而土壤干燥,导电越差(电阻越大)。土壤中的湿度是一个连续变化的一系列值,为模拟信号,使用A to D接线板之后可以将从环境中得来的模拟信号转成数字信号,在该板上有两个指示灯,PWR-LED和DO-LED,前者检测是否插好电源,如果电源的正负极连接正确,则会亮起,如下图(左)所示。我这里使用的是YL-69型号,灯为绿色。该传感器在输出数字信号时,可以使用一字螺丝刀将电位器进行调节(蓝色中间有十字架的部位)提前设定阈值大小,一旦土壤湿度达到或大于阈值,则DO-LED指示会亮起,如下图(右)所示。
二:传感器引脚介绍:
传感器的小板接口分别为:AO、DO、GND、VCC,如上图所示:AO模拟量,DO数字量,GND负极、VCC正极
AO模拟信号,输出的模拟值是介于所提供的电压值(0-2.3v)之间的电压变化值。如果输出0V,则代表土壤导电性不好,即水分含量很低,若输出2.3v则表示水分子含量高,当然就可以用这个电压值来换算土壤湿度值。
DO数字信号,简单的输出为0和1,可直接通过信号灯判断土壤中水分是否低于阈值,高于则“开”,低则“关”。
GND表示接地,即为负极
VCC连接电源,即为正极(可接3.3V-5V)
三:MCP3008模拟-数字转换器
但在接下来的这个项目中,我们只是单独利用模拟输出来检测土壤湿度值,由于树莓派4B自身是没有模拟信号引脚的,所以没有办法直接输出模拟信号数值,此时我们需要使用一个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)。
四、设备连线方式与代码实现
MCP3008共有16个引脚,其中8个用于记录模拟输入值,位于CH0-CH7(引脚1-8),4个通信引脚通过SPI协议方法与树莓派通信,还有2个电源引脚,2个接地引脚。
五:代码程序(使用方法)
1. 先启用树莓派的SPI接口,树莓派的SPI接口与SSH、VNC服务相同,是默认关闭的,需要我们在配置中打开此服务才可以使用。按照以下步骤启动终端并输入以下命令:
sudo raspi-config
选择Interface选项,来启用SPI接口。
2.安装spidev库,spidev库将帮助通过SPI接口读取传感器值,使用以下四条命令来安装。
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(,) # Read MCP3008 data def analogInput(channel): spi.max_speed_hz = adc = spi.xfer2([,(+channel)<<,]) data = ((adc[]&) << ) + adc[] return data while True: output = analogInput() # Reading from CH0 output = interp(output, [, ], [, ]) output = int(output) print("Moisture:", output) sleep(0.1)
当从土壤湿度传感器读取模拟输出值时,它以百分比测量湿度,使用来自numpy库的特定interp模块进行映射得到从0-100的值。
六:注意事项
(1)持续输出0或100,无论探针是否放入水中均没有变化
(2)没有操作探针,但读数呈有规律地变化
针对以上出现有以下几种解决方案
(1)检查树莓派的SPI服务有无正确打开
(2)先检查线有没有接稳,查看是不是线的连接顺序(传感器的正负极有没有接反,与树莓派的连线有没有串行)有误
(3)线是否有生锈或损坏(之前第一次做实验时,各种调试都出现不了正确结果,后来才发现是有几根线生锈了所以不通)
注意事项 :
(1)尽量使用长线,便于看清连线位置
(2)尽量不要使用拼接线(一根公对公,一根母对母拼接成公对母的),这样需要照顾的线更多,也更容易出纰漏
(3)一定一定要有耐心,出现问题后按照顺序逐一排查。因为涉及到的连线较多
7:土壤传感器原理图