SDI-12传感器数据采集
1. SDI-12传感器接线。
VOUT1:+12V
GND:电压负极
SDI:SDI-12数据线
2. 配置中选择SDI-12传感器,此处使员的是SDI-12一体式的温湿度气压传感器,地址为‘0’也就是十进制48。

勾选对应的传感器并修改地址
需要注意的是,SDI-12协议的通讯地址为ASCII编码的0-9 A-Z a-z范围,需要转换为对应的十进制数据。
表:SDI-12传感器地址与RTU地址对应表
SDI-12地址 | RTU中传感器地址 |
0 | 48 |
1 | 49 |
2 | 50 |
3 | 51 |
4 | 52 |
5 | 53 |
6 | 54 |
7 | 55 |
8 | 56 |
9 | 57 |
A | 65 |
… | … |
Z | 90 |
a | 97 |
… | … |
z | 122 |
3. 采集数据。
设置好RTU之后会定时采集数据
收到的数据与调试信息如下:
0-0:13:58.423 [INFO] 接收数据长度:29->0+1.685+27.0+0.4735+100.712
0-0:13:58.425 [INFO] 温度:27.000000
0-0:13:58.427 [INFO] 湿度:0.473500
0-0:13:58.428 [INFO] 气压:100.711998

上位机上采集的数据
4. SDI-12采集数据的命令
SDI12_SendBreak(); //发送唤醒
sprintf(CmdBuff, "%cM!", (char)RH_GetSensorAddr(num)); //发送0M!
if (SDI12_SendCmdAndResponse(/*"0M!"*/CmdBuff, &pData) > 0) //发送采集命令
{
if (SDI12_WaitResponse(2000, &pData) > 0) //等待响应,就是采集完成
{
sprintf(CmdBuff, "%cD0!", (char)RH_GetSensorAddr(num)); //发送0D0!
if (SDI12_SendCmdAndResponse(/*"0D0!"*/CmdBuff, &pData) > 0)//发送读取数据命令
{
if (TRUE == GetTempData((char*)pData, pSensorData))
{
error = SENSORS_OK;
break;
}
else
{
error = SENSORS_INVALID;
}
}
}
}
首先发送break唤醒设备,然后发送0M!开始采集数据,等待数据采集完成后,发送0D0!读取数据,之后就可以收到数据的响应,并进行解析。
5. SDI-12简介
SDI-12数据记录器和传感器通过数据线交换ASCII码来进行通讯。数据记录器向数据线上发出中断唤醒传感器,数据线上中断持续时间须大于12毫秒。数据记录器发送一个指令。 传感器返回一个相应的响应, 一个指令对应一个相应的传感器。 每个指令的第一个字符对应于记录器需要与之通讯的传感器地址。SDI-12 总线上的其他传感器不响应此指令继续处于低功率待机状态。当数据记录器向一个传感器发出开始测量指令,记录器在这台传感器的数据收集完成前不和其他传感器之间进行通讯。