前言
这次使用C语言来实现树莓派读取DS18B20测量的温度,加深一下对文件I/O的理解
DS18B20是一个比较常用的温度传感器,采用单总线控制,以前用单片机编程控制时严格按照单总线的时序控制,今天来看看在linux系统下如何通过DS18B20来获取温度信息。
一、实验准备
1、硬件准备
硬件 | 数量 |
---|---|
Raspberry 4B | 1 |
DS18B20 温度传感器 | 1 |
杜邦线 | 若干 |
2、软件准备
在开始之前,要使能树莓派内核的单总线协议驱动模块(1-Wire)
具体操作如下
sudo raspi-config
单总线的接口默认是GPIO 4(BCM),使用默认接口的话可以忽略下面更换引脚的操作
若想更换自己选择的端口,则需要在 /boot/config.txt 文件的最后那行中加上 “,gpiopin=你想要的端口”。
vim /boot/config.txt
在最后一行添加以下内容,这里的 gpiopin = 4 是采用BCM GPIO的标准。
如果是模块化的DS18B20,则添加以下内容【因为模块中已包含上拉电阻】
dtoverlay=w1-gpio, gpiopin=4
如果是单独的一个DS18B20芯片【也就是普通直插三极管的样子】
dtoverlay=w1-gpio-pullup, gpiopin=4
最后重启系统
sudo reboot
确认系统有自动加载单总线协议的驱动模块:
lsmod | grep w1
以下为正常加载
二、实现过程
配置好单总线的驱动协议模块后,将DS18B20接上树莓派
Raspberry Pi | DS18B20 |
---|---|
3.3V | VCC |
GND | GND |
4 (BCM) | DQ |
接上树莓派后,可以在 /sys/bus/w1/devices/ 目录下找到一个28-xxxxxx的文件夹(xxxxxxx为该DS18B20芯片的序列号)
该文件夹存放 DS18B20 的数据信息
DS18B20测量的温度数据存放在该文件夹的 w1_slave 文件中。
从图中看出,这时DS18B20测量的温度值为 31.562 ℃
1、找该DS18B20芯片的设备文件夹
- ①、打开 “/sys/bus/w1/devices/” 这个文件夹,并让dirp指向该文件夹
- ②、从该文件夹中,逐个找 “ 文件名中包含有 28- 的文件 ”
- ③、找到则将文件夹名复制给字符数组 dir_name
- ③、找不到则报错,退出函数
char path[50] = "/sys/bus/w1/devices/";
//打开文件夹"/sys/bus/w1/devices/"
if ((dirp = opendir(path)) == NULL)
{
printf("ERROR: Open Directory '%s' Failure: %s\n", path, strerror(errno));
return -1;
}
printf("Open Directory '%s' Successfully\n", path);
//在文件夹中找DS18B20的文件夹28-xx
while ((direntp = readdir(dirp)) != NULL)
{
if (strstr(direntp->d_name, "28-") != NULL)
{
strncpy(dir_name, direntp->d_name, strlen(direntp->d_name));
printf("Find file: %s\n", dir_name)