一个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)”。