RS485 土壤传感器(温度&湿度)

简介

该传感器适用于土壤温度以及水分的测量,5-30V宽电压供电,RS485输出,可检测土壤温度、湿度、电导率(EC),响应快,输出稳定,可搭配Arduino UNO R3与TTL转485扩展板,快速搭建测试。

土壤传感器防护等级为IP68,采用黑色阻燃环氧树脂真空灌装密封,探针材质选用316型不锈钢,具有防锈防水防腐蚀、耐盐碱腐蚀、耐长期电解,受土壤含盐量影响较小,可长期埋入土壤中,适用各种土质。

土壤传感器带有电导率自动温度补偿功能,无论环境如何变化,都能确保测量的准确性,广泛适用于科学实验、节水灌溉、温室大棚、花卉蔬菜、草地牧场、土壤速测、植物培养、粮食仓储及各种颗粒物含水量和温度的测量。

土壤电导率(EC)是土壤中盐的水平(盐度)。这些参数是土壤肥力和健康的重要指标,并最终影响植物。当土壤含盐量高时,即使土壤中的水分含量很高,盐分也会使植物难以吸收水分。这种情况最终会“烧毁”植物。在土壤湿度、温度和EC水平的最佳范围内,植物在其偏好的环境中生长得最好。种植者需要这些参数的数据,并了解需要采取什么行动来确保植物健康和更高的产量。

特点

  • 5-30V宽电压供电
  • RS485输出,可搭配Arduino使用
  • 带自动温度补偿,精度高,响应快,输出稳定
  • 不锈钢探针,可长期埋入土里或水里
  • 树脂真空灌装密封,IP68防护等级

技术规格

  • 供电电压:DC5-30V
  • 功耗:0.7W@24V
  • 输出方式:RS485
  • 检测参数:温度、湿度、电导率(EC)
  • 湿度参数
  • 量程:0-100%
  • 分辨率:0.1%
  • 精度:0-50%@±2%,50-100%@±3%
  • 温度参数
  • 量程:-40°C~+80°C
  • 分辨率:0.1°C
  • 精度:±0.5°C
  • EC参数
  • 量程:0-20000us/cm
  • 分辨率:1us/cm
  • 精度:0-10000us/cm@±3%FS,10000-20000us/cm@±5%FS
  • 温度补偿:内存温度补偿,补偿范围0-50°C
  • 防护等级:IP68
  • 探针材料:防腐特制电极
  • 密封材料:黑色阻燃环氧树脂
  • 工作温度:-40°C~+60°C
  • 线长:2m

引脚示意图

标号 名称 功能描述
棕线 VCC 电源输入正极,DC5-30V供电
黑线 GND 电源接地线
黄线 485-A RS485数据A线
蓝线 485-B RS485数据B线

尺寸图

尺寸图

通信协议

1、通讯基本参数

接口 编码 数据位 奇偶校验位 停止位 错误校验 波特率
RS485 8位二进制 8 1 CRC 2400bit/s、4800bit/s、9600 bit/s 可设,默认9600bit/s

2、数据帧格式定义

采用 ModBus-RTU 通讯规约,格式如下:

  • 初始结构 ≥4 字节的时间
  • 地址码 = 1 字节
  • 功能码 = 1 字节
  • 数据区 = N 字节
  • 错误校验 = 16 位 CRC 码
  • 结束结构 ≥4 字节的时间
  • 地址码:为传感器的地址,在通讯网络中是唯一的(出厂默认 0x01)。
  • 功能码:主机所发指令功能指示,本传感器只用到功能码 0x03(读取寄存器数据)。
  • 数据区:数据区是具体通讯数据,注意 16bits 数据高字节在前!
  • CRC 码:二字节的校验码。

主机问询帧结构:

地址码 功能码 寄存器起始地址 寄存器长度 校验码低位 校验码高位
1byte 1byte 2byte 2byte 1byte 1byte

从机应答帧结构:

地址码 功能码 有效字节数 数据一区 第二数据区 第N数据区 校验码
1byte 1byte 1byte 2byte 2byte 2byte 2byte

3、通讯协议示例及解释

举例:读取电导率温度水分三合一设备(地址 0x01)的电导率及温度湿度值

问询帧(16 进制):

地址码 功能码 寄存器起始地址 寄存器长度 校验码低位 校验码高位
0x01 0x03 0x00 0x00 0x00 0x03 0x05 0xCB

应答帧(16 进制):

地址码 功能码 返回有效字节数 湿度值 温度值 电导率值 校验码低位 校验码高位
0x01 0x03 0x06 0x02 0x92 0xFF 0x9B 0x03 0xE8 0xD8 0x0F

湿度计算:

  • 湿度:0292 H (十六进制)= 658 = 65.8%RH

温度计算:

  • 当温度低于 0 ℃ 时温度数据以补码的形式上传。
  • 温度:FF9B H(十六进制)= -101 => 温度 = -10.1°C

电导率计算:

  • 电导率:03E8 H (十六进制)= 1000 => 电导率 = 1000 μS/cm

4、寄存器地址

寄存器地址 PLC或组态地址 内容 操作 定义说明
0000H 40001(十进制) 含水率 只读 含水率实时值(扩大10倍)
0001H 40002(十进制) 温度值 只读 温度实时值(扩大10倍)
0002H 40003(十进制) 电导率 只读 电导率实时值
0003H 40004(十进制) 盐度 只读 盐度实时值
0004H 40005(十进制) 总溶解固体TDS 只读 TDS实时值
0022H 40035(十进制) 电导温度系数 读写 0-100对应0.0%-10.0% 默认0.0%
0023H 40036(十进制) 盐度系数 读写 0-100对应0.00-1.00 默认55(0.55)
0024H 40037(十进制) TDS系数 读写 0-100对应0.00-1.00 默认50(0.5)
0050H 40081(十进制) 温度校准值 读写 整数(扩大10倍)
0051H 40082(十进制) 含水率校准值 读写 整数(扩大10倍)
0052H 40083(十进制) 电导率校准值 读写 整数
07D0H 42001(十进制) 设备地址 读写 1-254(出厂默认1)
07D1H 42002(十进制) 设备波特率 读写 0代表2400 1代表4800 2代表9600

使用教程

准备

  • 硬件

Arduino UNO x1

TTL转RS485扩展板(DFR0259) x1

RS485土壤传感器(温度&湿度&EC) x1

  • 软件

Arduino IDE,点击下载 Arduino IDE

接线图

烧录代码前,请将扩展板的收发模式开关切换到AUTO,运行/编译开关切换到OFF,烧录代码后,运行/编译开关切换到ON,串口波特率选择9600

Arduino连接图

示例代码

uint8_t Com[8] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x03, 0x05, 0xCB };
float tem, hum;
int ec;
void setup() {
  Serial.begin(9600);  //初始化串口
}
void loop() {
  readHumitureEC();
  Serial.print("TEM = ");
  Serial.print(tem, 1);
  Serial.print(" °C  ");
  Serial.print("HUM = ");
  Serial.print(hum, 1);
  Serial.print(" %RH  ");
  Serial.print("EC = ");
  Serial.print(ec, 1);
  Serial.println(" us/cm ");
  delay(1000);
}
void readHumitureEC(void) {
  uint8_t Data[10] = { 0 };
  uint8_t ch = 0;
  bool flag = 1;
  while (flag) {
    delay(100);
    Serial.write(Com, 8);
    delay(10);
    if (readN(&ch, 1) == 1) {
      if (ch == 0x01) {
        Data[0] = ch;
        if (readN(&ch, 1) == 1) {
          if (ch == 0x03) {
            Data[1] = ch;
            if (readN(&ch, 1) == 1) {
              if (ch == 0x06) {
                Data[2] = ch;
                if (readN(&Data[3], 8) == 8) {
                  if (CRC16_2(Data, 9) == (Data[9] * 256 + Data[10])) {
                    hum = (Data[3] * 256 + Data[4]) / 10.00;
                    tem = (Data[5] * 256 + Data[6]) / 10.00;
                    ec = Data[7] * 256 + Data[8];
                    flag = 0;
                  }
                }
              }
            }
          }
        }
      }
    }
    Serial.flush();
  }
}

uint8_t readN(uint8_t *buf, size_t len) {
  size_t offset = 0, left = len;
  int16_t Tineout = 500;
  uint8_t *buffer = buf;
  long curr = millis();
  while (left) {
    if (Serial.available()) {
      buffer[offset] = Serial.read();
      offset++;
      left--;
    }
    if (millis() - curr > Tineout) {
      break;
    }
  }
  return offset;
}

unsigned int CRC16_2(unsigned char *buf, int len) {
  unsigned int crc = 0xFFFF;
  for (int pos = 0; pos < len; pos++) {
    crc ^= (unsigned int)buf[pos];
    for (int i = 8; i != 0; i--) {
      if ((crc & 0x0001) != 0) {
        crc >>= 1;
        crc ^= 0xA001;
      } else {
        crc >>= 1;
      }
    }
  }

  crc = ((crc & 0x00ff) << 8) | ((crc & 0xff00) >> 8);
  return crc;
}

结果:将土壤传感器插入土里,则串口打印出传感器检测到的温度值、湿度值与EC值。

安装使用方法

1、速测法

选定合适的测量地点,避开石块,确保钢针不会碰到坚硬的物体,按照所需测量深度抛开表层土,保持下面土壤原有的松紧程度,紧握传感器垂直插入土壤,插入时不可左右晃动,一个测点的小范围内建议多次测量求平均值。

速测法

2、埋地测量法

垂直挖直径>20cm 的坑,在既定的深度将传感器钢针水平插入坑壁,将坑填埋严实,稳定一段时间后,即可进行连续数天,数月乃至更长时间的测量和记录。
速测法

3、注意事项

  • 测量时钢针必须全部插入土壤里。
  • 避免强烈阳光直接照射到传感器上而导致温度过高,野外使用注意防雷击。
  • 勿暴力折弯钢针,勿用力拉拽传感器引出线,勿摔打或猛烈撞击传感器。
  • 传感器防护等级 IP68,可以将传感器整个泡在水中。
  • 由于在空气中存在射频电磁辐射,不宜长时间在空气中处于通电状态。

常见问题

无输出或输出错误存在可能的原因:

  • 电脑有 COM 口,选择的口不正确。
  • TTL转485模块运行/编程拨动开关选择不正确。
  • 波特率错误。
  • 485 总线有断开,或者 A、B 线接反。
  • 设备数量过多或布线太长,应就近供电。
  • 设备损坏。

还有客户对此产品有任何问题,欢迎通过 qq 或者论坛联系我们!
更多问题及有趣的应用,可以访问论坛进行查阅或发帖

更多

DFRobot 商城购买链接