简介
该传感器适用于土壤温度以及水分的测量,5-30V宽电压供电,RS485输出,可检测土壤温度、湿度、电导率(EC)、酸碱度(PH),响应快,输出稳定,可搭配Arduino UNO R3与TTL转485扩展板,快速搭建测试。
土壤传感器防护等级为IP68,采用黑色阻燃环氧树脂真空灌装密封,探针材质选用316型不锈钢,具有防锈防水防腐蚀、耐盐碱腐蚀、耐长期电解,受土壤含盐量影响较小,可长期埋入土壤中,适用各种土质。
土壤传感器带有电导率自动温度补偿功能,无论环境如何变化,都能确保测量的准确性,广泛适用于科学实验、节水灌溉、温室大棚、花卉蔬菜、草地牧场、土壤速测、植物培养、粮食仓储及各种颗粒物含水量和温度的测量。
土壤电导率(EC)是土壤中盐的水平(盐度)。这些参数是土壤肥力和健康的重要指标,并最终影响植物。当土壤含盐量高时,即使土壤中的水分含量很高,盐分也会使植物难以吸收水分。这种情况最终会“烧毁”植物。在土壤湿度、温度和EC水平的最佳范围内,植物在其偏好的环境中生长得最好。种植者需要这些参数的数据,并了解需要采取什么行动来确保植物健康和更高的产量。
土壤酸碱度, 又称“土壤反应”。它是土壤溶液的酸碱反应,主要取决于土壤溶液中氢离子的浓度,以PH值表示。PH值等于7的溶液为中性溶液;PH值小于7,为酸性反应;PH值大于7为碱性反应。
土壤酸碱度一般可分为以下几级:
PH值 土壤酸碱度
<4.5 极强酸性
4.5—5.5 强酸性
5.5—6.5 酸性
6.5—7.5 中性
7.5—8.5碱性
8.5—9.5 强碱性
>9.5 极强碱性
特点
- 5-30V宽电压供电
- RS485输出,可搭配Arduino使用
- 带自动温度补偿,精度高,响应快,输出稳定
- 不锈钢探针,可长期埋入土里或水里
- 树脂真空灌装密封,IP68防护等级
技术规格
- 供电电压:DC5-30V
- 功耗:0.5W@24V
- 输出方式:RS485
- 检测参数:温度、湿度、电导率(EC)、酸碱度(PH)
- 湿度参数
- 量程: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
- PH参数
- 量程:3-9PH
- 分辨率:0.1PH
- 防护等级:IP68
- 探针材料:防腐特制电极
- 密封材料:黑色阻燃环氧树脂
- 工作温度:-20°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、通讯协议示例及解释
举例:读取温度湿度ECPH四合一设备(地址 0x01)的参数值
问询帧(16 进制):
地址码 | 功能码 | 寄存器起始地址 | 寄存器长度 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|
0x01 | 0x03 | 0x00 0x00 | 0x00 0x04 | 0x44 | 0x09 |
应答帧(16 进制):
地址码 | 功能码 | 返回有效字节数 | 湿度值 | 温度值 | 电导率值 | PH值 | 校验码低位 | 校验码高位 |
---|---|---|---|---|---|---|---|---|
0x01 | 0x03 | 0x08 | 0x02 0x92 | 0xFF 0x9B | 0x03 0xE8 | 0x00 0x38 | 0x57 | 0xB6 |
湿度计算:
- 湿度:0292 H (十六进制)= 658 = 65.8%RH
温度计算:
- 当温度低于 0 ℃ 时温度数据以补码的形式上传。
- 温度:FF9B H(十六进制)= -101 => 温度 = -10.1°C
电导率计算:
- 电导率:03E8 H(十六进制)= 1000 => 电导率 = 1000 us/cm
PH计算:
- PH:0038 H(十六进制)= 56 => PH = 5.6
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(十进制) | 电导率校准值 | 读写 | 整数 |
0053H | 40084(十进制) | PH校准值 | 读写 | 整数 |
07D0H | 42001(十进制) | 设备地址 | 读写 | 1-254(出厂默认1) |
07D1H | 42002(十进制) | 设备波特率 | 读写 | 0代表2400 1代表4800 2代表9600 |
使用教程
准备
- 硬件
Arduino UNO x1
RS485土壤传感器(温度&湿度&EC&PH) x1
- 软件
Arduino IDE,点击下载 Arduino IDE
接线图
烧录代码前,请将扩展板的收发模式开关切换到AUTO,运行/编译开关切换到OFF,烧录代码后,运行/编译开关切换到ON,串口波特率选择9600
示例代码
uint8_t Com[8] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0x44, 0x09 };
float tem, hum, ph;
int ec;
void setup() {
Serial.begin(9600); //初始化串口
}
void loop() {
readHumitureECPH();
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.print(" us/cm ");
Serial.print("PH = ");
Serial.println(ph, 1);
delay(1000);
}
void readHumitureECPH(void) {
uint8_t Data[13] = { 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 == 0x08) {
Data[2] = ch;
if (readN(&Data[3], 10) == 10) {
if (CRC16_2(Data, 11) == (Data[11] * 256 + Data[12])) {
hum = (Data[3] * 256 + Data[4]) / 10.00;
tem = (Data[5] * 256 + Data[6]) / 10.00;
ec = Data[7] * 256 + Data[8];
ph = (Data[9] * 256 + Data[10]) /10.00;
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值、PH值。
安装使用方法
1、速测法
选定合适的测量地点,避开石块,确保钢针不会碰到坚硬的物体,按照所需测量深度抛开表层土,保持下面土壤原有的松紧程度,紧握传感器垂直插入土壤,插入时不可左右晃动,一个测点的小范围内建议多次测量求平均值。
2、埋地测量法
垂直挖直径>20cm 的坑,在既定的深度将传感器钢针水平插入坑壁,将坑填埋严实,稳定一段时间后,即可进行连续数天,数月乃至更长时间的测量和记录。
3、注意事项
- 测量时钢针必须全部插入土壤里。
- 避免强烈阳光直接照射到传感器上而导致温度过高,野外使用注意防雷击。
- 勿暴力折弯钢针,勿用力拉拽传感器引出线,勿摔打或猛烈撞击传感器。
- 传感器防护等级 IP68,可以将传感器整个泡在水中。
- 由于在空气中存在射频电磁辐射,不宜长时间在空气中处于通电状态。
常见问题
无输出或输出错误存在可能的原因:
- 电脑有 COM 口,选择的口不正确。
- TTL转485模块运行/编程拨动开关选择不正确。
- 波特率错误。
- 485 总线有断开,或者 A、B 线接反。
- 设备数量过多或布线太长,应就近供电。
- 设备损坏。
还有客户对此产品有任何问题,欢迎通过 qq 或者论坛联系我们!
更多问题及有趣的应用,可以访问论坛进行查阅或发帖