0 卖盘信息
BOM询价
您现在的位置: 首页 > 技术方案 >消费电子 > 基于Arduino和DS18B20温度传感器自制模拟温度计解决方案

基于Arduino和DS18B20温度传感器自制模拟温度计解决方案

来源: elecfans
2021-11-17
类别:消费电子
eye 87
文章创建人 拍明

原标题:基于Arduino和DS18B20温度传感器自制模拟温度计解决方案

基于Arduino和DS18B20温度传感器自制模拟温度计解决方案


自制模拟温度计不仅是一个富有教育意义的项目,也是一个能够将理论知识转化为实际应用的绝佳机会。本文将详细探讨如何利用流行的开源硬件平台Arduino和高精度数字温度传感器DS18B20来构建一个可靠且易于使用的模拟温度计。我们将深入剖析所需元器件的选择、功能、以及为何选择它们,并提供实现细节,确保您能成功完成这个项目。

image.png

项目概述与目标


我们的目标是设计并实现一个能够实时测量环境温度,并将温度值以模拟方式(例如,通过模拟电压输出、LED灯条或小型模拟仪表)显示出来的温度计。选择Arduino作为核心控制器是因为其易用性、丰富的库支持和强大的社区。DS18B20传感器因其单总线接口、高精度和宽测量范围而成为理想的温度测量元件。


核心元器件选择与详细解析



1. 微控制器:Arduino Uno R3


  • 元器件型号: Arduino Uno R3

  • 器件作用: 作为整个温度计系统的“大脑”,负责读取DS18B20传感器的数据,处理这些数据,并根据处理结果控制模拟显示输出。它提供编程环境,使得我们可以上传控制代码。

  • 为何选择:

    • 易用性与社区支持: Arduino Uno是Arduino系列中最受欢迎的板卡之一,拥有庞大的用户群和丰富的在线资源(教程、论坛、库文件),对于初学者而言非常友好。

    • 性价比高: 相较于其他微控制器平台,Arduino Uno价格适中,且功能强大,足以满足本项目需求。

    • 开发环境友好: Arduino IDE(集成开发环境)简洁直观,支持C++语言,使得编程变得简单。

    • I/O接口丰富: Arduino Uno提供了数字输入/输出引脚(Digital I/O Pins)、模拟输入引脚(Analog Input Pins)、PWM引脚(Pulse Width Modulation)等,能够方便地连接各种传感器和执行器。例如,DS18B20需要连接到一个数字引脚,而模拟显示部分可能需要用到模拟输出或PWM引脚。

    • USB供电与通信: 可以通过USB线缆直接连接电脑进行供电和程序上传,同时也能通过串口进行数据通信,便于调试。

  • 功能:

    • 数据采集: 通过数字引脚与DS18B20通信,读取温度数据。

    • 数据处理: 将DS18B20读取到的原始数字温度值转换为可读的摄氏度或华氏度。

    • 逻辑控制: 根据温度值控制模拟显示设备的输出,例如调整LED亮度、驱动模拟电压表指针等。

    • 通信能力: 可以通过串口将温度数据发送到电脑进行监控(可选)。


2. 温度传感器:DS18B20 数字温度传感器


  • 元器件型号: DS18B20(TO-92封装或防水探头版本)

  • 器件作用: 负责精确测量环境温度,并将模拟温度值转换为数字信号输出。

  • 为何选择:

    • 单总线接口(One-Wire Interface): 这是DS18B20最大的优势之一。它只需要一根数据线(加上电源和地线)就能与微控制器通信,极大地简化了接线。这对于简化电路设计和节省Arduino的I/O引脚非常重要。

    • 高精度: DS18B20提供高达9到12位的可配置分辨率,在$-10^circ C到+85^circ C范围内,精度可达pm 0.5^circ C$,足以满足大多数日常温度测量需求。对于更高精度,可以配置为12位分辨率。

    • 宽测量范围: 测量范围宽广,从$-55^circ C到+125^circ C$。这使得它适用于多种应用场景,无论是室内、室外还是工业环境。

    • 寄生电源模式: DS18B20支持寄生电源模式,即只需数据线和地线即可工作,从数据线窃取电源。这在某些布线受限或希望减少线缆数量的场景下非常有用,尽管在本项目中我们通常会选择外部供电以确保稳定性。

    • 唯一64位序列码: 每个DS18B20传感器都拥有一个唯一的64位序列号,这使得在同一条单总线上连接多个DS18B20传感器成为可能,并能通过序列号区分和读取每个传感器的数据。

    • 成熟的库支持: Arduino平台有非常成熟的DS18B20库(例如OneWire库和DallasTemperature库),极大地简化了编程。

  • 功能:

    • 温度测量: 内置高精度热敏电阻和模数转换器(ADC),能够将温度变化转换为数字信号。

    • 数字输出: 通过单总线协议以数字形式输出温度数据。

    • 报警功能: 可编程的温度高低报警功能(本例中可能不直接使用,但在其他高级应用中很有用)。

    • 非易失性存储器(EEPROM): 用于存储用户定义的温度上下限等配置信息。


3. 上拉电阻:4.7kΩ 电阻


  • 元器件型号: 4.7kΩ 金属膜电阻

  • 器件作用: 用于DS18B20数据线(DQ)的上拉。

  • 为何选择: 单总线协议要求数据线在空闲时处于高电平状态。DS18B20内部是开漏(Open-Drain)输出,这意味着它只能将数据线拉低到地,而不能主动将其拉高。因此,需要一个外部上拉电阻将数据线拉高到VCC(通常是5V),当DS18B20发送数据时,它会周期性地将数据线拉低。

  • 功能: 确保单总线在不传输数据时保持高电平,保证通信的正常进行。4.7kΩ是Dallas Semiconductor(现在是Maxim Integrated)推荐的典型值,适用于DS18B20的通信。


4. 模拟显示元件(多种选择,根据需求选择其一或组合):


以下是一些可行的模拟显示方案,您可以根据项目的复杂度和预算选择最适合的一种或几种。


方案A:LED 灯条/LED 阵列(模拟灯光渐变)


  • 元器件型号: WS2812B 可寻址RGB LED 灯条(或普通LED阵列配限流电阻)

  • 器件作用: 通过不同数量或不同亮度的LED点亮,直观地显示温度变化。WS2812B灯条可以实现颜色和亮度渐变,提供更丰富的视觉效果。

  • 为何选择:

    • WS2812B灯条: 仅需一个数据引脚即可控制多个LED,简化接线。可以实现从冷色到暖色的渐变,或者根据温度值改变LED点亮数量,非常直观。

    • 普通LED阵列: 成本低廉,易于理解和实现。每个LED需要一个数字引脚控制(或通过移位寄存器/LED驱动芯片),适合显示离散的温度区间。

  • 功能:

    • WS2812B灯条: 接收Arduino发送的数字信号,控制每个LED的颜色和亮度,实现温度值的可视化渐变显示。

    • 普通LED阵列: Arduino根据温度值选择性点亮不同数量的LED,例如,每增加$5^circ C$就点亮一个LED。


方案B:指针式模拟电压表/电流表


  • 元器件型号: 小尺寸直流电压表(例如0-5V量程)或电流表(例如0-100mA量程),搭配驱动电路。

  • 器件作用: 将温度值转换为模拟电压或电流信号,驱动指针偏转,实现传统模拟仪表的显示效果。

  • 为何选择: 具有复古和直观的视觉效果,能够清晰地显示温度变化的趋势。

  • 功能:

    • Arduino的PWM输出: Arduino的数字引脚可以通过PWM(脉冲宽度调制)产生模拟电压信号。

    • RC滤波器: 将PWM信号通过RC(电阻-电容)低通滤波器平滑成相对稳定的直流电压。

    • 驱动: 将平滑后的电压(或通过限流电阻转换为电流)输入到模拟电压表或电流表,驱动指针偏转。例如,可以将$0^circ C$映射到0V,$100^circ C$映射到5V。


方案C:数字电位器(与模拟电压表结合)


  • 元器件型号: MCP4131或AD5241等数字电位器

  • 器件作用: Arduino通过SPI或I2C接口控制数字电位器的阻值,进而调节输出电压,驱动模拟仪表。

  • 为何选择: 相较于PWM+RC滤波器,数字电位器可以提供更精确和稳定的模拟电压输出,避免PWM带来的纹波。

  • 功能: Arduino发送指令给数字电位器,调节其分压比,从而产生与温度值成比例的模拟电压,驱动模拟电压表。


方案D:DAC(数模转换器)芯片(与模拟电压表结合)


  • 元器件型号: MCP4725(I2C接口)或其他型号的DAC芯片

  • 器件作用: 将Arduino输出的数字温度值直接转换为高精度的模拟电压信号,用于驱动模拟电压表。

  • 为何选择: DAC芯片是专门用于将数字信号转换为模拟信号的器件,其输出精度和稳定性远高于PWM+RC滤波器或数字电位器方案,尤其适用于需要高精度模拟输出的场景。

  • 功能: Arduino通过I2C接口向MCP4725发送12位数字温度值,MCP4725将其转换为0-5V范围内的模拟电压,直接连接到模拟电压表。


5. 面包板与跳线(杜邦线)


  • 元器件型号: 标准面包板(例如400孔或830孔)和各种长度的公对公、公对母、母对母跳线。

  • 器件作用: 面包板用于临时搭建电路,无需焊接,方便测试和修改。跳线用于连接Arduino、传感器和显示元件。

  • 为何选择:

    • 易于原型开发: 面包板使得电子元件的连接变得快速简便,非常适合项目初期的测试和调试。

    • 可重复利用: 元件可以轻松插入和拔出,方便重复使用。

    • 安全性: 在焊接之前进行测试,可以有效避免短路或其他接线错误。

  • 功能: 提供一个无焊接的物理平台,用于组装电路并确保所有元件之间的电气连接正确。


6. USB 数据线


  • 元器件型号: USB A到B型数据线(用于Arduino Uno)

  • 器件作用: 连接Arduino Uno到电脑,用于供电、上传程序和串口通信。

  • 为何选择: 这是Arduino Uno的标准连接方式,提供稳定可靠的电源和数据传输。

  • 功能: 为Arduino板提供电源,并将编译好的代码上传到Arduino的微控制器中,同时允许Arduino通过串口向电脑发送调试信息。


7. 供电方式(可选,根据项目场景选择)


  • 元器件型号: 9V电池(带电池扣)或5V直流电源适配器

  • 器件作用: 当项目需要脱离电脑独立运行时,提供稳定的电源。

  • 为何选择: USB供电虽然方便,但如果项目需要长时间独立运行或放置在特定位置,外部电源是必需的。

  • 功能: 为Arduino板及其连接的外设提供持续的电能。


电路连接图(概念性描述,实际操作请参考具体引脚)


  1. DS18B20连接:

    • VCC(或红色线) 连接到Arduino的 5V 引脚。

    • GND(或黑色线) 连接到Arduino的 GND 引脚。

    • DQ(数据线,或黄色线) 连接到Arduino的任意数字引脚,例如 D2

    • DQ 引脚和 5V 引脚之间连接一个 4.7kΩ上拉电阻

  2. 模拟显示元件连接(以PWM+RC滤波器驱动模拟电压表为例):

    • Arduino的一个 PWM引脚(例如 D9D10)连接到一个 1kΩ电阻

    • 电阻的另一端连接到 10uF电解电容 的正极。

    • 电解电容的负极连接到Arduino的 GND

    • 电解电容正极与电阻之间的节点连接到模拟电压表的 正极

    • 模拟电压表的 负极 连接到Arduino的 GND

  3. 电源连接:

    • 使用USB数据线连接Arduino到电脑进行开发和测试。

    • 独立运行时,将9V电池连接到Arduino的DC插孔,或将5V适配器连接到DC插孔。


软件编程(Arduino IDE)



1. 准备工作:安装Arduino IDE和必要的库


  • 下载并安装Arduino IDE: 从Arduino官网下载最新版本的IDE。

  • 安装OneWire库和DallasTemperature库:

    • 打开Arduino IDE。

    • 点击“工具” -> “管理库...”。

    • 在搜索框中输入“OneWire”,找到并安装OneWire库。

    • 在搜索框中输入“DallasTemperature”,找到并安装DallasTemperature库。


2. 编程思路


  1. 初始化: 包含必要的库文件,定义DS18B20的数据引脚,初始化OneWire和DallasTemperature对象。

  2. 读取温度:loop()函数中,定时向DS18B20发送请求,读取温度数据。

  3. 数据处理: 将读取到的原始温度数据转换为摄氏度或华氏度。

  4. 模拟显示: 根据温度值,通过Arduino的PWM功能或DAC芯片输出相应的模拟信号,驱动模拟显示设备。

    • PWM实现模拟电压: 将温度值映射到0-255的PWM占空比,然后输出到PWM引脚。例如,$0^circ C$对应0, $100^circ C$对应255。

    • LED灯条: 根据温度值计算需要点亮的LED数量或LED颜色。

  5. 串口输出(可选): 将温度值通过串口打印到电脑,便于调试和监控。


3. 示例代码框架(以PWM驱动模拟电压表为例)

#include <OneWire.h>
#include <DallasTemperature.h>

// 定义DS18B20连接的Arduino数字引脚
#define ONE_WIRE_BUS 2

// 定义连接模拟电压表的PWM引脚
#define ANALOG_OUTPUT_PIN 9 // 确保选择一个PWM引脚 (例如 3, 5, 6, 9, 10, 11)

// 设置OneWire总线
OneWire oneWire(ONE_WIRE_BUS);

// 将DallasTemperature库与OneWire总线关联起来
DallasTemperature sensors(&oneWire);

void setup() {
 // 初始化串口通信,用于调试输出
 Serial.begin(9600);
 Serial.println("DS18B20 温度计启动!");

 // 启动DS18B20传感器
 sensors.begin();

 // 配置模拟输出引脚为输出模式 (对于PWM,通常不需要显式设置pinMode,但习惯上可以)
 pinMode(ANALOG_OUTPUT_PIN, OUTPUT);
}

void loop() {
 // 向DS18B20请求温度转换
 Serial.print("请求温度...");
 sensors.requestTemperatures(); // 这会将温度数据读取到传感器的内部存储器

 // 从DS18B20获取温度值 (第一个传感器)
 float temperatureC = sensors.getTempCByIndex(0);

 // 检查温度读取是否成功
 if (temperatureC == DEVICE_DISCONNECTED_C) {
   Serial.println("错误: 无法读取温度数据!");
   delay(2000); // 稍作延迟再次尝试
   return;
 }

 // 打印温度到串口
 Serial.print("温度: ");
 Serial.print(temperatureC);
 Serial.println(" °C");

 // 将温度值映射到PWM输出范围 (0-255)
 // 假设我们希望将0°C映射到PWM的0,将100°C映射到PWM的255。
 // 您可以根据实际的温度测量范围和模拟仪表的量程进行调整。
 int pwmValue = map(temperatureC, 0, 100, 0, 255);

 // 限制pwmValue在有效范围内 (0-255)
 pwmValue = constrain(pwmValue, 0, 255);

 // 将PWM值输出到指定的PWM引脚
 analogWrite(ANALOG_OUTPUT_PIN, pwmValue);

 // 每2秒读取一次温度
 delay(2000);
}

代码解释:

  • #include <OneWire.h>#include <DallasTemperature.h>:引入必要的库,用于与DS18B20通信。

  • #define ONE_WIRE_BUS 2:定义DS18B20数据线连接到Arduino的数字引脚2。您可以根据实际连接修改。

  • #define ANALOG_OUTPUT_PIN 9:定义用于模拟输出的PWM引脚。请务必选择Arduino Uno上具有PWM功能的引脚(通常是3, 5, 6, 9, 10, 11,带波浪线~的)。

  • OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);:创建OneWire和DallasTemperature对象,用于传感器通信。

  • sensors.begin();:在setup()函数中初始化传感器。

  • sensors.requestTemperatures();:在loop()函数中请求传感器进行温度转换。这是一个非阻塞函数,传感器会开始测量,但不会立即返回结果。

  • sensors.getTempCByIndex(0);:获取第一个(或唯一一个)DS18B20传感器的摄氏度温度值。如果连接了多个DS18B20,可以使用getDeviceAddress()getTempCByAddress()来指定读取哪个传感器。

  • map(temperatureC, 0, 100, 0, 255);:这是一个非常重要的函数,它将一个范围内的值(这里是温度,从0到100摄氏度)线性地映射到另一个范围(这里是PWM值,从0到255)。您可以根据您的实际温度范围和模拟仪表的量程来调整map函数的参数。

  • constrain(pwmValue, 0, 255);:确保pwmValue始终在0到255之间,防止出现超出范围的值导致异常。

  • analogWrite(ANALOG_OUTPUT_PIN, pwmValue);:将计算出的PWM值输出到指定的引脚。Arduino会根据这个值生成一个相应占空比的方波,通过RC滤波器后即可得到一个模拟电压。


调试与优化


  • 串口监视器: 在Arduino IDE中打开串口监视器,可以实时查看DS18B20读取到的温度值,这对于调试非常重要。

  • 电源稳定性: 确保为DS18B20和Arduino提供稳定的5V电源。如果使用电池供电,当电池电量不足时,可能会导致传感器读取不稳定。

  • 上拉电阻: 确保4.7kΩ的上拉电阻正确连接在DQ线和VCC之间,这是DS18B20单总线通信的关键。

  • 模拟显示校准:

    • PWM+RC滤波器: 调整RC滤波器的参数(电阻和电容的值)可以影响输出电压的平滑程度和响应速度。较大的电容会使输出更平滑但响应更慢。

    • 模拟电压表: 如果您使用的是指针式电压表,可能需要进行物理校准或在代码中进行微调,以确保其指示与实际温度匹配。可以通过测量在已知温度下(例如冰水混合物$0^circ C$和沸水$100^circ C$)的电压输出,然后调整map函数的参数进行校准。

    • LED灯条: 调整map函数或LED控制逻辑,确保LED点亮数量或颜色变化符合预期,并且与温度变化呈线性或非线性(根据您的设计)关系。

  • DS18B20的封装选择: 如果是用于测量液体或户外温度,推荐使用防水探头版本的DS18B20,它通常带有密封的不锈钢外壳。


项目扩展与进阶


完成基本的模拟温度计后,您可以尝试以下扩展功能:

  • 温度阈值报警: 添加蜂鸣器或LED指示灯,当温度超出预设范围时发出警报。

  • LCD/OLED显示屏: 除了模拟显示外,增加一个LCD1602或OLED显示屏,同时显示精确的数字温度值,方便用户查看。

  • 数据记录: 将温度数据记录到SD卡模块中,方便长期监控温度变化。

  • 网络功能: 使用ESP8266或ESP32模块,将温度数据上传到云平台(如ThingSpeak),实现远程监控。

  • 多个DS18B20传感器: 利用DS18B20的单总线特性,连接多个传感器,测量不同位置的温度。

  • 温度单位切换: 添加一个按钮,允许用户在摄氏度($^circ C$)和华氏度($^circ F$)之间切换显示单位。


总结


通过Arduino和DS18B20温度传感器,我们不仅能够构建一个功能完善的模拟温度计,还能深入理解微控制器、传感器通信和模拟信号处理的基本原理。从元器件的选择到电路的搭建,再到软件的编程,每一步都蕴含着丰富的电子工程知识。这个项目既是学习的起点,也是创新的平台,希望本文能为您自制高精度模拟温度计提供全面的指导和帮助。在实践中,您将遇到各种挑战,但解决这些挑战的过程本身就是最大的收获。

责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

上一篇: 已是第一篇

相关资讯

拍明芯城微信图标

各大手机应用商城搜索“拍明芯城”

下载客户端,随时随地买卖元器件!

拍明芯城公众号
拍明芯城抖音
拍明芯城b站
拍明芯城头条
拍明芯城微博
拍明芯城视频号
拍明
广告
恒捷广告
广告
深亚广告
广告
原厂直供
广告