本篇主要基于RT-Thread驱动DS18B20温度传感器。
一、硬件介绍
DS18B20是常用的数字温度传感器其输出的是数字信号具有体积小硬件开销低抗干扰能力强精度高的特点。
威廉希尔官方网站
性能描述
①、 独特的单线接口方式DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。
② 、测温范围 55℃+125℃固有测温误差注意不是分辨率这里之前是错误的1℃。
③、支持多点组网功能多个DS18B20可以并联在唯一的三线上最多只能并联8个实现多点测温如果数量过多会使供电电源电压过低从而造成信号传输的不稳定。
④、工作电源: 3.0-5.5V/DC 可以数据线寄生电源
⑤ 、在使用中不需要任何外围元件
⑥、 测量结果以9-12位数字量方式串行传送
⑦ 、不锈钢保护管直径 Φ6
⑧ 、适用于DN15-25, DN40-DN250各种介质工业管道和狭小空间设备测温
⑨、 标准安装螺纹 M10X1, M12X1.5, G1/2”任选
⑩ 、PVC电缆直接出线或德式球型接线盒出线,便于与其它电器设备连接。
二、驱动配置
刚好RT-Thread已经支持DS18B20的驱动所以在RT-Studio上只需要选择该驱动包即可。
同时记得打开sensor驱动框架
何谓sensor驱动框架
sensor为上层应用提供统一的标准接口open/close/read/controlsensor框架底层提供ops接口;featch_data/control,实际上使用rt-thread的sensor框架只需要对接这个接口就行然后注册设备应用层就可以访问了。
怎么打开RT-Studio如下图操作即可。
三、传感器读数据
static void read_temp(void)
{
struct rt_sensor_data sensor_data;
rt_size_t res;
if (flag == 0)
{
dev = rt_device_find("temp_ds18b20");
if (dev == RT_NULL)
{
rt_kprintf("Can't find temp_ds18b20 device\\n");
return;
}
if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
{
rt_kprintf("open device failed!\\n");
return;
}
rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)100);
flag = 1;
}
//while (1)
{
res = rt_device_read(dev, 0, &sensor_data, 1);
if (res != 1)
{
rt_kprintf("read data failed!size is %d\\n", res);
rt_device_close(dev);
return;
}
else
{
if (sensor_data.data.temp >= 0)
{
rt_kprintf("temp:%3d.%dC, timestamp:%5d\\n",
sensor_data.data.temp / 10,
sensor_data.data.temp % 10,
sensor_data.timestamp);
}
else
{
rt_kprintf("temp:-%2d.%dC, timestamp:%5d\\n",
abs(sensor_data.data.temp / 10),
abs(sensor_data.data.temp % 10),
sensor_data.timestamp);
}
}
}
}
MSH_CMD_EXPORT(read_temp, read temp);
之后保存并编译下载到正点原子STM32探索者V3开发板。
四、运行&测试
启动后上电log打印如下
\\ | /
- RT - Thread Operating System
/ | \\ 4.1.0 build May 10 2023 22:54:46
2006 - 2022 Copyright by RT-Thread team
[32m[I/sensor] rt_sensor[temp_ds18b20] init success[0m
list_device
device type ref count
temp_ds1 Sensor Device 0
uart1 Character Device 2
pin Miscellaneous Device 0
msh >
敲入msh cmd
read_temp
temp: 23.8C, timestamp:10604
msh >
msh >read_temp
temp: 23.9C, timestamp:11804
msh >
msh >read_temp
temp: 24.0C, timestamp:14818
msh >
msh >read_temp
temp: 23.9C, timestamp:19560
最后来一张真相。