目录
一、DS18B20温度传感器与树莓派的连接
二、获取温度代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <errno.h>
int ds18b20_get_temperature(float *temp);
int main(int argc, char *argv[])
{
float temp;
if( ds18b20_get_temperature(&temp) < 0 )
{
printf("ERROR: ds18b20 get temprature failure\n");
return 1;
}
printf("DS18B20 get temperature: %f ℃\n", temp);
return 0;
}
int ds18b20_get_temperature(float *temp)
{
char w1_path[50] = "/sys/bus/w1/devices/";
char chip[20];
char buf[128];
DIR *dirp;
struct dirent *direntp;
int fd =-1;
char *ptr;
float value;
int found = 0;
if( !temp )
{
return -1;
}
if((dirp = opendir(w1_path)) == NULL)
{
printf("opendir error: %s\n", strerror(errno));
return -2;
}
while((direntp = readdir(dirp)) != NULL)
{
if(strstr(direntp->d_name,"28-"))
{
strcpy(chip,direntp->d_name);found = 1;
}
}
closedir(dirp);
if( !found )
{
printf("Can not find ds18b20 in %s\n", w1_path);
return -3;
}
strncat(w1_path, chip, sizeof(w1_path)-strlen(w1_path));
strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path));
if( (fd=open(w1_path, O_RDONLY)) < 0 )
{
printf("open %s error: %s\n", w1_path, strerror(errno));
return -4;
}
if(read(fd, buf, sizeof(buf)) < 0)
{
printf("read %s error: %s\n", w1_path, strerror(errno));
return -5;
}
ptr = strstr(buf, "t=")+2;
if( !ptr )
{
printf("ERROR: Can not get temperature\n");
return -6;
}
*temp = atof(ptr)/1000;
return 0;
}