1 温湿度传感器使用概述
土壤温湿度传感器是将土壤水分和土壤温度传感器集中于一体,具有携带方便,密封,高精度等优点,是土壤墒情,土壤温度测量的理想选择。本文采用德国 Heraeus 公司进口 A 级 ST-1-PT1000传感器通过RS485转接板转换成TTL信号接在九联开发板的TTL 接口(ttyS01),从硬件上来讲完全可以接在开发板的485接口,但是目前切换USB还有点问题,所以先使用转接板后期再直接连接到485端口
。
1.1传感器RS485串口设置
标准 Modbus-RTU 协议,波特率:9600;校验位:无;数据位:8;停止位:1
1.2温湿度数据转换
土壤温湿度传感器在土壤饱和含水率范围内具有良好的线性特征,以下是典型的标定公式,用户可以参考使用,如果要获得更高精度,需进行二次标定。
1.3 温湿度串口数据协议
1.3.1 修改传感器地址
若传感器接收正确,数据按原路返回。
备注:如果忘记传感器的原地址,可以使用广播地址0XFE代替,使用0XFE时主机只能接一个从机,且返回地址仍为原地址,可以作为地址查询的方法。
1.3.2 查询传感器数据
查询传感器(地址为1)的数据(土壤温度,土壤湿度),主机→从机
若传感器接收正确,返回以下数据,从机→主机
PC机测试
实验之前可以先找个USB 转串口,先在PC机上做一些简单的协议测试,如下是使用ModeBusRTU调试工具查询传感器数据:
2 九联开发板和传感器的硬件连接
硬件清单:
1.九联开发板
2.485 温湿度传感器
3.12V传感器供电电源
4.485转TTL 小板子
5.杜邦线若干
温度传感器-> 485转TTL小板子 -> 九联开发板TTL 接口(ttySL0)
实物图连接如下
3 DEMO流程
本次实验包括了源码文件修改,编译,下载,上板测试。
3.1 源码文件解析及修改
移植仓库中的UART代码到开发板中,源代码仓库如下:
https://gitee.com/openharmony/vendor_unionman/tree/master/unionpi_tiger/sample/hardware/gpio
首先把uart的整个文件夹拷贝到某个目录下,我这里复制都openhamony/vendor/uniopi/unionpi_tiger/sample/hardware/下面,并在/openharmony/device/unionpi/a311d/BUILD.gn文件中增加该文件的路径。如下:
在main.c文件中根据自己的需要增加代码,我这里做的测试是给传感器发送一个查询数据的指令,然后把传感器返回的数据打印出来。
3.1.1 打开串口
在这里可以定义使用哪个串口
`#define UART_TTL_NAME "/dev/ttyS1"`
打开串口
char *uart_dev = UART_TTL_NAME;
fd = open(uart_dev, O_RDWR);
3.1.2 初始化串口设置
ret = uart_init(fd, 9600L)
int uart_init(int fd, int uartBaud)
{
set_baud(fd, conver_baudrate(uartBaud));
if (set_params(fd, 8L, 1, 'n')) {
printf("Set uart parameters fail.\n");
return -1;
}
return 0;
}
3.1.3 读写串口
串口的读写与普通文件一样,使用read,write函数
read(fd, buf ,8);
write(fd,buff,8);
main 修改demo
以下给出一个温湿度模块数据查询和显示的例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include "serial_uart.h"
static int fd;
void *_serial_input_task(void)
{
int i = 0;
int j = 0;
int ret = -1;
int buf = 0;
int recv[4] = {0};
char cmd_buf1[] = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B};
printf("temperature Sensor Ready!\n");
while (1) {
for (i = 0; i < 8; i++)
printf("%#X ", cmd_buf1[i]);
count = write(fd, cmd_buf1, 9);
if (count != 9) {
printf("send failed\n");
return -1;
}
for (i = 0; i < 9 ; i++) {
ret = read(fd, &buf, 1);
printf("%#X ", ret);
if (ret == -1) {
printf("data process error\n");
exit(0);
}
}
}
int main(int argc, char **argv)
{
char *uart_dev = UART_TTL_NAME;
int ret = -1;
fd = open(uart_dev, O_RDWR);
if (fd == -1) {
printf("open file error\n");
return ERR;
}
ret = uart_init(fd, 9600L);
if (ret == -1) {
printf("uart init error\n");
return ERR;
}
pthread_t pid_t;
pthread_create(&pid_t, NULL, (void *)_serial_input_task, 0);
while (1) {}
close(fd);
return 0;
}
3.2 编译,下载
3.3 测试
开发板上电之后串口进入/bin 目录下 执行./uart_test
程序启动之后会发送一串查询指令给传感器,并将接收到的数据打印出来,并从数据包中解析出温度和湿度的读值。
这是接到到的数据包
0X10X30X400XE400X1F0XFB0XCC
这是温度值
temprature now is0XE4
这是湿度值
humidity now is 0X1F
总结
本文主要使用了串口来查询温湿度传感器数据,主要包含的串口的读写功能测试,以及温度传感器的数据包解析。源码编译的要点基本再GPIO编译测试里面都有提到。另外还有个问题,串口原来的计划是使用485接口来调试,485串口需要切换到USB2.0,根据仓库里的说明并没有操作成功,这部分后面还需要再研究一下。
计划接下来的工作是把485传感器联动GPIO信号。GPIO外接继电器驱动用电设备。当温湿度超过设置的阈值触发用电设备工作。