你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】DHT11温湿度传感器——基于STM32f1

[复制链接]
STMCU小助手 发布时间:2022-5-14 21:00
前言+ M: [2 x! G2 H. d9 t1 S/ b! S
今天主要讲到DHT11温湿度传感器的应用,该传感器适用于多个场景,用途比较广泛,主要用来测量温度和湿度,其实对于单纯测量温度我们可以直接采用dsb18b20温度传感器,但是注意引脚接法,之前我不注意接反了,结果烧的······一碰手都直接起泡哈哈,好了,废话不讲,进入主题1 h9 s+ `* Y/ m* G' |0 b

, k- G1 x# q5 Q) M! ?9 y+ {2 s9 Z7 J一、DHT11温湿度传感器
% v. o( P: v0 t  ZDHT11传感器有四个接口,即VCC、GND、DATA、NC,那么首先要怎么接呢?其实这里面我们主要的就是接DATA这个口就行了,VCC、GND就不用多说了,NC端不接,悬空NC端即可,正常模块也是只有3个引脚引出来,所以只需要设定一个端口来与DATA互联就可以了! f- b! Y% V2 B( B' b# _& N
( x# u9 d. S" Y3 {) O, v% d3 K+ I) T
B(YH$LEE]2Z_0P{LB6GMVSR.png
) m0 I% H2 b, g; J6 Z6 Y: a/ F& s0 w3 h/ n* c# L7 C; U1 i; e
我们发现实际上也就是如我上面所说的,它的四个引脚只需要利用三个就行了,而且该模块还有一块电源指示灯,当工作时会亮起。下面为原理图:
& M7 g+ G# Q, F$ P- T
6 F, u5 l% m- u$ F; @ 8%I]GF@I9)_@LG@40J2O]$X.png
# g0 |' `& B$ s& P7 h0 T, N8 f. k+ ?( F8 n
那么在这里DATA只要随意连上STM32上一端口(下面我用到了PA11),设置为推挽输出即可,就可以实现数据互联。
& M- c+ ^$ t# a6 K+ w
8 v4 Q1 r8 c; j9 S, X" \ KBIWLAD[0SQ81@B@ED9_4_N.png
1 E& ]+ c) J" J3 t+ a1 N 下面这里主要是对输出的流程的讲解,实际上如果看不懂也没事,后面可以通过代码加深对这几段话的理解! O" S1 G4 D) X& ~
  f3 l5 Q0 `" h2 f6 _6 t, f
K~)U5~2H$~ELP`6{]$AT4`P.png
  S9 a' @  V( k$ E% E; U& w8 ]) w1 l; y6 h5 l- D
二、实现测量主程序4 w) D; e6 h& C- L0 d
DHT11函数(wenshi.c)
1 R6 E& d" @( j9 R
# E. [- p. r4 t1 C  d0 a
  1. #include "delay.h"
    * a; t+ R' k0 z( Q
  2. #include "wenshi.h", |  z3 c( b+ j$ @3 J% d
  3. ( a% k- C! B' [4 c9 h  c0 N1 f3 e* L
  4. #define DT GPIO_Pin_11# o( s8 X- z" ^  V( G/ u
  5. 4 W: K$ s. o) ^2 K8 Z
  6. //复位DHT11
    4 i0 ~" e/ S' C% `4 @
  7. void DHT11_Rst(void)           
    - _) R& S: U( @0 I2 @" }
  8. {                 3 g1 U% d: S- k% Z" }9 w
  9.         DHT11_IO_OUT();         //SET OUTPUT. u- G6 X. Y/ Q5 n
  10.         DHT11_DQ_OUT=0;         //拉低
    / F9 ]; R& H  G( V2 Q; t
  11.         delay_ms(20);            //拉低延时至少18ms
    7 Y1 u7 s2 s. b( t4 h
  12.         DHT11_DQ_OUT=1;         //DQ=1,拉高 2 t7 N: b) @% Z( e$ V7 ]
  13.         delay_us(30);             //拉高延时至少20~40us: Z8 r6 T$ I  K* ~/ }8 k6 n
  14. }& Y2 S2 A/ W8 v
  15. ! Z( q  X; e& h4 ?  t, A0 A) b
  16. //检测回应7 y7 _+ v4 J& L& i+ Y% x6 K6 S( ^
  17. //返回1:检测错误
      r+ Z& _& }9 u* h  t' K2 K
  18. //返回0:检测成功
    8 @# h$ |; G  F" {* N+ s- v6 H
  19. u8 DHT11_Check(void)            0 \7 E& A* [, J+ [
  20. {   ' R, W/ p5 z% e5 ]$ f
  21.         u8 retry=0;; z6 V; y; T& J1 z5 h
  22.         DHT11_IO_IN();//SET INPUT         , y# {! S( h5 l. E
  23.     while (DHT11_DQ_IN&&retry<100)//DHT11拉低40~80us" _2 u) W& Z& ~$ W0 D7 O
  24.         {" o: M( v. M- X; u; O; X' w
  25.                 retry++;4 F7 K3 n2 F" z6 D
  26.                 delay_us(1);- t/ a& Y2 G7 f
  27.         };         $ b3 C! F$ v3 `" Z
  28.         if(retry>=100)return 1;
      w: |/ ]8 a. Q; T. M7 ^
  29.         else retry=0;: P$ m1 w' f2 q$ H! w
  30.     while (!DHT11_DQ_IN&&retry<100)//DHT11再次拉高40~80us4 J; z* X7 `% T( _# A# w
  31.         {0 @! ^# }# f) S" ^4 U& T
  32.                 retry++;
    4 o* @( E) B3 {1 Y4 F$ w2 |/ @  d
  33.                 delay_us(1);/ p4 N) _6 H' w9 X
  34.         };
      z  M0 x/ F+ G3 |! u+ n+ U
  35.         if(retry>=100)return 1;            / o, f) F" ~) g- {; C
  36.         return 0;
    0 v' e3 T- E3 h
  37. }
      [% Z1 ?* N( a4 {3 N! f* H

  38. # r/ w: W. r, |8 d2 {  Z2 s
  39. //读取一个位Bit8 K7 u8 B7 i2 m% w9 |5 _
  40. //返回1或0" g* s$ Y, O, c, r; E9 s0 R
  41. u8 DHT11_Read_Bit(void)                          $ R2 G# Z' s/ r) j  x; `5 e0 u
  42. {
    3 ?; q. a1 ?# c( @
  43.          u8 retry=0;
    ' ~5 ?; p$ ?* h" q
  44.         while(DHT11_DQ_IN&&retry<100)//等待变低电平/ W! {5 U; k( p" W
  45.         {4 v0 i2 e3 K9 c# G) i8 k* K) S
  46.                 retry++;9 t4 T% q7 s1 q. z, t
  47.                 delay_us(1);: ?: D% e, ~4 Q) ^8 t4 v
  48.         }
    8 U! o2 v. |) p/ P0 c3 E
  49.         retry=0;
    # o# ]2 s% c+ h! z9 D5 `0 a
  50.         while(!DHT11_DQ_IN&&retry<100)//等待变高电平
    6 t. q( k% ^7 Z9 }
  51.         {/ S2 T* m# q& L' A& {: @
  52.                 retry++;
    ' V7 M. \6 o6 |+ y$ V, d; y1 j& B* U
  53.                 delay_us(1);
    $ z6 Z9 q1 W, \! c
  54.         }2 T$ `; r+ _% a- m
  55.         delay_us(40);//等待40us% S. h: O( ~7 L* F
  56.         if(DHT11_DQ_IN)return 1;
    ! {/ v* S# a2 }3 L$ c9 _
  57.         else return 0;                  
    : _, s# q' p: z  U# d8 u$ q' p
  58. }
    ) X3 L2 Z4 A3 N6 t

  59. - V+ n: R9 x# _
  60. //读取一个字节
    3 X; H6 }  e6 d2 i5 g; J, r  v1 K
  61. //返回读到的数据* M* j( F. K5 U! o
  62. u8 DHT11_Read_Byte(void)    : R6 l0 i0 _+ b7 c+ g
  63. {        * Y# L& |* S) S" S" `3 Y; K4 `
  64.         u8 i,dat;! d$ S2 f, x1 Q# j1 w) {8 w& Q1 @5 W
  65.         dat=0;# f3 K0 a' r5 I
  66.         for (i=0;i<8;i++)
    & ?2 `) z7 g+ r- O
  67.         {1 p0 T8 m- L: S3 Q
  68.                 dat<<=1; ( }" W: E# P- u
  69.                 dat|=DHT11_Read_Bit();3 L3 C& h4 K' L1 h) A4 L( w8 K$ s
  70.         }                                                   
    + C1 h6 f2 h0 u0 ^$ ]# _' z0 ^
  71.         return dat;
    & y9 i4 x) s5 L' s( j7 g3 s( M
  72. }
    + y  K- _  o+ _7 T

  73. 9 q$ X: a2 \( P" A1 |
  74. //DHT11读取一次数据
    + Q/ |# d& d: L! q
  75. //temp:温度(范围:0~50°)
    ) X: y- ^" J$ Y6 F  @1 V; u
  76. //humi:湿度(范围:20%~90%)
    9 t* U/ w& ]& s* H! B
  77. //tem:温度小数位
    ! u* \, C8 v5 l- O$ p
  78. //hum:湿度小数位% G+ v8 H! i# s# ]( m% m/ W
  79. u8 DHT11_Read_Data(u8 *temp,u8 *humi,u8 *tem,u8 *hum)    % T# u* ?9 i, u* i3 I9 s
  80. {        0 X+ E: U5 e$ y, R0 F# L9 b
  81.          u8 buf[5];% }, D3 B0 c; ?; ~( |- E
  82.         u8 i;
    $ b% n) @6 }7 F% \
  83.         DHT11_Rst();
    4 G" N& H3 B$ O# l- x
  84.         if(DHT11_Check()==0)0 `/ ]5 g  x, {
  85.         {
    5 O) `) |1 z3 w* O/ c
  86.                 for(i=0;i<5;i++)//读取40位字节
    $ \  s( w; w0 S- z$ T0 E  |
  87.                 {* f) S' }: c1 W/ }
  88.                         buf<i>=DHT11_Read_Byte();
    9 z; j1 V# m' _  ]) W) |5 e4 T
  89.                 }6 R+ N- c: g+ s7 T
  90.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
    ' L$ [% h9 s' U3 d5 _' u
  91.                 {+ y2 J9 o1 G" [' \: G- d) ^
  92.                         *humi=buf[0];
    " u' y7 Z5 y( c. Y8 @
  93.                         *hum=buf[1];
    8 u7 N+ a! V* w) \! h* m+ X7 [% \, i
  94.                         *temp=buf[2];
    8 A; t2 r4 o# O+ w7 @
  95.                         *tem=buf[3];
    ; l8 b4 J, L9 P' g' W
  96.                 }4 a' i" i' y. J9 e6 b5 C5 K
  97.         }. M$ U: ]% Y+ M) b1 d0 @8 r) P
  98.         else return 1;
    ' l; n/ E" v. s, [" [* j
  99.         return 0;            ; f( @; j: p4 |$ W
  100. }4 W& S8 e6 W7 C4 Z1 {4 K

  101. 5 v0 R& f* c* E6 s8 t
  102. //初始化DHT11,同时检测是否连接上DHT11,PA11初始化- }& J) v3 o5 l4 [# }. @
  103.           7 f6 s7 y; g9 B; x" f
  104. u8 DHT11_Init(void)
    & K# t" |! ~( r6 o% l, e% H7 a! k
  105. {         9 E) B) R2 J6 j# r4 U+ L6 x9 R1 U4 \( ^
  106.          GPIO_InitTypeDef  GPIO_InitStructure;        # g9 Z% D& _, j7 B4 D
  107.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        2 I% h# r7 I; b$ L8 A9 m7 y$ _
  108.          GPIO_InitStructure.GPIO_Pin = DT;                                 //PA114 V+ S. @7 s! ^  h
  109.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出. ?5 e  L/ t# R
  110.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    1 K3 [; Q& @2 e9 X8 v
  111.          GPIO_Init(GPIOA, &GPIO_InitStructure);                        # q: J$ G8 K0 B$ e1 H1 w
  112.          GPIO_SetBits(GPIOA,DT);                                                # r2 e# @6 r% r5 j( w
  113.                            
    4 S2 d% s) X# K
  114.         DHT11_Rst();  
    7 V; d5 b: L9 l! T1 ^. v$ J% G
  115.         return DHT11_Check();
    / w, Y  u9 a5 Q5 N' e
  116. }</i>
复制代码

& h+ d) Z  |- m/ i8 G* F/ g* y  N! e5 Z4 ^
主函数(main.c)& n6 e) a, D! I3 i  @: ~' l
  i& y+ z& R, u/ k8 X, U
  1. #include "led.h"6 d, C: [0 w& c/ Y3 R! Q1 y
  2. #include "delay.h"
    , {2 o$ G* ?) ?- t2 y  n: G- f
  3. #include "key.h"
    $ k3 z) a; S. _: e9 d
  4. #include "sys.h"- Q6 c6 s! ]. W' |; L  T
  5. #include "lcd.h"
    5 X0 C& _* M+ g+ h9 i+ |
  6. #include "usart.h"
    3 e. C9 Z$ p/ y$ C; r/ k
  7. #include "wenshi.h"3 m1 w( t$ U  a4 S1 J, u
  8. - H1 Z, R0 j' ]6 m
  9. u8 temp;
    9 l- J" r5 h+ R- ]2 g5 I
  10. u8 humi;
    + r. J$ s: U) A% H1 q" P
  11. u8 tem;' q# f! ~. Z) D0 z2 Y
  12. u8 hum;/ ^5 @! O3 S' l- u4 E3 }; ?* x% ?' P* X

  13. 1 J: G9 c5 o6 ~7 N7 H4 l
  14. 1 J% s! T" t9 u  w
  15. int main(void)
    3 W6 z8 q) `: l6 o7 o0 p1 g8 j9 Z
  16. {         ( j: f# n9 {! X

  17. . E0 ]: S( ?) i( L9 f
  18.         delay_init();                              
    * ^5 ]5 f" `; y& M6 W
  19.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         6 _- F8 ~2 I& _5 |- c& M+ ^1 f# S6 V
  20.         uart_init(115200);                 9 m2 J4 U8 L: X6 u% F! {: F
  21.          LED_Init();                             //LED初始化! K8 T$ P! a$ A8 W  z0 p) i
  22.         LCD_Init();              //LCD初始化0 O$ e+ E  c* p+ j3 Q1 {
  23.         POINT_COLOR=RED;         ; T7 s* v, f! \6 R3 r' s1 _+ v
  24.         while(DHT11_Init())0 ^9 L+ \& L% ?8 Q$ C: m1 F( S
  25.         {
    5 w6 |. S; M+ P2 L
  26.                 printf("DHT11 Error \r\n");
      I1 K/ m0 Z+ Z
  27.                 LCD_ShowString(20,20,210,16,16,"DHT11 Error");   h( V0 A! w) r4 \2 O3 E, x( _: d$ A
  28.                 delay_ms(1000);
    ( e2 U( B- S$ _% [
  29.         }
    * ~$ Q* G6 c7 H* k# g- \4 a
  30.           V) w9 |- s0 L& A
  31.   while (1)( C  O8 h/ o3 T
  32.   {
    8 D$ ^1 H- h1 C: _1 H- W
  33.                 DHT11_Read_Data(&temp,&humi,&tem,&hum);//取地址& P& D. q) H' N3 E$ m) U
  34. 8 A8 Y2 e8 U# Q3 x% r# t8 i
  35.                 LCD_ShowString(20,40,210,16,16,"temp:"); //分别显示所要显示的温度、湿度
    8 R: `- |2 l% h: a! ]- D- ~
  36.                 LCD_ShowString(20,70,200,16,16,"humi:");
    , b1 m. m  I: n* p' o
  37.                 LCD_ShowString(90,40,110,8,16,".");: z0 p* u: i" E* g% L
  38.                 LCD_ShowString(90,70,100,8,16,".");; T1 P6 E0 Q# Q1 F# M
  39.                 LCD_ShowNum(70,40,temp,2,16);' s4 V) |+ F, @& x
  40.                 LCD_ShowNum(70,70,humi,2,16);, k( {- j+ u% x1 b
  41.                 LCD_ShowNum(95,40,tem,2,16);
    - k; B" M7 _2 F
  42.                 LCD_ShowNum(95,70,hum,2,16);( y0 l3 |8 n3 D
  43.                 LED0=!LED0;
    ) M0 a0 [; P+ d4 Q
  44.                 delay_ms(1000);1 |3 t4 n) O6 {5 e2 S5 U
  45.   }1 ^- L5 H1 ?+ i% \0 w! W* b
  46. }<i style="background-color: rgb(255, 255, 255);">        </i>
复制代码

1 \  i! f( J  K. hLCD的代码就不列出来了,主要函数以及注释基本上已经到位了,希望对大家有所帮助!
  y. M8 F8 u9 }% B* _2 _9 F* d: O, B: L( x  `
三、测试结果

* L3 k* i/ s+ z8 s3 K6 L% X下图 为测试结果:* e& l( n. g- @/ J2 l( |

1 q: u' r- U! X! J  G4 f* O %~)RIQAOPS%TD5`P]T[S$AD.png
. d8 y9 y) R# f, ^6 Y& N
5 a+ M% F- Y0 a1 W7 A四、总结5 s; T/ V6 u6 {; ]7 q
写到这里就接近尾声了,老规矩肯定不能忘哈哈,于晏老哥的话后面依旧续上,那么这里总结就再啰里啰嗦几句吧,DHT11是一款比较入门级且又十分耐用的温湿度检测模块,咱们要用到基本上学习期间也是在单片机上的运用学习+ S! |  Z% U9 s. q3 J+ n* x! ~. }* _

" T% T+ Q- F, C+ t/ f2 K" }- T/ W' V- {

* }% Y3 s5 `' ?
收藏 评论0 发布时间:2022-5-14 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版