温度传感器DS18B20代码,温度传感器DS18B20实验
chanong
|作为“一线器件”,DS18B20 单线数字温度传感器具有独特的优势:
(1) 当使用单总线接口连接微处理器时,只需一根端口线即可实现微处理器与DS18B20 之间的双向通信。单总线具有经济性好、抗干扰性强、适合恶劣环境下的现场测温、使用方便等优点,可以让用户轻松搭建传感器网络和测量系统,可以为传感器网络的建设引入新的理念。
(2)测量温度范围宽,测量精度高DS18B20的测量范围为-55至+125,在-10至+85范围内精度为0.5。
(3) 支持多点网络功能将多个DS18B20并联在一根线上,实现多点测温。
(4)灵活的供电方案DS18B20可以通过内部寄生电路从数据线获取电源。因此,如果数据线时序满足一定要求,则无需连接外部电源,使得系统配置更简单、更可靠。
(5) 测量参数可设置DS18B20 的测量分辨率可通过程序设置为9 至12 位。
DS18B20的小尺寸、扩展的电压范围、提高的经济性、可选的小封装和扩展的电压范围使其适合构建您自己的经济型温度测量系统,使其成为设计人员的最爱,实属难得。
产品包装
时序图
典型应用电路
寄生供电方式
支持命令集
复位时序
读写时序
具体操作:
1. 打开IDE,进入Project > Load Libraries > Manage Libraries查找、下载并安装对应的库。否则程序创建后编译时会报错。
搜索18B20,浏览到18B20相关库,然后单击安装。
打开刚刚安装第三方库的File-Examples,找到第一个例子Alarm。
验证除了DallasTemperature.h 之外,您还需要另一个库OneWire.h,然后按照前面的步骤查找并安装OneWire。 ONE_WIRE_BUS 2 表示开发版本中数据端口连接到引脚2。
2、将Arduino开发版通过USB连接到电脑,选择对应的开发版本和端口,编译、上传、写入。
3、接线时需要加电阻,没有电阻就无法检测到设备。
引脚定义:面向印刷面,左侧为GND,右侧为VCC,中间为数字输出引脚(必须接4.7K至10K上拉电阻)。
物料清单表
Arduino Uno*1
18B20温度传感器1
4.7K电阻*1
接线
Arduino Uno ------ 18B20 温度传感器颜色
引脚2 ------ DO 白色
5V ------ VCC 红色
GND ------ GND 黄色
Arduino接线图
4. 连接线后,通过USB 连接计算机并打开串行监视器以查看结果。
报警案例代码。您可以根据您的需要更改它。
#include //引用单总线头文件
#include //引用18b20驱动文件
//数据线连接到Arduino的2号端口
#define ONE_WIRE_BUS 2//定义引脚2为数据引脚
//设置OneWire 实例以与任何OneWire 设备通信(不仅仅是Maxim/Dallas 温度IC)
OneWire oneWire(ONE_WIRE_BUS);
//将oneWire 引用传递给达拉斯温度。
达拉斯温度传感器(oneWire);
//保存设备地址的数组
设备地址内部温度计、外部温度计。
禁用设置(禁用)
{
//启动串口
串行.开始(9600);
Serial.println(\'达拉斯温度IC控制库演示\');
//启动库
sensors.begin();//初始化设备
//查找总线上的设备
Serial.print(\'找到\');
Serial.print(sensors.getDeviceCount(), DEC);//DEC表示串口数据以十进制格式打印
Serial.println(\'设备。\');
//在总线上查找设备并根据其索引对其进行分配。
if (!sensors.getAddress(insideThermometer, 0))
Serial.println(\'未找到设备0地址\');
if (!sensors.getAddress(outsideThermometer, 1))
Serial.println(\'未找到设备1地址\');
//显示总线上找到的地址
Serial.print(\'设备0地址:\');
printAddress(温度计);
串行.println();
Serial.print(\'设备0 报警: \');
printAlarms(温度计);
串行.println();
Serial.print(\'设备1地址:\');
printAddress(温度计之外);
串行.println();
Serial.print(\'设备1报警:\');
printAlarms(外部温度计);
串行.println();
Serial.println(\'设置报警温度.\');
//温度超过30时报警
sensors.setHighAlarmTemp(内部温度计, 30);
//温度低于-10时发出警报
sensors.setLowAlarmTemp(内部温度计,-10);
//温度超过31则发出警报
传感器.setHighAlarmTemp(outsideThermometer, 31);
//如果温度低于27则发送警报
传感器.setLowAlarmTemp(outsideThermometer, 27);
Serial.print(\'新设备0报警:\');
printAlarms(温度计);
串行.println();
Serial.print(\'新设备1报警:\');
printAlarms(外部温度计);
串行.println();
}
//输出设备地址的函数
void printAddress(设备地址设备地址)
{
for (uint8_t i=0; i 8; i++)
{
if (设备地址[i] 16) Serial.print(\'0\');
Serial.print(设备地址[i], HEX);
}
}
//输出设备温度的函数
void printTemperature(设备地址设备地址)
{
float tempC=Sensors.getTempC(deviceAddress);
Serial.print(\'临时C: \');
串行打印(tempC);
Serial.print(\'温度F: \');
Serial.print(达拉斯温度:to华氏度(tempC));
}
void printAlarms(uint8_t 设备地址[])
{
焦化温度。
temp=Sensors.getHighAlarmTemp(deviceAddress);
Serial.print(\'高位警报:\');
Serial.print(temp, DEC);
Serial.print(\'C/\');
Serial.print(达拉斯温度:to华氏度(温度));
Serial.print(\'F | 低警报: \');
temp=Sensors.getLowAlarmTemp(deviceAddress);
Serial.print(temp, DEC);
Serial.print(\'C/\');
Serial.print(达拉斯温度:to华氏度(温度));
Serial.print(\'F\');
}
//打印设备信息的主函数
void printData(设备地址设备地址)
{
Serial.print(\'设备地址:\');
printAddress(设备地址);
串口.print(\' \');
printTemperature(设备地址);
串行.println();
}
void checkAlarm(设备地址设备地址)
{
if (sensors.hasAlarm(deviceAddress))
{
Serial.print(\'ALARM: \');
printData(设备地址);
}
}
虚空循环(虚空)
{
//调用sensors.requestTemperatures()发出地球温度
//请求总线上的所有设备
Serial.print(\'请求温度.\');
传感器.requestTemperatures();
Serial.println(\'完成\');
//方法1:
//分别检查每个地址的报警情况
checkAlarm(温度计);
checkAlarm(外部温度计);
/*
//替代方法:
//搜索总线并迭代有警报的设备的地址。
//报警设备地址空间
设备地址报警地址;
Serial.println(\'正在搜索警报.\');
//调用alarm search()之前必须先调用重置alarm search()
传感器.resetAlarmSearch();
//如果没有设备有闹钟,则alarmSearch()返回0
while (sensors.alarmSearch(alarmAddr))
{
Serial.print(\'ALARM: \');
打印数据(alarmAddr);
}
*/
}