ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:118.63KB ,
资源ID:25034962      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25034962.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

中职扩展资源包资料树莓派系列教程14单总线控制DS18B20.docx

1、中职扩展资源包资料树莓派系列教程14单总线控制DS18B20DS18B20是一个比较常用的温度传感器,采用单总线控制,以前用单片机编程控制时严格按照单总线的时序控制,今天来看看在linux系统下如何控制DS18B20,体验一下在linux世界,一切都是文件。一、修改配置文件1sudo vi /boot/config.txt(注:运行sudoraspi-config实际上也是修改这个文件,例如设置AdvancedOptions-I2C启动i2C内核驱动,就是修个dtparam=i2c_arm=on这一行)在/boot/config.txt文件后面添加下面这一句,这一句就是树莓派添加DeviceT

2、ree设备,dtoverlay=w1-gpio-pull表示添加单总线设备,gpioin=4默认管脚为4,如果DS18B20接到其他管脚则需要修改这个值,Pioneer600扩展板DS18B20默认接到4,故不用修改。(注:管脚为BCM编号)1dtoverlay=w1-gpio-pull,gpioin=4在/boot/overlays/README中有关于树莓派DeviceTree的详细介绍,在其中我们找到下面关于w1-gpio-pullup设备的介绍如下图。二、查看模块是否启动重启树莓派是设置生效,运行lsmod命令,如果发现红色方框的两个模块说明模块已启动。如果没有发现,也可以运行如下命令

3、加载模块1sudo modprobe w1_gpio2sudo modprobe w1_therm三、读取温度如果没有问题,在/sys/bus/w1/devices中发现一个28-XXXX开头的文件夹,这个就是DS18B20的ROM,每个DS18B20都一样,在这个文件夹中读取w1_slave文件则会返回当前温度值。操作如下图:1sudo modprobe w1-gpio2sudo modprobe w1-therm3cd /sys/bus/w1/devices4cd 28-00000xxx5cat w1_slave返回数据中,第一行最后的YRS表示CRC校验成功,数据有效。第二行最后t=30

4、500表示当前温度为30.5摄氏度。如果接多个DS18B20,将会看到多个28-xxxx的文件,分别对应各个DS18B20。四、软件编程1、sysfs01#include02#include03#include04#include05#include06#include07#include0809int main(int argc, char *argv)1011char path50 =/sys/bus/w1/devices/;12char rom20;13char buf100;14DIR *dirp;15struct dirent *direntp;16int fd =-1;17char

5、 *temp;18float value;1920system(sudo modprobe w1-gpio);21system(sudo modprobe w1-therm);22if(dirp = opendir(path) = NULL)2324printf(opendir errorn);25return1;262728while(direntp = readdir(dirp) != NULL)2930if(strstr(direntp-d_name,28-00000)3132strcpy(rom,direntp-d_name);33printf( rom: %sn,rom);34353

6、6closedir(dirp);3738strcat(path,rom);39strcat(path,/w1_slave);40while(1)4142if(fd = open(path,O_RDONLY) 0)4344printf(open errorn);45return1;464748if(read(fd,buf,sizeof(buf) 0)4950printf(read errorn);51return1;525354temp =strchr(buf,t);55sscanf(temp,t=%s,temp);56value = atof(temp)/1000;57printf( temp

7、 : %3.3f Cn,value);5859sleep(1);6061return0;62编译并执行,结果如图1gcc Wall ds18b20.c o ds18b202sudo ds18b20注:(1)system(sudomodprobew1-gpio);system(sudomodprobew1-therm);在程序的开头运行了一下modprobe命令 (2)dirp=opendir(path)打开/sys/bus/w1/devices/文件路径(3)direntp=readdir(dirp)读取当前路径下的文件或文件夹(4)strstr(direntp-d_name,28-00000

8、)查找28-00000开头的文件,strstr为字符串操作函数,上面这条语句表示文件名字是否包含字符串“28-00000”,如果匹配则返回第一次匹配的地址,没有搜索到则返回NULL.(5)strcpy(rom,direntp-d_name);strcpy为字符串复制函数。,将包含28-00000的文件名复制到rom字符串(6)strcat(path,rom);strcat(path,/w1_slave);strcat为字符串连接函数,此时path的值为/sys/bus/w1/devices/28-00000xxxx/w1_slave(7)fd=open(path,O_RDONLY);read(

9、fd,buf,sizeof(buf)打开文件并读取数据(8)temp=strchr(buf,t);查找字符t第一次出现的位置,(9)sscanf(temp,t=%s,temp);sscanf函数是从一个字符串中读进与指定格式相符的数据,此处为从第二行数据中扫描出温度值(10) value=atof(temp)/1000;atof函数把字符串转化为浮点数。2、python01import os02importglob03import time0405os.system(modprobe w1-gpio)06os.system(modprobe w1-therm)0708base_dir =/sy

10、s/bus/w1/devices/09device_folder =glob.glob(base_dir +28*)010device_file = device_folder +/w1_slave11def read_rom():12name_file=device_folder+/name13f = open(name_file,r)14returnf.readline()1516def read_temp_raw():17f = open(device_file,r)18lines = f.readlines()19f.close()20returnlines2122def read_t

11、emp():23lines = read_temp_raw()24whilelines0.strip()-3: !=YES:25time.sleep(0.2)26lines = read_temp_raw()27equals_pos = lines1.find(t=)28ifequals_pos != -1:29temp_string = lines1equals_pos+2:30temp_c = float(temp_string) / 1000.031temp_f = temp_c * 9.0 / 5.0 + 32.032returntemp_c, temp_f3334print( rom

12、: + read_rom()35whileTrue:36print( C=%3.3f F=%3.3f% read_temp()37time.sleep(1)运行程序,运行结果如图1sudo python ds18b20.py注:(1)程序的开头运行了一下modprobe命令 (2)device_folder=glob.glob(base_dir+28*)0 device_file=device_folder+/w1_slave 定义设备文件夹和设备文件,glob.glob(base_dir+28*))函数为获得base_dir路径下所有28开头的文件。(3)whilelines0.strip()-3:!=YES: 判断w1-value第一行的最后三个字符是否为YES(4)equals_pos=lines1.find(t=) 查找第二行中t=出现的位置(5) temp_string=lines1equals_pos+2: 取温度数据总结:对比上面两个两个程序,我们可以发现python程序更加简单方便。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1