37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。

【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)

实验三十九:DS18B20单总线数字温度传感器模块

DS18B20

是世界第一片支持"一线总线"接口的温度传感器,一线总线独特而且经济的特点,使用户可轻松组建传感器网络,为测量系统构建系统引入全新要概念。

DS18B20 的内部结构主要由64 位ROM、温度灵敏元件、内部存储器和配置寄存器4 部分组成,如上图所示。
( 1) 64 位ROM。它的内容是64 位序列号,它可以被看作是该DS18B20 的地址序列码,其作用是使每个DS18B20 都各不相同,这样就可以实现一根总线上挂接多个DS18B20 的目的。
( 2) 温度灵敏元件。它完成对温度的测量,测量后的结果存储在2 个8 b 的温度寄存器中。
( 3) 内部存储器。内部存储器包括一个高速暂存RAM 和一个非易失性的可电擦除的E2 PROM,后者存放高温度和低温度触发器TH、TL 以及配置寄存器。
 
 
 

测温原理

用一个高温度系数的振荡器确定一个门周期,内部计数器在这个门周期内对一个低温度系数的振荡器的脉冲进行计数来得到温度值。计数器被预置到对应于-55摄氏度的一个值。如果计数器在门周期结束前到达0,则温度寄存器(同样初始化到-55摄氏度)的值增加,表明所测温度大于-55摄氏度。

1。温度系数振荡器是指一种振荡器,它的振荡频率与温度之间有一个特定的关系,即不同的温度对应不同的振荡频率。反之,测量出振荡器的输出频率,就可测量出温度值。

2.高温度系数振荡器:它的振荡频率受温度的影响很大,温度稍有变化,频率就会变化很多,即对温度敏感,多用于温度传感器。

3.低温度系数振荡器:它的振荡频率受温度的影响很小,即使温度变化很大,它的频率也基本不变。

同时,计数器被复位到一个值,这个值由斜坡式累加器电路确定,斜坡式累加器电路用来补偿感温振荡器的抛物线特性。然后计数器又开始计数直到 0,如果门周期仍未结束,将重复这一过程。 斜坡式累加器用来补偿感温振荡器的非线性,以期在测温时获得比较高的分辨力。这是通过改变计数器对温度每增加一度所需计数的的值来实现的。因此,要想获得所需的分辨力,必须同时知道在给定温度下计数器的值和每一度的计数值。

主要特性

(1) 独特的单线接口方式,与单片机连接时仅需要一条口线;

(2) 测温范围为- 55~ + 125℃,在- 10~ + 85℃范围内精度为±0. 5 ℃;

(3) 通过编程可实现9~ 12 位的数字读数方式;

(4) 用户可自设定非易失性的报警上下限值;

(5) 外围电路简单,使用时不需要外围元件,可用数据总线供电,电压范围为3. 0 ~ 5. 5 V 无需备用电源;

(6)无需外部元件,独特的一线接口,电源和信号混合在一起;

(7)每个芯片唯一编码,支持联网寻址,零功耗等待;

(8)DS18B20 有TO 92、SOIC 及CSP 封装,其中VDD 为外接供电电源输入端,GND 为公共地,DQ为数字信号输出端;

(9)适用于冷冻库,粮仓,储罐,GPS卫星定位系统,电讯机房,电力机房,电缆线槽等测温和控制领域。

部件描述

存储器---DS18B20的存储器包括高速暂存器RAM和可电擦除RAM,可电擦除RAM又包括温度触发器TH和TL,以及一个配置寄存器。存储器能完整的确定一线端口的通讯,数字开始用写寄存器的命令写进寄存器,接着也可以用读寄存器的命令来确认这些数字。当确认以后就可以用复制寄存器的命令来将这些数字转移到可电擦除RAM中。当修改过寄存器中的数时,这个过程能确保数字的完整性。高速暂存器RAM是由8个字节的存储器组成;用读寄存器的命令能读出第九个字节,这个字节是对前面的八个字节进行校验。

64-位光刻ROM---前8位是DS18B20的自身代码,接下来的48位为连续的数字代码,最后的8位是对前56位的CRC校验。64-位的光刻ROM又包括5个ROM的功能命令:读ROM,匹配ROM,跳跃ROM,查找ROM和报警查找。

外部电源的连---DS18B20可以使用外部电源VDD,也可以使用内部的寄生电源。当VDD端口接3.0V—5.5V的电压时是使用外部电源;当VDD端口接地时使用了内部的寄生电源。无论是内部寄生电源还是外部供电,I/O口线要接5KΩ左右的上拉电阻。

配置寄存器---配置不同的位数来确定温度和数字的转化。可以知道R1,R0是温度的决定位,由R1,R0的不同组合可以配置为9位,10位,11位,12位的温度显示。这样就可以知道不同的温度转化位所对应的转化时间,四种配置的分辨率分别为0.5℃,0.25℃,0.125℃和0.0625℃,出厂时以配置为12位。

温度的读取---DS18B20在出厂时以配置为12位,读取温度时共读取16位,前5个位为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。温度为正时读取方法为:将16进制数转换成10进制即可。温度为负时读取方法为:将16进制取反后加1,再转换成10进制即可。例:0550H = +85 度,FC90H = -55 度。

使用要点

DS18B20 采用的是单线总线协议方式,即在一条数据线上实现数据的双向传输,而单片机硬件上不支持单总线协议,因此必须采用软件方法来模拟单总线的协议是序来完成对DS18B20 芯片的访问。由于DS18B20 是在一根I/ O 线上读写数据,因此对读写的数据位有严格的时序要求,它有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序: 初始化时序、读时序、写时序。所有时序都是将单片机作为主设备,DS18B20 作为从设备,而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求DS18B20 回送数据,在进行写命令后,主机需启动读时序完成数据接收。

几个应用电路

DS18B20单总线数字温度传感器模块

一、尺寸:长28mm X宽12mm X高10mm

二、主要芯片:18B20温度传感器

三、工作电压:直流5V

模块特点

1、分辨率调整范围:9-12位

2、带安装孔方便安装,孔径:2.5

3、温度测量范围:-55~+125℃

4、温度测量精度:0.5℃

5、工作电压:DC5V

6、数字信号输出

引脚接线
Arduino Uno      <------>         18B20温度传感器模块  
Pin 3                  <------>          OUT (S)      
5V                      <------>          VCC   
GND                   <------>          GND

搜索、下载库文件-DallasTemperature

后来又安装了一个库-OneWire

/*

【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)

实验三十九:DS18B20单总线数字温度传感器模块

*/

#include <OneWire.h>

#include <DallasTemperature.h>

#define ONE_WIRE_BUS 3

OneWire oneWire(ONE_WIRE_BUS);

DallasTemperature sensors(&oneWire);

void setup(void)

{

  Serial.begin(9600);

  Serial.println("Dallas Temperature IC Control Library Demo");

  sensors.begin();

}

void loop(void)

{

  Serial.print(" Requesting temperatures...");

  sensors.requestTemperatures(); 

  Serial.println("DONE");

  Serial.print("Temperature for Device 1 is: ");

  Serial.print(sensors.getTempCByIndex(0));  

  delay(500);

}

  

用手触摸DS18B20,温度升高

「雕爷学编程」Arduino动手做(39)——DS18B20温度传感器的更多相关文章

  1. 「雕爷学编程」Arduino动手做(15)——手指侦测心跳模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  2. 「雕爷学编程」Arduino动手做(9)——火焰传感器模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  3. 「雕爷学编程」Arduino动手做(10)——敲击传感器模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  4. 「雕爷学编程」Arduino动手做(14)——倾斜角度模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  5. 「雕爷学编程」Arduino动手做(13)——触摸开关模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  6. 「雕爷学编程」Arduino动手做(12)——霍尔磁力模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  7. 「雕爷学编程」Arduino动手做(11)——金属触摸模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  8. 「雕爷学编程」Arduino动手做(8)——湿度传感器模块

    37款传感器和模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器与模块,依照实践出真知(动手试试)的理念,以学习和交流为目的,这里准备 ...

  9. 「雕爷学编程」Arduino动手做(7)——旋转电位器模块

    37款传感器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备逐一做做实验 ...

  10. 「雕爷学编程」Arduino动手做(41)---激光接收管模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

随机推荐

  1. 2019-2020-1 20199329《Linux内核原理与分析》第七周作业

    <Linux内核原理与分析>第七周作业 一.本周内容概述: 对Linux系统如何创建一个新进程进行追踪 分析Linux内核创建一个新进程的过程 二.本周学习内容: 1.学习进程的描述 操作 ...

  2. What does __GNUC__ mean?

    It indicates that I'm a GNU compiler and you can use GNU extensions. https://stackoverflow.com/quest ...

  3. 利用python画出SJF调度图

    最先发布在csdn.本人原创. https://blog.csdn.net/weixin_43906799/article/details/105510046 SJF算法: 最短作业优先(SJF)调度 ...

  4. QT bug ig9icd64.dll

    QT bug ig9icd64.dll bugintel ig9icd64.dll 处有未经处理的异常 遇到了一个 奇奇怪怪的bug, 一般的QT程序中 在main.cpp 中初始化一个窗口进行显示后 ...

  5. dockerfile简介及书写规则

                                       Dockerfile 简介 Dockfile是一种被Docker程序解释的脚本, Dockerfile由一条一条的指令组成,每条指 ...

  6. qemu-img 整理

    qemu-img命令语法: qemu-img command [command options] check命令: check [-f fmt < qcow2 | qed | vdi >] ...

  7. Redis(一):数据结构与对象

    前言 本书是Redis设计与实现的读书笔记,旨在对Redis底层的数据结构及实现有一定了解.本书所有的代码基于Redis 3.0. 简单动态字符串 SDS Redis没有直接使用C语言中的字符串,而是 ...

  8. C++获取当前系统时间并格式化输出

    C++中与系统时间相关的函数定义在头文件中. 一.time(time_t * )函数 函数定义如下: time_t time (time_t* timer); 获取系统当前日历时间 UTC 1970- ...

  9. 一只简单的网络爬虫(基于linux C/C++)————支持动态模块加载

    插件在软件设计中有很大的好处,可以方便地扩展各种功能,使用插件技术能够在分析.设计.开发.项目计划.协作生产和产品扩展等很多方面带来好处: (1)结构清晰.易于理解.由于借鉴了硬件总线的结构,而且各个 ...

  10. pyhton中绘制多个图像

    1,在python的图像学习中,有时我们需要在同一个窗口中,显示多个图像,方便我们查看输出图像的区别. 2,在pycharm中,导入matplotlibmokuai,据说此模块来自matlab,因为没 ...