From 38bdcfe45ea89f6e94b902425e89858c86689b45 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Fri, 31 Aug 2018 18:30:57 +0800 Subject: [PATCH] add ds18b20 python and C source code --- program/ds18b20/ds18b20.c | 93 +++++++++++++++++++++++++++++++ program/ds18b20/ds18b20.py | 37 ++++++++++++ 2 files changed, 130 insertions(+), 0 deletions(-) diff --git a/program/ds18b20/ds18b20.c b/program/ds18b20/ds18b20.c new file mode 100644 index 0000000..c04d69b --- /dev/null +++ b/program/ds18b20/ds18b20.c @@ -0,0 +1,93 @@ +#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; +} + diff --git a/program/ds18b20/ds18b20.py b/program/ds18b20/ds18b20.py new file mode 100644 index 0000000..31f1f8b --- /dev/null +++ b/program/ds18b20/ds18b20.py @@ -0,0 +1,37 @@ +#!/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()) + -- Gitblit v1.9.1