树莓派与DS18B20获取环境温度(Linux)

  • 前言
  • 一、硬件准备
    • 1.1 树莓派4B
    • 1.2 DS18B20温湿度传感器
    • 1.4 项目展示效果
  • 二、软件准备
    • 2.1 Vim(Linux)
    • 2.2 SecureCRT(window)
  • 三、操作和源码展示
  • 四、总结

注:本文系湛江市岭南师范学院物联网俱乐部原创部分训练项目,转载请保留声明。

前言

在上次的教程中已经教大家如何使用文件IO系统调用、文件夹操作系统调用和文件拷贝,这些知识点将会在本次小项目中发挥得淋漓尽致。对于极客们,树莓派是上等的DIY神器;对于项目开发者,树莓派也不失为一种省时、省力的明智选择。很多爱好者在玩树莓派,所以其开源的资料比较多,好多东西我们可以拿来即用,不用重复造轮子。下面,请跟我我学习一下怎么在树莓派上用C语言读取ds18b20的温度值。

一、硬件准备

1.1 树莓派4B


1.2 DS18B20温湿度传感器

1.4 项目展示效果

二、软件准备

2.1 Vim(Linux)

sudo apt-get install vim

2.2 SecureCRT(window)

参考链接:https://blog.51cto.com/linuxguest/392248

三、操作和源码展示

a)接线

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

sudo apt-get update
sudo apt-get upgrade

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

sudo modprobe w1-gpio
sudo modprobe w1-therm
cd  /sys/bus/w1/devices/
ls


①每个DS18B20温度传感器的序列号不同,以下代码虽然可以快速读取温度,并且逻辑也不难,但是非常局限,源码初级版本:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>#define buffsize 1024int main(void)
{float temp;int i_num,j_num;int fd=-1;int rv=-1;char message_buff[buffsize];char temp_buff[5];fd=open("/sys/bus/w1/devices/28-3c01d075b607/w1_slave",O_RDONLY);if(fd < 0){perror("打开文件失败\n");return 0;}while(1){lseek(fd,0,SEEK_SET);memset(message_buff,0,sizeof(message_buff));rv=read(fd,message_buff,sizeof(message_buff));if(rv < 0){printf("Read data from file failure:%s\n",strerror(errno));continue;}if(rv >= 0){printf("Read %d bytes data from files:%s\n",rv,message_buff);break;}}for(i_num=0;i_num<sizeof(message_buff);i_num++){if(message_buff[i_num]=='t'){for(j_num=0;j_num<sizeof(temp_buff);j_num++){temp_buff[j_num]=message_buff[i_num+2+j_num];   }}  } temp=(float)atoi(temp_buff)/1000;printf("%.3f℃\n",temp);goto cleanup;cleanup:close(fd);return 0;}

效果图:

②如果想做到树莓派读取任意一个DS18B20温度传感器的值,但是以下这份源码难度稍微高点,需要用到结构体指针、strstr()、strcpy()和strncat()这几个知识点,源码高级版本如下:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>int DS18B20_get_temperature(float *temp);
#define buffsize 1024int 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 failure:%f ℃\n",TEMP);return 0;
}int DS18B20_get_temperature(float *temp)
{char             w1_path[50] = "/sys/bus/w1/devices/";char             w2_path[15] = "/w1_slave";char             chip[20];DIR              *dirp;struct dirent    *direntp;int              found = 0;int i_num,j_num;int fd=-1;int rv=-1;char message_buff[buffsize];char temp_buff[5];if(!temp){return -1;}if((dirp=opendir(w1_path))==NULL)//dirp指向w1_path路径下的文件夹{printf("opendir error:%s\n",strerror(errno));return -2;}printf("opendir sucess!\n");while((direntp=readdir(dirp))!=NULL)//direntp为结构体指针,指向dirp指向w1_path路径下的文件夹{if(strstr(direntp->d_name,"28-"))//这里是将结构体里面的d_name,指向dirp指向w1_path路径下的文件夹“28-”这个文件夹,这个时候可以获取DS18B20的序列号{strcpy(chip,direntp->d_name);//这里是将结构体里面d_name所代表的序列号给chipfound = 1;break;}    }closedir(dirp);if(!found){printf("Can not find ds18b20 in %s\n",w1_path);return -3;}strncat(w1_path,chip,strlen(chip));printf("w1_path:%s\n",w1_path);strncat(w1_path,w2_path,strlen(w2_path));printf("w1_path:%s\n",w1_path);fd=open(w1_path,O_RDONLY);if(fd < 0){perror("打开文件失败\n");return 0;}lseek(fd,0,SEEK_SET);memset(message_buff,0,sizeof(message_buff));rv=read(fd,message_buff,sizeof(message_buff));if(rv < 0){printf("Read data from file failure:%s\n",strerror(errno));}if(rv >= 0){printf("Read %d bytes data from files:%s\n",rv,message_buff);}for(i_num=0;i_num<sizeof(message_buff);i_num++){if(message_buff[i_num]=='t'){for(j_num=0;j_num<sizeof(temp_buff);j_num++){temp_buff[j_num]=message_buff[i_num+2+j_num];   }}  } *temp=(float)atoi(temp_buff)/1000;printf("%.3f℃\n",*temp);goto cleanup;cleanup:close(fd);return 0;
}

效果图:

提示:

(1)strstr()
描述
C 库函数 char *strstr(const char *haystack, const char *needle) 在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。声明
下面是 strstr() 函数的声明。
char *strstr(const char *haystack, const char *needle)参数
haystack -- 要被检索的 C 字符串。
needle -- 在 haystack 字符串内要搜索的小字符串。返回值
该函数返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。(2)strcpy()
描述
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。声明
下面是 strcpy() 函数的声明。
char *strcpy(char *dest, const char *src)参数
dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。返回值
该函数返回一个指向最终的目标字符串 dest 的指针。(3)strncat()
描述
C 库函数 char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。声明
下面是 strncat() 函数的声明。
char *strncat(char *dest, const char *src, size_t n)参数
dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
src -- 要追加的字符串。
n -- 要追加的最大字符数。返回值
该函数返回一个指向最终的目标字符串 dest 的指针。

四、总结

学习总是从简单到难,写代码也是如此,先实现一个功能,再去实现下一个功能,然后进行整合,最后进行优化,一份优质的源码由此诞生。

树莓派与DS18B20获取环境温度(Linux)相关推荐

  1. 树莓派下DS18B20获取实时温度

    文章目录 1. DS18B20温度传感器 2. DS18B20安装及配置 3.基础代码逻辑分析 3.1 逻辑分析 3.2 阶段代码示例 4. 代码及运行结果 4.1 全部代码 4.1 运行结果 1. ...

  2. 树莓派控制DS18B20温度传感器

    DS18B20是一种常见的数字温度传感器,其控制命令和数据都是以数字信号的方式输入输出,它的通信接口采用的是1-Wire(单总线).1-Wire是一种半双工异步的通讯协议(通信双方可以各自约定通信速率 ...

  3. 极智读书 | 《树莓派开始,玩转Linux》读书分享

        感谢杭州地铁六号线,这里有我大把的美好读书时间.     这次要分享的书是<树莓派开始,玩转Linux>. 书简介     先上封面:     树莓派是我三年前刚接触硬件入手的一个 ...

  4. 树莓派4B Raspbian系统常用Linux 命令及快捷键

    2021SC@SDUSC 命令在哪里输入? 通过 SSH 客户端登录你的树莓派,或者进入树莓派的桌面运行终端程序,接下来就可以输入命令了. 什么是 sudo 命令? 在一行命令之前加上 sudo,表示 ...

  5. 树莓派-利用DS18B20检测温度

    一.DS18B20概述与连接 DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点.这里不对DS18B20进行详细描述. 传感器的引脚有三个: ...

  6. 树莓派+温度传感器DS18B20

    作者:陈拓chentuo@ms.xab.ac.cn 2018.05.28/2018.06.01 0.  概述 用树莓派读取DS18B20温度,上传到物联网平台. 1.  准备 1.1 硬件 我用树莓派 ...

  7. 树莓派与DS18B20温度传感器模块的使用

    好久不见鸭,时隔半年,树莓派菜鸟再次写起博客 树莓派与DS18B20温度传感器模块的使用 其实树莓派内置了驱动文件,可以直接通过一些命令读取温度传感器的温度,所以使用起来很简单,下面来示范一下. 所用 ...

  8. 《树莓派学习指南(基于Linux)》——第 2 章 开始探索 2.1 欢迎使用LXDE

    本节书摘来自异步社区<树莓派学习指南(基于Linux)>一书中的第2章,第2.1节,作者[英]Peter Membrey ,[澳]David Hows ,译者 张志博,孙峻文,更多章节内容 ...

  9. 树莓派4直接运行linux,树莓派4最小化安装Linux

    树莓派4最小化安装Linux toc 1.本文目的 Raspberry Pi 4 Model B发布了半年了,其强大的性能与低廉的价格使得其非常的热门. 下面来看一下主要的功能 1.5GHz 4核心6 ...

最新文章

  1. microsoft visual sourcesafe explorer 获取不了文件夹的解决方法
  2. 我如何看Spring5?
  3. .NET Core全新的配置管理[共9篇]
  4. 计算机与艺术就业怎样,就业报告:这些艺术类好就业,这些难就业!
  5. 汇编语言-王爽 随书源码、检测点、实验答案
  6. linux 改成utc时间_深度操作系统UTC时间设置怎样改?
  7. [转载] 七龙珠第一部——第020话 修行的威力
  8. 【解析】.NET中代理服务器WebProxy的各种用法
  9. postman下载excel出现乱码
  10. 再谈PHP从入门到精通需要几年
  11. html播放器参数,sewise HTML5开源播放器参数说明
  12. 在线教育数据分析实战项目案例
  13. 密码学的安全性浅析-3
  14. 前端:注册校验页面(html+css+javascript)
  15. 归并排序(C语言实现)
  16. 浙江有计算机学校吗,浙江2021年哪里有计算机学校
  17. BNET通信区块链项目CEO刘建军受邀参加2018“区块链共识大会”
  18. esp32,基于阿里云平台,配置实现Node.js SDK接入示例出现description: ‘Failed to authenticate: 4‘ BUG
  19. 给宝宝起名,您重视了吗?
  20. 塔望食业洞察丨方便速食行业市场现状、消费趋势、品牌策略分析

热门文章

  1. 矩阵变换:矩阵是怎样变换向量的
  2. VPP学习(二)VPP安装
  3. 超详细Redis入门教程
  4. strtotime那些事
  5. Mysql Mac 免安装教程
  6. java开发环境搭建(一)
  7. 抽奖转盘,实现后台概率控制
  8. 合理使用DTO(Data Transfer Object)
  9. mysql也有dblink
  10. 轻量级rpc框架Hessian