【物联网初探】- 08 - ESP32 操作电容式土壤湿度传感器(Arduino IDE)

本文介绍如何使用ESP32与电容式土壤湿度传感器进行土壤湿度监测,并通过UDP传输数据。包括硬件接线、传感器读数原理及标定方法,提供完整代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 硬件、接线、环境配置

2. 电容式土壤湿度传感器 (arduino)

  • 硬件外观,某宝购入,挑了一个便宜的,4.75元一个,宽压 DC 3.3 ~ 5.5 V 均可。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aaVsmMs3-1648450550579)(.assets/image-20220328103726056.png)]

  • 参考资料 :电容式湿度传感器 - DFROBOT,该文档讲解非常详细。

3. ESP32 与电容式土壤湿度传感器

3.1 接线
  • 湿度传感器的板子上一共出来三根线,VCC 和 GND 正常接供电和接地即可,我这个传感器 3.3V 和 5V 输入都可以。

  • 重点就是数据输出的那根线,接一个不用的 GPIO 口即可,注意避开有特殊功能的口,接口定义参见 01 篇博客,这里我连接了 GPIO 4 ,对应我板子上标识的 G4 (这个 ESP32 的标识可能与你的不同,请参照你自己的电路图确定 GPIO 号),这里注意,如果同时使用 wifi 可能会有 GPIO 口冲突问题,简单的解决方法就是换不冲突的口来读,见 3.4。

    在这里插入图片描述

3.2 湿度数据读取
  • 只需利用 analogRead() 函数,读取该 GPIO 口上的模拟数据。

  • 请注意,该数据并不是相对湿度,而是一个参考值,这里引用 dfrobot 官网的一段解释

    问题:为什么我们不能用防水的相对湿度传感器去测量土壤湿度?

    解释:土壤湿度的定义是取1公斤土样,彻底烘干,减少的重量(水的重量)与1公斤的比值成为土壤湿度。空气相对湿度的定义是当前温度下的绝对湿度与当前温度下的饱和湿度的百分比。综上土壤湿度跟空气湿度不是一个概念,也不是一个数量级,土壤湿度10%时土壤中空气的湿度已经100%了。注意:利用防水型相对湿度传感器,将其埋在土壤里是不会损坏的,即使带电再水里煮也不会损坏,但当面对湿度稍大的土壤,土壤中空气湿度会长期是100%,测量就失去了意义。

  • 极简代码

    void setup() {
      Serial.begin(9600); 
    }
    void loop() {
      Serial.println(analogRead(4));//湿度传感器接ESP32上的GPIO号
      delay(100);
    }
    
3.3 湿度传感器标定 Why , What , How
3.3.1 为什么要标定
  • 在 3.2 的解释基础上,我们明确了该传感器只能根据电容感应原理输出一个数值,而不同的土壤湿度会影响电容,导致不同的输出数据,虽然我们无法得知准确的土壤湿度数据,但是我们能根据测量值来定性的得知当前土壤相对的湿度关系。
3.3.2 标定什么
  • 标定的是该传感器在 干燥环境下的读数 ,和 潮湿环境下的读数 ,那么从植物浇水的角度来讲,我们可以在植物土壤比较干燥的情况下测一次读数,然后在浇透水之后测一次,以这两次的数值为干、湿的参考基准,然后设置一个相对湿度的对应关系函数。
3.3.3 标定流程
  • **参考 电容式湿度传感器 - DFROBOT 文档中对该传感器的标定建议,我们采用 空气中的读数水中的读数 ,作为 干、湿的参考区间 ,步骤如下:

    • 首先,烧录读取传感器数据的代码,参考 3.2 极简代码即可,并打开 Arduino 上的串口监视器。

    • 空气中观察读数,我手头这个传感器的读数大约稳定在 2590

      在这里插入图片描述

  • 把传感器下半部分插入水中,观察读数,大约稳定在 1090,至此我们就获得了两个极值。

    在这里插入图片描述

3.3.4 确定函数对应关系
  • 从上述测量值我们可以看出,模拟输出的数值与湿度是成反比的,我们可以根据两次测量值构造一个简单的线性函数,实际上湿度与电容式传感器测量值不一定是线性关系,如果想要得出稍微准确的对应关系,应该在不同湿度的土壤中做多次试验来拟合曲线。

  • 这里,我们就理想化的认为它符合线性关系,那么读数 1090 记为 c m a x c_{max} cmax , 对应土壤湿度 100% 记为 m m a x m_{max} mmax; 读数 2590 记为 c m i n c_{min} cmin ,对应土壤湿度 0% 记为 m m i n m_{min} mmin,当前土壤含水量为 m c u r m_{cur} mcur,ESP32 读数为 c c u r c_{cur} ccur,构造线性函数如式(1):
    m c u r = ( c c u r − c m i n ) ∗ ( m m a x − m m i n ) ( c m a x − c m i n ) (1) m_{cur} = (c_{cur} - c_{min})* \frac{(m_{max}-m_{min})}{(c_{max}-c_{min})} \tag 1 mcur=(ccurcmin)(cmaxcmin)(mmaxmmin)(1)

3.3.5 插入土壤深度
  • 推荐的插入深度如下图,绿色区间为建议的深度,不可越过红色线。

    在这里插入图片描述

3.4 ESP32 土壤湿度测量 UDP 传输例子
  • wifi 与 adc 冲突问题,目前我偷懒解决,换了一个不冲突的 pin 口就好了,之前的 GPIO 4 无法读取数据。

  • 例程代码

    #include <WiFi.h>
    
    const char *ssid = "***";
    const char *password = "***";
    float c_min =  2590.0;  //readings in air
    float c_max = 1090.0;   //readings in water
    float m_min = 0.0;      //min soil moisture
    float m_max = 100.0;    //max soil moisture
    const int m_Pin = 32;   //与wifi不冲突的pin
    
    WiFiUDP Udp;
    IPAddress remote_IP(192, 168, 1, 22);
    unsigned int remoteUdpPort = 6060;  // 自定义远程监听端口
    
    void setup()
    {
      Serial.begin(9600);
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED)
      {
        delay(200);
        Serial.print(".");
      }
      Serial.println("Connected");
      Serial.print("IP Address:");
      Serial.println(WiFi.localIP());
    }
    
    void loop()
    {
      Udp.beginPacket(remote_IP, remoteUdpPort);//配置远端ip地址和端口
      int c_cur = analogRead(m_Pin);//读取GPIO上的模拟数据
      int m_cur = (c_cur - c_min) * (m_max - m_min) / (c_max - c_min);//公式(1)
      String str_m_cur(m_cur);
      Udp.println(str_m_cur);//把数据写入发送缓冲区
      Udp.endPacket();//发送数据
      delay(1000);
    }
    
  • 测试结果正常,空气中 UDP 远端收到 0,水中收到 100 。

基于RS485的电容式土壤湿度和温度传感器概述: 电容式土壤湿度传感器通过Modbus通过RS485连接,并且提供温度读数。该无接触电容式土壤湿度传感器,是我的I2C土壤水分传感器(链接:https://www.cirmall.com/circuit/6457/detail?3)的延续。传感器的这种特殊版本适用于需要长电缆运行的更专业的安装。它增加了本地电压调节器,以减轻电压降和RS485收发器,以适应长电线,也反向极性,并增加额外的ESD保护等级。 基于RS485的电容式土壤湿度和温度传感器实物展示: 基于RS485的电容式土壤湿度和温度传感器主要特点: 电容土壤湿度感测 温度感应 温度稳定性好 良好的稳定性与功率变化 适用于长电缆运行 使用工业Modbus协议 无接触电容式RS485土壤湿度传感器技术参数: 电源电压-5V 总线可以在3V和5V上运行 默认串行设置:19200,8位帧,无奇偶校验,2个停止位 默认Modbus地址:1 电流消耗:有效:9mA,深度睡眠:11uA 基于RS485的电容式土壤湿度和温度传感器工作原理: 传感器进行周期性测量(默认情况下每500ms一次),通过写入Modbus寄存器之一可以更新测量之间的延迟。测量结果保存在特定的Modbus寄存器中,除非传感器处于深度睡眠状态,否则可以由主机读取。 通过写入几秒钟进入深度睡眠进入特殊的睡眠寄存器。传感器将收发器和所有外围设备置于最低可能的功耗模式,并在指定的时间内睡眠。睡眠后,传感器将唤醒,开始测量,并在总线上可用,直到下一个睡眠命令。 串行通信参数可以通过写入相关寄存器来更新波特率,奇偶校验位和地址。如果写入任何一个寄存器,传感器将重置并引导新参数。 基于RS485的电容式土壤湿度和温度传感器如何解读读数? 水分值是相对的。意思是,更多的水分会给你更高的阅读量,更少的水分 - 读数更低。由于不同类型的土壤的读数会有所不同,因此可以将其校准为土壤中的水量。 水分有些线性。我在运输前测试所有传感器,并在空闲空气中放置约292个。 温度由传感器主体上的热敏电阻测量。计算的绝对测量精度优于2%。返回值在十分之一摄氏度。即,值252将意味着25.2°C。 基于RS485的电容式土壤湿度和温度传感器控制器支持 只要您拥有RS485收发器,传感器就可以与任何支持串行通信的控制器正常工作。许多微处理器系列都有很多Modbus库。尝试传感器的最简单的方法是使用丰富而便宜的USB至RS485加密狗,并将其连接到Raspberry pi或甚至直接连接到计算机。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值