首页 > 其他分享 >使用一个io口同时兼容连接dht11和18b20温度传感器

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

时间:2024-08-03 17:25:36浏览次数:8  
标签:初始化 温度传感器 18b20 io 传感器 print 18B20 Serial DHT11

一个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” 并循环打印温度和湿度。

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

标签:初始化,温度传感器,18b20,io,传感器,print,18B20,Serial,DHT11
From: https://blog.csdn.net/lhcdwz/article/details/140892162

相关文章

  • iree 编译流程(2)——buildGlobalOptimizationPassPipeline
    buildGlobalOptimizationPassPipelineIREE::Util::createSimplifyGlobalAccessesPass这个pass主要做这几件事:将不可变globaltensor的load提前到了block的开头,将globaltensor的store安全地挪到block的结尾。进行以下化简:如果loadafterstore,则把load......
  • Deep Learning-Based Multiclass Instance Segmentation for Dental Lesion Detection
    Abstract为此,我们提出了一种用于根尖周疾病检测的轻量级Mask-RCNN模型。该模型分为两部分构建:轻量级的改进MobileNet-v2骨干网和基于区域的网络(RPN),用于小数据集的根尖周疾病定位。为了测量所提出模型的有效性,轻量级的Mask-RCNN在包含五种不同类型根尖周围病变图像的自定义......
  • Android Studio开发学习(二、注册存储)
    用户注册首先我们创建一个新的Activity,将他命名为RegisterActivity我们还是先设计注册界面布局(根据自身喜好),我这里延用了上一篇透明框布局bg_username、btn_left、btn_right上一篇我们已经简单介绍了LinearLayout、TextView、EditText功能,这里补充一下Button布局,它决定按钮......
  • 怎么配置一个axios来拦截前后端请求
    首先创建一个axios.js文件导入我们所需要的依赖importaxiosfrom"axios";importElementfrom'element-ui'importrouterfrom"./router";设置请求头和它的类型和地址注意先注释这个url,还没有解决跨域问题,不然会出现跨域//axios.defaults.baseURL="http://loc......
  • 常用的数据集WebVision介绍和pytorch下的简单使用
    WebVision数据集介绍官方下载地址WebVision数据集常用于开集/闭集噪声学习、长尾噪声学习方法在真实数据集上的评估。根据[2]的统计,干净样本占70%,OOD噪声占25%,ID噪声占5%。由于数据集本身较大,论文中使用的都是其中很小的一部分,进入下载页面,选择《WebVisionDataset1.0》《Resi......
  • 李沐动手学深度学习V2-chapter_convolutional-modern
    李沐动手学深度学习V2文章内容说明本文主要是自己学习过程中的随手笔记,需要自取课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=333.788.0.0课件等信息原视频简介中有卷积神经网络经典卷积神经网络LeNet深度卷积神经网络AlexNetAlexNet与LeNet对比:1.......
  • 小程序唯品会Authorization sign
    ​声明本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wxa15018601872       本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解......
  • Caused by: java.lang.ClassNotFoundException:org.apache.hadoop.hive.conf.hiveConf
    在sqoop执行create-hive-table时候报错这样,java.io.IOException:原因是缺失jar包,可能是sqoop conf文件的sqoop-env-template.sh里面没有配置相关的hadoop hivezookeeper 的相关环境变量进入sqoop的conf文件下找到sqoop-env-template.sh进入添加相关得到环境变量(注意......
  • 【RTT-Studio】详细使用教程七:SGM5352外部DAC使用
    文章目录一、简介二、RTT时钟配置三、初始化配置四、完整代码五、测试验证一、简介本文主要介绍使用RTT-ThreadStudio来驱动SGM5352芯片的使用,该芯片主要是一个低功率,4通道,16位,电压输出DAC。它从2.7V到5.5V,设计保证了单调性。SGM5352-16通过使用外部参考电压来设置......
  • Caused by: io.lettuce.core.RedisCommandExecutionException: WRONGTYPE Operation a
    当遇到io.lettuce.core.RedisCommandExecutionException:WRONGTYPEOperationagainstakeyholdingthewrongkindofvalue这个异常时,说明你在Redis中尝试执行的操作与存储在特定键中的数据类型不匹配。下面是一些具体的步骤来帮助你解决问题:1.确定键的数据类型首先,你......