一、ds18b20温度传感器简介
它的通信接口是采用了1-Wire(单总线协议),这是一种异步半双工串行电平信号的通信协议(通信双方可以各自约定通信速率互相传输数据,但必须分时复用一根数据线)。
二、ds18b20与树莓派的连接
所需材料:
ds18b20一个
树莓派一个
杜邦线三根
树莓派引脚图
连接方式
单总线的接口默认是GPIO 4(BCM),所以将温度传感器数据口接入此,然后分别接正负就行了。
树莓派 ds18b20
①------------------------VCC
②------------------------DQ
③------------------------GND
三、使能1-Wrie
配置内核启动后自动加载一线协议驱动
sudo raspi-config
然后选择第三个,回车
选择P7 1-Wire ,回车
确认后,重启树莓派
sudo reboot
查看是否使能了
lsmod | grep w1
进入相应文件查看温度值
上面的t=31125就是温度值了
接下来就是代码获取这个文件路径下的温度了。
四、代码实现
#include <string.h>
#include <errno.h>
#include <stdio.h>
#include <syslog.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
int get_temperature(float *temperature);
int main(int argc,char **argv)
{
float temperature;
int rv = 0;
rv = get_temperature(&temperature);
if( rv < 0 )
{
printf("get ds18b20 temperature error!!!\n");
return 1;
}
printf("get ds18b20 temperature successfully: %.3fC°\n",temperature);
return 0;
}
int get_temperature(float *temperature)
{
char w1_path[64]="/sys/bus/w1/devices/";
struct dirent *direntp = NULL;
DIR *dirp = NULL;
char chip_sn[32];
int found = 0;
char buf[128];
int temper_fd = -1;
char *ptr = NULL;
if(!temperature)
{
printf("Invalid input arguments\n");
return -1;
}
dirp = opendir(w1_path);
if(!dirp)
{
printf("Open folder %s failure: %s\n",w1_path,strerror(errno));
return -2;
}
while(NULL != (direntp=readdir(dirp)))
{
if( strstr(direntp->d_name,"28-"))
{
strncpy(chip_sn,direntp->d_name,sizeof(chip_sn));
found = 1;
}
}
closedir(dirp);
if(!found)
{
printf("Can not find ds18b20 chipset\n");
return -3;
}
strncat(w1_path,chip_sn,sizeof(w1_path)-strlen(w1_path));
strncat(w1_path,"/w1_slave",sizeof(w1_path)-strlen(w1_path));
if( (temper_fd = open(w1_path,O_RDONLY)) < 0)
{
printf("Open file failure: %s\n",strerror(errno));
perror("Open file failure");
return -4;
}
memset(buf,0,sizeof(buf));
if(read(temper_fd,buf,sizeof(buf)) < 0)
{
printf("Read data from fd: %d failure: %s\n",temper_fd,strerror(errno));
return -5;
}
ptr=strstr(buf,"t=");
if(!ptr)
{
printf("Can not find t= string\n");
return -6;
}
ptr += 2;
*temperature = atof(ptr)/1000;
close(temper_fd);
return 0;
}
运行结果如下: