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

0、结果

说明:先来看看串口调试助手显示的结果,第一个值是空气温度值。如果是你想要的,可以接着往下看。


1、外观

说明:虽然DS18B20温度传感器形态各异,但是原理和代码都是适用的,就是接线可能有点不一样。

 

2、连线

说明:只需要连接三根线。
uno————土壤湿度传感器

如果你手里的传感器不是集成的模块,可以按照下面的接线。
uno————土壤湿度传感器

 3、源程序

说明:采用非阻塞方式编写,一定时间检测一次温度,并将对应功能进行函数化,方便移植。

/****************************************ds18b20 part****************************************/
#include <OneWire.h>                                          //调用库文件
#include <DallasTemperature.h>                                //调用库文件
#define ONE_WIRE_BUS 2                                        //设置对应的引脚
#define ds18b20TimeInterval 1000

OneWire oneWire(ONE_WIRE_BUS);                                //实例化对象
DallasTemperature sensors(&oneWire);                          //实例化对象
DeviceAddress insideThermometer;                              //实例化对象

unsigned long ds18b20Times = 0;
float ds18b20Temp = 0;
/****************************************set up and loop part*********************************/
void setup(void)
{
  Serial.begin(9600);                                         //设置串口波特率为9600
  sensors.begin();                                            //传感器波特率初始化
  if (!sensors.getAddress(insideThermometer, 0)) {            //检测设备是否上线
    Serial.println("设备未上线!");                             //串口打印对应的值
  }
  Serial.println("设备上线!");                                 //串口打印对应的值
}
void loop()
{
  printTemperature(insideThermometer);                         //获取温度数据
}
/****************************************ds18b20 part****************************************/
/*获取温度数据*/
void printTemperature(DeviceAddress deviceAddress)
{
  if (millis() - ds18b20Times >= ds18b20TimeInterval) {        //一定时间执行一次
    ds18b20Times = millis();
    sensors.requestTemperatures();                             //请求温度的数据
    ds18b20Temp = sensors.getTempC(deviceAddress);

    Serial.print("温度: ");                                    //串口打印对应的值
    Serial.print(ds18b20Temp);
    Serial.println(" (C).");
  }
}

4、注意事项

说明:如果有什么问题可以评论@我,我将帮助你。需要在线下载对应的库文件才不会编译报错,可以在管理库中很方便的搜到,如果搜不到可以评论@我,我将私发给你。

5、基本原理

        DS18B20是一种数字温度传感器,它采用1-Wire接口协议进行通信,可以通过单个数据线连接到控制器或处理器中。其工作原理基于热敏电阻的特性。

        当 DS18B20 暴露在环境温度下时,其内置的热敏电阻会根据温度的变化而改变电阻值。DS18B20将电压源引入热敏电阻,然后使用内部的模拟-数字转换器 (ADC) 测量电压和电阻值,并将其转换为数字温度数据。此外,DS18B20使用了独特的ROM存储器结构,可以存储其唯一的64位序列号。

        通过1-Wire接口协议,控制器可以向DS18B20发送命令以获取温度数据,并且每个DS18B20具有唯一的地址,因此多个DS18B20可以在同一总线上使用。

<think>好的,用户需要关于使用Arduino UnoDS18B20温度传感器、MAX7219驱动模块和3641AS数码管显示的示例代码和接线图。首先,我需要确认这些组件之间的连接方式和所需的库文件。 首先,DS18B20是单总线温度传感器,需要使用OneWire库和DallasTemperature库来读取数据。MAX7219是LED驱动器,通常使用LedControl库来控制数码管。3641AS是一个四位共阴数码管,需要与MAX7219正确连接。 接线方面,Arduino Uno的5V和GND需要为各个模块供电。DS18B20的数据线需要接一个4.7KΩ的上拉电阻到VCC,然后连接到Arduino的数字引脚(比如D2)。MAX7219的DIN、CLK、LOAD/CS引脚分别连接到Arduino的D7、D6、D5。3641AS的段选和位选需要接到MAX7219的输出引脚。需要注意共阴数码管的接线是否正确,避免接反。 代码部分,需要包含相应的库,初始化传感器和LED控制器。设置中需要启动温度传感器,配置MAX7219的亮度和清空显示。循环部分,读取温度并显示到数码管上。需要注意温度读取的延迟,避免频繁请求导致错误。同时,处理可能的负温度,显示负号。 可能需要检查用户是否安装了必要的库,比如OneWire、DallasTemperature和LedControl。如果没有安装,需要指导用户通过库管理器安装。此外,提醒用户注意数码管的共阴特性,确保MAX7219模块支持多位数码管驱动。 用户可能遇到的问题包括接线错误、库未安装、温度读取失败等。建议在代码中添加串口输出,用于调试温度是否正确读取。另外,MAX7219的亮度设置可能需要调整,避免过暗或过亮。 最后,确保示例代码中的引脚定义与实际接线一致,必要时允许用户根据实际情况修改引脚号。总结步骤:接线→安装库→上传代码→测试,并提供可能的故障排除方法。</think>### Arduino Uno + DS18B20 + MAX7219 + 3641AS 组合应用教程 #### 一、硬件接线说明 1. **DS18B20温度传感器** - VCC → Arduino 5V - GND → Arduino GND - DATA → Arduino D2(需接4.7KΩ上拉电阻到VCC)[^1] 2. **MAX7219驱动模块** - VCC → Arduino 5V - GND → Arduino GND - DIN → Arduino D7 - CLK → Arduino D6 - CS → Arduino D5 3. **3641AS数码管** - 段选引脚(a-g, dp)→ MAX7219 SEG A-G, DP - 位选引脚(DIG0-DIG3)→ MAX7219 DIG0-DIG3 ![接线示意图](https://via.placeholder.com/600x400?text=接线图参考Fritzing文件[^1]) #### 二、示例代码 ```cpp #include <OneWire.h> #include <DallasTemperature.h> #include <LedControl.h> #define ONE_WIRE_BUS 2 #define DIN_PIN 7 #define CLK_PIN 6 #define CS_PIN 5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); LedControl lc = LedControl(DIN_PIN, CLK_PIN, CS_PIN, 1); void setup() { sensors.begin(); lc.shutdown(0, false); lc.setIntensity(0, 8); lc.clearDisplay(0); } void displayTemperature(float temp) { int integer = abs((int)temp); int decimal = abs((int)(temp * 10)) % 10; bool isNegative = temp < 0; lc.setDigit(0, 3, isNegative ? 10 : integer / 100, false); lc.setDigit(0, 2, (integer % 100) / 10, false); lc.se
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值