树莓派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;
}

 

posted @ 2021-03-03 16:31  一大堆豆子  阅读(546)  评论(0编辑  收藏  举报