树莓派DS18B20温度传感器
一.DS18B20温度传感器模块与树莓派的连接
二.使能内核一线协议驱动模块
三、Python读取DS18B20温度源码
iot@raspberrypi:~/ds18b20 $ vim ds18b20.py
#!/usr/bin/python
#-*- coding:utf-8 -*-
import glob
import time
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'
def read_rom():
name_file=device_folder+'/name'
f = open(name_file,'r')
return f.readline()
def read_temp_raw():
f = open(device_file, 'r')
lines = f.readlines()
f.close()
return lines
def read_temp():
lines = read_temp_raw()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
return temp_c
print(' DS19B20 get temperature: %3.3f ℃'% read_temp())
四、C程序读取DS18B20温度源码
iot@raspberrypi:~/ds18b20 $ vim ds18b20.c
#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("DS19B20 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));
strncat(w1_path, "/w1_slave", sizeof(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;
}