1 U5 M* X& e: P% u5 D: h6 b
" k+ a5 b) o: T+ V' m! b0 Q4 r! H
' A C' ^# T# S: G' K G
DHT11是一种温度和湿度传感器,顾名思义,用于测量特定环境或密闭空间中的大气温度和湿度。该传感器通常用于监测农业、食品工业、医院、汽车、气象站等许多应用中的环境参数。
9 I G# ]. O9 n0 @3 ^9 r8 [4 s
}. z; w8 W6 b8 R该传感器可以测量0°C到50°C的温度,精度为1°C。它通常用于控制环境,如热通风系统、恒温室等,监测温度以采取纠正措施。
* v3 ~- Y# ~6 O) a5 X/ p8 Z# x- A, J$ |8 \7 m) Z
湿度测量范围为20%至90%,精度为1%。湿度表示空气中存在的水蒸气含量。在许多情况下,湿度值必须保持在受控范围内,例如在茶粉的制造和储存过程中,室内必须保持作业要求的湿度,否则会影响茶的味道和气味。客厅的湿度水平也应保持在舒适的范围内,理想的舒适的湿度值在50%到65%之间。9 K" ~' C9 C9 X( Y! z
7 k u: k& \) Y
今天,我们学习如何将流行的 DHT11传感器与 STM32配合检测环境温度和湿度。前面我们已经学习了STM32 板的基础知识以及如何使用 Arduino IDE 对它编程。
4 P+ n( P+ N% j, M# {" p! Y6 G; g! C6 F3 m3 ]
DHT11温湿度传感器% Y' Q& W- g' _ c2 u9 W& s. k% D
如前所述,DHT11传感器用于测量温度和湿度。该传感器配有专用的内置NTC来测量温度。它有一个8位微控制器,通过单线协议将温度和湿度值作为串行数据输出。也就是说,传感器只有一个数据管脚,通过它可以读取温度和湿度值,从而节省微控制器端的管脚。传感器也经过工厂校准,因此易于与其他微控制器对接。% l; _0 }9 W; e! q! \) a0 V
0 W5 @. r- k5 y" K4 }
6 v7 q/ o* }1 K0 I1 }4 R! M8 e& g0 p* p; U9 ^& e6 T1 D
DHT11 参数规格: W! M- n |/ ~ T2 ]8 |+ }
' Q1 f9 a( d* {# X: u T9 F§ 工作电压:3.5V 至 5.5V
/ e/ d \5 Y g) v! P( d
& _# \( t6 O% N+ ~& q; ]7 W9 j§ 工作电流:0.3mA(测量)60uA(待机)
! T; r5 P" ~3 Y5 q0 M8 ?% p
. F1 z7 ~2 R; G3 I% O§ 输出:串行数据 Q6 C! y8 P9 X9 r: |% c* o
* Q9 l; h0 L( ~+ o& }+ i" n6 M§ 温度范围:0°C 至 50°C
. d( V) z" r1 F/ s) ~* R- x$ i$ w4 J" U" C
§ 湿度范围:20% 至 90%* M4 ]# s& ~' m+ \ E
! X% G$ E, n1 h* d# [
§ 分辨率:温度和湿度均为 16 位
3 Q6 {% k9 p3 S F- i8 v; m4 k% j7 u: E. r B" b0 a
§ 准确度:±1°C 和 ±1%3 n ~; b' N- n( a/ _4 u
9 Q( b4 Y' M+ L; l; D7 M; S
^9 I0 i4 x2 U3 H ]
, B% R& J% [: r/ o; r0 q电路连接
& h y' ]9 _, p8 Y9 i2 d$ p- E将DHT11 与 STM32连接的电路图如下所示。电路是使用 Fritzing 软件绘制的。
" F3 H" l" y2 Z. s8 Y# P
9 ]* |3 E; S2 }6 r- L/ L
6 Y* M' I/ Q. B$ a0 Q/ A# ~6 p
% m7 B; w% o7 P) Y3 E3 [- M# I6 f' l如您所见,我们使用I2C 接口模块将 LCD 模块连接到 STM32。这使连接变得简单,并进一步减少了控制器端使用的引脚数量。如下图* W# }# o; ~; M3 d- h
- O2 h0 h0 f, r* p
$ q6 |' A7 x4 Z" G* M5 [! ^- N+ p% s$ N) Y# ~6 q' n
同样,STM32F103C8 和 DHT11 传感器之间的电路连接如下表所示。
, D8 A; P" z1 F& O/ x
: V. m- _& ?4 B/ P( y3 I7 f8 k
. t" M0 V2 `0 W% Z, X* M
7 e6 i+ ?9 J( j; q5 J5 T+ _6 u整个电路由电脑的 USB 端口供电。现在我们的硬件已经准备好了,让我们进入编码部分。+ u2 B8 o4 h5 y7 ~9 n4 p, p
1 |+ A Q! J# z$ f; J0 P配置Arduino IDE
2 x- V1 _' p8 P2 ?. s& \我们要编写程序,从 DHT11 传感器中读取温度和湿度值并将其显示在 LCD 模块上。这里LCD显示器是通过I2C适配器连接的,因此我们首先要找到这个适配器的I2C地址来与LCD通信。1 ? y7 C+ x7 Y3 g6 l0 A9 Q
4 ~1 L( s2 c8 m% Q查找 I2C 串行接口模块的地址:
$ d+ c) o% V# S. s
0 l5 d4 g9 K3 V8 i" y& @! I; H6 T1.在Arduino IDE安装STM32开发包' z! u6 ]9 t( Q) n0 a4 [
( Z# S4 N- a3 O' A, F2. 示例中提供了用于扫描连接的 I2C 设备的程序(在 Arduino IDE 中:文件->示例->Wire->I2C scanner_wire)。如下所示。4 e2 U8 z% q* `: ^& ~4 X# o
) X0 c) I1 @6 a) O5 W3 x
" N+ k4 P+ \+ x7 ~
9 ? }3 Y+ D8 {2 E+ _3. 将代码上传到 STM32F103C8,打开串行监视器。给STM32F103C8上电开机。' @" G- z1 N% |* K6 D
! c- v2 j+ }- E' z. \2 Z
( L7 Z6 z) h& r* i
/ E3 q4 S3 c7 ?& O
8 s; Q! l2 W9 V
! e3 R7 `9 H, g0 N9 \ o7 r5 ^. [
我们可以看到,在串口监视器中,I2C的地址为“0x27”。* q& f$ E6 U) D$ F5 p
3 ?6 f+ t5 K( k3 ~8 ^, o; n- N) I
安装相关库文件, C0 Y9 ?( R d4 T/ ~- u6 I X
导入I2C LCD库,以便STM32F103C8通过 I2C 与 LCD 显示器进行通信。
. x B* E' \0 H4 V# K1 U2 p0 Q. f& |' P! z$ }0 l+ F* m! [
1 }" R8 T& I$ X; P) S; I
. l8 u1 b! P. ^" A& m接着安装DHT库- p7 T6 w% o5 d7 U3 z; d- x
" B1 @6 Y8 O- o5 r
5 z0 u V$ w/ n2 U: g' m( g8 q" n! x) N* _* r0 _3 g* j/ U$ D
安装好DHT包后,就可以开始编写程序了。0 X0 u4 Z: s% x: m& g) }
4 q5 x4 y% U1 m( `程序6 e; ?- Y" _4 @) t
- #include <Wire.h> // I2C 库 A! _( _# o- u* M. d: j! j
- #include <LiquidCrystal_I2C.h> // I2C LCD 库. `& p( I! n' Y2 r, Y
- #include <DHT.h> //DHT库
$ X- C( S# V) N- A; h - #define DHTPIN PA1 //定义与STM32F103C8的PA1相连的DHT11(OUT引脚)的引脚名称
7 w' E, m0 E3 ~# u4 i9 D4 A5 I - #define DHTTYPE DHT119 m, v; A$ K: n( @) c Z
- LiquidCrystal_I2C lcd(0x27, 16, 2); //初始化lcd,I2C地址0x27,16*2 类型LCD4 G A" G: f, ^, x0 Q
- DHT dht(DHTPIN, DHTTYPE); // 初始化dht,stm连接DHT的引脚,类型为DHT11
. r' l0 ?8 Z3 v" j, E4 [ - void setup()0 y" F. S9 g+ P# s1 ^6 V/ W! E0 a
- {
! |5 Y) p f9 h8 s r - lcd.begin();9 t' ?0 U {" m, a, l" K6 B
- dht.begin(); //开始接收温度和湿度值。+ U( M) ?1 {1 [6 ^4 I5 x8 b' J9 J2 }
- lcd.backlight();8 I* V( U% t6 e3 Q; f
- lcd.setCursor(0,0);* o* H9 k6 l& s3 k
- lcd.print("Hello World");
: L! f" y# F4 n" Y+ { - lcd.setCursor(0,1);
, \0 k2 e" n& y- c - lcd.print("DHT11 with STM32"); G) m9 {3 f. _% J5 S
- delay(3000);" X& l) J0 W& l) O1 [
- lcd.clear();! |6 V9 F6 q0 I7 S9 ~- P8 R
- }
4 p* j- o. }: `7 X
* X2 {$ R* L7 V3 S9 W- void loop()
/ C6 w$ o$ Z0 M! o1 m# a# x - {8 L, o' N3 x: t# v, {: b( m
- float h = dht.readHumidity(); //获取湿度值
0 y) ?' l/ D; Q) _6 J - float t = dht.readTemperature(); //获取温度值* r3 ]% C9 t4 r& Z7 D% T/ b& _
- lcd.setCursor(0,0);) e, D: L( v& [3 W3 r0 T! w
- lcd.print("Temp: ");
6 d9 r( ]8 L L. h: Y - lcd.print(t);
4 |! Y8 U6 i8 |2 ~' s* ?" x0 O - lcd.print(" C");
" I9 m, A( L3 ~" }5 ^- h - lcd.setCursor(0,1);, K; A5 @: T5 c* d
- lcd.print("Humid: ");
* ?: N0 W/ t& N1 G1 _( C - lcd.print(h);
# G' Z, W/ `- x( H - lcd.print(" %");
' o+ p. \ t$ L& | - }+ k* q/ o7 E9 P& \& i! r; y
- , @% S, h2 R7 ]
复制代码 9 g! s1 ^ w/ J" d( |. l4 e
- v$ G2 l8 j+ T3 j |