本篇文章简单介绍了如何在树莓派上配置土壤湿度传感器以读取土壤湿度(以百分比的形式出现)及代码实现。

主要包含有以下4个模块:

一、土壤湿度传感器常见类型及介绍

二、实验所需设备

三、设备连线方式与代码实现

四、常见问题及注意事项

一、土壤湿度传感器常见类型及介绍

土壤湿度传感器,又名土壤水分传感器、土壤墒情传感器、土壤含水量传感器等。顾名思义,主要用来测量土壤相对含水量,做土壤墒情监测。在智能农业,农业灌溉和林业防护等领域极广。该传感器价格低廉,如果想在家制作一个简易的智能自动化作物灌溉系统,有了它,再加上温湿度传感器、树莓派/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(,) # 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)一定一定要有耐心,出现问题后按照顺序逐一排查。因为涉及到的连线较多,对硬件小白来说,很容易眼花缭乱想放弃,但是太简单的东西谁都能做,能攻破学习或者生活中一个个难关的人才能有所成长啊~

如果你在配置土壤湿度传感器时或使用树莓派时遇见了什么问题,欢迎在评论区写下,看到了会及时答复。期待与大家一起学习。

文字及图片部分来源:https://maker.pro/raspberry-pi/tutorial/interfacing-soil-moisture-sensor-with-raspberry-pi

转发请标明来源。祝大家学派happy!

在树莓派上读取土壤湿度传感器读书-python代码实现及常见问题(全面简单易懂)的更多相关文章

  1. 在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)

    最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...

  2. 树莓派dht11,土壤湿度传感器,继电器的使用。树莓派云灌溉(二)

    关于传感器的一些说明 我的想法是这样的 我尽量用易于理解的语言去说我的想法 首先,土壤湿度传感器和dh11会获取数据,然后树莓派会处理这些数据,读出土壤温湿度和空气温湿度,并将这些数据上传到云服务器, ...

  3. 树莓派连接DHT11温湿度传感器(python)

    介绍 DHT11作为一个廉价配件,同时包含了温度.湿度传感器,而且,编码使用也非常简单. 本文介绍如果在树莓派中使用 DHT11,代码是Python.如果有任何疑问,欢迎在下面留言. 接线 VCC接5 ...

  4. Arduino与水泵实验+土壤湿度传感器

    1 水泵实验我们这里是使用的继电器控制的水泵,注意再实验的时候电池的电压不要超过6v,太大容易烧毁水泵,如果是长时间的使用水泵,要注意将水泵放入水中,这样可以达到给水泵降温的效果.1.全新5V继电器模 ...

  5. 树莓派上搭建基于Python+web.py+fastcgi+lighttpd的网站

    最近在网上淘了一个树莓派,什么是树莓派?这里是他的官方网站你可以去看看. 简单的说就是一块使用了ARM11的CPU,具有256MB或512MB内存的具有两个USB接口,一个RJ45接口,HDMI输出和 ...

  6. 在树莓派上用 python 做一个炫酷的天气预报

    教大家如何在树莓派上自己动手做一个天气预报.此次教程需要大家有一定的python 基础,没有也没关系,文末我会放出我已写好的代码供大家下载. 首先在开始之前 需要申请高德地图API,去高德地图官网注册 ...

  7. 在树莓派上用Python控制LED

    所需材料 一个已经安装配置好了的树莓派 连接控制树莓派所用的其他必须设备 200Ω电阻 x 8 led x 8 面包板及连接线若干 电路连接 电路图 按照电路图所示,在面包板上进行连接. 编写程序 安 ...

  8. 关于树莓派Pi2通过UART连接攀藤G5传感器的python

    1.准备工作:树莓派Pi2板子,攀藤G5传感器 关于树莓派40pin口网上很多,我们只了解与攀藤G5连接的问题 (1)攀藤G5pin1(VCC5v)要注意是5V,有很多板子接的是3V,而树莓派的pin ...

  9. 树莓派 连接 JY901(MPU9250) python 代码

    先说BUG,最近要做项目需要树莓派和陀螺仪,资金充足的话肯定是买一个硬件卡尔曼滤波的传感器类似JY901模块,资金不足的就买MPU6050. 网上关于MPU6050在树莓派上的代码还能用,关于JY90 ...

随机推荐

  1. 学习scrapy框架爬小说

    一.背景:近期学习python爬虫技术,感觉挺有趣.由于手动自制爬虫感觉效率低,了解到爬虫界有先进的工具可用,尝试学学scrapy爬虫框架的使用. 二.环境:centos7,python3.7,scr ...

  2. Maven本地仓库/中央仓库(阿里镜像)/JDK配置

    第一步打开你已经下载好的Maven,进入:根磁盘:\......\apache-maven-3.6.2\conf文件夹找到settings.xml文件(没有的可以自行创建一个同名的文件即可) 使用文本 ...

  3. Java实现 LeetCode 838 推多米诺(暴力模拟)

    838. 推多米诺 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌. 同样地, ...

  4. Java实现 LeetCode 811 子域名访问计数 (暴力)

    811. 子域名访问计数 一个网站域名,如"discuss.leetcode.com",包含了多个子域名.作为顶级域名,常用的有"com",下一级则有" ...

  5. (Java实现) 最佳调度问题

    题目描述 假设有n个任务由k个可并行工作的机器完成.完成任务i需要的时间为ti.试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早. 对任意给定的整数n和k,以及完成任务i需要的时 ...

  6. Java实现 LeetCode 638 大礼包(阅读理解题,DFS)

    638. 大礼包 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大礼包,每个大礼包以优惠的价格捆绑销售一组物品. 现给定每个物品的价格,每个大礼包包含物品的清单,以及待购物品清单.请输 ...

  7. Java实现 LeetCode 155 最小栈

    155. 最小栈 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) – 将元素 x 推入栈中. pop() – 删除栈顶的元素. top() – 获取 ...

  8. java实现扑克牌移动

    /* 下面代码模拟了一套扑克牌(初始排序 A~K,共 13 张)的操作过程. 操作过程是: 手里拿着这套扑克牌,从前面拿一张放在后面,再从前面拿一张放桌子上,再从前面拿一张放在后面,.... 如此循环 ...

  9. MAC抓包工具Charles安装及破解

    参考资料:https://juejin.im/post/5c0a430f51882516207d205d 下载 Charles官网下载安装包,下载成功后根据指示安装即可 官网地址:http://www ...

  10. JavaScript使用for循环和splice删除数组指定元素的注意点

    在JavaScript里可以结合for循环和splice来删除数组指定的元素.但是要注意删除元素后,数组索引会发生改变 示例 var arr = ["a","b" ...