ArduinoUNO实战-第十四章-LM35温度传感器和DS18B20温度传感器

一、参考

在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.8876
val/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);
}

在这里插入图片描述

方法二 非阻塞

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

// #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(".");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值