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

发布时间 2023-07-23 13:03:48作者: 行者花雕

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验三十九:DS18B20单总线数字温度传感器模块

18B20元件官方链接如下:
https://www.maximintegrated.com/cn/products/sensors/DS18B20.html
相关技术参考资料:
https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
https://www.jin-hua.com.tw/upload/product/2110000001544_DATA.pdf

18B20数字温度传感器模块实验所需硬件清单

Arduino Uno开发板 X1
0.96寸OLED显示屏X1
杜邦线 若干(备了9条)
高电平触发有源蜂鸣器模块X1
IIC/I2C 1602 LCD液晶屏模块X1
18B20数字温度传感器模块X2
LED发光二极管(绿、蓝色)X2
高电平触发单路5V继电器模块X1
Proto Shield 原型扩展板(带mini面包板)X1

传感器模块实验所需软件平台
代码编程 Arduino IDE (版本1.8.19)
仿真编程 Linkboy (版本V4.6.3)
图形编程 Mind+ (版本 V1.7.0 RC2.0)
以及编玩边学(线上平台https://ide.codepku.com/?type=Arduino)

实验接线示意图

搜索安装“DallasTemperature”和“OneWire”库
1、打开Arduino——工具——管理库——搜索DallasTemperature——安装

2、打开Arduino——工具——管理库——搜索OneWire——安装

实验说明
 
18B20 虽然具有测温系统简单、测温精度高、連接方便、占用口线少等优点,但在实际应用中也应注意以下几方面的问题:
1、18B20和普通的三极管看起来差不多,所以注意不要把它当成一般的Pass三极管,以免损坏。为了防止损坏 18B20,请确保电源线和地线没有接反。
 
2、较小的硬件开销需要相对复杂的软件进行补偿,由于18B20与微处理器间采用串口资料传送,因此,在对18B20 进行读写编程时,必须严格的保证读写时序,否则将无法读取测温结果。在使用 PL/M、C 等语言进行系统程序设计时,对 18B20 操作部分最好采用组合语言实现。
 
3、在 18B20 的有关资料中均未提及单汇流排上所挂 18B20 数量问题,容易使人误认为可以挂任意多个18B20,在实际应用中并非如此。当单汇流排上所挂18B20 超过 8个时,就需要解决微处理器的汇流排驱动问题,这一点在进行多点测温系统设计时要加以注意。
 
4、连接 18B20 的汇流排电缆是有长度限制的。试验中,当采用普通信号电缆传输长度超过 50m 时,读取的测温资料将发生错误。当将汇流排电缆改为双绞线带遮罩电缆时,正常通讯距离可达 150m,当采用每米绞合次数更多的双绞线带遮罩电缆时,正常通讯距离进一步加长。这种情况主要是由汇流排分布电容使信号波形产生畸变造成的。因此,在用18B20 进行长距离测温系统设计时要充分考虑汇流排分布电容和阻抗匹配问题。
 
5、18B20 测温程式设计中,向18B20 发出温度转换命令后,程序总要等待 18B20 的返回信号,一旦某个18B20 接触不好或断线,当程序读该18B20时,将没有返回信号,程序进入闭环。这一点在进行18B20 硬件连接和软件设计时也要给予一定的重视。测温电缆线建议采用遮罩 4 芯双绞线,其中一对线接地线与信号线,另一组接 VCC 和地线,遮罩层在源端单点接地。
 

程序一:单线数字温度18B20 + Arduino
Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序一:单线数字温度18B20 + Arduino
*/

#include <OneWire.h>  // 调用OneWire库
#include <DallasTemperature.h>  // 调用DallasTemperature库
#define ONE_WIRE_BUS 2  // 定义18B20数据口连接arduino的 2 脚
OneWire oneWire(ONE_WIRE_BUS);  // 初始连接在单总线上的单总线设备
DallasTemperature sensors(&oneWire);

void setup(void) {
  Serial.begin(9600);  // 设置串口通信波特率
  Serial.println("18B20温度 IC 控制库演示"); // 温度IC控制库演示
  sensors.begin(); // 初始化总线
}

void loop(void) {
  Serial.print(" 读取温度...");  // 发起温度转换
  sensors.requestTemperatures();  // 向总线上所有设备发送温度转换请求
  Serial.println("完成");   // 温度转换完成
  Serial.print("温度为: ");  // 串口打印实时温度值
  // 同一总线上可以有多个 DS18B20。
  // 0指的是线上的第一个IC
  Serial.print(sensors.getTempCByIndex(0));
  delay(500);  // 延时500毫秒
}

  

实验串口返回情况(手摸传感器升温3度)

Arduino实验场景图

程序二:串口显示温度
实验开源仿真编程(Linkboy V4.63)

实验串口返回情况

 

Arduino实验场景图

程序三:带工作指示灯的温度检测器
(1)实验开源图形编程(Mind+、编玩边学)

(2)实验串口返回情况

程序四:TM1637数码管显示温度
(1)实验开源仿真编程(Linkboy V4.63)

Arduino实验场景图

程序五:温度控制红绿蓝三色灯
(1)Arduino参考开源代码

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序五:温度控制红绿蓝三色灯
*/

#include <OneWire.h>  // 调用OneWire库
#include <DallasTemperature.h>  // 调用DallasTemperature库

int redLedPin = 2;//红色LED
int greenLedPin = 3;//绿色LED
int blueLedPin = 4;//蓝色LED

int temp_sensor = 5;//温度传感器

float temperature = 0;
//低于下限的温度值都会触发蓝色LED灯亮起。
//高于上限的变量都会触发红色LED灯亮起。
//介于两者之间的变量都将打开绿色LED灯。
int lowerLimit = 25;//温度下限阙值
int higherLimit = 27;//温度上限阙值
//创建一个OneWire对象
OneWire oneWirePin(temp_sensor);
DallasTemperature sensors(&oneWirePin);

void setup(void) {
  //激活Arduino串行接口
  Serial.begin(9600);
  //设置LED作为输出
  pinMode(redLedPin, OUTPUT);
  pinMode(greenLedPin, OUTPUT);
  pinMode(blueLedPin, OUTPUT);
  sensors.begin();//温度传感器初始化
}

void loop() {
  Serial.print("Requesting Temperatures from sensors: ");
  sensors.requestTemperatures();
  Serial.println("DONE");
  temperature = sensors.getTempCByIndex(0);

  digitalWrite(redLedPin, LOW);
  digitalWrite(greenLedPin, LOW);
  digitalWrite(blueLedPin, LOW);

  Serial.print("Temperature is ");
  Serial.print(temperature);

  //设置LED作为输出
  if (temperature <= lowerLimit) {
    Serial.println(", blue LED is Activated");
    digitalWrite(blueLedPin, HIGH);
  }
  else if (temperature > lowerLimit && temperature < higherLimit) {
    Serial.println(", Green LED is Activated");
    digitalWrite(greenLedPin, HIGH);
  }
  else if (temperature >= higherLimit) {
    Serial.println(", Red LED is Activated");
    digitalWrite(redLedPin, HIGH);
  }
  delay(2000);
}

  

实验串口返回情况

 

(2)实验场景图
温度下限为25度,上限为27度
低于下限的温度值都会触发蓝色LED灯亮起

 

高于上限的变量都会触发红色LED灯亮起

 

介于两者之间的变量都将打开绿色LED灯