【用Proteus仿真Arduino】 05 -DS18B20数字式温度测量

5.1 简介

使用数字式温度传感器DS18B20实现温度测量,并且串口输出温度测量值

5.2 关于DS18B20

DS18B20元件官方链接如下:
https://www.maximintegrated.com/cn/products/sensors/DS18B20.html
DS18B20
DS18B20引脚定义:

  • DQ为数字信号输入/输出端;
  • GND为电源地;
  • VDD为外接供电电源输入端(在寄生电源接线方式时接地)

5.3 原理图

添加DS18B20元件,在元器件搜索栏中输入“DS18B20”,并添加至元器件选择栏,如图
在这里插入图片描述
并将其DQ管脚接至数字口2脚,也就是ATmega328P的4管脚,同时接10kΩ的上拉电阻,VCC接至+5V,GND接至地端,修改后的Arduino UNO仿真图如图所示在这里插入图片描述
编辑DS18B20参数属性,弹出如图所示的DS18B20设置框。设置框里有内部序列号、当前温度值、调节的最小变化量。

内部序列号用于单总线上挂有多个DS18B20的情况下,甄别不同的传感器。只有内部序列号相同的DS18B20才会响应单总线上的命令并作出相应的响应。
在这里插入图片描述

5.4 编辑代码

DS18B20设置完成后,下面进入Arduino编程部分。
相关库引入
两个库均在GitHub上,可以在release标签页中下载最新项目文件。

下载两个库的zip包后在Arduino IDE中选择:项目 > 加载库 > 添加一个 .ZIP库 ,两个库添加完成后就可以使用了。
在开始编写代码之前将Paul Stoffregen的OneWire包括在库管理器中,这是为了 DallasTemperature库的调用,在编写代码时,可以不用包含此库。

启动arduino IDE,选择DallasTemperature中示例simple文件并打开,复制代码,在protues中切换到“Source Code”标签,粘贴代码,然后编译代码。

在这里插入图片描述

5.5 运行仿真

在这里插入图片描述

oneWire 和DallasTemperature库说明

OneWire库

这是用于1-Wire总线通讯的库,1-Wire总线是达拉斯半导体(已经被美信收购)推出的一种总线技术,一根线完成数据双向通讯,甚至总线上的设备还能从这条线取电。对于布线和现场施工来说这个技术蛮好的,但是这方面方便了别的地方就需要牺牲点了,具体来说1-Wire总线对通讯时间控制有些要求,通常通过程序来读写的话就需要牺牲一些性能了,因为读写过程中很多时候是阻塞的,OneWire库中可以看到很多延时存在。只用OneWire库就可以操作DS18B20了,可以参考该库的例程。
下面是OneWire库中部分方法说明(这个库不用太在意因为我们主要用的是下面那个库):

  • OneWire(uint8_t pin) { begin(pin); }
    构造方法,指定总线接入的pin号;
  • void begin(uint8_t pin)
    初始化总线接口;
  • uint8_t reset(void)
    复位总线,如果总线上有可用设备则返回1,没有则返回0;
  • void select(const uint8_t rom[8])
    选择指定设备,rom[8]为设备序列号;
  • void skip(void)
    发送跳过指令(0xCC);
  • void write(uint8_t v, uint8_t power = 0)
  • void write_bytes(const uint8_t *buf, uint16_t count, bool power = 0)
  • uint8_t read(void)
  • void read_bytes(uint8_t *buf, uint16_t count)
  • void write_bit(uint8_t v)
  • uint8_t read_bit(void)
    读写相关操作;
  • void depower(void)
    停止向总线供电;
  • void reset_search()
  • void target_search(uint8_t family_code)
  • bool search(uint8_t *newAddr, bool search_mode = true)
    搜索设备相关操作;
  • static uint8_t crc8(const uint8_t *addr, uint8_t len)
  • static bool check_crc16(const uint8_t* input, uint16_t len, const uint8_t* inverted_crc, uint16_t crc = 0)
  • static uint16_t crc16(const uint8_t* input, uint16_t len, uint16_t crc = 0)
    计算CRC校验;

DallasTemperature库

这个库在上面那个库之上再封装了一层,方便直接使用DS18B20等系列的温度传感器。这个库中温度转换可以设置为阻塞或非阻塞模式,阻塞模式下运行温度转换请求方法时会阻塞一段时间。这个库中访问设备可以通过设备地址(序列号)或是索引,通过索引方式访问相对会耗更多时间。
部分方法说明如下:

  • DallasTemperature(OneWire*)
    构造函数;
  • void begin(void)
    初始化总线,获取总线上有多少OneWire设备和其中多少为DS18等系列设备;
  • uint8_t getDS18Count(void)
    返回DS18等系列设备数量;
  • bool getAddress(uint8_t* deviceAddress, uint8_t index)
    获取指定索引设备的地址到deviceAddress对象;
  • bool isConnected(const uint8_t* deviceAddress, uint8_t* scratchPad)
    返回指定地址(序列号)设备是否连接到总线,并读取设备寄存器数据到scratchPad对象;
  • uint8_t getResolution()
    返回全局设备最大分辨率;
  • void setResolution(uint8_t newResolution)
    设置所有设备数据分辨率;
  • uint8_t getResolution(const uint8_t* deviceAddress)
    返回指定地址(序列号)设备分辨率;
  • bool setResolution(const uint8_t* deviceAddress, uint8_t newResolution, bool skipGlobalBitResolutionCalculation)
    设置指定地址(序列号)设备分辨率;
  • void setWaitForConversion(bool flag)
    设置温度转换时是否阻塞,true则阻塞,默认为true;
  • bool getWaitForConversion(void)
    返回温度转换时是否阻塞;
  • void setCheckForConversion(bool flag)
    设置是否在阻塞时检查转换完成,true则检查,默认为true;
  • bool getCheckForConversion(void)
    返回是否在阻塞时检查转换完成;
  • void requestTemperatures(void)
    向总线上所有设备发送温度转换指令,阻塞模式下该方法将阻塞一定时间;
    阻塞时间和全局设备最大分辨率以及是否在阻塞时检查转换完成标志有关,
    分辨率影响: 9:最大94ms;10:最大188ms;11:最大375ms;其它:最大750ms;
  • bool requestTemperaturesByAddress(const uint8_t* deviceAddress)
    向总线上指定地址(序列号)设备发送温度转换指令,阻塞模式下该方法将阻塞一定时间;
  • bool requestTemperaturesByIndex(uint8_t deviceIndex)
    向总线上指定索引设备发送温度转换指令,阻塞模式下该方法将阻塞一定时间;
  • int16_t getTemp(const uint8_t* deviceAddress)
    返回指定地址(序列号)设备温度数据,数据分辨率为1/128℃,如果发生错误则返回DEVICE_DISCONNECTED_RAW(-7040,默认值);
    为了兼容性考虑这里温度数据的分辨率和DS18B20有所不同,DS18B20默认分别率为1/16℃;
  • float getTempC(const uint8_t* deviceAddress)
    返回指定地址(序列号)设备摄氏温度,如果发生错误则返回DEVICE_DISCONNECTED_C(-127,默认值);
  • float getTempF(const uint8_t* deviceAddress)
    返回指定地址(序列号)设备华氏温度,如果发生错误则返回DEVICE_DISCONNECTED_F(-196.6,默认值);
  • float getTempCByIndex(uint8_t deviceIndex)
  • float getTempFByIndex(uint8_t deviceIndex)
    返回指定索引设备温度,如果发送错误则返回默认值;
  • bool isParasitePowerMode(void)
    返回是否需要总线寄生供电,需要则返回true;
    警报相关方法不在此列出,请自行查询源码
  • static float toFahrenheit(float)
    将摄氏温度转为华氏温度;
  • static float toCelsius(float)
    将华氏温度转为摄氏温度;
  • static float rawToCelsius(int16_t)
    将原始温度转换为摄氏温度;
  • static float rawToFahrenheit(int16_t)
    将原始温度转换为华氏温度;

总结

基于OneWire和DallasTemperature库使用DS18B20主要内容就是上面这些了,更多信息可以参考美信对于1-Wire总线的引用笔记:
https://www.maximintegrated.com/cn/app-notes/index.mvp/id/126
https://www.maximintegrated.com/cn/app-notes/index.mvp/id/187

版权声明:本文为CSDN博主「acktomas」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/acktomas/article/details/105178907

生成海报
点赞 0

acktomas

我还没有学会写个人说明!

暂无评论

相关推荐

如何在Proteus ISIS中使用虚拟终端

虚拟终端是Proteus中可用的重要工具,在处理GSM,GPS,XBee等串行模块时,它非常方便。因此,让我们开始使用Proteus中的虚拟终端。 什么是虚拟终端&#xf