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

STM32L0+环境温度检测

[复制链接]
烟花绽放 发布时间:2016-5-15 21:35
参加STM32L0方案秀活动至今已过去一两个月了,直到近端时间才着手去做,先来几张图片* v2 ], `& m1 l" |  X, g
IMG_20160515_203048.jpg ) S1 C3 |  B3 R) D* g. t3 U, a
这是目前的显示界面,做的时候突然发现手头上的光强传感器不在身边,
+ c! i8 I% ?- R2 r# M& m+ C4 ]7 `2 O在毕业的时候放老家了,所以目前只能先驱动DHT11,显示温湿度,& I! H1 w( _1 c$ u* L- _
至于PM2.5的检测,目前手头上暂时没有相应的传感器,等待下面有时间采购回来在加上. c+ \8 P  W; j! I
IMG_20160515_203054.jpg - b) K2 W9 {7 G* j  E
LD2是作为程序运行的指示灯,这一张图片是灯灭的时候,下一张的照片灯是亮着的1 [0 {, a- s; P
IMG_20160515_203117.jpg
+ T6 S3 q- z% U( o' Y这是目前的东西,STM32L073Nucle板子,DHT11传感器,LCD12864显示,12864驱动的时候使用了一片74HC245做电平转换(以前在用到12864的时候,在搭硬件的时候,12864总是会出现一些问题,所以我直接加了一片245做电平转换,因为目前没有去读液晶操作,所以没有使用到74LVT4245).; u. r* N1 N  L+ i( `& }  ~  u
程序:, e) U( _0 G6 T0 ?2 [1 F
main.c中主程序如下7 B( v8 ]' f, @% Y+ B
int main(void)
. m1 n) h2 [( p8 U' p{
9 k" {3 J% a" z# |' F2 c
- s, |% Q/ m3 M: }1 j# \  /* USER CODE BEGIN 1 */
* Q: i; M6 v2 }5 i  ?2 |# p5 ~+ b        u8 wd=0,sd=0,gq=0;
' w2 j0 K& J0 |) J, r6 j% G  /* USER CODE END 1 */
7 ^1 k! b9 E6 ]* ?0 A# T6 P* d7 ~) `) d4 ~$ h! U! A
  /* MCU Configuration----------------------------------------------------------*/
0 N+ T- L) b4 j. i1 b0 S! y8 R% s, ?, M
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
5 y6 ^' v" N( R* j  HAL_Init();
; m( U. d1 Z6 z* K( f. W5 }7 @) G' z' W" I
  /* Configure the system clock */
( r0 E% u. X$ e. m  SystemClock_Config();6 }8 N5 T* K3 n; ^

! X8 b. ?+ [; x9 Q5 G% |, k& R  /* Initialize all configured peripherals */
4 b, h( j$ C% q/ F  MX_GPIO_Init();
# d; f3 d! E" S) S/ W0 t
0 b) A# K. A* T/ _; i: }  /* USER CODE BEGIN 2 */
# K/ ]. B) r$ T( `3 K  R        lcd12864_init();
; c$ Q! X5 X9 v+ _+ c- [  /* USER CODE END 2 */8 j" G( o/ ]* s0 H
        write_dat(0x80,16,"  环境温度检测  ");  q  r' K, p1 }; j* B+ `
        write_dat(0x90,16,"湿度:  %      ");: E, g9 s7 a- D8 b0 h
        write_dat(0x88,16,"温度:  ℃      ");
! j5 R9 _5 Q# I- H/ v% _  Z        write_dat(0x98,16,"光强:  cd      ");/ s% U( q7 w/ K7 Z/ y# P
  /* Infinite loop */
- }' I& k4 L" K; r, w; n" Y- ^  /* USER CODE BEGIN WHILE */
  R6 E8 c4 R+ q* r, K; V  while (1)
; U1 K, F. j7 h& @( Z  {
( b9 q) ^/ i  s9 C$ g) m  /* USER CODE END WHILE */" W( L& F( M% G
3 {. C: I2 \! @
  /* USER CODE BEGIN 3 */7 o7 A9 T9 g4 B3 Z
                DHT11_Read_Data(&wd,&sd);8 I, A& J1 ~+ T2 C( r( ~' ~* Y- Y. L+ `
                write_number(0x93,sd);
# X5 a) k. f$ Y! W8 t3 ^) _                write_number(0x8b,wd);
3 D4 K' c, X8 Q" ^" k. W9 G            write_number(0x9b,gq);
4 L( X: e3 ~% Y: f: q7 k                HAL_Delay(500);. N4 G0 L* k. f4 U5 @# `* W# v
            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
3 v$ o; x* F& i$ R            HAL_Delay(500);
( m" P4 M9 f9 I4 p6 W9 K            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
  x6 I8 @5 ~$ N; ~8 A  }
# ^2 C! S+ w: t0 |  /* USER CODE END 3 */
; w% U, d9 X  P& f
2 {  r+ L9 v0 d6 h* i}
+ |- `2 w7 x( }3 U
% x+ d2 `$ m& r; `  C12864的驱动我以前发过帖子,直接移植过来就可以了,这次就不发了
+ L7 j8 ?+ B! G& `( `* e7 h' c) t1 J3 k) z6 l% \4 R3 s
DHT11.c程序如下7 C# h# y$ ?# j5 K
#include "stm32l0xx_hal.h"
  u. v0 E8 D9 }+ [- w" f#include "dht11.h"9 a& d0 Y+ y1 @' a
#include "gpio.h"0 [5 u- u1 _/ @0 y

, v  Y# y  V0 W  v' t) o" N2 svoid delay_us(uint32_t value)6 x2 M# H, K3 i$ G. Q" b4 [
{
7 g% D% R+ z$ u" N3 s" Z        uint32_t i;
) U4 ]" v; o( ]8 ^* F        i = value * 8;
6 I3 c- _5 E. v8 t        while(i--);
: h7 N$ q) ~9 t2 k* l8 [* j6 ^}
* b1 r' j9 I  Q% T
9 X5 D& B3 p7 G7 V: gvoid DHT11_IO_IN(void)
: a- B; N) {$ F  c{
) k9 L' G. V4 @5 ?- l  W2 X# ]  GPIO_InitTypeDef GPIO_InitStruct;
8 N0 j! \! n; T* z: V        /*Configure GPIO pin : PC10 */6 ?/ {4 ?/ w! X% m
  GPIO_InitStruct.Pin = IO_DHT11;) Y8 m$ c+ {+ V7 ?; G
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
8 O0 q8 N, C2 r3 @, D' N  GPIO_InitStruct.Pull = GPIO_PULLUP;
5 p5 H7 O  [% @! L* Q+ u  HAL_GPIO_Init(GPIO_DHT11, &GPIO_InitStruct);2 U& X* A, Z7 o) n
}
; b  S8 n$ e+ D% g
% v7 `; O6 f1 ~void DHT11_IO_OUT(void)5 m6 R! W) X! u8 K* [. R
{5 f+ l, y7 D; p7 h9 H0 _) _
        GPIO_InitTypeDef GPIO_InitStruct;9 d/ F1 n# Q% E1 |; A: _$ i
% y6 _' F0 z4 a( X" ^
        /*Configure GPIO pin : PC10 */8 ?) ]  K7 @  W, w) j& A3 r
        GPIO_InitStruct.Pin = IO_DHT11;
# b% `% u5 R/ D        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;# N# @  g  y4 s- B
        GPIO_InitStruct.Pull = GPIO_NOPULL;$ @0 A" {' Z  M
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;3 ^9 @2 n/ ?/ `( o( w" t6 q" n
        HAL_GPIO_Init(GPIO_DHT11, &GPIO_InitStruct);
" _. q  Y5 {6 o" p) D9 i}6 ^7 d6 R6 l4 i

* |0 z4 T# n  d) O5 \//复位DHT11
5 x# R$ |+ @1 ]: @, Dvoid DHT11_Rst(void)           5 j% D' [  o( u& I
{                 
- r# Z- A4 _( |  N        DHT11_IO_OUT();         //SET OUTPUT# {/ V- w' U' j: Y
    DHT11_DQ_Low;                 //拉低DQ4 g: m8 }  k$ \8 m' J
    HAL_Delay(20);            //拉低至少18ms
0 ^. D5 e  z1 p7 n    DHT11_DQ_High;                 //DQ=1 * E5 }7 U# V4 ]2 t
        delay_us(30);             //主机拉高20~40us
8 t7 m$ ~; }. T# U' J) T, M}. J9 q. x6 `/ r1 O5 \
//等待DHT11的回应: ~6 V6 v" D4 @
//返回1:未检测到DHT11的存在
/ Y' f  ?( [1 o4 G  A; X//返回0:存在
8 M" H- F  P3 u) K& A4 v' t/ Iuint8_t DHT11_Check(void)            
+ J; O4 F( G0 A; K3 a9 {{   
3 g0 P% Y/ K8 D6 }2 M3 O1 p        uint8_t retry=0;$ f7 ]/ W: j1 k) }, f; u
        DHT11_IO_IN();//SET INPUT         0 R; ?7 ^3 B8 j+ t( A
    while ((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)&&retry<100)//DHT11会拉低40~80us5 m; x0 u9 P  W$ v. z
        {
& J% `" n3 z% |2 f                retry++;3 E6 t7 u2 j: T1 y
                delay_us(3);// 1us
" B7 T% V5 _/ N- _5 K3 K- F+ V        };         
% n5 u2 |9 B8 G        if(retry>=100)return 1;
1 f* H. O; ^3 Y4 h1 B& ~5 y        else retry=0;4 u+ @" @; k7 V+ H& _" F* A# m
    while ((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_RESET)&&retry<100)//DHT11拉低后会再次拉高40~80us+ n! @, \, W* z. }  n
        {4 S0 t4 a8 @( x
                retry++;
( A! d! K& y4 j5 ?+ A1 s                delay_us(3);  ~/ S6 u- H0 U5 d: O
        };6 K$ ^/ J7 u4 j: w& E
        if(retry>=100)return 1;              _. K5 X8 n. \5 W5 i
        return 0;
  Q3 A! p6 l# E: j1 g}
# n/ l+ P: o7 @' G, H" F//从DHT11读取一个位1 s. D& L' B( V+ n- z
//返回值:1/0: A0 c* \; d# C( {
uint8_t DHT11_Read_Bit(void)                          
  Z% r4 Y" L" A) e. t{
" d# @  v) x- G         uint8_t retry=0;
: ^$ r* F# h4 ]        while((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)&&retry<100)//等待变为低电平& c1 n4 Y  o3 Y) z
        {+ U  `) g+ X* A* u9 q# j
                retry++;
6 l6 K+ \" c5 r  _9 U% C                delay_us(3);- |3 s$ {7 C: z5 l, I7 a* ]
        }# o9 E/ M6 I: F8 s
        retry=0;
, C/ s1 H- D8 {! M9 \' ?        while((HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_RESET)&&retry<100)//等待变高电平
) B) m5 v: U) A$ L9 C1 x& E* ]$ d        {
! [, l2 `8 y1 r                retry++;: Y6 D1 C; }4 z# U7 e* a* |* ^) ~+ r5 y
                delay_us(3);! ?3 N5 V# b  [" Y
        }
* L$ l$ u8 ?: Z/ F; i        delay_us(50);//等待40us
# ]7 [% T7 n1 D  g* i        if(HAL_GPIO_ReadPin(GPIO_DHT11,IO_DHT11)==GPIO_PIN_SET)/ L8 F8 n1 d7 p
                return 1;
2 V6 |; B1 _( F, s$ c! _5 @        else
: R& B! U' c: R; i: b- C# v3 E                return 0;                   4 Q+ e5 V" M+ V/ P) \8 H
}
! M6 e1 R$ S4 K" `//从DHT11读取一个字节
  ]3 R5 R, E$ ?( s: G( B) o  ]; f7 p//返回值:读到的数据
* F* N+ F% U  a. a8 _uint8_t DHT11_Read_Byte(void)    ! i/ b: V- A! T, Q$ h/ @
{        + i$ U. Z( _: K5 _
    uint8_t i,dat;+ b. U, V1 _& _# M
    dat=0;3 ~" n2 T& }7 `$ `5 J
        for (i=0;i<8;i++) 0 S$ [) G6 t) Z, A4 r6 g4 I9 `
        {
: K1 {8 g: c4 M: n$ d$ O- F( `                   dat<<=1;
- _2 _8 _& d# l: z1 q/ h; q            dat|=DHT11_Read_Bit();% u! j6 i. f! ^1 ]
    }                                                   
$ p6 c6 u; a5 q. t( ?    return dat;
. c5 e4 }2 O, I}% X5 }( E. y, C  k8 b  Q
//从DHT11读取一次数据3 Q3 [" e* n) k8 t
//temp:温度值(范围:0~50°)& B8 }( R% ~  R: \
//humi:湿度值(范围:20%~90%)
. `1 O, s! `& p( v4 K+ V) T  W( H//返回值:0,正常;1,读取失败
. e) n: Q6 C( `- b: y7 J2 buint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)    & e( e* F" u$ G' i
{        
2 S6 ]* A7 u5 f6 i$ A$ ?; n% q         uint8_t buf[5];& s# I/ g. y! l4 O, ?
        uint8_t i;
/ X6 t1 x1 T# |$ q        DHT11_Rst();% J+ H" m: b5 F3 }) M& O8 G( i) f
        if(DHT11_Check()==0)$ a4 R" v  N: }5 y
        {9 h& z4 S- }9 z4 m4 s1 ]
                for(i=0;i<5;i++)//读取40位数据8 h2 v, M7 g( y2 G3 M7 N5 f
                {
0 K* q- `1 U& R: e' O0 G9 d+ u( P                        buf=DHT11_Read_Byte();
0 C" K  D3 E5 ]/ F2 U( _$ i% E4 ]                }
1 j. |8 y& w+ ~3 p                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
/ p. G. D1 X. Q4 d# k                {
( F9 i+ u) Q7 j$ `                        *humi=buf[0];. ]/ `- H# w/ Q
                        *temp=buf[2];
% {) c% z4 A+ O' Y5 f% G- Q* m                }
& r; b3 E* N: O, n        }else return 1;
  ~3 f" i; L" u' G  ]        return 0;            
8 z& U. U. x) I4 d" T0 W+ c7 W}
" c, S/ d$ t9 I) M! Q3 O//初始化DHT11的IO口 DQ 同时检测DHT11的存在
; ^7 N! m+ {" A//返回1:不存在8 V8 w+ \5 Q9 B2 o
//返回0:存在            
( u& r: f' a+ d* Yuint8_t DHT11_Init(void)
+ H( r# D6 R2 M{                             
5 D# X1 q( Y# U* O        DHT11_Rst();  //复位DHT119 W/ H/ H# T4 L6 |- H
        return DHT11_Check();//等待DHT11的回应
: y: Y! u/ H! I! P; v}
; W% `" I6 N& s7 M) \7 l; \
' C1 c/ z! a0 @. t- Y5 ]4 B9 \* X在DHT11的驱动中,us级的延时函数我使用的是/ M9 t, G( B1 o' ^
void delay_us(uint32_t value)
+ G& r3 v+ g- G{
2 i: D" O6 w) u/ a        uint32_t i;5 b9 Z( g; G( ]7 @0 m+ n
        i = value * 8;
9 [; f- `  X+ L        while(i--);
  K# A2 h; X7 C  m, E4 V# y}
* g$ |, d6 Q0 q# R: s# G) i9 e( [; k! S5 j+ R/ q% Q& u3 y! r
,前两天在调节的时候,STM32总是检测不到DHT的存在,今天下午对照时序检查的时候才发现是因为1 r5 d: y1 p8 s# G( h( h( s1 I
//复位DHT11
; t: o/ v0 M! I: P2 [) r4 i, ^void DHT11_Rst(void)           : `0 d; Z; P: Q( z; x
{                 ! D9 [$ E: v( o) C& n
        DHT11_IO_OUT();         //SET OUTPUT
: }9 u" d3 c# U/ e% S: ?    DHT11_DQ_Low;                 //拉低DQ
0 v, ^+ e, U& ~  {" U    HAL_Delay(20);            //拉低至少18ms
/ T  D2 {  g4 A: e5 ]    DHT11_DQ_High;                 //DQ=1
% @0 D# y- J9 h* w% R" a        delay_us(30);             //主机拉高20~40us
5 V/ y& g: q  Y8 J# n. O& V4 B# M7 H}$ R$ @$ z. i/ `4 L; `4 @' g2 f

4 o% z8 J5 k! v5 l函数里面是先拉低持续至少18MS,然后拉高20~40us,这里我写成了拉高30ms了,所以总是检测不到DHT11的存在
$ R+ m8 W4 i1 ?
7 X6 N2 N5 H- n" j" Q& n& M5 v& h0 b$ P- n) H. E0 H( |6 N
DHT11.h中的程序
0 h' F, c3 `$ D2 B* S9 |/ Y5 f" _8 p. C% n6 g' `% Q
9 `. O' Z) P, d7 T; ]
#ifndef __DHT11_H, ~+ {( O" Q$ s, E; D
#define __DHT11_H
) q4 u  W+ x; r" k% h% V7 v2 n#include "stm32l0xx_hal.h"
$ [; a' d& L9 z* n#include "gpio.h": D8 C6 R. N9 i6 {9 a+ M1 Q
& o9 R/ @: s* l' r7 j
#define IO_DHT11 GPIO_PIN_10
2 W3 _6 c5 K5 \( Y: }% g: M+ v$ n% u#define GPIO_DHT11 GPIOC6 x8 y0 J4 U. V$ c1 e
; ^6 |3 B  w: @+ Z- B6 t
#define  DHT11_DQ_High  HAL_GPIO_WritePin(GPIO_DHT11, IO_DHT11, GPIO_PIN_SET);5 s9 u1 z& l" d  m
#define  DHT11_DQ_Low   HAL_GPIO_WritePin(GPIO_DHT11, IO_DHT11, GPIO_PIN_RESET);
0 T. f% l1 F$ Y- B& O8 r; U1 M* A! C& V$ c

% F2 j8 ^9 o3 X/ J7 X; K+ l1 N5 n+ s; _1 b3 C
void DHT11_IO_OUT(void);6 Z+ u' ~/ R/ P; S$ k
void DHT11_IO_IN(void);
! E& y- ]: I; z2 vuint8_t DHT11_Init(void);//初始化DHT11& ~# |  q' U2 N$ ?: Y; v# |; i+ M
uint8_t   DHT11_Read_Data(uint8_t *temp,uint8_t *humi) ;//读取温湿度
# g" q/ R$ h0 @0 ]uint8_t   DHT11_Read_Byte(void);//读出一个字节
" @# j$ `3 ?! j+ a9 _6 @+ w: ]4 {uint8_t   DHT11_Read_Bit(void);//读出一个位$ ]- B) @( }2 P6 B9 s* P" ]
uint8_t   DHT11_Check(void);//检测是否存在DHT110 w! [( K+ w9 s: W  Q! [
void DHT11_Rst(void);//复位DHT11  6 Z* L: `) P* B4 ?2 E
void delay_us(uint32_t value);2 _) P; g- l' u
void delay40us(void);6 s0 O1 C, B( g0 w) l4 _+ I( F! ^
) R. s+ ~/ M# c7 w* Q
#endif
5 q; e% |; X1 k# ^" I$ A1 {- p/ U1 g
目前的话,先做成这个样子,传感器的话,等后续拿到之后,再添加上去$ D$ j  W' a- I* V2 O: I9 _
前端时间申请了机智云的gokit2开发套件  这几天就要到了,我打算先学习一下,后续能够将数据上传云端,方便远程查询。  V2 t. m$ Z* s4 o: T' I' [4 V
在最后,还是要谢谢ST社区的活动和支持,当然还有机智云,,,
" H* r9 m. w' {/ M5 q1 ]& h9 v# y' q+ j1 `6 s/ S. Q
' R; g9 \0 P) e1 T2 M+ J0 {
! `" H3 i6 b2 h6 L& _0 \  f
2 U( W8 p3 w2 Y9 O# ^
! \1 [' a5 s0 V1 d
: F# ~  C5 M1 r- j6 _7 ]$ p

评分

参与人数 1 ST金币 +30 收起 理由
zero99 + 30

查看全部评分

收藏 3 评论9 发布时间:2016-5-15 21:35

举报

9个回答
zhangdaijin 回答时间:2016-5-15 22:07:33
不错  顶楼主
烟花绽放 回答时间:2016-5-16 08:58:28
zhangdaijin 发表于 2016-5-15 22:07
3 Z1 W5 C# b0 Q不错  顶楼主
0 x7 p9 v/ @: R7 ^9 y4 E( s: W$ s
谢谢支持
沐紫 回答时间:2016-5-16 09:03:53
谢谢分享
烟花绽放 回答时间:2016-5-16 09:41:50
沐紫 发表于 2016-5-16 09:03+ l& _: z3 p: g: e. b0 q
谢谢分享
' q/ N2 ?6 \+ @& K" r( @: X
           
suoma 回答时间:2016-5-16 21:13:34
谢谢分享学习一下
anny 回答时间:2016-5-17 09:33:28
谢谢分享
HenryChen 回答时间:2016-5-26 16:59:27
学习。。。。。。。。。。。。。
epochal 回答时间:2017-7-15 08:38:33
好!谢谢分享!
oliversky 回答时间:2019-6-18 09:01:16
老哥,能不能发我一份你的工程文件,我这个调了很久没调出来,我邮箱是497314467@qq.com
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版