esp笔记(10)esp8266 驱动 ds18B20 多点测温

ds18b20 简介

在这里插入图片描述

DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在 -10~+ 85°C范围内,精度为 ± 0.5°C ,其IO只有3个:VCC,GND,和 DQ,其中 DQ 为单总线,可以输出和输入数据,特别的,多个 18b20 的 DQ 可以连接到 MCU 同一个 IO 口上,每个 18b20 都有一个 唯一ID,MCU通过该ID来读取指定传感器的温度值。

详情:DS18B20 datasheet

ds18b20 是通过总线竞争来避免数据干扰的,详见:DS18B20单总线策略的分析

程序设计

1. 库安装

驱动 ds18b20 需要安装2个库,第1个库为单总线库 OneWire:
在这里插入图片描述
本文安装的版本为 2.3.5

第二个库为 ds18b20 的库 DallasTemperature :
在这里插入图片描述
本文安装的版本为 3.9.0

至此已完成了本文所需库的安装

2. 硬件连接

本文使用了 2个 ds18b20 ,接入一个 4.7k 上拉电阻(这一步是必须的,否则无法读取温度),DQ 数据线接入 D2 中:
在这里插入图片描述

3. 运行例程

Arduino 的库通常有一些简单好用的例程,我们可以直接使用:、
文件 -> 示例 -> DS18B20 -> Multiple
在这里插入图片描述
该示例为读取多点温度的程序,Alarms 应该为报警温度,在ds18b20中,也可以设置最高和最低温度报警值,如果以读取报警温度的指令来读取,则只有处于报警温度的设备会反馈温度。Multiple 代码如下:

#include <DS18B20.h>

DS18B20 ds(2);

void setup() {
  Serial.begin(9600);
  Serial.print("Devices: ");
  Serial.println(ds.getNumberOfDevices());
  Serial.println();
}

void loop() {
  while (ds.selectNext()) {
    switch (ds.getFamilyCode()) {
      case MODEL_DS18S20:
        Serial.println("Model: DS18S20/DS1820");
        break;
      case MODEL_DS1822:
        Serial.println("Model: DS1822");
        break;
      case MODEL_DS18B20:
        Serial.println("Model: DS18B20");
        break;
      default:
        Serial.println("Unrecognized Device");
        break;
    }

    uint8_t address[8];
    ds.getAddress(address);

    Serial.print("Address:");
    for (uint8_t i = 0; i < 8; i++) {
      Serial.print(" ");
      Serial.print(address[i]);
    }
    Serial.println();

    Serial.print("Resolution: ");
    Serial.println(ds.getResolution());

    Serial.print("Power Mode: ");
    if (ds.getPowerMode()) {
      Serial.println("External");
    } else {
      Serial.println("Parasite");
    }

    Serial.print("Temperature: ");
    Serial.print(ds.getTempC());
    Serial.print(" C / ");
    Serial.print(ds.getTempF());
    Serial.println(" F");
    Serial.println();
  }

  delay(10000);
}

第3行,指明了 DQ 连接 MCU 为 GPIO2 ,本文连接在丝印 D2 处也就是 GPIO4
在这里插入图片描述

所以应该将括号内的 2 改为 4

#include <DS18B20.h>

DS18B20 ds(4);

void setup() {
  Serial.begin(9600);
  Serial.print("Devices: ");
  Serial.println(ds.getNumberOfDevices());
  Serial.println();
}

void loop() {
  while (ds.selectNext()) {
    switch (ds.getFamilyCode()) {
      case MODEL_DS18S20:
        Serial.println("Model: DS18S20/DS1820");
        break;
      case MODEL_DS1822:
        Serial.println("Model: DS1822");
        break;
      case MODEL_DS18B20:
        Serial.println("Model: DS18B20");
        break;
      default:
        Serial.println("Unrecognized Device");
        break;
    }

    uint8_t address[8];
    ds.getAddress(address);

    Serial.print("Address:");
    for (uint8_t i = 0; i < 8; i++) {
      Serial.print(" ");
      Serial.print(address[i]);
    }
    Serial.println();

    Serial.print("Resolution: ");
    Serial.println(ds.getResolution());

    Serial.print("Power Mode: ");
    if (ds.getPowerMode()) {
      Serial.println("External");
    } else {
      Serial.println("Parasite");
    }

    Serial.print("Temperature: ");
    Serial.print(ds.getTempC());
    Serial.print(" C / ");
    Serial.print(ds.getTempF());
    Serial.println(" F");
    Serial.println();
  }

  delay(10000);
}

可以看到获取到2个ds18b20,并打印出他们的温度:
在这里插入图片描述
重要提示:这个例程似乎会出现 内存 问题,导致读取几次温度后,会打印一些信息,经测试是esp重启了,原因不明。
在这里插入图片描述

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值