文章目录

  • 目的
  • 快速使用
    • 相关库引入
    • 使用步骤
    • 使用演示
      • 演示一
      • 演示二
      • 演示三
  • 相关库说明
    • OneWire库
    • DallasTemperature库
  • 总结

目的

DS18B20是常用的温度传感器,功能够用、使用简单,本文将用Arduino第三方的库来驱动DS18B20获取温度值。
DS18B20元件官方链接如下:
https://www.maximintegrated.com/cn/products/sensors/DS18B20.html

快速使用

相关库引入

两个库均在GitHub上,可以在release标签页中下载最新项目文件。

  • OneWire库
    项目地址:https://github.com/PaulStoffregen/OneWire
    使用时需要包含OneWire.h 文件OneWire.cpp 文件util 文件夹
  • DallasTemperature库
    项目地址:https://github.com/milesburton/Arduino-Temperature-Control-Library
    使用时需要包含DallasTemperature.h 文件DallasTemperature.cpp 文件

下载两个库的zip包后在Arduino IDE中选择:项目 > 加载库 > 添加一个 .ZIP库 ,两个库添加完成后就可以使用了。

如果你想将库文件都包含在自己的项目中那可以将相关文件和文件加放到项目文件夹里,然后修改DallasTemperature.h文件头部#include <OneWire.h>#include "OneWire.h",之后在项目中使用时用""引用DallasTemperature.h即可,比如#include "DallasTemperature.h"

使用步骤

  1. 引入相关库;
  2. 声明OneWireDallasTemperature对象;
  3. 使用DallasTemperaturebegin方法初始化总线;
  4. 发送温度转换请求;
  5. 读取温度值;

使用演示

演示一

以下演示是最简单的使用方式,但是性能上损失较大:

// #include <OneWire.h> //可以不引入,因为DallasTemperature.h中已经引入了OneWire.h
#include <DallasTemperature.h>#define ONE_WIRE_BUS 4 //1-wire数据总线连接在IO4
OneWire oneWire(ONE_WIRE_BUS); //声明
DallasTemperature sensors(&oneWire); //声明void setup(void)
{Serial.begin(115200);Serial.println("");sensors.begin(); //初始化总线
}void loop(void)
{Serial.println("发起温度转换");sensors.requestTemperatures(); //向总线上所有设备发送温度转换请求,默认情况下该方法会阻塞Serial.println("温度转换完成");float tempC = sensors.getTempCByIndex(0); //获取索引号0的传感器摄氏温度数据if (tempC != DEVICE_DISCONNECTED_C) //如果获取到的温度正常{Serial.print("当前温度是: ");Serial.print(tempC);Serial.println(" ℃\n");}delay(2000);
}

演示二

以下演示是一种非阻塞获取温度的方式,性能上消耗较少:

// #include <OneWire.h> //可以不引入,因为DallasTemperature.h中已经引入了OneWire.h
#include <DallasTemperature.h>#define ONE_WIRE_BUS 4               //1-wire数据总线连接在IO4
OneWire oneWire(ONE_WIRE_BUS);       //声明
DallasTemperature sensors(&oneWire); //声明void setup(void)
{Serial.begin(115200);Serial.println("");sensors.begin(); //初始化总线sensors.setWaitForConversion(false); //设置为非阻塞模式
}unsigned long previousMillis = 0; //毫秒时间记录
const long interval = 1000;       //时间间隔
void loop(void)
{//以下段落相当于每秒读取前次温度,并发起新一次温度转换unsigned long currentMillis = millis();         //读取当前时间if (currentMillis - previousMillis >= interval) //如果和前次时间大于等于时间间隔{previousMillis = currentMillis; //更新时间记录float tempC = sensors.getTempCByIndex(0); //获取索引号0的传感器摄氏温度数据if (tempC != DEVICE_DISCONNECTED_C)       //如果获取到的温度正常{Serial.print("\n当前温度是: ");Serial.print(tempC);Serial.println(" ℃");}Serial.println("发起温度转换");sensors.requestTemperatures(); //发起新的温度转换}delay(20);Serial.print(".");
}


上图可以看到在转换温度过程中用户还可以做别的事(这里打印了".")

演示三

以下演示中展示了更多DallasTemperature库中的方法:

// #include <OneWire.h> //可以不引入,因为DallasTemperature.h中已经引入了OneWire.h
#include <DallasTemperature.h>#define ONE_WIRE_BUS 4               //1-wire数据总线连接在IO4
OneWire oneWire(ONE_WIRE_BUS);       //声明
DallasTemperature sensors(&oneWire); //声明DeviceAddress myDS18B20; //声明一个地址对象void setup(void)
{Serial.begin(115200);Serial.println("");sensors.begin(); //初始化总线Serial.print("总线上DS18系列设备数量为:");Serial.println(sensors.getDS18Count());Serial.print("总线是否需要寄生供电(1-true; 0-false):");Serial.println(sensors.isParasitePowerMode());Serial.print("总线上设备数据最大分辨率为:");Serial.println(sensors.getResolution());sensors.setResolution(9); //设置总线上所有设备数据分辨率sensors.getAddress(myDS18B20, 0); //获取索引号0的设备地址(设备序列号)
}void loop(void)
{Serial.println("\n发起温度转换");sensors.requestTemperaturesByAddress(myDS18B20); //向总线上指定地址传感器发送温度转换请求Serial.println("温度转换完成");int16_t temp = sensors.getTemp(myDS18B20); //获取指定地址传感器温度数据if (temp != DEVICE_DISCONNECTED_RAW) //如果获取到的温度正常{Serial.print("当前温度数据是: ");Serial.println(temp);Serial.print("当前摄氏是: ");Serial.println(DallasTemperature::rawToCelsius(temp));}delay(5000);
}

相关库说明

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

在Arduino中使用DS18B20温度传感器(基于OneWire和DallasTemperature库)相关推荐

  1. Arduino基础篇(七)-- 如何使用DS18B20数字温度传感器(基于OneWire和DallasTemperature库)

    温度传感器是指能感受温度并转换成可用输出信号的传感器.按测量方式分为接触式和非接触式,按照传感器材料及电子元件分为热电阻和热电偶两类,按照工作原理分为模拟式和数字式.本篇主要介绍数字温度传感器 DS1 ...

  2. 【ESP32】13.DS18B20温度传感器实验(OneWire和DallasTemperature库)

    上一篇: [ESP32]12.I2C LCD1602液晶显示实验(LiquidCrystal_I2C库) 前言: 先放电路连接图: DS18B20是单总线温度传感器.比较有特色的是该模块仅仅需要一个接 ...

  3. ds18b20程序c语言,单片机中使用DS18B20温度传感器C语言程序(参考6)

    /******************************************/ // //       DS18B20温度计C程序 //       2007.06.08 /******** ...

  4. ds18b20温度报警C语言程序,单片机中使用DS18B20温度传感器C语言程序(参考4)

    #include sbit DQ = P2^2;      //定义DS18B20端口DQ sbit BEEP=P2^3 ;     //定义报警接口 unsigned char presence ; ...

  5. 第三十五篇、基于Arduino uno,获取DS18B20温度传感器的温度值——结果导向

    0.结果 说明:先来看看串口调试助手显示的结果,第一个值是空气温度值.如果是你想要的,可以接着往下看. 1.外观 说明:虽然DS18B20温度传感器形态各异,但是原理和代码都是适用的,就是接线可能有点 ...

  6. DSB算法C语言程序,单片机中使用DSB温度传感器C语言程序.doc

    单片机中使用DSB温度传感器C语言程序 单片机中使用DS18B20温度传感器C语言程序(参考1) /************************************************** ...

  7. 基于普中A2实验板,ds18b20温度传感器与ds1302时钟芯片的冲突现象的探讨

    在普中板上进行写较综合的项目时,是否会出现温度传感器经常出错的问题,明明是严格按照时序图所编写的程序就是无法读出正确的值(全为0),或许温度底层在其他工程里能正常运行,而到了某些工程中却总是出错.这些 ...

  8. 「雕爷学编程」Arduino动手做(39)——DS18B20温度传感器

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

  9. 基于C51单片机+DS18B20温度传感器+LCD1602显示器的智能水温控制系统(PID)

    基于AT89C52的温度控制系统 一.DS18B20传感器相关介绍 DS18B20特性 封装形式与引脚说明 供电方式(外部电源供电.寄生电源供电.寄生电源强上拉) DS18B20指令(ROM指令操作) ...

最新文章

  1. 数据结构——树与二叉树
  2. MS IDE 工程垃圾清理
  3. 【超全解析】原码、反码、补码、移码的相互转化和解读(取值范围)
  4. 译注(3): NULL-计算机科学上最糟糕的失误
  5. 怎么在QQ浏览器上使用微信聊天?
  6. 密码学是如何保护区块链的 1
  7. 《软件定义数据中心:Windows Server SDDC技术与实践》——第1章 微软数据中心与SDDC漫谈1.1 微软数据中心建设之道...
  8. DB2 exception: Cannot create PoolableConnectionFactory SQLCODE=-142
  9. seaborn—seaborn.distplot绘制直方图和连续密度统计
  10. Java Web项目漏洞修复(绿盟检测)
  11. 教你识别显存颗粒编号
  12. JavaScript中的模块化之AMD和CMD
  13. Dubbo跟Spring Cloud哪个更好用?“微服务”第二代又赢了!
  14. mac 命令行查看DNS
  15. 《热浪球爱战》首映 周秀娜现场超低胸打排球
  16. matlab噪音的消除办法,基于MATLAB的噪声消除方法.ppt
  17. Tensorflow基础4:run()函数
  18. python贪吃蛇小游戏代码_python 贪吃蛇小游戏代码
  19. ThinkPad T440换装固态硬盘(SSD)和内存条
  20. 个人表现怎么写学生_小学生家长寄语大全 家长寄语怎么写

热门文章

  1. 分析tga图像格式文件
  2. 浅谈密码学的历史发展过程
  3. 【渝粤题库】陕西师范大学202051公共财政学作业(高起专)
  4. GitHub申请账号
  5. [新增EA028高压注射器]24套UML+EA和StarUML的建模示范视频-全程字幕(2022.7.4更新)
  6. java常用的单词,快点收藏点赞吃灰
  7. 集成学习与模型融合(kaggle-Elo Merchant Category Recommendation)
  8. bzoj3219 巡游
  9. 指纹识别键盘软件测试,防水键盘指纹识别_笔记本评测-中关村在线
  10. 2019.08.21【NOIP提高组】模拟 B 组 dfs、最小生成树+二分、dp+计算几何、floyed+dfs、spfa