将DHT11温度和湿度传感器与STM32F103C8连接的方法

描述

  DHT11是一款温湿度传感器,顾名思义,用于测量特定环境或密闭空间内的大气温湿度。该传感器通常用于监测农业、食品工业、医院、汽车、气象站等许多应用中的环境参数。

  该传感器可以测量从 0°C 到 50°C 的温度,精度为 1°C。它通常用于受控环境中,例如热通风系统、恒温室等,以监测温度并采取纠正措施。湿度测量范围为 20% 至 90%,精度为 1%。湿度表示空气中存在的水蒸气量。在许多情况下,例如在制造和储存茶粉时,湿度值必须保持在受控范围内,必须在房间内保持正确的湿度,否则茶会失去味道和气味。客厅的湿度水平也应保持在舒适的范围内。获得最大舒适度的理想湿度值在 50% 到 65% 之间。

  今天在本教程中,我们将学习如何将流行的 DHT11 温度和湿度传感器与 STM32 微控制器连接。

  DHT11温湿度传感器

  在继续界面程序之前,让我们了解一些有关 DHT11 传感器的信息。如前所述, DHT11 传感器用于测量 温度和湿度。 该传感器带有一个专用的内置 NTC来测量温度。它有一个板载 8 位微控制器,可通过单线协议将温度和湿度值作为串行数据输出。意思是,传感器只有一个数据引脚,通过它可以读取温度和湿度值,从而节省了微控制器端的引脚。该传感器还经过工厂校准,因此易于与其他微控制器连接。

  DHT11 规格:

  工作电压:3.5V 至 5.5V

  工作电流:0.3mA(测量)60uA(待机)

  输出:串行数据

  温度范围:0°C 至 50°C

  湿度范围:20% 至 90%

  分辨率:温度和湿度均为 16 位

  准确度:±1°C 和 ±1%

DHT11

  所需组件

  STM32F103C8

  DHT11温湿度传感器

  16x2 液晶显示器

  IIC/I2C 串行接口适配器模块

  面包板

  连接电线

  电路原理图

  将 DHT11 与 STM32 微控制器连接的完整电路图如下所示。电路是使用 Fritzing 软件绘制的。

DHT11

  如您所见,我们使用I2C 接口模块将 LCD 模块连接到 STM32。这使连接变得简单,并进一步减少了控制器端使用的引脚数量。但是,如果您没有此模块,您也可以通过以下链接直接连接 LCD STM32 。

  如果您有接口模块,那么 I2C 串行接口模块(固定 16X2 LCD 显示器)和 STM32F103C8 之间的电路连接如下表所示:

DHT11

  同样,STM32F103C8 和 DHT11 传感器之间的电路连接如下表所示。

DHT11

  连接完成后,我的硬件如下所示。

DHT11

  整个设置由我笔记本电脑的 STM32 的 USB 端口供电。现在我们的硬件已经准备好了,让我们进入编码部分。

  为 STM32F103C8 准备 Arduino IDE

  我们必须编写一个程序来从 DHT11 传感器中读取温度和湿度值并将其显示在 LCD 模块上。这里液晶显示器是通过I2C适配器连接的,因此我们首先要找到这个适配器的I2C地址来与LCD通信。

  将 I2C 串行 LCD 接口适配器模块与 STM32F103C8 连接:

  从电路图中我们可以注意到 STM32F103C8 I2C 引脚 PB6 和 PB7 与 I2C 串行接口模块的 SCL 和 SDA 引脚相连。要查找 I2C 串行接口模块的地址,我们必须扫描可用地址。

  扫描 I2C 串行接口模块的地址:

  按照以下步骤查找 LCD I2C 接口模块的 I2C 地址。

  1.首先检查Arduino IDE的STM32包是否安装。

  2. 通过上述链接使用 Arduino IDE 安装用于编程 STM32 的软件包时,默认安装了线库。

  3. 示例中提供了用于扫描连接的 I2C 设备的程序(在 Arduino IDE 中:Files-》Examples-》Wire-》I2C 扫描仪线)。在此之前,在 Tools-》Board-》Generic STM32F103C8 Series 中选择板,如下所示。

DHT11

  4. 然后将代码上传到 STM32F103C8 和打开的串行监视器。

DHT11

  现在注意 I2C 16x2 LCD 显示器的 I2C 地址为 (0x27)。

  为 I2C 16x2 显示模块和 DHT11 传感器安装库:

  现在我们知道了 I2C 地址,我们需要下载一个库,以便通过 I2C 与 LCD 显示器进行通信。I2C LCD 显示库可从此链接下载。下载 zip 文件后,通过 sketch-》import library 在 Arduino IDE 中安装 I2C LCD 库。该库也可以与 Arduino 板一起使用,用于与 I2C LCD 显示模块进行通信。

  同样,为了从 DHT11 传感器读取串行数据,我们将使用DHT11 库。使用提供的链接将库下载为 ZIP 文件,下载后,使用草图-》导入库在 Arduino IDE 中安装 DHT库。同样的库也可以与 Arduino 板一起使用。

编码说明

本文的完整代码可以在本页底部找到,相同的解释如下。最初包括所需的库。包括用于在 STM32F103C8中使用 I2C 的Wire.h库、用于使用 I2C 类型 LCD 显示器的LiquidCrystal_I2C.h和用于使用 DHT 传感器功能的DHT.h

 

#include        
#include    
#include                     

 

现在定义了与STM32F103C8的PA1相连的DHT11(OUT引脚)的引脚名称

 

#define DHTPIN PA1

 

而且,DHTTYPE 被定义为 DHT11。

 

#define DHTTYPE DHT11

 

接下来初始化 I2C 地址为 0x27 和 16x2 类型 LCD 显示器的LiquidCrystal_I2C类的对象 lcd 。

 

LiquidCrystal_I2C lcd(0x27, 16, 2);

 

此外, DHT 类的对象 dht与 STM32 和 DHT 类型为 DHT11 的 DHT 引脚被初始化

 

DHT dht(DHTPIN, DHTTYPE);    

 

接下来在void setup() 中:

首先使用以下方法初始化 LCD

 

液晶显示器开始();

 

然后使用以下语句开始接收来自 DHT11 传感器的温度和湿度值。                       

 

dht.begin();         

 

打开黑光灯并打印欢迎信息并在三秒钟后清除它们。

 

液晶背光();     
lcd.setCursor(0,0); 
lcd.print("电路文摘"); 
lcd.setCursor(0,1); 
lcd.print("DHT11 与 STM32"); 
延迟(3000);
lcd.clear();

 

接下来在void loop() 中:

从 DHT11 传感器连续接收该值。为了获得温度和湿度的单独值并将其存储在变量中,使用了以下语句。

仅获取湿度值

 

浮动 h = dht.readHumidity();      

 

仅获取温度值

 

浮动 t = dht.readTemperature();   

 

最后在 16X2 LCD 显示屏上打印

 

  lcd.setCursor(0,0); 
  lcd.print("温度:"); 
  lcd.print(t); 
  lcd.print("C"); 
  lcd.setCursor(0,1); 
  lcd.print("湿度:"); 
  lcd.print(h); 
  lcd.print("%");

 

  基于STM32的温度计的工作

  一旦您的硬件和代码准备就绪,只需将代码写入您的硬件,您应该会注意到您的 LCD 显示欢迎屏幕,然后是实时温度和湿度值,如下所示

DHT11

  如果您的显示器没有显示任何内容,您可以检查调整I2C 模块背面的对比度电位器。我尝试使用空调改变房间温度,发现传感器值也会相应变化。AC 还可以选择测量室温,如下图所示,我的遥控器显示室温为 27°C,我们的传感器还在 LCD 上显示 27.3°C,这非常接近。

DHT11

#include //使用 I2C 的库

#include //使用 I2C 类型 LCD 显示器的

库 #include //使用 DHT 传感器的库


#define DHTPIN PA1


#define DHTTYPE DHT11


LiquidCrystal_I2C lcd(0x27, 16, 2); //为LiquidCrystal_I2C类初始化对象lcd,I2C地址为0x27和16x2类型的LCD显示


DHT dht(DHTPIN, DHTTYPE); //使用STM32的DHT引脚和DHT类型为DHT11的DHT类初始化对象dht


void setup()

{

// 初始化 LCD

lcd.begin();

dht.begin(); //开始接收温度和湿度值。

液晶背光();// 打开黑灯并打印欢迎信息。

lcd.setCursor(0,0);

lcd.print("电路文摘");

lcd.setCursor(0,1);

lcd.print("DHT11 与 STM32");

延迟(3000);

lcd.clear();

}


无效循环()

{

浮动h = dht.readHumidity();//获取湿度值

float t = dht.readTemperature(); //获取温度值

lcd.setCursor(0,0);

lcd.print("温度:");

lcd.print(t);

lcd.print("C");

lcd.setCursor(0,1);

lcd.print("湿度:");

lcd.print(h);

lcd.print("%");

}
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分