一、参考
在Arduino中使用DS18B20温度传感器(基于OneWire和DallasTemperature库)
二、目标
通过LM35测量温度值,通过串口发送给电脑
三、理论学习
1、LM35
LM35使用非常普遍,他使用内部补偿机制,输出可以从0°C开始。封装在T0992,工作电压4-30V。而且在上述电压范围内,芯片的工作电流不超过60ua。根据产品使用手册,得知LM35传感器的输出电压与设置温度呈线性关系,0°C时输出为0V,每升高1°C,输出电压增加10mV。
计算过程:
1.假设AD读取出来的值为val,那么该AD值对应的电压为:val5/10231000 = 4.8876val,单位mV
2.对应的温度为4.8876val/10 = 0.48876*val,单位是°C。
2、DS18B20
DS18B20是很常用且易用的温度传感器元件,在元器件的应用上也只需要一个DS18B20元件,只利用一个接口就可以,难点在于算法上的将读取的模拟值转换为实际的温度。
四、实物图
引脚说明
五、接线图
六、Mind+
读取温度之后通过串口发送,并且1s中发送一次。
七、LM35代码
/*
温度传感器LM35
*/
#include<Arduino.h>
// 定义引脚命名
#define LM35 A0
int val = 0;
// 定义温度初始值
float temp = 0;
// the setup function runs once when you press reset or power the board
void setup() {
// 打开串口
Serial.begin(9600);
}
// the loop function runs over and over again forever
void loop()
{
val = analogRead(LM35);
temp = 0.48876 * val;
Serial.print(val);
Serial.print("= LM35 = ");
Serial.println(temp);
delay(1000);
}
八、DS18B20
1、相关库引入
两个库均在GitHub上,可以在release标签页中下载最新项目文件。
OneWire库
项目地址:https://github.com/PaulStoffregen/OneWire
使用时需要包含OneWire.h 文件、OneWire.cpp 文件、util 文件夹;
所有版本库文件地址:https://github.com/PaulStoffregen/OneWire/releases
库文件下载:OneWire-2.3.7.zip
DallasTemperature库
项目地址:https://github.com/milesburton/Arduino-Temperature-Control-Library
使用时需要包含DallasTemperature.h 文件、DallasTemperature.cpp 文件;
所有版本库文件地址:https://github.com/milesburton/Arduino-Temperature-Control-Library/releases
库文件下载:Arduino-Temperature-Control-Library-3.9.1.zip
下载两个库的zip包后在Arduino IDE中选择:项目 > 加载库 > 添加一个 .ZIP库 ,两个库添加完成后就可以使用了。
中文版是在Arduino IDE中选择:Sketch > Include library > Add .ZIP library两个库添加完成后就可以使用了。
2、使用步骤
- 引入相关库;
- 声明OneWire和DallasTemperature对象;
- 使用DallasTemperature的begin方法初始化总线;
- 发送温度转换请求;
- 读取温度值;
3、代码
方法一 阻塞
/*
温度传感器LM35
*/
#include<Arduino.h>
// DS18B20温度传感器模块需要引入的
#include <DallasTemperature.h>
#include <OneWire.h>
DeviceAddress insideThermometer;
OneWire oneWire_A0(A0);//设置端口为A0
DallasTemperature sensors_A0(&oneWire_A0);
float ds18b20_A0_getTemp(int w) {
sensors_A0.requestTemperatures();
if(w==0) {
return sensors_A0.getTempC(insideThermometer);
}
else {
return sensors_A0.getTempF(insideThermometer);
}
}
// the setup function runs once when you press reset or power the board
void setup() {
// 打开串口
Serial.begin(9600);
sensors_A0.getAddress(insideThermometer, 0);
sensors_A0.setResolution(insideThermometer, 9);
}
// the loop function runs over and over again forever
void loop()
{
float temp = ds18b20_A0_getTemp(0);
Serial.println(String(temp) + String("C"));//串口打印18B20的温度带上单位C
delay(1000);
}
文章来源:https://www.toymoban.com/news/detail-436751.html
方法二 非阻塞
以下演示是一种非阻塞获取温度的方式,性能上消耗较少:文章来源地址https://www.toymoban.com/news/detail-436751.html
// #include <OneWire.h> //可以不引入,因为DallasTemperature.h中已经引入了OneWire.h
#include <DallasTemperature.h>
#define ONE_WIRE_BUS A0 //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(".");
}
到了这里,关于ArduinoUNO实战-第十四章-LM35温度传感器和DS18B20温度传感器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!