树莓派通过C语言读取ds18b20的温度值

    树莓派通过C语言读取ds18b20的温度值

    对于极客们,树莓派是上等的DIY神器;对于项目开发者,树莓派也不失为一种省时、省力的明智选择。因为有好多人在玩树莓派,所以其开源的资料比较多,好多东西我们可以拿来即用,不用重复造轮子。下面,就跟我学习一下怎么在树莓派上用C语言读取ds18b20的温度值。

    树莓派上的ds18b20驱动已经有人实现了,所以我们只需要去编写应用程序就OK啦!话说当年学的不咋地的Linux高编在这里居然用到了。

硬件准备:

树莓派(Raspberry Pi),我用的是二代的

DS18b20温度传感器 + 一个10K电阻(或直接买ds18b20模块,也就是店家帮你焊接好电阻了)

杜邦线(两头都是母的)

接线方式:

ds18b20的信号线连接树莓派的GPIO7


确认硬件连接是否正确,然后读取温度:

1,首先升级内核(如果版本太老,可能无法正常读ds18b20)

sudo apt-get update

sudo apt-get upgrade

2,挂载设备驱动,确认设备是否生效

sudo modprobe w1-gpio

sudo modprobe w1-therm

cd  /sys/bus/w1/devices/

ls


28-00000495db35就是外接的温度传感器设备,但并不是每个客户端都显示一样的,这个是传感器的序列号。

3,查看当前温度

cd  28-00000495db35

ls


cat  w1_slave


第二行的t=26187就是当前的温度值,要换算成摄氏度,除以1000,即当前温度为16187 / 1000=26.187摄氏度。


确定设备正常后,我们写代码,以后通过代码读取温度。


#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>

#define  BUFSIZE  128

int main(void)
{
	float temp;
	int i, j;
    int fd;
	int ret;

	char buf[BUFSIZE];
	char tempBuf[5];

	fd = open("/sys/bus/w1/devices/28-00000495db35/w1_slave", O_RDONLY); //以只读方式打开ds18b20设备文件

	if(-1 == fd){              //打开设备文件出错
		perror("open device file error");  //打印出错信息(原因)
		return 1;
	}

	while(1){
		ret = read(fd, buf, BUFSIZE);  //将设备文件中的内容读入buf中
		if(0 == ret){                  //返回0表示读文件结束
			break;	                   //跳出循环体
		}
		if(-1 == ret){                 //读文件出错
			if(errno == EINTR){        //出错是由中断引起的
				continue;	           //继续读文件
			}
			perror("read()");          //打印出错信息(原因)
			close(fd);                 //关闭文件
			return 1;
		}
	}

	for(i=0;i<sizeof(buf);i++){
		if(buf[i] == 't'){               //如果读到‘t’,说明后面马上出现温度值
			for(j=0;j<sizeof(tempBuf);j++){
				tempBuf[j] = buf[i+2+j]; //将温度值以字符串的形式写入tempBuf中
			}
		}	
	}

	temp = (float)atoi(tempBuf) / 1000;  //将字符串转换为浮点型温度数据

	printf("%.3f C\n",temp);             //打印出温度值

	close(fd);                           //关闭文件

	return 0;
}





猜你喜欢

转载自blog.csdn.net/u011708919/article/details/23338239