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

使用CubMX和Proteus学习STM32单片机(七)------智能环境监测系统

[复制链接]
STMCU小助手 发布时间:2022-11-16 15:23
该智能环境监测系统采用STMF103R4为主控MCU单元,主要外设有LCD1602,DHT11,EEPROM 24C02以及LDR光电检测单元,采用Proteus作为仿真平台用于对系统进行一个初步的验证,采用CubMX和Keil作为程序编辑软件,以实现监测周围环境的主要参数的功能。: _' f) ^* |# O1 w# G, s( m
7 b" z3 w# s& Q  o6 H
第一,先介绍一下Proteus上搭建的硬件电路图。
- B; K2 ~$ b1 c% l% Z3 m: U首先是STMF103R4单元,如下图所示:
4 g* S; U+ j( B, I6 v
0 u4 y0 U( Q2 m8 E2 b% B9 i) ^ )F3R1WS}0SJ~9K0NQ6{8M89.png 4 d; P1 V: O2 P9 Q! Y# k& C
6 y4 R3 K5 B  k- O0 `
然后是LCD1602模块:9 x5 ~% D8 m" N; n4 f

8 I( k2 T" h$ E( \5 W R[N5FRTT~WUEJ%HN9JVOY)B.png # o  T/ |( i* G0 S" W6 I3 I

% g( {( a- M0 n8 X然后是EEPROM 24C02模块:
0 r2 `, C" |1 }
9 K: Q) J% ]( n3 |. B5 d J}PLNP}S{AHU4A{ALU_6BL7.png
3 m$ E* ]) R0 M) d3 A; J
/ I( s- ?8 [2 X8 \4 a; X* [- c然后是DHT11模块:
/ |, P. @1 o1 a- Y4 |- E! b5 h1 M! n* q6 o( z8 ^$ H. B% \* W) k* i4 o
S[21Y6T[3`74~BSE5{OM7S2.png
" Y" i# ]2 t: R% q* P: s% h5 g$ r% ?7 K
最后是LDR光电检测部分,用于转换光强数据:$ m5 X, V# c  e' R- w  V

2 S8 \/ n7 l7 G, T C}R@Q99[9(Y73GO1@EBHE}K.png 5 l7 P6 R8 s0 Z4 j3 d6 n
: B% _3 s& R9 f! ~& F2 ^
最最后,再来一张整体的图。1 p- A* L1 U2 J6 Y5 W

$ W% j$ L' z# |5 m% f X0]%(CX9]U`4G$H%(@1U@@Y.png
  n; l) R- c. H/ ]4 r$ O8 H! j* c  X+ n+ S" \8 _! ^
! Y( o. S% K: ~  H
第二,对功能进行一个简单的概括
. d$ [1 N# w3 Q! g! W0 PLCD1602实时显示测量的温度与湿度;
, y; G' s: S4 _( `- |
1 A$ t1 d! \& A9 y对光照强度进行实时监控,在LCD1602上显示AD_Value,
4 i4 ?1 t: M( z; }6 O: O+ S. U4 ]- b5 h$ B/ [
设置AD_Value在一定值的时候输出不同占空比的PWM波给LED灯;
* B8 Y) f; R  T: R
; v* x: F% f- U将最近的5个温湿度数据输入进24C02中,存储起来,按下按键后在LCD1602上显示最近的5个湿度温度数据,
) U6 ^& c0 U6 t5 K4 C+ G3 z4 p$ O- l8 }, X: o
再按一次按键就显示实时的温度湿度以及AD_Value。
/ }- |9 f: @/ V# Y' g: L: T9 b- v
" `: n+ l. C3 u& c$ x, W1 x
8 b1 X' a5 V2 N" N
' J/ f% X( ?$ }: Y第三,简单介绍一下Keil中的程序
5 j4 {+ R- U) Q0 q& V8 Z首先是温湿度采集显示功能,相关程序如下图所示,刚开始调用DHT11_Read_Data函数将温度数据和湿度数据分别赋给temp和humi两个变量,然后将它们赋值给要存储进24C02中的数组,最后调用sprintf格式化函数和LCD_WRITE_StrDATA显示函数将温湿度数据显示再LCD1602中。9 H1 M2 C0 t0 s: K+ W# ^

6 I2 M' x' Q+ p6 f5 B {%@_)607I_(R$BG$XGOKP.png : {, d6 H# @  P0 ?' ?. W# g/ N
. C+ o1 y2 P* n- U# M' i) D* h& R
然后是ADC采集功能以及PWM占空比设置功能,光照强度越强,AD采集的电压越小,需要LED的亮度也要越暗些,所以PWM的占空比要小一些,所以AD_Value与PWM的占空比P_Value成一种正关系,即AD_Value越大,P_Value越大,设置P_Value=AD_Value/50就行,因为AD_Value最大值是4096,不要让P_Value超过100就可以了。程序如下图所示。刚开始掉用HAL_ADC_Start函数启动32单片机内部ADC,之前已经初始化了,然后判断是否转换完成和检测完成,都没问题之后再用HAL_ADC_GetValue函数获取ADC转换数据,然后计算出PWM占空比,再进行格式化并在LCD1602上显示。最后将新的占空比写进__HAL_TIM_SET_COMPARE函数中,从而改变输出的PWM波形占空比,改变LED灯的亮度。
7 s# C6 M/ e- P0 }: o( `
( C. |4 q8 D* w- d 86P)HC3XH$T4_]KLR8XPS1R.png . X/ N  B* s, s5 ], S% M
! N5 |( t2 n; R8 l; z  I
还有就是存储最近的5次温湿度数据进24C02中,程序如下图所示,首先复位一下写地址,然后一个for循环调用AT_24C02_write_data写入函数分别将5个温度数据和5个湿度数据写入24C02中以供备用。
7 ~8 c. ]3 T, J5 k& W4 D7 I# r# y) P/ a# |* R
VXO8{U@]}_DF7XP$DB]M8[4.png 4 T9 S( x9 u8 J7 ^: U9 N

3 v% I6 k6 z7 Y( p8 t最后就是一个按键切换的功能,先提前设置好一个标志位flag,主要程序如下图所示,当检测到按键正常按下后,取反标志位flag,然后给LCD1602清一次屏。% k! m5 d9 v  o4 n: c0 N3 |+ `  G5 J
3 `9 E6 e- s8 l" R; A1 P" `
$@O9~}S1MPD%`HA2F38W3`C.png + h. K# X1 M5 v1 y6 |' S4 N$ C6 t

0 J2 h9 F' Z# g. b% A% {5 y5 ~最最后在while循环里面判断标志位并设置标志位为不同值时的功能即可。程序如下图所示,flag为1的时候读取24C02中的数据并在LCD1602上显示。
5 S3 X) Y) l9 O+ a! G& B7 g2 O* d5 n6 K2 G! A$ U
W40LXO{18CN%OOU82AHAA(A.png . ~( i6 j" X1 }2 N
1 b8 p! L& Y& O' E+ c: O3 X
反之,flag为0的时候则将前三个功能一起应用起来即可。" r0 t1 Z, d3 M; F( |- ?
8 c! W1 U5 l# T' E! {9 Z; [
G0HVGCGHPZSMID4M]KI9R61.png 3 t0 e& z- B  P. g/ u
/ l  f2 X+ ]& F3 |+ E  N* w

1 @! B  {; Z  N; U  U, M) ~    第四,进入实际检验阶段4 Q& [9 M- E+ z
将程序编译好然后在Proteus中显示出来。实际现象如下图所示。
3 Z  s$ p4 x+ N: l. f  j
+ `  N4 a% F; U- D, c& _) mLCD1602第一行显示温度和湿度,第二行显示AD_Value和PWM占空比。
: `$ I2 r9 d3 h& k+ Q& Y4 g$ j) [, l" n  J& c) i4 @# U
按下一次按键后,将24C02存储的最近的5次温度数据和湿度数据显示在LCD1602上。
* }8 Z/ x3 v+ f7 ?8 @+ J" e* |
0 F. `  [) e' D {`W1KBF2STQIIP08[16~E`X.png
$ I8 o9 y. m3 v" Z
' s$ e/ ~( Z2 i. A( }, A$ Q1 e2 h) r其实还是仿真还是有点问题的,可能调用的资源比较多,Proteus仿真的时候比较慢,且容易卡住,这个问题应该在实际的板子上能够消除。
9 \9 [' r4 E% e7 e: a
  X( M7 m1 }% E( K0 \
) l" I  ~4 A. Y" X- x# i2 M( G补充一下CubMX的配置:) n1 S. {/ G1 F6 j
! k$ e9 _$ ~- j% D' m2 H! X2 n
9{9AA7`00DLBWH8UD5IYH4S.png
3 P- c& R+ I2 C7 g; [; ~( @! W+ Z2 a
2 v9 o  U3 f9 ]6 z& [( Y0 N P2THBCS)O4)EFIJVQGZ[KW8.png
3 n! g& j+ t3 ], X$ h! c
, }9 E* U4 {# ?  Q, b- r+ ^3 h6 i: Q
3 c8 Y! y9 z( I 2CEW}NG~KOPE@IO4C{9@C[Q.png
( f! q' z! ^6 U! }5 R8 ^* K: @0 ~4 S1 `: W5 B/ g0 `6 e8 L
8QNX62K[R_3O{TKP[MPX55Q.png & F0 q9 O2 d* ~
! g: e: B5 g4 m$ A9 A5 t
HPOA}1I`2(U0TWEZ(GXF}AG.png
& T1 X$ p) I8 p* U& u
) h* Q/ [* g3 | B)]2BEPO{)IS5SKJ0RZO4QB.png ( O  v9 d$ M* ^* |2 Q

' A  w- H6 P# p' Q8 n5 J 作者:jxjajl   bilibili
' i3 P7 Q5 |# ]) h/ m% `" I& L3 Z4 ~  s
赞 收藏 评论0 发布时间:2022-11-16 15:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版