使用一个io口同时兼容连接dht11和18b20温度传感器

一个io口同时兼容dht11和18b20温度传感器,也就是说这个io口设计具有高度灵活性,可以兼容DHT11和18B20两种不同类型的温度传感器(一次只能连接一种温度传感器)。用户可以轻松地在同一个io口上连接不同的传感器,从而实现更广泛的应用。这种设计不仅简化了操作流程,也为未来连接其他传感器类型提供了便利。

本程序在ESP32开发板上进行验证,你需要安装指定的库文件,

DHT库用于与DHT系列湿度和温度传感器通信
OneWire库用于与1-Wire协议设备通信
DallasTemperature库则用于与DS18B20温度传感器通信

选择开发板ESP32,然后直接编译烧录。打开串口接收窗口,把波特率设置为115200,即可看到接收到的温湿度数据,你可以自行编译或者直接使用bin固件先测试一下效果,满足你的需求后再拿去使用。

// 使用一个IO口兼容dht11和18b20温度传感器
//(注意一次只能连接一种温度传感器)
// 2024年8月3日
// @LHCDWZ-刘洪材

#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define SENSORPIN 15  // 设置传感器的数据引脚

//定义了一个枚举类型 SensorType 放入 DHT11传感器、DS18B20传感器、未知类型的传感器
enum SensorType {
  DHT11_SENSOR,
  DS18B20_SENSOR,
  UNKNOWN_SENSOR
};

SensorType sensorType = UNKNOWN_SENSOR;

DHT dht(SENSORPIN, DHT11);  // 初始化DHT11传感器
OneWire oneWire(SENSORPIN);  // 初始化18B20传感器
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  Serial.println("正在尝试初始化18B20传感器");
  // 首先初始化18B20传感器
  sensors.begin();
  sensors.requestTemperatures();
  float temp18B20 = sensors.getTempCByIndex(0);
  // 输出一次结果
  Serial.print("18B20读取到的温度是: ");
  Serial.print(temp18B20);
  Serial.println("°C");
  //如果18B20传感器没有成功连接或初始化会输出-127℃

  // 判断传感器类型
  //如果18B20传感器不等于-127,说明当前温度获取成功,那么当前就是18B20传感器,否则进行dht11初始化
  if (temp18B20 != -127) {
    Serial.println("成功初始化,当前传感器是18B20");
    sensorType = DS18B20_SENSOR;  // 设置传感器类型为18B20
  } else {
    Serial.println("初始化18B20传感器失败");
    Serial.println("正在尝试初始化DHT11传感器");
    // 初始化DHT11传感器
    dht.begin();
    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();
    Serial.print("DHT11读取到的湿度是: ");
    Serial.print(humidity);
    Serial.print("%  温度是: ");
    Serial.print(temperature);
    Serial.println("°C");
    // 如果湿度不等于0或者温度不等于0,即湿度和温度数据有效
    // if (humidity != "nan" || temperature != "nan") {
      if (!isnan(humidity) || !isnan(temperature)) {
      Serial.println("成功初始化,当前传感器是DHT11");
      sensorType = DHT11_SENSOR;  // 将传感器类型设置为DHT11_SENSOR
    }
    else {
       Serial.println("全部初始化失败,请检查接线是否正确,传感器是否是此程序支持的两种类型,并且一次只能接入一个传感器。");
    }
  }
}
// 在loop函数中执行传感器数据的读取和输出
void loop() {
  // 如果传感器是DHT11则执行
  if (sensorType == DHT11_SENSOR) {
    float humidity = dht.readHumidity();
    float temperature = dht.readTemperature();
    Serial.print("DHT11读取到的湿度是: ");
    Serial.print(humidity);
    Serial.print("%  温度是: ");
    Serial.print(temperature);
    Serial.println("°C");
  } // 如果传感器是DS18B20则执行
  else if (sensorType == DS18B20_SENSOR) {
    sensors.requestTemperatures();
    float temp18B20 = sensors.getTempCByIndex(0);
    Serial.print("18B20读取到的温度是: ");
    Serial.print(temp18B20);
    Serial.println("°C");
  }

  delay(1000);  // 延迟1秒后再次读取数据
}

注释写的很清楚了,运行逻辑如下:

首先开始初始化18B20,如果初始化成功,会立即打印 “成功初始化,当前传感器是18B20” 并循环打印温度。

如果18B20传感器没有成功连接或成功初始化会输出-127℃,然后就会开始初始化DHT11,如果初始化成功,会立即打印 “成功初始化,当前传感器是DHT11” 并循环打印温度和湿度。

如果仍没有正确初始化,那就会打印全部初始化失败,请检查接线是否正确,传感器是否是此程序支持的两种类型(DHT1118B20)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值